使用 autotools 仅构建一小部分项目

Building only a small subset of project using autotools

我有一个使用 autotools 的大型项目,其中包含一些构建到实用程序库中的代码。该项目有很多依赖项,我想为移动环境编译该实用程序库的特定子集 (Android/iOS)。我希望对于那个特定的功能子集不需要很多依赖项,并且由于技术原因,不可能为那些 architectures/platforms 编译整个项目。

这个迷你版的库实际上不仅对我有用,对其他人也很有用。这就是项目维护者建议为 configure 脚本引入 --enable-mini 标志的原因。经过一些试验(我之前从未在 configure.ac 中做过任何事情)我实际上得到了一个构建这个额外的 mini 库的工作。

现在进入正题:是否有一种干净的方法来排除所有其他项目可执行文件和库的构建?我想要的是一个 ./configure --enable-mini 调用,它只会导致 libutilmini.a/libutilmini.la 被构建。当然,有些组件可以通过 --disable-X 选项禁用,但显然该项目的设置方式并未使 所有 组件成为可选组件。除了构建迷你库似乎没有必要构建其他所有内容之外,整个项目不会构建,例如 iOS 平台。

我真的很想避免在每个子目录中的所有 Makefile.am 中添加 if HAVE_MINI [...],特别是因为迷你库对大多数其他开发人员没有用,这似乎不是就像一种优雅的方法。是否有任何推荐的方法来实现这些目标?

我知道我可以使用我需要的资源创建一个新项目并构建它们,但正如我所说,迷你库 某些人有用 其他开发者也是如此。

如果您想使用不带参数的常规 make 命令使用 automake 有条件地编译某些内容,您 必须 使用 automake 条件(if HAVE_MINI你指的东西);没有别的办法。但是,您 可以 做的是,在您的顶层 Makefile.am 中创建一个额外的目标(例如,build_mini),这取决于构建您的libmini。然后你可以告诉人们,如果他们想要构建 libmini(而不是其他),他们不会 运行 make,但他们 运行 make build_mini。这看起来像:

(顶级Makefile.am)

SUBDIRS = foo bar baz
build_mini:
        $(MAKE) -C foo libmini-depends
        $(MAKE) -C bar libmini.la

或类似的(详细信息将取决于构建 libmini.la 所需的内容)。

然后你会 bar/Makefile.am 看起来像这样:

if WANT_MINI
lib_LTLIBRARIES += libmini.la
endif
libmini_la_SOURCES = # ...

唯一真正需要在条件语句中的是将 libmini.la 添加到 lib_LTLIBRARIES;其他一切都可以是无条件的。所以用这个方法,你应该只有一个 if FOO...endif 结构。