Makefile:目标依赖项声明中特定于目标的变量

nih*_*hit 3 makefile gnu-make

我正在尝试编写一个使用特定于目标的变量的 makefile,但是虽然在每个目标和先决条件主体中正确设置了变量,但先决条件列表本身并未使用该变量进行更新,从而导致检查和检查错误的先决条件叫。

如何也更新先决条件中特定于目标的变量?

在下面的示例中, 和make foomake 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)

Max*_*kin 5

6.11 特定于目标的变量值

\n
\n

与自动变量一样,这些值仅在 target\xe2\x80\x99s 配方的上下文中可用(以及其他特定于目标的分配)。

\n
\n

但不在先决条件列表中。换句话说,infoo:$(X) X不是特定于目标的。

\n
\n

达到预期结果的一种方法是:

\n
same_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\n
Run 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\n
Run Code Online (Sandbox Code Playgroud)\n