我正在使用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之类的函数。有什么方法可以解决这个限制吗?
答案 0 :(得分:3)
$(shell)
版本错误,因为它们混淆了执行时间。
$(shell)
命令本身在make parse-time处理但值为
$@
仅存在于目标执行时间。
$(basename)
扩展也是如此。
但是,您可以使用Secondary Expansion:
.SECONDEXPANSION:
a/%.txt: $$(notdir $$@)
@echo '$$@: $@'
@echo '$$<: $<'