[英]Makefile to rebuild during header file changes
我正在嘗試為項目編寫Makefile。 這樣,只要任何C文件發生更改,我都可以構建項目。 但是,當頭文件發生更改時,它不會構建。
因此,我正在嘗試使用Makefile創建一個更簡單的目錄結構,如果它可以工作,我計划在主項目中執行相同的操作。
目錄結構是
src -> code1 -> file1.c
src -> code2 -> file2.c
src -> code1inc -> file1.h
src -> code2inc -> file2.h
所有文件都應該一起構建並給出一個二進制的FinalBin
當file1.h發生更改時,它僅需構建file1.c。 我該如何通過Makefile強加此功能?
這是我當前的Makefile。
CC = gcc
CFLAGS = $(INCLUDES)
TARGET = FinalBin
SOURCES := $(wildcard *.c)
PATH_CODE1 = src/code1
PATH_CODE2 = src/code2
CODE1_SOURCES := $(wildcard $(PATH_CODE1)/*.c)
CODE1_OBJECTS := $(patsubst %.c,%.o,$(CODE1_SOURCES))
CODE2_SOURCES := $(wildcard $(PATH_CODE2)/*.c)
CODE2_OBJECTS := $(patsubst %.c,%.o,$(CODE2_SOURCES))
PATH_CODE1INC = src/code1inc
PATH_CODE2INC = src/code2inc
INCLUDES = -I$(PATH_CODE1INC) \
-I$(PATH_CODE2INC)
CODE1_HEADERS := $(wildcard $(PATH_CODE1INC)/*.h)
CODE2_HEADERS := $(wildcard $(PATH_CODE2INC)/*.h)
all: $(TARGET)
obj1 = $(CODE1_OBJECTS) $(CODE1_HEADERS)
obj2 = $(CODE2_OBJECTS) $(CODE2_HEADERS)
$(TARGET) : $(obj1) $(obj2)
$(CC) $^ -o $@
clean:
rm $(TARGET) $(CODE1_OBJECTS) $(CODE2_OBJECTS)
請在這方面指導我。
你的工作對我來說似乎很不尋常。
典型的方法是擁有一個源文件列表,這些源文件可以手工編寫或自動評估,例如,從一個或多個目錄中捕獲所有c文件。 那就是您已經做的: CODE1_SOURCES := $(wildcard $(PATH_CODE1)/*.c)
但是,每個文件的依賴關系應自動生成。 例如,gcc提供了“ -M”或“ -MM”選項來重建所謂的依賴文件,通常名為“ .d”或“ .dep”
完整過程的良好文檔可以在這里找到:
http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/#basic
對於簡單的情況,這是來自以上文檔的示例:
SRCS = foo.c bar.c ...
%.o : %.c
@$(MAKEDEPEND); \
cp $*.Td $*.d; \
sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
-e '/^$$/ d' -e 's/$$/ :/' < $*.Td >> $*.d; \
rm -f $*.Td
$(COMPILE.c) -o $@ $<
include $(wildcard $(SRCS:.c=.d))
如果使用gcc MAKEDEPEND可以是:
MAKEDEPEND = gcc -M $(CPPFLAGS) -o $*.Td $<
簡短說明:
通常,您使用以下命令定義規則如何從%.o文件生成%.o文件:
%.o : %.c
作為該規則的第一步,始終在必須編譯源代碼的情況下始終構建depfile,通常是在%.o文件不存在或相關性比%.o文件新的情況下:
gcc -M $(CFLAGS) -o $*.Td $<
摘錄的最后一行確實包含了所有這些自動生成的依賴文件,只需將它們包含在Makefile中即可:
include $(wildcard $(SRCS:.c=.d))
不需要規則中的sed語句。 Gcc支持-MF選項來控制依賴項輸出文件。
CC = gcc
SRCS = foo.c bar.c ...
OBJS = $(SRCS:%.c=%.o)
DEPS = $(wildcard $(OBJS:%=%.d))
%.o : %.c
$(CC) -MD -MP -MF "$@.d" -o $@ -c $<
include $(DEPS)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.