1

在使用 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在这里运行,对吧?

我怀疑这是一个错误,但我在勘误表上找不到它。这真的是一个错误,还是我误解了它?

4

1 回答 1

3

是的,像这样使用将美元符号加倍是错误的。唯一一次将它们加倍不会受到伤害的是,如果您要将call函数的结果发送到类似eval再次扩展结果的东西。但在任何一种情况下都不需要它。

我应该指出,这个例子虽然比大多数其他方法更好,但现在已经有些过时了。GCC 编译器的选项可以生成几乎完全符合您所需的 makefile 依赖项输出,而无需后处理,同时仍会同时创建目标文件。这实际上效率更高,因为您不必每次编译时都运行编译器两次。

于 2013-08-01T23:38:48.593 回答