Заменить переменную в макрос m4 при запуске autoconf - PullRequest
0 голосов
/ 16 июня 2020

У меня есть что-то подобное в моем configure.a c, где двоичное имя задается и передается через AC_SUBST, и это же двоичное имя затем жестко закодировано в различных других макросах m4.

UTIL_BIN_NAME=foobar
...
AC_ARG_WITH([utils],
  [AS_HELP_STRING([--with-utils],
  [build foobar binary (default=yes)])],
  [build_utils=$withval],
  [build_utils=yes])
...
AC_SUBST(UTIL_BIN_NAME)

Есть ли способ, которым я могу заменить переменную, чтобы двоичное имя было жестко закодировано только в одном месте, а не в нескольких местах. например, что-то вроде:

UTIL_BIN_NAME=foobar
...
AC_ARG_WITH([utils],
  [AS_HELP_STRING([--with-utils],
  [build $UTIL_BIN_NAME binary (default=yes)])],
  [build_utils=$withval],
  [build_utils=yes])
...
AC_SUBST(UTIL_BIN_NAME)

Вышеупомянутое, к сожалению, не работает, так что это просто пример того, чего я надеюсь достичь.

Я пытался выполнить различные поиски, чтобы попытаться найти правильный способ сделать это, но как-то не хватает и ничего не нахожу. Как этого добиться?

1 Ответ

1 голос
/ 16 июня 2020

Вы можете использовать переменные оболочки в аргументах макроса Autoconf, но это не всегда дает желаемый эффект. Autoconf не расширяет их сам (обычно; здесь есть совсем другая история), но вас может сбить с толку тот факт, что порядок кода в сгенерированном сценарии configure не соответствует строго порядку макросов в Autoconf ввод. В частности, код для обработки аргументов идет впереди, почти перед всем остальным. Кроме того, ссылки на переменные не используются синтаксически или семантически в сценарии оболочки в некоторых местах, где макросы Autoconf вводят свои аргументы.

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

Autoconf переименовывает практически все встроенные функции m4 в пространство имен m4_, поэтому базовый c define встроенный будет записан как «m4_define»:

m4_define([UTIL_BIN_NAME], [foobar])

Определение макроса m4, такое как это, вступает в силу при обработке, поэтому оно не чувствительно к манипуляциям Autoconf с порядок вывода. Последующие появления UTIL_BIN_NAME будут расширены Autoconf в соответствии с данным определением, с учетом цитат из . Конечно, вам нужна переменная оболочки для использования с AC_SUBST и для некоторых других целей, но создать переменную оболочки из макроса не так уж сложно.

Цитирование немного сложно, но это дает желаемый результат (насколько я понимаю) для меня:

m4_define([UTIL_BIN_NAME], [foobar])
# Create a shell variable with the same name and (initial) value as the macro:
[UTIL_BIN_NAME]=UTIL_BIN_NAME

# Note: one could use the (a) macro to customize the names of shell variables
# such as 'build_utils', too, if that were desirable.  Details are left as an
# exercise.
AC_ARG_WITH([UTIL_BIN_NAME],
  [AS_HELP_STRING([--with-[]UTIL_BIN_NAME],
    [build ]UTIL_BIN_NAME[ binary (default=yes)])],
  [build_utils=$withval],
  [build_utils=yes]
)

# ...

AC_SUBST([UTIL_BIN_NAME])
...