Требуется небольшое чтение между строк, чтобы понять все, что говорят документы 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
вам все равно понадобятся как минимум пустые версии каждого требуемого файла шаблона.
С положительной стороны это также означает, что вам не нужно выбирать только один заголовок для каждого символа. Если есть какие-то элементы, которые вы хотели бы иметь в обоих заголовках, вам просто нужно написать оба шаблона соответствующим образом.