makefile使用target中定义的变量

时间:2017-11-15 14:37:58

标签: makefile

如何使用make target

中定义的变量
.PHONY: foo

VAR_GLOBAL=$(shell cat /tmp/global)

foo:
    echo "local" > /tmp/local
    VAR_LOCAL=$(shell cat /tmp/local)
    echo ${VAR_GLOBAL}
    echo ${VAR_LOCAL}

这是执行输出:

$ echo global > /tmp/global
$ make foo
echo "local" > /tmp/local
VAR_LOCAL=local
echo global
global
echo

2 个答案:

答案 0 :(得分:1)

您可能希望在override directive中使用target-specific variable assignment,请尝试:

foo: override LS_LOCAL=$(shell ls /var | tail -1)
    echo ${LS_GLOBAL}
    echo ${LS_LOCAL}

如果永远不会定义LS_LOCAL(即使是内置规则),您可能不需要override关键字。

顺便说一句,您可以使用wildcard functionlastword function相结合(可能与notdir function结合使用)来避免$(shell ls /var | tail -1),因此您可以编写$(lastword $(wildcard /var/*))或而是$(notdir $(lastword $(wildcard /var/*)))。但是,请注意扩展的顺序以及带空格的文件名。最后,shell function可能会使用您的$PATH variable(如果在ls之前出现一些奇怪的/bin/ls程序,可能会发生奇怪的事情。也许使用$(shell /bin/ls /var | /usr/bin/tail -1)可能会更好。

还要看Guile-extended make;考虑一些其他build-automation工具,例如ninja和/或生成Makefile(或其他构建配置),例如通过configure script生成的autoconf或{ {3}}

另请注意,配方中的命令可以由多个物理反斜线组成(因此在相同的 shell中执行)。也许你可能会考虑像

这样的东西
  export MY_VAR=$$(ls /var | tail); \
  dosomething; \
  use $$MY_VAR

在一些食谱中。

答案 1 :(得分:0)

正如@KelvinSherlock指出这是another question

的副本

这是我的问题的具体解决方案:

.PHONY: foo

VAR_GLOBAL=$(shell cat /tmp/global)

foo:
    echo "local" > /tmp/local
    $(eval VAR_LOCAL := $(shell cat /tmp/local))
    echo ${VAR_GLOBAL}
    echo ${VAR_LOCAL}