在GNU make中文手冊(cè)這本書中,3.14節(jié)講到了依賴文件的自動(dòng)生成,如下圖

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

圖中的規(guī)則對(duì)C源文件和Makefile在同一目錄,是正確的。但是不在同一目錄的又希望依賴文件在對(duì)應(yīng)的目錄下,比如src/log/log_file.c,希望依賴文件log_file.d生成在src/log/下。因?yàn)間cc(aix平臺(tái)xlc編譯器亦如此)生成的依賴文件內(nèi)容中目標(biāo)文件名沒(méi)有帶路徑,例如下所示
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而替換了,改正后的規(guī)則如下
%.d: %.c
$(CC) $(CFLAGS) $(INCS) $< $(MFLAGS) $@.$$$$;\
sed 's,$(*F).o[ :]*,$*.o $@: ,g' < $@.$$$$ > $@;\
$(RM) $@.$$$$
$(CC) $(CFLAGS) $(INCS) $< $(MFLAGS) $@.$$$$;\
sed 's,$(*F).o[ :]*,$*.o $@: ,g' < $@.$$$$ > $@;\
$(RM) $@.$$$$
該規(guī)則對(duì)C源文件和Makefile在同一目錄也適合,生成后的依賴文件內(nèi)容如下
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