我有一个使用autotools的大型项目,其中包含一些构建到实用程序库中的代码。该项目有很多依赖项,我想为移动环境(Android / iOS)编译该实用程序库的特定子集。我希望对于该特定功能子集不需要很多依赖项,并且由于技术原因而无法为这些体系结构/平台编译整个项目。
这个迷你版的图书馆实际上不仅对我有用,对其他人也有用。这就是为什么项目的维护者建议为--enable-mini
脚本引入configure
标志的原因。经过一些实验(我之前从未在configure.ac
内做过任何事情)我实际上有一个构建工作来构建这个额外的 mini 库。
现在要点:是否有一种干净的方法可以排除所有其他项目可执行文件和库的构建?我想要的是./configure --enable-mini
调用,只会生成libutilmini.a
/ libutilmini.la
。当然,有些组件可以通过--disable-X
选项禁用,但显然项目的设置方式并不能使所有组件成为可选项。除了构建迷你库似乎没有必要构建其他所有内容之外,整个项目不会为iOS平台构建。
我真的想避免在每个子目录中的所有if HAVE_MINI [...]
添加Makefile.am
,特别是因为迷你库对大多数其他开发人员没用,这似乎不是一个优雅的方法。有没有推荐的方法来实现这些目标?
我知道我可以使用我需要的源代码创建一个新项目并构建它们,但正如我所说, 对某些其他开发人员有用,太
答案 0 :(得分:2)
如果你想使用没有参数的常规make
命令有条件地使用automake编译某些东西,你有使用automake条件(你引用的if HAVE_MINI
) ;没有其他办法。但是,您可以做的事情是在您的顶层build_mini
中创建一个额外的目标(比如Makefile.am
),这取决于构建您{{1}所需的一切}}。然后,您可以告诉别人,如果他们想要构建libmini
(而不是其他任何内容),则他们不会运行libmini
,而是会运行make
。这看起来像是:
(toplevel Makefile.am)
make build_mini
或其他一些(详细信息取决于构建libmini.la所需的内容)。
然后你将bar / Makefile.am看起来像这样:
SUBDIRS = foo bar baz
build_mini:
$(MAKE) -C foo libmini-depends
$(MAKE) -C bar libmini.la
唯一真正需要在条件内部的是将libmini.la添加到lib_LTLIBRARIES;其他一切都可以是无条件的。因此,使用此方法,您应该只有一个if WANT_MINI
lib_LTLIBRARIES += libmini.la
endif
libmini_la_SOURCES = # ...
构造。