【问题标题】:Building only a small subset of project using autotools使用自动工具仅构建项目的一小部分
【发布时间】:2015-07-29 19:12:06
【问题描述】:

我有一个使用自动工具的大型项目,其中包含一些构建到实用程序库中的代码。该项目有很多依赖项,我想为移动环境(Android/iOS)编译该实用程序库的特定子集。我预计对于该特定功能子集来说,很多依赖项是不必要的,并且由于技术原因,为这些架构/平台编译整个项目是不可能的。

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

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

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

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

【问题讨论】:

  • 如果组件不是可选的,它们很可能是强制性的......所以你应该构建它们。

标签: makefile autotools autoconf


【解决方案1】:

如果您想使用不带参数的常规 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 构造。

【讨论】:

  • 感谢您的回答!我会试一试。不过,我更喜欢受configure 影响的东西。不知怎的,感觉更熟悉了……
  • 有条件地不使用条件不编译某些东西,不出所料,是不可能的......
猜你喜欢
  • 2013-11-07
  • 2018-06-09
  • 2023-03-03
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
  • 2011-03-12
  • 2016-06-30
  • 1970-01-01
相关资源
最近更新 更多