Makefile:检查是否设置了多个变量

问题描述 投票:0回答:2

在我的Makefile中我想检查是否设置了多个环境变量。 但我不想为每一个写多个

ifndef
。我只想要一个变量数组以使其可重用。

check-variables:
  for var in var1 var2 var3 ; do \
    if [ -z "$$var" ] ; then \
      echo "$$var is not set"; exit 1; \
    fi \
  done

但是它不起作用...

makefile sh
2个回答
3
投票

这不是 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 中(并将所有

$
加倍)。


0
投票

如果您不需要去除前导/尾随空格并且可以假设您的值不能包含单引号,则可以执行以下相当简洁的操作:

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

工作原理:

  • 这种方法不是列出 var 名称,然后必须弄清楚如何取消引用 var 名称,而是列出 var 值,然后检查每个值
  • for
    循环中,我们只检查该值是否为空,如果是,则发出
    1
  • 这会将 MISSING makefile 变量设置为空白(没有变量为空),或一系列
    1
    字符(每个空变量一个)
  • 然后我们可以检查 MISSING 是否为空,以确定是否有任何变量为空
© www.soinside.com 2019 - 2024. All rights reserved.