Используйте PACKAGE_VERSION в аргументе AC_OUTPUT () - PullRequest
0 голосов
/ 23 октября 2018

Заранее извиняюсь за отсутствие опыта работы с m4sh.

У меня есть файл configure.ac, содержащий следующие строки:

AC_INIT([libhelloworld], [2.5])

...

AC_OUTPUT([
Makefile
src/helloworld-${PACKAGE_VERSION}.pc
src/Makefile
])

Причина, стоящая за аргументом AC_OUTPUT() я хотел бы избежать копирования и вставки новой версии моей программы в нескольких местах при каждом обновлении.Поэтому я решил использовать макрос PACKAGE_VERSION, автоматически определяемый при вызове AC_INIT() в начале configure.ac.

Строка src/helloworld-${PACKAGE_VERSION}.pc затем корректно расширяется до src/helloworld-2.5.pc, и все, кажется, работаетхорошо.Однако у меня есть пара вопросов.

  1. Я использую ${PACKAGE_VERSION} в качестве переменной оболочки, но PACKAGE_VERSION сам по себе является макросом m4.Могу ли я верить, что это всегда будет работать?Будет ли оно всегда определяться как таковое при вызове AC_OUTPUT()?
  2. Существуют ли другие способы получения значения PACKAGE_VERSION в пределах configure.ac?Например, если бы вместо configure.ac я был внутри Makefile.am, я бы не использовал фигурные скобки, а вместо этого синтаксис оценки команды, как в $(PACKAGE_VERSION).Как правильно делать то, что я хочу в configure.ac?

1 Ответ

0 голосов
/ 26 октября 2018

Документация для AC_INIT гласит, что PACKAGE_VERSION является «выходной переменной», то есть, когда вы вызываете AC_INIT, выполняется что-то вроде этого:

AC_SUBST([PACKAGE_VERSION], [2.5])

Это позволяет конфигурировать вводфайлы, такие как Makefile.in (сгенерированные из Makefile.am) для использования @PACKAGE_VERSION@ внутри этих файлов, заменяемых на 2.5.

Нет ничего плохого в вашем подходе, если он работает, но вы можете рассмотреть возможность использованияAS_VAR_SET([hello_version], [AC_PACKAGE_VERSION]) для установки переменной оболочки hello_version и src/helloworld-${hello_version}.pc на входе Autoconf.Таким образом, даже если Autoconf больше не предоставляет переменную оболочки PACKAGE_VERSION в каком-либо будущем выпуске, ваш код не сломается, поскольку вы будете полагаться на свою собственную переменную hello_version.


КакКроме того, использование helloworld-2.5.pc немного нерегулярно, когда версия helloworld равна 1.0 или выше (т.е. API стабильный).Обычно можно увидеть helloworld.pc, за исключением того, что возникает проблема того, что происходит, когда вы выпускаете 3.0 и заменяете установленную версию 2.x helloworld.pc на версию 3.0: если вы используете семантическое управление версиями, 3.0 несовместимо с 2.x, и любой код, использующий что-то вроде pkg-config --libs helloworld, сломается.

Тогда вы можете вместо этого использовать helloworld-2.pc, а когда вы выпускаете 3.0, вместо этого у вас будет helloworld-3.pc, чтобы избежать пользователей вашегобиблиотека, связывающая некорректную / несовместимую библиотеку (а также позволяющую пользователям переходить на новую версию в своем собственном темпе);можно также применить эту идею в Automake для директории заголовка для конкретной версии:

## SOURCE PATH     => INSTALL PATH
## include/hello.h => $(includedir)/helloworld-2/hello.h
helloincludedir = @includedir@/helloworld-@hello_major@
helloinclude_HEADERS = include/hello.h

Autoconf также позволяет указывать входные данные выходного файла, так что можно создать выходной файл src/helloworld-${hello_major}.pc в каталоге сборки.из src/helloworld.pc.in в исходном каталоге без необходимости обновлять имя файла src/helloworld.pc.in при переходе с 2.x на 3.0;это также можно использовать с AC_INIT, если вы в порядке с макросами, что позволяет вам контролировать информацию о версии в одном центральном месте:

m4_define([hello_version_major], [2]) dnl
m4_define([hello_version_minor], [5]) dnl
m4_define([hello_version], [hello_version_major[.]hello_version_minor]) dnl
AC_PREREQ([2.69])
AC_INIT([libhelloworld], [hello_version])
AS_VAR_SET([hello_major], [hello_version_major])
AS_VAR_SET([hello_minor], [hello_version_minor])
# For automake and configuration of pkg-config file
AC_SUBST([hello_major])
AC_SUBST([hello_minor])
AC_SUBST([hello_version])
...
AC_CONFIG_FILES([
    Makefile
    src/Makefile
    src/helloworld-]hello_version_major[.pc:src/helloworld.pc.in
])
AC_OUTPUT

Я понимаю, что это выглядит удивительно сложнее, чем можно было ожидать,но это Autoconf для вас.Обратите внимание, что мне пришлось использовать нечетные кавычки в AC_CONFIG_FILES, чтобы использовать макрос.Использование

src/helloworld-${hello_major}.pc:src/helloworld.pc.in

вместо макроса привело к созданию поврежденного файла config.status в Autoconf 2.69 (попробуйте config.status без аргументов, затем config.status src/helloworld-2.pc, чтобы увидеть проблему);Я не проверял никаких других версий.Я сообщил об ошибке, но макрос работает до следующего выпуска.

...