使用 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
结构。
我有一个使用 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
结构。