首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于编译器动态更改“配置-帮助”字符串

基于编译器动态更改“配置-帮助”字符串
EN

Stack Overflow用户
提问于 2018-07-29 15:40:33
回答 1查看 127关注 0票数 1

这个问题与Help string variable substitution for “configure --help”有关。我们的configure.ac有以下内容。IS_SUN_COMPILER按预期工作。

代码语言:javascript
运行
复制
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上测试时,默认值是“是”,这是不正确的:

代码语言:javascript
运行
复制
CXX=/opt/developerstudio12.6/bin/CC ./configure --help
...

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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选项的默认值取决于所使用的编译器,所以只需说明这一点。记住用户的选择(如果有的话),然后在编译器确定之后应用它。也许是这样的:

代码语言:javascript
运行
复制
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“来确定一个名为HAS_PTHREADS的Automake条件的值有点可疑。如果这确实是一个用户可选择的选项,至少对某些编译器来说是这样的,那么我应该将条件USE_PTHREADS命名为--enable-pthreads,并可能将其命名为--enable-pthreads
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51581918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档