【问题标题】:Makefile: target-specific variables in target dependencies declarationMakefile:目标依赖声明中的目标特定变量
【发布时间】:2020-01-19 04:55:15
【问题描述】:

我正在尝试编写一个使用特定于目标的变量的 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)

我试图实现的目标是不同的目标将构建相似的先决条件 - 相同的文件,在不同的文件夹中 - 通过将文件夹作为特定于目标的变量传递。问题在于,如下例所示,如果首先调用一个目标(在示例中为foo),则调用第二个目标将不会执行任何操作。

DIR=fooDir
FILE=$(DIR)/filename

$(FILE):
    touch $(FILE)
    echo $(FILE)

foo: $(FILE)

bar:DIR=barDir
bar: $(FILE)

【问题讨论】:

标签: makefile gnu-make


【解决方案1】:

6.11 Target-specific Variable Values:

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

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


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

same_files := filename another_filename

# ${1} is the target name.
# ${2} is the directory.
define similar_prerequisites
${1} : $(addprefix ${2}/,${same_files})
$(addprefix ${2}/,${same_files}) : ${2}
    touch $$@
${2} :
    mkdir $$@
endef

all : foo bar

foo bar :
    @echo "$@ prerequisites are $^"

$(eval $(call similar_prerequisites,foo,fooDir))
$(eval $(call similar_prerequisites,bar,barDir))

输出:

$ make
mkdir fooDir
touch fooDir/filename
touch fooDir/another_filename
foo prerequisites are fooDir/filename fooDir/another_filename
mkdir barDir
touch barDir/filename
touch barDir/another_filename
bar prerequisites are barDir/filename barDir/another_filename

【讨论】:

  • 编辑以解释我正在尝试做的事情。
  • @nihohit 为您添加了解决方案。
  • 谢谢,这行得通!问题是解决方案比仅仅声明 2 个变量要冗长得多,所以我必须检查我的代码并了解哪个是更可取的选项。
  • @nihohit 如果您找到更优雅的解决方案,我会很感兴趣。
猜你喜欢
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 2021-02-07
相关资源
最近更新 更多