我正在尝试编写一个使用特定于目标的变量的 makefile,但是虽然在每个目标和先决条件主体中正确设置了变量,但先决条件列表本身并未使用该变量进行更新,从而导致检查和检查错误的先决条件叫。
如何也更新先决条件中特定于目标的变量?
在下面的示例中, 和make foo都make bar应该打印“world”,但make foo打印“hello”。
X=hello
hello:
echo "hello"
world:
echo "world"
foo:X=world
foo:$(X)
bar:X=world
bar:
make $(X)
Run Code Online (Sandbox Code Playgroud)
我试图实现的目标是,通过将文件夹作为特定于目标的变量传递,不同的目标将构建类似的先决条件 - 相同的文件,在不同的文件夹中。问题是,如下例所示,如果第一个目标被调用(foo在示例中为 ),则调用第二个目标不会执行任何操作。
DIR=fooDir
FILE=$(DIR)/filename
$(FILE):
touch $(FILE)
echo $(FILE)
foo: $(FILE)
bar:DIR=barDir
bar: $(FILE)
Run Code Online (Sandbox Code Playgroud)
\n\n与自动变量一样,这些值仅在 target\xe2\x80\x99s 配方的上下文中可用(以及其他特定于目标的分配)。
\n
但不在先决条件列表中。换句话说,infoo:$(X) X不是特定于目标的。
达到预期结果的一种方法是:
\nsame_files := filename another_filename\n\n# ${1} is the target name.\n# ${2} is the directory.\ndefine similar_prerequisites\n${1} : $(addprefix ${2}/,${same_files})\n$(addprefix ${2}/,${same_files}) : | ${2}\n touch $$@\n${2} :\n mkdir $$@\nendef\n\nall : foo bar\n\nfoo bar :\n @echo "$@ prerequisites are $^"\n\n$(eval $(call similar_prerequisites,foo,fooDir))\n$(eval $(call similar_prerequisites,bar,barDir))\n\nRun Code Online (Sandbox Code Playgroud)\n输出:
\n$ make\nmkdir fooDir\ntouch fooDir/filename\ntouch fooDir/another_filename\nfoo prerequisites are fooDir/filename fooDir/another_filename\nmkdir barDir\ntouch barDir/filename\ntouch barDir/another_filename\nbar prerequisites are barDir/filename barDir/another_filename\nRun Code Online (Sandbox Code Playgroud)\n