检查是否在配置脚本中设置了环境变量?

时间:2018-11-16 03:54:52

标签: environment-variables autotools autoconf

我正在尝试测试是否在Autoconf脚本中设置了ANDROID_NDK_ROOT。相关节如下所示。根据自动配置邮件列表上的How can I check an environment variable?,我可以使用:

if test "${var+set}" = set; then
  echo "variable \$var is set to: $var"
fi 

未设置该变量,但是我的AC_MSG_ERROR未执行。

$ printenv | grep ANDROID_NDK_ROOT
$

相反,测试产生以下错误:

./configure: line 20616: syntax error near unexpected token `('
./configure: line 20616: `  $as_echo_n "(cached) " >&6'

(该主题中还有另一个答复,但这似乎只是评论,不能回答问题)。

如何测试是否在Autoconf中设置了环境变量?


这是我要在configure.ac中执行的节:

# if test "$IS_ANDROID_OS" != "0"; then
if true; then

   if test "${ANDROID_NDK_ROOT+set}" != set; then
     AC_MSG_ERROR([ANDROID_NDK_ROOT is not set. Please set ANDROID_NDK_ROOT])
   fi 

   THIS_FILE="$ANDROID_NDK_ROOT/sources/android/cpufeatures/cpu-features.h"
   AC_CHECK_FILE([$THIS_FILE],
      [cp "$THIS_FILE" "$ac_srcdir"],
      AC_MSG_RESULT([cpu-features.h does not exist in ANDROID_NDK_ROOT, skipping])
   )

   THIS_FILE="$ANDROID_NDK_ROOT/sources/android/cpufeatures/cpu-features.c"
   AC_CHECK_FILE([$THIS_FILE],
      [cp "$THIS_FILE" "$ac_srcdir"],
      AC_MSG_RESULT([cpu-features.c does not exist in ANDROID_NDK_ROOT, skipping])
   )
fi

这是configurecat -n的一部分:

 20610
 20611     THIS_FILE="$ANDROID_NDK_ROOT/sources/android/cpufeatures/cpu-features.c"
 20612     as_ac_File=`$as_echo "ac_cv_file_$THIS_FILE" | $as_tr_sh`
 20613  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $THIS_FILE" >&5
 20614  $as_echo_n "checking for $THIS_FILE... " >&6; }
 20615  if eval \${$as_ac_File+:} false; then :
 20616    $as_echo_n "(cached) " >&6
 20617  else
 20618    test "$cross_compiling" = yes &&
 20619    as_fn_error $? "cannot check for file existence when cross compiling""$LINENO" 5
 20620  if test -r "$THIS_FILE"; then
 20621    eval "$as_ac_File=yes"
 20622  else
 20623    eval "$as_ac_File=no"
 20624  fi

2 个答案:

答案 0 :(得分:1)

用于测试是否设置了变量的shell语法没有任何问题,并且可以与Autoconf一起正常工作。

该问题似乎是由于未能为AC_CHECK_FILE()宏引用第三个参数而引起的。您应该始终用引号(用方括号括起来)引用每个宏的每个参数,尤其是当该参数本身是一个宏调用或包含一个宏调用本身时。通过将您提供的示例代码包装在configureAC_INIT之间,我可以在AC_OUTPUT中重现语法错误,但是使用正确的引用可以消除该错误。具体来说,在这里:

   THIS_FILE="$ANDROID_NDK_ROOT/sources/android/cpufeatures/cpu-features.h"
   AC_CHECK_FILE([$THIS_FILE],
      [cp "$THIS_FILE" "$ac_srcdir"],
      [AC_MSG_RESULT([cpu-features.h does not exist in ANDROID_NDK_ROOT, skipping])]
   )

   THIS_FILE="$ANDROID_NDK_ROOT/sources/android/cpufeatures/cpu-features.c"
   AC_CHECK_FILE([$THIS_FILE],
      [cp "$THIS_FILE" "$ac_srcdir"],
      [AC_MSG_RESULT([cpu-features.c does not exist in ANDROID_NDK_ROOT, skipping])]
   )

不引用该参数会导致该参数被扩展太多次,并且所得到的输出确实不是语法上有效的shell代码。

答案 1 :(得分:1)

我遇到了这个老问题,并认为我会分享一个最终需要使用的解决方案,当我需要检查多个变量的设置时(在这个经过清理的示例中,VAR1VAR4): / p>

m4_foreach_w([my_var],[VAR1 VAR2 VAR3 VAR4],[
  AS_VAR_IF(myvar, [], AC_MSG_ERROR([Missing required variable: myvar!]))
  AC_SUBST(myvar)dnl Export variable to Makefile as well
  AC_ARG_VAR(myvar, [])dnl if this variable changes, re-run configuration
])