我正在阅读使用 GNU Make 管理项目,并在第 2.7 章 - 自动依赖生成中找到了这个示例。作者从 GNU 手册中说:
%.d: %c
$(CC) -M $(CPPFLAGS $< > $@.$$$$; \
sed s',\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
但是,我可以用这个做同样的事情(注意sed
):
-include $(subst .c,.d,$(SOURCES))
%.d: %.c
@$(CC) -M $(CPPFLAGS) $< | sed 's|:| $*.d : |' > $@;
所有这些行都是生成依赖项,然后添加*.d
名称。他们不得不将第一行从:
foo.o: bar.h foo.h fubar.h
到 foo.o foo.d : bar.h foo.h fubar.h
我的更简单,似乎工作得很好,但我认为 GNU 人有他们的sed
命令的理由。还:
- 为什么要将文件重定向到
sed
? 为什么不简单地将其作为常用参数 - 为什么不完全跳过中间文件?
我知道 GNU 的人也可以想到这些,但出于某种原因,他们选择了更复杂的设置。我只是想了解他们的推理,所以我可以在飞行中做这些。