मेरे पास निम्न मेकफ़ाइल है जिसका उपयोग मैं एक प्रोग्राम (एक कर्नेल, वास्तव में) बनाने के लिए करता हूं जिस पर मैं काम कर रहा हूं। यह खरोंच से है और मैं प्रक्रिया के बारे में सीख रहा हूं, इसलिए यह सही नहीं है, लेकिन मुझे लगता है कि इस स्तर पर मेरे लेखन के स्तर के मेकफ़ाइल के लिए पर्याप्त शक्तिशाली है।मेरे पास मेकफ़ाइल स्वचालित रूप से स्रोत फ़ाइलों का पुनर्निर्माण कैसे कर सकता है जिसमें संशोधित हेडर फ़ाइल शामिल है? (सी/सी ++ में)
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 [email protected] $^
$(SOBJS) : $(SFILES)
$(AS) $(ASFLAGS) $< -o [email protected]
%.o: %.c
@echo Compiling $<...
$(CC) $(CFLAGS) -c -o [email protected] $<
#Clean Script - Should clear out all .o files everywhere and all that.
clean:
-del *.img
-del *.o
-del assembly\*.o
-del core.elf
इस makefile साथ मेरा मुख्य मुद्दा यह है कि जब मैं एक हेडर फाइल को संशोधित कि एक या अधिक सी फ़ाइलों में शामिल हैं, सी फ़ाइलों का पुनर्निर्माण नहीं कर रहे हैं। मैं अपनी सभी सी फाइलों के लिए अपनी सभी हेडर फाइलों पर निर्भरता रखकर इसे आसानी से ठीक कर सकता हूं, लेकिन जब भी मैं हेडर फ़ाइल बदलता/जोड़ता हूं, तो यह प्रभावी रूप से परियोजना के पूर्ण पुनर्निर्माण का कारण बनता है, जो बहुत ही सुंदर नहीं होगा।
जो मैं चाहता हूं केवल सी फाइलों के लिए है जो में हैडर फ़ाइल जिसे मैं पुनर्निर्मित करने के लिए बदलता हूं, और पूरी परियोजना को फिर से लिंक करने के लिए। मैं सभी हेडर फ़ाइलों को लक्ष्य की निर्भरता के कारण जोड़कर लिंक कर सकता हूं, लेकिन मैं यह नहीं समझ सकता कि सी फाइलों को अमान्य कैसे बनाया जाए जब उनकी हेडर फाइलें नई हों।
मैंने सुना है कि जीसीसी के पास यह संभव बनाने के लिए कुछ कमांड हैं (इसलिए मेकफ़ाइल किसी भी तरह से पता लगा सकता है कि किन फ़ाइलों को पुनर्निर्मित करने की आवश्यकता है) लेकिन मैं अपने जीवन के लिए वास्तविक कार्यान्वयन उदाहरण नहीं ढूंढ सकता । क्या कोई समाधान पोस्ट कर सकता है जो इस व्यवहार को मेकफ़ाइल में सक्षम करेगा?
संपादित करें: मुझे स्पष्ट करना चाहिए, मैं अलग-अलग लक्ष्यों को रखने और प्रत्येक लक्ष्य रखने की अवधारणा से परिचित हूं। आपको हेडर फ़ाइलों की आवश्यकता है। जब भी मैं कहीं हेडर फ़ाइल शामिल करता हूं, तो मुझे मेकफ़ाइल संपादित करने की आवश्यकता होती है, जो दर्द का थोड़ा सा होता है। मैं ऐसे समाधान की तलाश में हूं जो हेडर फ़ाइल निर्भरताओं को अपने आप प्राप्त कर सके, जो कि मैं निश्चित रूप से निश्चित हूं कि मैंने अन्य परियोजनाओं में देखा है।
मुझे गलत हो सकता है, लेकिन मुझे लगता है कि जीसीसी ने वास्तव में उस प्रस्ताव को हल करने के लिए एक सुविधा जोड़ा है। Http://gcc.gnu.org/onlinedocs/gcc-4.3.1/gcc/Preprocessor-Options.html विशेष रूप से -एमपी देखें। –
हां, -एमपी 3 के बाद से मौजूद है, क्लैंग और आईसीसी में मौजूद है, और sed की आवश्यकता को voids। http://bruno.defraine.net/techtips/makefile-auto- निर्भरता-with-gcc/#comment-50775 – hmijail