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

时间:2018-07-29 15:40:34

标签: autotools autoconf m4

此问题与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)

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

1 个答案:

答案 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