在GNU make中文手冊這本書中,3.14節講到了依賴文件的自動生成,如下圖

所以sed就找不到src/log/log_file.o而替換了,改正后的規則如下
該規則對C源文件和Makefile在同一目錄也適合,生成后的依賴文件內容如下

圖中的規則對C源文件和Makefile在同一目錄,是正確的。但是不在同一目錄的又希望依賴文件在對應的目錄下,比如src/log/log_file.c,希望依賴文件log_file.d生成在src/log/下。因為gcc(aix平臺xlc編譯器亦如此)生成的依賴文件內容中目標文件名沒有帶路徑,例如下所示
log_file.o: src/log/log_file.c src/log/log_file.h src/log/log_type.h \
src/log/../base/io_ext.h
src/log/../base/io_ext.h
所以sed就找不到src/log/log_file.o而替換了,改正后的規則如下
%.d: %.c
$(CC) $(CFLAGS) $(INCS) $< $(MFLAGS) $@.$$$$;\
sed 's,$(*F).o[ :]*,$*.o $@: ,g' < $@.$$$$ > $@;\
$(RM) $@.$$$$
$(CC) $(CFLAGS) $(INCS) $< $(MFLAGS) $@.$$$$;\
sed 's,$(*F).o[ :]*,$*.o $@: ,g' < $@.$$$$ > $@;\
$(RM) $@.$$$$
該規則對C源文件和Makefile在同一目錄也適合,生成后的依賴文件內容如下
src/log/log_file.o src/log/log_file.d: src/log/log_file.c src/log/log_file.h src/log/log_type.h \
src/log/../base/io_ext.h
src/log/../base/io_ext.h