Как выполнить несколько действий в [action-if-true]

Мы пытаемся проверить доступность -pthread и устанавливаем флаг как в CXXFLAGS, так и в LDFLAGS. Мы не хотим использовать ax_pthread, потому что он использует неправильный компилятор и устанавливает неправильные флаги для проекта C++. И согласно значению флага -pthread при компиляции, -pthread является наиболее переносимым, поэтому мы хотим использовать его как для CXXFLAGS, так и для LDFLAGS.

Сценарий, который мы добавили в 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]?


person jww    schedule 04.11.2017    source источник


Ответы (1)


Мне непонятно, почему вы используете оператор оболочки &&; он не будет работать, если предыдущий макрос m4 создает новую строку. Вам следует рассмотреть возможность использования ; или просто нескольких строк.

Также довольно часто в скриптах конфигурирования достаточно просто установить переменную оболочки в AC_COMPILE_IFELSE действиях, а затем проверить это. Это позволяет избежать глубоко вложенного кода оболочки и проблем, связанных с цитированием/расширением макросов 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])
person Florian Weimer    schedule 05.11.2017
comment
Спасибо, Флориан. Мне непонятно, почему вы используете оператор оболочки &&... - Это стандартный материал оболочки - && и ||. Я использую его, потому что Autoconf документация не говорит мне, что делать. Меня не удивляет, что это неправильно :) - person jww; 05.11.2017
comment
Кроме того, в скриптах конфигурации достаточно просто установить переменную оболочки... — У вас есть пример этого? Я тоже об этом думал, но не знал, как установить локальную переменную, которая не экспортировалась. То, что я пробовал, не удалось настроить, например set foo=1. - person jww; 05.11.2017