我正在使用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 '$$<: $<'