আমি কীভাবে একটি মেকফিলের সংশোধিত শিরোলেখ ফাইল অন্তর্ভুক্ত উত্স ফাইলগুলি স্বয়ংক্রিয়ভাবে পুনর্নির্মাণ করতে পারি? (সি / সি ++ এ)


92

আমার নিচের মেকফাইল রয়েছে যা আমি একটি প্রোগ্রাম তৈরি করতে ব্যবহার করি (একটি কার্নেল, আসলে) যা আমি কাজ করছি। এটি স্ক্র্যাচ থেকে এবং আমি প্রক্রিয়াটি সম্পর্কে শিখছি, সুতরাং এটি নিখুঁত নয়, তবে আমার অভিজ্ঞতার মেকফিলগুলি লেখার স্তরের জন্য এই পর্যায়ে যথেষ্ট শক্তিশালী বলে মনে করি।

AS  =   nasm
CC  =   gcc
LD  =   ld

TARGET      =   core
BUILD       =   build
SOURCES     =   source
INCLUDE     =   include
ASM         =   assembly

VPATH = $(SOURCES)

CFLAGS  =   -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions \
            -nostdinc -fno-builtin -I $(INCLUDE)
ASFLAGS =   -f elf

#CFILES     =   core.c consoleio.c system.c
CFILES      =   $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
SFILES      =   assembly/start.asm

SOBJS   =   $(SFILES:.asm=.o)
COBJS   =   $(CFILES:.c=.o)
OBJS    =   $(SOBJS) $(COBJS)

build : $(TARGET).img

$(TARGET).img : $(TARGET).elf
    c:/python26/python.exe concat.py stage1 stage2 pad.bin core.elf floppy.img

$(TARGET).elf : $(OBJS)
    $(LD) -T link.ld -o $@ $^

$(SOBJS) : $(SFILES)
    $(AS) $(ASFLAGS) $< -o $@

%.o: %.c
    @echo Compiling $<...
    $(CC) $(CFLAGS) -c -o $@ $<

#Clean Script - Should clear out all .o files everywhere and all that.
clean:
    -del *.img
    -del *.o
    -del assembly\*.o
    -del core.elf

এই মেকফিলের সাথে আমার প্রধান সমস্যাটি হ'ল আমি যখন এক বা একাধিক সি ফাইলের অন্তর্ভুক্ত একটি শিরোনাম ফাইল সংশোধন করি তখন সি ফাইলগুলি পুনর্নির্মাণ হয় না। আমি আমার হেডার ফাইলগুলির সমস্ত আমার সি ফাইলগুলির জন্য নির্ভরশীলতা হয়ে খুব সহজেই এটি ঠিক করতে পারি, তবে যে কোনও সময় আমি কোনও শিরোনাম ফাইল পরিবর্তন / সংযোজন করে যা প্রকল্পটির সম্পূর্ণ পুনর্নির্মাণের কারণ হতে পারে যা খুব করুণাময় হবে না।

আমি যা চাই তা কেবলমাত্র সি ফাইলগুলির জন্য যা আমি পুনর্নির্মাণের জন্য পরিবর্তিত শিরোলেখ ফাইলটি অন্তর্ভুক্ত করে এবং পুরো প্রকল্পটি আবার সংযুক্ত হওয়ার জন্য। আমি সমস্ত শিরোলেখ ফাইলকে টার্গেটের নির্ভরতা তৈরি করে লিঙ্কিংটি করতে পারি, তবে অন্তর্ভুক্ত শিরোনাম ফাইলগুলি আরও নতুন করে যখন সি ফাইলগুলিকে অকার্যকর করা যায় তবে আমি তা বুঝতে পারি না।

আমি শুনেছি এটি সম্ভব করার জন্য জিসিসির কিছু কমান্ড রয়েছে (যাতে কোন ফাইলটি পুনরায় তৈরি করা দরকার তা মেকফিল একরকমভাবে জানতে পারে) তবে আমি আমার জীবনের পক্ষে এটি দেখতে বাস্তবের একটি উদাহরণ খুঁজে পাচ্ছি না। কেউ কি এমন কোনও সমাধান পোস্ট করতে পারেন যা কোনও মেকফাইলে এই আচরণকে সক্ষম করে?

সম্পাদনা: আমার স্পষ্ট করা উচিত, আমি পৃথক লক্ষ্যবস্তু স্থাপন এবং প্রতিটি টার্গেট রাখার ধারণার সাথে পরিচিত familiar যাতে হেডার ফাইলের প্রয়োজন হয়। এর জন্য প্রতিবারই আমি কোথাও শিরোনামের ফাইলটি কোথাও অন্তর্ভুক্ত করার জন্য আমাকে মেকফিল সম্পাদনা করতে হবে, যা কিছুটা ব্যথা। আমি এমন একটি সমাধান খুঁজছি যা শিরোনামের ফাইলের নিজস্বতা নির্ভর করতে পারে যা আমি নিজেই অন্যান্য প্রকল্পগুলিতে দেখেছি certain

