在先决条件中创建函数

make functions in the prerequisites

我正在学习 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 也会运行。我预计它会执行另一条规则来首先构建该目标。当我用 echo $^ 替换 bash 行时,输出的所有内容都是 code/myscript.bash。它似乎没有在 $@ 上进行替换以构建先决条件。我现在看到我可以通过在目标和先决条件中使用 % 来获得所需的目标,但是是否可以在先决条件中使用函数?

FILES = folder1/file folder2/file folder3/file    

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

要使用依赖于规则目标的功能,您需要启用二次扩展。要启用二次扩展,除了在依赖项中将 $ 加倍外,还需要使用 .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,$@)

$ 加倍的作用是防止代码在第一次展开时被求值。

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