我想要的是使用嵌套的autotools包构建我的autotools包。它是一个静态库,如果您输入$prefix/lib
make && make install
文件夹中安装lib
子包档案
configure.ac
AC_INIT([testlib],[1.0],[bugs@anonym.net])
AM_INIT_AUTOMAKE([foreign -Wall -Werror])
AC_PROG_CC()
AC_PROG_RANLIB()
AC_CHECK_HEADERS()
AC_LANG([C])
AC_CONFIG_FILES([Makefile src/Makefile])
AC_OUTPUT
Makefile.am
SUBDIRS = src
的src / Makefile.am
lib_LIBRARIES = libtestlib.a
libtestlib_a_SOURCES = testlib.c
include_HEADERS = testlib.h
但是我想在我的autotools包中将它用作嵌套包,并且只需要在构建时间时进行链接。
那么我如何实现我的软件包是build&安装,但子/嵌套包只是构建而不修改 configure.ac或子包中的Makefile.am?
答案 0 :(得分:1)
使用AC_CONFIG_SUBDIRS([testlib])
。有关代码示例,请在the documentation中详细了解它。
修改强>
如果您想在不触及子包的情况下构建便捷库(例如,如果您将其存储为主Git存储库中的Git子模块),那么您可以:
configure.ac
复制到您的包裹configure.ac
configure.ac
包括AC_OUTPUT([subpackage/Makefile])
subpackage
SUBDIRS
退出Makefile.am
让您的软件包Makefile.am
按照您希望的方式构建子包的相关部分,例如
noinst_LIBRARIES = subpackage/libsubpackage.a
subpackage_libsubpackage_a_SOURCES = subpackage/source.c etc.
这可能不是您想要的,因为它涉及复制大量子包的构建系统,但它确实允许您将子包丢弃到包中。
答案 1 :(得分:1)
我不确定这是不是太过于hackish,但是给SUBDIRS变量一个特定于目标的值似乎工作并且看起来相对优雅:
SUBDIRS = src
install installdirs: SUBDIRS =
或更常见的
SUBDIRS := foo bar libgazonk
install installdirs: SUBDIRS := $(filter-out libgazonk, $(SUBDIRS))
(避免无限递归所需的简单扩展。)
答案 2 :(得分:1)
那么我如何实现我的软件包已构建并安装,但 /嵌套包仅在无需修改的情况下构建即可。 子软件包中的Makefile.am?
您最好的选择是在顶层AC_CONFIG_SUBDIRS
中使用configure.ac
将子软件包的 configuration 与顶层软件包链接,但避免使用{顶级SUBDIRS
中的{1}}触发Makefile.am
递归到子包中。代替后者,将手动规则添加到顶层make
中,以通过递归Makefile.am
构建所需的库。
在顶级程序包中,看起来像这样:
configure.ac
make
Makefile.am
# ...
AC_CONFIG_SUBDIRS([testlib-1.0])
# ...
然后,请确保在需要的地方表达对# ... testlib-1.0 *not* present in SUBDIRS ...
testlib-1.0/src/libtestlib.a:
$(MAKE) -C testlib-1.0
的适当依赖,并在顶层使用适当的链接选项。