উত্তর:


30

ইতিমধ্যে এই সাইটে অন্য কোথাও নির্দেশিত হিসাবে, এই পৃষ্ঠাটি দেখুন: স্ব-নির্ভরতা উত্পন্নকরণ

সংক্ষেপে, জিসিসি স্বয়ংক্রিয়ভাবে আপনার জন্য .d নির্ভরতা ফাইল তৈরি করতে পারে, যা আপনি সংকলিত .c ফাইলের নির্ভরতা যুক্ত মিনি মেকফিল টুকরা। আপনি যখনই .c ফাইল পরিবর্তন করেন এবং এটি সংকলন করেন, তখন .d ফাইলটি আপডেট হবে।

গিসিসিতে-এম পতাকা যুক্ত করার পাশাপাশি, আপনাকে .d ফাইলগুলি মেকফাইলে অন্তর্ভুক্ত করতে হবে (যেমন ক্রিস উপরে লিখেছেন)। পৃষ্ঠায় আরও কিছু জটিল সমস্যা রয়েছে যা সেড ব্যবহার করে সমাধান করা হয় তবে আপনি এগুলি উপেক্ষা করতে পারেন এবং .d ফাইলগুলি মুছে ফেলার জন্য একটি "ক্লিন করুন" করতে পারেন যখনই কোনও হেডার ফাইল তৈরি করতে সক্ষম না হওয়ার বিষয়ে অভিযোগ করেন যা আর অস্তিত্বহীন থাকে that ।


4
আমার ভুল হতে পারে তবে আমি মনে করি জিসিসি আসলে সেড ইস্যুটি চেষ্টা করার জন্য একটি বৈশিষ্ট্য যুক্ত করেছে। Gcc.gnu.org/onlinesocs/gcc-4.3.1/gcc/Preprocessor-Otionstions.html বিশেষত- এমপি দেখুন ।
ইউজিন মারকোট

হ্যাঁ, -জিমিপি জিসিসি 3 থেকে বিদ্যমান, ঝনঝন এবং আইসিসিতে বিদ্যমান এবং সেডের প্রয়োজনীয়তাটিকে voids করে। bruno.defrain.net/techtips/makefile-auto-d
depend

উত্তরের লিঙ্কটির সর্বশেষতম সংস্করণে জিসিসি পতাকা ব্যবহার করে উদাহরণ রয়েছে।
ম্যাডসায়েন্টিস্ট

20

অন্যরা যেমন বলেছে আপনি 'মেক নির্ভর' কমান্ড যুক্ত করতে পারেন তবে একই সাথে নির্ভরতা তৈরি করতে এবং সংকলন করতে জিসিসি পাবেন না:

DEPS := $(COBJS:.o=.d)

-include $(DEPS)

%.o: %.c
    $(CC) -c $(CFLAGS) -MM -MF $(patsubst %.o,%.d,$@) -o $@ $<

'-MF' প্যারামিটারটি নির্ভরতাগুলি সংরক্ষণ করতে কোনও ফাইল নির্দিষ্ট করে।

'অন্তর্ভুক্ত' এর শুরুতে ড্যাশ .d ফাইল উপস্থিত না থাকায় মেক অব্যাহত রাখতে বলে (যেমন প্রথম সংকলনের উপরে)।

নোট করুন -o বিকল্পের সাথে জিসিসিতে একটি বাগ রয়েছে বলে মনে হচ্ছে। আপনি যদি অবজেক্ট ফাইলের নামটি সেট করতে সেট করেন obj/_file__c.oতবে জেনারেটে _file_.dএখনও থাকবে _file_.oনা, থাকবে না obj/_file_c.o


18
এটি আমার পক্ষে কার্যকর হয়নি। উদাহরণস্বরূপ g++ -c -Wall -Werror -MM -MF main.d -o main.o main.cpp মেকফাইল এটি তৈরি করেছে এবং চালিয়েছে : আমি মূল.ডি ফাইল পেয়েছি, তবে মূল.ও 0 বাইট ছিল। তবে-এমএমডি পতাকাটি ঠিক যা করার প্রয়োজন তা করছে বলে মনে হচ্ছে। সুতরাং আমার কাজের মেকফিল নিয়মটি পরিণত হয়েছিল:$(CC) -c $(CFLAGS) -MMD -o $@ $<
ড্যারেন কুক

17

