代码之家  ›  专栏  ›  技术社区  ›  jww avp

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

  •  0
  • jww avp  · 技术社区  · 7 年前

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

    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
    

    这是一大块 configure 从…起 cat -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
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   John Bollinger    7 年前

    用于测试是否设置了变量的shell语法没有任何错误,它可以与Autoconf配合使用。

    这个问题似乎是由于没有引用第三个论点引起的 AC_CHECK_FILE() 尤其地 当该参数是或包含宏调用本身时。我可以在中重现语法错误 configure 通过在 AC_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代码。

        2
  •  1
  •   Aaron D. Marasco    5 年前

    我遇到了这个老问题,我想我应该分享一个解决方案,当我需要检查设置了多个变量时,我最终使用了这个解决方案(在这个经过净化的示例中, VAR1 VAR4 ):

    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
    ])