我在学习make
的过程中遇到了问题,是否有可能在目标的先决条件列表中使用函数。说我有以下......
FILES = folder1/file folder2/file folder3/file
$(FILES) : code/my_script.bash $(subst folder,dir,$@)
bash code/my_script.bash $(subst folder,dir,$@)
在这种情况下,即使folder1 / file不存在,my_script.bash也会运行。我预计它将执行另一条规则来首先构建该目标。当我用bash
替换echo $^
行时,输出的所有内容都是code/myscript.bash
。它似乎没有在$@
上进行替换来构建先决条件。我现在看到我可以在target和prereq中使用%
来获得所需的目标,但是是否可以在先决条件中使用函数?
答案 0 :(得分:1)
要使用依赖于规则目标的功能,您需要启用辅助扩展。要启用辅助扩展,您需要使用.SECONDEXPANSION:
,同时在版权中加倍$
。所以:
FILES = folder1/file folder2/file folder3/file
all: $(FILES)
.SECONDEXPANSION:
$(FILES): code/my_script.bash $$(subst folder,dir,$$@)
bash code/my_script.bash $(subst folder,dir,$@)
$
加倍的做法是阻止在第一次扩展期间对代码进行评估。
如果您在先决条件中使用的函数不依赖于仅在评估规则时存在的变量(如$@
),则不需要二次扩展。
答案 1 :(得分:0)
FILES = folder1/file folder2/file folder3/file
$(FILES) : code/my_script.bash $$(subst folder,dir,$$@)
bash code/my_script.bash $(subst folder,dir,$@)