【问题标题】:Dynamically change "configure --help" string based on compiler根据编译器动态更改“configure --help”字符串
【发布时间】:2018-07-29 15:40:33
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: autotools autoconf m4


    【解决方案1】:

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

    请记住,configure --help 会在不运行任何 (Autoconf) 测试的情况下输出帮助文本。因此,帮助消息不能根据任何此类测试的结果而有所不同。

    还请记住,Autoconf 输入的m4 处理对输入的实际文本不敏感,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首先被定义为“启用线程存储(默认为否)”,然后很快(且无条件地)重新定义为“启用线程存储(默认为是)”,然后再扩展。 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 的用户将有义务阅读和理解文档,或者只是提供适当的选项,就好像没有默认设置一样。不特别关心它的用户会得到所选编译器的默认行为。


    • 其他几个 cmets:我敦促您避免使用 ac_ 名称前缀定义 shell 变量。这些名称是为 Autoconf 保留的。

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

    【讨论】:

    • 谢谢约翰。我认为带有通用消息的错误默认设置是一个糟糕的策略。现在是 2018 年,我们更愿意做额外的工作,而不是把它推给用户。我们当然不希望用户使用 RTFM。我们认为要求用户阅读手册是一种设计失败,这使它成为我们的错误。这些东西开箱即用应该很容易正确使用。
    • 关于变量名,Autconf 对--with-XXX--enable-XXX 使用什么?我们试图与 Autoconf 无缝集成,包括变量。 Autoconf 手册没有在Choosing Package Options 讨论该主题。 (而且它缺乏例子。这是我对文档最大的抱怨之一。几乎没有例子,所以一旦我们读到一些东西,我们就必须在网上搜索。我相信我们会遇到更糟糕的情况由于缺乏官方示例而导致的实践)。
    • 谁说错误默认设置,@jww?我建议如果用户没有指定,那么他们会获得适合其编译器的默认行为。如果只有一个正确的选择,那你为什么要提供一个选项呢?
    • 至于变量名,我带你问一下用--enable--with选项的值设置的变量,比如我建议使用的$enable_tls。这些在AC_ARG_ENABLEAC_ARG_WITH 宏的文档中进行了描述,这也是它们最常用的上下文。它们分别是$enable_XXX$with_XXX,XXX 中的任何非字母数字字符都转换为下划线(_)。
    猜你喜欢
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 2014-09-04
    • 2014-11-30
    • 1970-01-01
    • 2018-03-30
    相关资源
    最近更新 更多