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



我正在使用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等函数似乎不可用。有什么办法可以绕过这个限制吗?

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

$(shell)命令本身是在make解析时处理的,但是

$@仅在目标执行时间存在。

对于$(basename)展开也是如此。

这里可以使用的是二级展开:

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

相关内容

  • 没有找到相关文章

最新更新