Я пытаюсь реализовать с помощью Autotools «многовариантную опцию» для моей общей библиотеки: в случае, если пользователь включает ее, библиотека должна иметь возможность сожительствовать с другими ее версиями. Это означает, что имя двоичного файла должно содержать строку версии или, по крайней мере, любую строку, которая отличает его от других версий.
libtool имеет опцию -release
, которая делает именно это. Однако, как объяснено здесь , это не будет работать для моей цели, потому что по крайней мере к одному файлу не будет добавлен суффикс, и это создаст конфликт с другими версиями пакета:
4,3. Несколько версий библиотек
Хотя libtool был разработан для обработки множества
библиотеки, реализующие один и тот же API (и даже ABI) в системе,
распределения сделали это необходимость спорное. С другой стороны, это не
необычно для установки нескольких версий библиотеки, с
реализовано несколько API, позволяющих потребителям выбирать поддерживаемые
версия. Это касается, например, Gtk + и Glib.
Первая реакция будет сочетать два варианта, -release
и
-version-info
; это было бы, однако, неправильно. При использовании -release
статический архив, один с расширением .a
, архив libtool (см.
Раздел 6, «Архивы Libtool» ) и файл .so
, используемый
редактор ссылок будет не иметь добавленную ревизию, что означает
другая версия библиотеки не может быть установлена одновременно.
В этой ситуации лучше всего добавить часть библиотеки
информация о версии к названию библиотеки, примером которой является
libglib-2.0.so.0
Глиб сонама. Для этого декларация в
Makefile.am
должно быть так:
lib_LTLIBRARIES = libtest-1.0.la
libtest_1_0_la_LDFLAGS = -version-info 0:0:0
В параграфе, который я только что цитировал, также содержится общее решение этой проблемы, которое заключается в добавлении суффикса к имени двоичного файла вручную. Однако это может быть утомительной задачей, если библиотека часто меняет версию, и наверняка не подходит для моего случая, где суффикс должен добавляться , только если пользователь включает опцию .
Мне удалось подготовить среду в configure.ac
, чтобы следующие две подстановки переменных были установлены в пустую строку, если «опция мультиверсии» отключена, и когда она включена, они установлены как:
AC_SUBST([LIBRARY_SUFFIX_1], [-1.2])
AC_SUBST([LIBRARY_SUFFIX_2], [_1_2])
Но когда я пытаюсь экспортировать эти замены в src/Makefile.am
, как в следующем примере,
lib_LTLIBRARIES = libfoo@LIBRARY_SUFFIX_1@.la
libfoo@LIBRARY_SUFFIX_2@_la_SOURCES = \
foo.c
libfoo@LIBRARY_SUFFIX_2@_la_LDFLAGS = \
-version-info "2:0:0"
libfoo@LIBRARY_SUFFIX_2@_la_LIBADD =
Я получаю следующие сообщения об ошибках от configure
:
src/Makefile.am:17: warning: variable 'libfoo@LIBRARY_SUFFIX_2@_la_SOURCES' is defined but no program or library has 'libfoo@LIBRARY_SUFFIX_2@_la' as canonical name (possible typo)
src/Makefile.am:23: warning: variable 'libfoo@LIBRARY_SUFFIX_2@_la_LIBADD' is defined but no program or library has 'libfoo@LIBRARY_SUFFIX_2@_la' as canonical name (possible typo)
src/Makefile.am:20: warning: variable 'libfoo@LIBRARY_SUFFIX_2@_la_LDFLAGS' is defined but no program or library has 'libfoo@LIBRARY_SUFFIX_2@_la' as canonical name (possible typo)
После небольшого исследования я нашел несколько пакетов, которые делают именно то, что я пытался сделать ( # 1 , # 2 , # 3, # 4 , # 5 , # 6 , # 7 , # 8 , # 9 , # 10 , # 11 ). Я нашел также этот похожий вопрос на stackoverflow, но ответы не сильно помогают. Я даже нашел статью в официальном руководстве Automake , в которой предлагается пример, очень похожий на то, что я хочу сделать, но если я попытаюсь дословно скопировать и вставить его, я все равно получаю те же сообщения об ошибках.
С другой стороны, эта другая статья из того же руководства гласит, что
Вы не можете поместить подстановку конфигурации (например, ‘@FOO@
’ или ‘$(FOO)
’
где FOO
определяется через AC_SUBST
) в переменную _SOURCES
.
Причину этого трудно объяснить, но достаточно сказать, что
просто не сработает. Automake выдаст ошибку, если вы попытаетесь это сделать.
Однако я не помещаю подстановку configure в переменную _SOURCES
, я пытаюсь получить само имя переменной _SOURCES
из подстановки configure. И я нашел по крайней мере одиннадцать пакетов, которые делают именно это.
Так что вопрос: Что я делаю неправильно? Может ли кто-нибудь создать минимальный рабочий пример, в котором содержимое lib_LTLIBRARIES
взято из подстановки конфигурации?