如何在[action-if-true]

时间:2017-11-04 20:43:14

标签: c++ pthreads autoconf

我们正在尝试测试-pthread可用性,并在CXXFLAGSLDFLAGS中设置标记。我们不想使用ax_pthread因为它使用了错误的编译器并为C ++项目设置了错误的标志。根据{{​​3}},-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不会产生与测试相关的警告。

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

我们希望在[action-if-true]中执行三项操作:

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

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

1 个答案:

答案 0 :(得分: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])