এটি ক্রিস ডডের উত্তরের সমতুল্য , তবে ভিন্ন নামকরণের কনভেনশন ব্যবহার করে (এবং কাকতালীয়ভাবে sedযাদুটির প্রয়োজন হয় না । পরবর্তী নকল থেকে অনুলিপি করা হয়েছে ।


আপনি যদি কোনও জিএনইউ সংকলক ব্যবহার করছেন তবে সংকলকটি আপনার জন্য নির্ভরতার একটি তালিকা একত্রিত করতে পারে। মেকফিল টুকরা:

depend: .depend

.depend: $(SOURCES)
        rm -f ./.depend
        $(CC) $(CFLAGS) -MM $^>>./.depend;

include .depend

হাতিয়ারটিও রয়েছে makedependতবে আমি এটির মতো পছন্দ করি নাgcc -MM


4
আপনি কেন উত্স বানান না? বিশেষত আরও অনেক চরিত্রের প্রয়োজন হয় না এবং এটি "এসআরসিএস" এর মতো অপ্রচলিত নয় যা সংক্ষিপ্ত আকারের মতো দেখাবে।
হ্যালো গুডবাই

@ হেলো গুডবাই কিছুটা স্টাইল আমি সর্বদা ব্যবহার করেছি, এবং সর্বদা দেখেছি SRCSএবং OBJS। আমি বেশিরভাগ সময় একমত হই, তবে প্রত্যেকেরই জানা উচিত সেগুলি কী।
শেরেরেলবিসি

@ শেরেললবিসি লোকেদের "কী" জানা উচিত এবং লোকেরা আসলে যা জানত তা প্রায়শই দুটি ভিন্ন জিনিস: পি
হ্যালো গুডবাই

7

আপনাকে প্রতিটি সি ফাইলের জন্য পৃথক লক্ষ্যবস্তু তৈরি করতে হবে, এবং তারপরে নির্ভরতা হিসাবে শিরোনাম ফাইলটি তালিকাবদ্ধ করতে হবে। আপনি এখনও আপনার জেনেরিক লক্ষ্যগুলি ব্যবহার করতে পারেন এবং .hএরপরে নির্ভরতাগুলি পরে রাখুন:

%.o: %.c
        @echo Compiling $<...
        $(CC) $(CFLAGS) -c -o $@ $<

foo.c: bar.h
# And so on...

4

মূলত, যখন হেডার ফাইলগুলি পরিবর্তন হয় তখন আপনাকে বস্তু ফাইলগুলি পুনর্নির্মাণের জন্য गतिशीलভাবে মেকফিল বিধি তৈরি করতে হবে। আপনি যদি জিসিসি এবং জ্নুমাকে ব্যবহার করেন তবে এটি মোটামুটি সহজ; যেমন কিছু রাখুন:

$(OBJDIR)/%.d: %.c
        $(CC) -MM -MG $(CPPFLAGS) $< | sed -e 's,^\([^:]*\)\.o[ ]*:,$(@D)/\1.o $(@D)/\1.d:,' >$@

ifneq ($(MAKECMDGOALS),clean)
include $(SRCS:%.c=$(OBJDIR)/%.d)
endif

আপনার মেকফিল


4
আমি এটিকে বুঝতে চাই না, বাদে (তিনি-এমএম এবং-এমএম ফ্ল্যাগগুলি নতুন হওয়া বাদ দিয়ে) ক্রিপ্টিক পাঠ্যের রেজেক্স লুকিনের লাইনটি কী তা আমি বুঝতে পারি না। এটি আমাকে সতীর্থদের খুশি করতে চলেছে না ... ^ _ ^ আমি চেষ্টা করে দেখব এবং আমার কোনও ফলাফল আছে কিনা তা দেখুন।
নিকোলাস ফ্লাইেন্ট

সেড "স্ট্রিম এডিটর" এর জন্য সংক্ষিপ্ত, যা কোনও ফাইল ব্যবহার না করেই পাঠ্যের একটি স্ট্রিম পরিবর্তন করতে পারে। এটি একটি স্ট্যান্ডার্ড ইউনিক্স সরঞ্জাম এবং ছোট এবং দ্রুত তাই এটি awk বা পার্লের চেয়ে বেশি ব্যবহৃত হয়।
Zan Lynx

আহ, সমস্যা আছে: আমি উইন্ডোজ এর অধীনে এটি করছি।
নিকোলাস ফ্লাইন্ট

3

@ মিপাদি যা বলেছে তার উপরে এবং উপরে, আপনি -Mনির্ভরতার একটি রেকর্ড উত্পন্ন করতে ' ' বিকল্পটি ব্যবহার করতে পারেন explore এমনকি আপনি সেগুলি একটি পৃথক ফাইল (সম্ভবত 'depend.mk') তৈরি করতে পারেন যা পরে আপনি মেকফিলের অন্তর্ভুক্ত করেন। অথবা আপনি এমন একটি ' make dependনিয়ম খুঁজে পেতে পারেন যা মেকফিলটিকে সঠিক নির্ভরতা (Google এর শর্তাবলী: "এই লাইনটি সরিয়ে নাও" এবং নির্ভর করে) দিয়ে সম্পাদনা করে ed


1

উত্তরগুলির কোনওটিই আমার পক্ষে কার্যকর হয়নি। উদাহরণস্বরূপ, মার্টিন ফিডোর উত্তরে জিসিসি নির্ভরতা ফাইল তৈরি করতে পারে, কিন্তু যখন আমি চেষ্টা করেছিলাম যে এটি কোনও সতর্কতা বা ত্রুটি ছাড়াই খালি (শূন্য বাইট) অবজেক্ট ফাইল তৈরি করছে। এটি একটি সিসি বাগ হতে পারে। আমিও আছি

$ জিসিসি - রূপান্তর জিসিসি (জিসিসি) 4.4.7 20120313 (রেড হ্যাট ৪.৪..7-১))

