如何从目标创建makefile先决条件

时间:2015-09-01 07:19:07

标签: makefile gnu-make

我正在使用GNU make,我正在尝试根据目标创建先决条件。我希望先决条件是目标的基名。所以,当我运行时:

make a/b/foo.txt

它应该运行:

cp foo.txt a/b/foo.txt

这些都不起作用:

a/%.txt: $(basename $@)
    cp $< $@

a/%.txt: $(@F)
    cp $< $@

a/%.txt: $(shell basename $@)
    cp $< $@

a/%.txt: $(basename %)
    cp $< $@

a/%.txt: $(shell basename %)
    cp $< $@

我已经看到%用于目标和先决条件,所以我知道将先决条件建立在目标上是正常的。我也看到了先决条件中的变量,所以这也很正常。但似乎特殊变量$ @和$(@ F)在先决条件中不可用,以及basename和shell之类的函数。有什么方法可以解决这个限制吗?

1 个答案:

答案 0 :(得分:3)

$(shell)版本错误,因为它们混淆了执行时间。

$(shell)命令本身在make parse-time处理但值为 $@仅存在于目标执行时间。

$(basename)扩展也是如此。

但是,您可以使用Secondary Expansion

.SECONDEXPANSION:

a/%.txt: $$(notdir $$@)
        @echo '$$@: $@'
        @echo '$$<: $<'