在我的Makefile中我想检查是否设置了多个环境变量。 但我不想为每一个写多个
ifndef
。我只想要一个变量数组以使其可重用。
check-variables:
for var in var1 var2 var3 ; do \
if [ -z "$$var" ] ; then \
echo "$$var is not set"; exit 1; \
fi \
done
但是它不起作用...
这不是 make 问题,而是 shell 问题。 如果您在 shell 提示符下运行该脚本(当然,将
$$
更改回 $
,就像 make 所做的那样),它也不起作用。 除非您能让命令在 shell 提示符下工作,否则您无法让它在 makefile 中工作。
shell 命令为:
for var in var1 var2 var3 ; do \
if [ -z "$var" ] ; then \
echo "$var is not set"; exit 1; \
fi \
done
您可以看到为什么这没有达到您想要的效果:您每次都在检查 shell 变量
var
。 您要做的是检查由 $var
的值命名的变量的值。 为此,您需要 eval (shell 的 eval,而不是 make 的 eval
函数):
for var in var1 var2 var3 ; do \
eval test -n \"\$$var\" \
|| { echo "$var is not set"; exit 1; }; \
done
您应该发现上面的内容可以在 shell 中运行,然后您需要将其放回到 makefile 中(并将所有
$
加倍)。
如果您不需要去除前导/尾随空格并且可以假设您的值不能包含单引号,则可以执行以下相当简洁的操作:
MISSING=$(shell for x in '${VAR1}' '${VAR2}' '${VAR3}' ; do [ \"$$x\" = \"\" ] && echo 1 ; done)
ifneq ($(MISSING),)
$(error Missing one or more required var(s): VAR1 VAR2 VAR3)
endif
工作原理:
for
循环中,我们只检查该值是否为空,如果是,则发出 1
1
字符(每个空变量一个)