检查配置脚本中是否设置了环境变量?
Check if environment variable is set in configure script?
我正在尝试测试是否在 Autoconf 脚本中设置了 ANDROID_NDK_ROOT
。相关节如下所示。根据 Autoconf 邮件列表上的 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
这是来自 cat -n
的 configure
的块:
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
您的 shell 测试变量是否已设置的语法没有任何问题,并且在 Autoconf 中工作正常。
问题似乎是由于未能引用 AC_CHECK_FILE()
宏的第三个参数引起的。你应该总是引用(用方括号)每个宏的每个参数,尤其是当该参数是或包含宏调用本身时。我可以通过将您提供的示例代码包装在 AC_INIT
和 AC_OUTPUT
之间来重现 configure
中的语法错误,但它会通过适当的引用消失。具体来说,这里:
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 代码。
我遇到了这个老问题,我想我会分享一个解决方案,当我需要检查设置了多个变量时我最终使用了这个解决方案(在这个经过净化的示例中,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
])
我正在尝试测试是否在 Autoconf 脚本中设置了 ANDROID_NDK_ROOT
。相关节如下所示。根据 Autoconf 邮件列表上的 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
这是来自 cat -n
的 configure
的块:
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
您的 shell 测试变量是否已设置的语法没有任何问题,并且在 Autoconf 中工作正常。
问题似乎是由于未能引用 AC_CHECK_FILE()
宏的第三个参数引起的。你应该总是引用(用方括号)每个宏的每个参数,尤其是当该参数是或包含宏调用本身时。我可以通过将您提供的示例代码包装在 AC_INIT
和 AC_OUTPUT
之间来重现 configure
中的语法错误,但它会通过适当的引用消失。具体来说,这里:
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 代码。
我遇到了这个老问题,我想我会分享一个解决方案,当我需要检查设置了多个变量时我最终使用了这个解决方案(在这个经过净化的示例中,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
])