根据编译器动态更改 "configure --help" 字符串

Dynamically change "configure --help" string based on compiler

此问题与 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和OSX上测试都OK,显示默认是。当我用 SunCC 在 Solaris 上测试时,默认值是 default 是 yes 这是不正确的:

CXX=/opt/developerstudio12.6/bin/CC ./configure --help
...

  --enable-tls            enable thread storage (default is yes)

如何动态更改默认值和帮助字符串?

How do I dynamically change the default value and help string?

请记住,configure --help 输出的帮助文本没有 运行 任何 (Autoconf) 测试。因此,不能根据任何此类测试的结果改变帮助消息。

还请记住,m4 Autoconf 输入的处理对输入的实际文本不敏感,m4 运算符和已识别的宏除外。因此,您不能使用 shell 条件来影响 m4 的输出。 m4 确实有自己的一组内置条件宏,但是当您 构建 configure 脚本时,这些当然会产生效果,而不是当您是运行吧。

因此,给定此代码:

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 首先被定义为 "enable thread storage (default is no)",然后在它被展开之前很快(并且无条件地)重新定义为 "enable thread storage (default is 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 保留的。

  • 我觉得您使用 "enable tls" 来确定名为 HAS_PTHREADS 的 Automake 条件的值有点可疑。如果这确实是一个用户可选择的选项,至少对于某些编译器而言,那么我会将条件命名为 USE_PTHREADS,并且可能将该选项命名为 --enable-pthreads.