这个问题与Help string variable substitution for “configure --help”有关。我们的configure.ac有以下内容。IS_SUN_COMPILER按预期工作。
IS_SUN_COMPILER=`echo $COMPILER_VERSION | $EGREP -i -c -E 'Sun C\+\+'`
...
if test "$IS_SUN_COMPILER" = "1"; then
DEF_VALUE_TLS=no
m4_define([HELP_STRING_TLS], [enable thread storage (default is no)])
else
DEF_VALUE_TLS=yes
m4_define([HELP_STRING_TLS], [enable thread storage (default is yes)])
fi
AC_ARG_ENABLE(tls,
AS_HELP_STRING([--enable-tls], [HELP_STRING_TLS]),
ac_enable_tls=$enableval,
ac_enable_tls=$DEF_VALUE_TLS)
AM_CONDITIONAL(HAS_PTHREADS, test $ac_enable_tls = yes)Linux和OS上的测试是可以的,默认情况是是的。当我用SunCC在Solaris上测试时,默认值是“是”,这是不正确的:
CXX=/opt/developerstudio12.6/bin/CC ./configure --help
...
--enable-tls enable thread storage (default is yes)如何动态更改默认值和帮助字符串?
发布于 2018-07-30 13:44:45
如何动态更改默认值和帮助字符串?
请记住,configure --help输出帮助文本而不运行任何(Autoconf)测试。因此,不能根据任何此类测试的结果更改帮助消息。
还请记住,Autoconf输入的m4处理对输入的实际文本不敏感,除了m4运算符和可识别的宏。因此,您不能使用shell条件来影响m4的输出。m4确实有它自己的一组内置条件宏,但是在构建configure脚本时,这些宏当然会产生效果,而不是在运行它时。
因此,考虑到这一代码:
如果测试"$IS_SUN_COMPILER“=”1“,则DEF_VALUE_TLS=no m4_define(HELP_STRING_TLS,启用线程存储(默认值为否))或DEF_VALUE_TLS=yes m4_define(HELP_STRING_TLS,启用线程存储(默认值为yes))
,宏HELP_STRING_TLS首先定义为“启用线程存储(默认为否)”,然后很快(无条件)重新定义为“启用线程存储(默认值为yes)”,然后再进行扩展。shell if构造只是m4的文本。
我建议您继续使帮助文本更通用。事实上,enable-tls选项的默认值取决于所使用的编译器,所以只需说明这一点。记住用户的选择(如果有的话),然后在编译器确定之后应用它。也许是这样的:
AC_ARG_ENABLE([tls],
AS_HELP_STRING([--enable-tls],
[enable thread-local storage (default is compiler-dependent)]),
[], [enable_tls=""]
)
# note: you get shell variable $enable_tls for free when the --enable or
# --disable option is given; no need to create another variable
# ...
AS_IF([test "x$enable_tls" = x], [
AS_IF([test "$IS_SUN_COMPILER" = "1"], [
enable_tls=no
], [
enable_tls=yes
]
])
AM_CONDITIONAL([HAS_PTHREADS], [test "$enable_tls" = yes])随附的文档可以在您认为合适的详细信息级别上解释此选项的默认值的编译器依赖性。真正关心是否使用TLS的用户将有义务阅读和理解文档,或者只是在没有默认的情况下提供适当的选项。不特别关心它的用户将得到所选编译器的默认行为。
ac_名称前缀定义shell变量。这些名称是为Autoconf保留的。HAS_PTHREADS的Automake条件的值有点可疑。如果这确实是一个用户可选择的选项,至少对某些编译器来说是这样的,那么我应该将条件USE_PTHREADS命名为--enable-pthreads,并可能将其命名为--enable-pthreads。https://stackoverflow.com/questions/51581918
复制相似问题