簡體   English   中英

頭文件更改期間要重建的Makefile

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM