如何使用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
答案 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
function与lastword
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}