Динамически изменять строку "configure --help" на основе компилятора

Этот вопрос связан с подстановкой строковой переменной справки для "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 в порядке, и по умолчанию отображается да. Когда я тестирую на Solaris с SunCC, значением по умолчанию является "да", что неверно:

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

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

Как динамически изменить значение по умолчанию и строку справки?

1 ответ

Решение

Как динамически изменить значение по умолчанию и строку справки?

Помни что configure --help выводит текст справки без запуска каких-либо (Autoconf) тестов. Поэтому сообщение справки не может быть изменено в зависимости от результатов таких тестов.

Помните также, что m4 обработка ввода Autoconf нечувствительна к реальному тексту ввода, за исключением m4 операторы и распознанные макросы. Следовательно, вы не можете использовать условные выражения оболочки для влияния m4 выходной. m4 имеет свой собственный набор встроенных условных макросов, но, конечно, они имеют свой эффект, когда вы создаете configure сценарий, а не когда вы его запускаете.

Таким образом, учитывая этот код:

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 сначала определяется как "включить хранилище потоков (по умолчанию - нет)", а затем очень быстро (и безусловно) переопределено на "включить хранение потоков (по умолчанию - да)", прежде чем оно когда-либо расширится. Оболочка 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, будут обязаны либо читать и понимать документы, либо просто предоставлять соответствующую опцию, как если бы не было значений по умолчанию. Пользователи, которые не заботятся об этом, получают поведение по умолчанию для выбранного компилятора.


  • Несколько других комментариев: я призываю вас избегать определения переменных оболочки с помощью ac_ префикс имени Такие имена зарезервированы для Autoconf.

  • Мне кажется немного странным, что вы используете "enable tls", чтобы определить значение условного выражения Automake с именем HAS_PTHREADS, Если это действительно выбираемая пользователем опция, по крайней мере, для некоторых компиляторов, то я бы назвал условную USE_PTHREADS и, возможно, назовите опцию --enable-pthreads,

Другие вопросы по тегам