在Managing Projects with GNU Make的第8章(P150)中,作者介绍了Tromey’s Way
。
define make-depend
$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -M $1 | \
$(SED) 's,\($$(notdir $2)\) *:,$$(dir $2) $3: ,' > $3.tmp
$(MV) $3.tmp $3
endef
%.o: %.c
$(call make-depend,$<,$@,$(subst .o,.d,$@))
$(COMPILE.c) -o $@ $<
我对双美元符号$$(notdir $2)
和$$(dir $2)
的理解是,它用于转义$
以便稍后展开。但是,我们希望它在$2
处运营,对吧?
我怀疑这是一个错误,但我在勘误表中找不到它。这真是一个错误,还是我误解了?
答案 0 :(得分:3)
是的,像这样使用美元符号加倍是一个错误。如果您要将call
函数的结果发送到类似eval
的内容,再次扩展结果,那么唯一一次不会让它们加倍的话就会受到影响。但在任何一种情况下都没有必要。
我应该指出,这个例子,虽然比大多数其他方法更好,但现在有点不赞成。 GCC编译器具有的选项可以生成您想要的makefile依赖项输出,而无需后处理,同时仍然可以同时创建目标文件。这实际上更有效,因为每次编译时都不必运行编译器两次。