【问题标题】:How to perform multiple actions in [action-if-true]如何在 [action-if-true] 中执行多个操作
【发布时间】:2017-11-04 20:43:13
【问题描述】:

我们正在尝试测试-pthread 的可用性并在CXXFLAGSLDFLAGS 中设置标志。我们不想使用ax_pthread,因为它使用了错误的编译器并为 C++ 项目设置了错误的标志。而根据Significance of -pthread flag when compiling 的说法,-pthread 是最便携的,所以我们想将它用于CXXFLAGSLDFLAGS

我们添加到configure.ac 的脚本是:

AC_ARG_ENABLE(tls,
   AS_HELP_STRING([--enable-tls], [enable thread storage (default is yes)]),
   ac_enable_tls=$enableval,
   ac_enable_tls=yes)
AM_CONDITIONAL(HAS_PTHREADS, test $ac_enable_tls = yes)

if test "$ac_enable_tls" = "yes"; then
   SAVED_CXXFLAGS="$CXXFLAGS"
   CXXFLAGS="-pthread"
   AC_MSG_CHECKING([for pthread support])
   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])],
      [AC_MSG_RESULT([-pthread]) && AC_SUBST([AM_CXXFLAGS], ["-pthread"]) && AC_SUBST([AM_LDFLAGS], ["-pthread"])],
      [AC_MSG_FAILURE(["--enable-tls=yes but pthreads are not available"])]
   )
   CXXFLAGS="$SAVED_CXXFLAGS"
fi

结果:

./configure: line 16173: syntax error near unexpected token `&&'
./configure: line 16173: ` && AM_LDFLAGS="-pthread"'

autoreconf --warnings=all 不会产生与测试相关的警告。

我猜问题在于尝试在AC_COMPILE_IFELSE[action-if-true] 中做三件事。 Autoconf AC_COMPILE_IFELSE 文档没有告诉我们如何处理这种情况,也没有提供示例。

我们要在[action-if-true]中执行三个动作:

  • 打印消息pthread
  • AM_CXXFLAGS += -pthread
  • AM_LDFLAGS += -pthread

如何在[action-if-true] 中执行多项操作?

【问题讨论】:

    标签: c++ pthreads autoconf


    【解决方案1】:

    我不清楚你为什么使用&& shell 运算符;如果前面的 m4 宏发出换行符,它将不起作用。您应该考虑使用; 或干脆多行。

    在配置脚本中也很常见,只是在 AC_COMPILE_IFELSE 操作中设置一个 shell 变量,然后再检查它。这避免了深度嵌套的 shell 代码,以及与 m4 引用/宏扩展相关的问题。这是一个来自 glibc 的示例:

      AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include <sys/sdt.h>                      
    void foo (int i, void *p)
    {
      asm ("" STAP_PROBE_ASM (foo, bar, STAP_PROBE_ASM_TEMPLATE (2)) ""
           :: STAP_PROBE_ASM_OPERANDS (2, i, p));
    }]])], [libc_cv_sdt=yes], [libc_cv_sdt=no])
    

    【讨论】:

    • 谢谢弗洛里安。 “我不清楚你为什么使用 && shell 运算符...” - 这是标准的 shell 东西 - &amp;&amp; and ||。我使用它是因为Autoconf documentation 没有告诉我该怎么做。它是错误的并不让我感到惊讶:)
    • “在配置脚本中也很常见,只是为了设置一个 shell 变量……” - 你有这方面的例子吗?我也想过,但不确定如何设置未导出的局部变量。我尝试配置的东西失败了,比如set foo=1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    相关资源
    最近更新 更多