Как перейти к следующему заголовку конфигурации в Autoconf - PullRequest
1 голос
/ 17 мая 2019

Autoconf допускает несколько файлов конфигурации в AC_CONFIG_HEADERS.Из руководства Autoconf :

- Макрос: AC_CONFIG_HEADERS (header ..., [cmds], [init-cmds])

Этот макрос одиниз инстанцирующих макросов;см. Действия по настройке.Заставьте AC_OUTPUT создать файл (ы) в заголовке списка, разделенного пробелом или новой строкой, содержащего операторы препроцессора C #define, и замените '@ DEFS @' в сгенерированных файлах на -DHAVE_CONFIG_H вместо значения DEFS.Обычное имя для заголовка - config.h.

...

Мы используем два заголовка config.Первый называется config_asm.h и включает определения доступности ISA, такие как SSE2, SSSE3, SSE4.1, AES, CLMUL, SHA и т. Д. Второй называется config_cxx.h и включает определения для функций C ++, таких какатомика, alignof, alignas, синхронизация и т. д. Пользователи включают в себя верхний уровень config.h, который включает в себя подчиненные файлы конфигурации, такие как config_asm.h и config_cxx.h.

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

Как переключаться между файлами конфигурации при использовании Autoconf?


Вот то, что я имею до сих пор.Я считаю, что мне нужно изменить что-то вроде AC_CONFIG_HEADERS([config_asm.h config_cxx.h]).Но мне не ясно, как сказать Autoconf записать результаты в определенный файл конфигурации.

AC_INIT([Crypto++], [8.3], [http://cryptopp.com/bugs], [cryptopp], [http://cryptopp.com/])
AM_INIT_AUTOMAKE

AC_PROG_CXX
AC_LANG([C++])

AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_HEADERS([config_asm.h])
AC_CONFIG_FILES([Makefile] [libray.pc])
AC_CONFIG_SRCDIR([configure.ac])

Когда я сообщаю Autoconf, что есть второй файл конфигурации, это приводит к ошибке.Я подозреваю, что упускаю что-то простое, но я не уверен, что это такое, поскольку руководство не обсуждает это.

AC_CONFIG_HEADERS([config_asm.h config_cxx.h]) приводит к:

autoreconf -f -i
...

configure.ac:105: installing './compile'
configure.ac:95: installing './missing'
configure.ac:101: error: required file 'config_cxx.h.in' not found
Makefile.am: installing './depcomp'

1 Ответ

1 голос
/ 18 мая 2019

Требуется небольшое чтение между строк, чтобы понять все, что говорят документы Autoconf, и требуется широкое понимание Autoconf, чтобы понять, где еще документы могут что-то сказать. В частности,

Сделать AC_OUTPUT создать файл (ы) в списке, разделенном пробелом или новой строкой header

зависит от вас, чтобы понять, что то, что AC_OUTPUT делает для генерации заголовков, очень похоже на то, что оно делает для генерации файлов, указанных с помощью AC_CONFIG_FILES: оно генерирует их из шаблонов. В случае заголовков он ожидает другую форму шаблона и заполняет его на основе другого набора определений символов (из AC_DEFINE, в отличие от * из 1012 *), но это все еще просто обработка шаблона. Немного позже об этом есть дополнительная подсказка в описании AC_CONFIG_HEADERS, где написано

Обычно входной файл называется header.in; однако вы можете переопределить имя входного файла [...]

Важно, что ни сгенерированный configure, ни сгенерированный config.status не записывают и не изменяют шаблоны. Основной ответ, таким образом, заключается в том, что вы контролируете, в каком заголовке или заголовках определяется каждый символ, управляя шаблонами .

И это, конечно, хитрость. В типичном проекте с одним заголовком конфигурации обычно (заново) генерируется шаблон заголовка конфигурации при необходимости путем запуска autoheader, как правило, под управлением autoreconf. И вы все еще можете это сделать, но autoheader всегда отправляет all свой вывод в первый заголовок, определенный в вызове AC_CONFIG_HEADERS. (Он даже не создает пустые шаблоны для каких-либо других заголовков, поэтому вы получили ошибку о том, что config_cxx.h.in не найдено.)

Если вы не можете использовать только один заголовок, вам нужно поддерживать все шаблоны заголовков, кроме одного (полу), вручную. Поскольку autoreconf приведет к обновлению первого, я собираюсь предложить, что если важно иметь два заголовка, ни один из которых не содержит всех определений, то выберите «ни один из вышеперечисленных» в качестве первого заголовка. Вместо этого определите другой заголовок , который на практике не используется, но указан первым. Создайте свои шаблоны для двух реальных конфиг-заголовков из частей автоматически управляемого.

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

AC_CONFIG_COMMANDS_PRE([pushd "$srcdir" && { ./generate_header_templates; popd; }])

При запуске autoreconf вам все равно понадобятся как минимум пустые версии каждого требуемого файла шаблона.

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

...