在先决条件中创建函数
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,$@)
$
加倍的作用是防止代码在第一次展开时被求值。
如果先决条件中使用的函数不依赖于仅在评估规则时存在的变量(如 $@
),则不需要二次扩展。
我正在学习 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,$@)
$
加倍的作用是防止代码在第一次展开时被求值。
如果先决条件中使用的函数不依赖于仅在评估规则时存在的变量(如 $@
),则不需要二次扩展。