Makefile 在先决条件中创建函数

Makefile 在先决条件中创建函数,makefile,Makefile,我正在学习make的过程中,我被困在是否可以将prereq列表中的函数用于目标上。假设我有以下几点 FILES = folder1/file folder2/file folder3/file $(FILES) : code/my_script.bash $(subst folder,dir,$@) bash code/my_script.bash $(subst folder,dir,$@) 在这种情况下,my_script.bash将运行,即使folder1/file不存在。我预

我正在学习
make
的过程中,我被困在是否可以将prereq列表中的函数用于目标上。假设我有以下几点

FILES = folder1/file folder2/file folder3/file

$(FILES) : code/my_script.bash $(subst folder,dir,$@)
    bash code/my_script.bash $(subst folder,dir,$@)

在这种情况下,my_script.bash将运行,即使folder1/file不存在。我预计它将首先执行另一条规则来构建该目标。当我将
bash
行替换为
echo$^
时,输出的是
code/myscript.bash
。它似乎没有在
$@
上进行替换来构建prereq。现在我明白了,我可以通过在target和prereq中使用
%
来获得所需的目标,但是可以在prereq中使用函数吗?

要使用依赖于规则目标的函数,需要启用辅助扩展。要启用二次扩展,除了将部门中的
$
加倍外,还需要使用。因此:

FILES = folder1/file folder2/file folder3/file    

$(FILES) : code/my_script.bash $$(subst folder,dir,$$@)
    bash code/my_script.bash $(subst folder,dir,$@)
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,$@)
$
加倍的作用是防止在第一次扩展期间对代码求值


如果先决条件中使用的函数不依赖于仅在计算规则时才存在的变量(如
$@
),则不需要进行二次扩展。

可以使用函数,但不使用二次扩展就不能使用特定于目标的变量(如
$@
)。因此
$$(subst folder,dir,$@)
应作为预请求使用?是否希望每个输出文件都依赖于所有输入文件?或一对一映射?请使用问题上的编辑链接添加其他信息。“发布答案”按钮只能用于问题的完整答案。@JTG这是一个完整的答案(某种程度上)。啊,谢谢@EtanReisner,我在队列中看到了它,没有注意到更改。尽管如此,您还是应该对此进行描述或解释,以便对其他人有所帮助。