Проверить, установлена ​​ли переменная окружения в скрипте настройки? - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь проверить, установлен ли ANDROID_NDK_ROOT в сценарии Autoconf. Соответствующая строфа показана ниже. Согласно Как проверить переменную среды? в списке рассылки 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 Ответ

0 голосов
/ 16 ноября 2018

Нет ничего плохого в синтаксисе вашей оболочки для проверки, установлена ​​ли переменная, и она отлично работает с 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])]
   )

Если не заключить в кавычки аргумент, он будет слишком многократно расширен, и полученный вывод действительно не будет синтаксически допустимым шелл-кодом.

...