Документация для 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
, чтобы увидеть проблему);Я не проверял никаких других версий.Я сообщил об ошибке, но макрос работает до следующего выпуска.