此问题与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 X上进行测试是可以的,并且显示默认为是。当我使用SunCC在Solaris上测试时,默认值为默认值为yes ,这是错误的:
CXX=/opt/developerstudio12.6/bin/CC ./configure --help
...
--enable-tls enable thread storage (default is yes)
如何动态更改默认值和帮助字符串?
答案 0 :(得分:1)
如何动态更改默认值和帮助字符串?
请记住,configure --help
在不运行任何(Autoconf)测试的情况下输出帮助文本。因此,不能根据任何此类测试的结果来更改帮助消息。
还请记住,除了m4
运算符和可识别的宏之外,对Autoconf输入的m4
处理对输入的实际文本不敏感。因此,您不能使用shell条件来影响m4
的输出。 m4
确实有其自己的一组内置条件宏,但是,当您构建 configure
脚本时,它们当然会起作用,而不是当您< em>运行。
因此,给出以下代码:
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
,首先将宏HELP_STRING_TLS
定义为“启用线程存储(默认为否)”,然后很快(无条件)将其重新定义为“启用线程存储(默认为yes)”。扩展。外壳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保留的。
您在使用“启用tls”来确定名为HAS_PTHREADS
的Automake条件的值时,对我来说有点难闻。如果这确实是用户可选择的选项,至少对于某些编译器而言,则我将其命名为条件USE_PTHREADS
,并可能将选项命名为--enable-pthreads
。