在"lib_LTLIBRARIES"中使用配置替换



我正在尝试使用Autotools为我的共享库实现"多版本选项":如果用户启用它,该库必须能够与自身的其他版本共存。这意味着二进制文件的名称必须包含版本字符串,或者至少包含将其与其他版本区分开来的任何字符串。

libtool有一个选项,-release,它正是这样做的。但是,正如这里所解释的,这不适用于我的目的,因为至少一个文件不会附加任何后缀,这将与包的其他版本产生冲突:

4.3. 多个库版本

虽然libtool旨在处理多个 在系统上实现相同 API(甚至 ABI)的库, 分配使这种必要性变得毫无意义。另一方面,它不是 对于要安装库的多个版本,这种情况并不常见,具有 实现多个 API,允许消费者选择他们支持的 版本。例如,Gtk+和Glib就是这种情况。

第一反应是将两个选项结合起来,-release-version-info;不过,这是错误的。使用-release静态存档,具有.a扩展名的存档,libtool 存档(请参阅 第 6 节 "Libtool 档案").so和 链接编辑器不会附加修订版,这意味着两个 不能同时安装不同版本的库。

在这种情况下,最好的选择是附加部分库的 库名称的版本信息,例如 Glib的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 将给出错误。

但是,我不是在将配置替换放入_SOURCES变量中,我试图做的是从配置替换中获取_SOURCES变量的名称本身。我发现至少有 11 个软件包可以做到这一点。

所以问题是:我做错了什么?有没有人能够生成一个最小的工作示例,其中lib_LTLIBRARIES的内容取自配置替换?

我不明白为什么-release不适合你,所以我就把这个解决方案排除在这个答案之外。 该过程类似,但会创建不同的.so文件名(例如libfoo-1.2.solibfoo.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时,我看到相同的警告;它构建库OK。

我已经找到了问题的答案。如果我对lib_LTLIBRARIES的内容libXXX_la_SOURCESlibXXX_la_LDFLAGSlibXXX_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 =
...

但是,出于某种原因,一旦我使用两个不同的配置替换,即使它们包含相同的文本,我也会收到上述错误

嗨,我刚刚找到了解决此问题的方法,它似乎有效。如果变量定义为用 AC_SUBST 替换,则可以在 Makefile.am 中的行之间重新分配变量

configure.ac:
AC_SUBST(CAN, "whatever")
AC_SUBST(SUFFIX1, ".foo")
AC_SUBST(SUFFIX2, "_foo")
...
Makefile.am
CAN=@SUFFIX1@
lib_LTLIBRARIES = libmylib@CAN@.la
CAN=@SUFFIX2@
libmylib@CAN@_la_SOURCES=$(lib_la_SOURCES)
libmylib@CAN@_la_LDFLAGS=$(lib_la_LDFLAGS)
libmylib@CAN@_la_CFLAGS=$(lib_la_CFLAGS)
libmylib@CAN@_la_LIBADD=$(lib_la_LIBADD)

相关内容

  • 没有找到相关文章

最新更新