সুতরাং এখানে আমার সম্পূর্ণ Makefile যা আমার পক্ষে কাজ করে; এটি সমাধানের সংমিশ্রণ + এমন কিছু যা অন্য কারও দ্বারা উল্লিখিত হয়নি (যেমন "প্রত্যয় প্রতিস্থাপনের নিয়ম" .cc.o :) হিসাবে নির্দিষ্ট করা হয়েছে:

CC = g++
CFLAGS = -Wall -g -std=c++0x
INCLUDES = -I./includes/

# LFLAGS = -L../lib
# LIBS = -lmylib -lm

# List of all source files
SRCS = main.cc cache.cc

# Object files defined from source files
OBJS = $(SRCS:.cc=.o)

# # define the executable file 
MAIN = cache_test

#List of non-file based targets:
.PHONY: depend clean all

##  .DEFAULT_GOAL := all

# List of dependencies defined from list of object files
DEPS := $(OBJS:.o=.d)

all: $(MAIN)

-include $(DEPS)

$(MAIN): $(OBJS)
    $(CC) $(CFLAGS) $(INCLUDES) -o $(MAIN) $(OBJS) $(LFLAGS) $(LIBS)

#suffix replacement rule for building .o's from .cc's
#build dependency files first, second line actually compiles into .o
.cc.o:
    $(CC) $(CFLAGS) $(INCLUDES) -c -MM -MF $(patsubst %.o,%.d,$@) $<
    $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $<

clean:
    $(RM) *.o *~ $(MAIN) *.d

লক্ষ্য করুন যে আমি .cc ব্যবহার করেছি .. উপরের মেকফাইলটি .c ফাইলগুলির জন্য সামঞ্জস্য করা সহজ।

এই দুটি লাইনের গুরুত্ব লক্ষ্য করুন:

$(CC) $(CFLAGS) $(INCLUDES) -c -MM -MF $(patsubst %.o,%.d,$@) $<
$(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $<

সুতরাং প্রথমে নির্ভরতা ফাইল তৈরি করতে একবার gcc বলা হয় এবং তারপরে আসলে একটি .cc ফাইল সংকলন করে iles এবং প্রতিটি উত্স ফাইলের জন্য তাই।


0

সহজ সমাধান: কেবলমাত্র .c থেকে .o সংকলন নিয়মের জন্য Makefile ব্যবহার করুন শিরোনাম ফাইল (গুলি) এবং আপনার প্রকল্পে নির্ভরতা হিসাবে প্রাসঙ্গিক যা কিছু প্রাসঙ্গিক উপর নির্ভরশীল।

উদাহরণস্বরূপ, কোথাও মেকফাইলে:

DEPENDENCIES=mydefs.h yourdefs.h Makefile GameOfThrones.S07E01.mkv

::: (your other Makefile statements like rules 
:::  for constructing executables or libraries)

# Compile any .c to the corresponding .o file:
%.o: %.c $(DEPENDENCIES)
        $(CC) $(CFLAGS) -c -o $@ $<

-1

আমি বিশ্বাস করি যে mkdepআদেশ আপনি চান তা। এটি #includeলাইনের জন্য .c ফাইলগুলি স্ক্যান করে এবং তাদের জন্য একটি নির্ভরতা গাছ তৈরি করে। আমি বিশ্বাস করি অটোমেক / অটোকনফ প্রকল্পগুলি এটি ডিফল্টরূপে ব্যবহার করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.