Используйте подстановку конфигурации в `lib_LTLIBRARIES` - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь реализовать с помощью 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 взято из подстановки конфигурации?

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Я не понимаю, почему -release не будет работать для вас, поэтому я просто опущу это решение из этого ответа. Процедура аналогична, но создаст другие .so имена файлов (например, libfoo-1.2.so и libfoo.so), но с тем же .a именем.

configure.ac

AC_INIT([myproject],[0.1],[project@example.com])
AC_PREREQ([2.69])
AC_CONFIG_SRCDIR([src/foo.c])
AC_PROG_CC
AC_ARG_ENABLE([multi], AS_HELP_STRING([--enable-multi], [Enable multi]))
AM_INIT_AUTOMAKE([1.15 foreign])
AM_PROG_LIBTOOL
AM_CONDITIONAL([MULTI_NAME], [test "x$enable_multi" = "xyes"])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT

Makefile.am

SRCS=src/foo.c
lib_LTLIBRARIES=
if MULTI_NAME
lib_LTLIBRARIES+=libfoo-1.2.la
libfoo_1_2_la_SOURCES=$(SRCS)
else
lib_LTLIBRARIES+=libfoo.la
libfoo_la_SOURCES=$(SRCS)
endif

./configure ; make создает libfoo.so.0.0.0 (в Linux, где управление версиями включено по умолчанию). ./configure --enable-multi ; make создает libfoo-1.2.so.0.0.0

Это не дает мне предупреждения, которые вы видели. Когда я пытаюсь использовать AC_SUBST, я вижу те же предупреждения; он собирает библиотеки в порядке.

0 голосов
/ 26 марта 2019

Я нашел ответ на свой вопрос. Если я использую одну и ту же подстановку конфигурации для обоих содержимого из lib_LTLIBRARIES и имен из libXXX_la_SOURCES libXXX_la_LDFLAGS libXXX_la_LIBADD, все работает нормально, как в следующий сценарий:

Содержимое configure.ac:

...

AC_SUBST([CUSTOM_NAME], [foo])

...

Содержимое src/Makefile.am:

...

lib_LTLIBRARIES = lib@CUSTOM_NAME@.la

lib@CUSTOM_NAME@_la_SOURCES = \
    foo.c

lib@CUSTOM_NAME@_la_LDFLAGS = \
    -version-info "2:0:0"

lib@CUSTOM_NAME@_la_LIBADD = 

...

Но по какой-то причине, как только я использую две разные замены конфигурации, , даже если они содержат одинаковый текст , я получаю ошибки выше. Таким образом, следующий сценарий не принят:

Содержимое configure.ac:

...

AC_SUBST([CUSTOM_NAME], [foo])
AC_SUBST([ANOTHER_NAME], [foo])

...

Содержимое src/Makefile.am:

...

lib_LTLIBRARIES = lib@CUSTOM_NAME@.la

lib@ANOTHER_NAME@_la_SOURCES = \
    foo.c

lib@ANOTHER_NAME@_la_LDFLAGS = \
    -version-info "2:0:0"

lib@ANOTHER_NAME@_la_LIBADD =

...
...