2

我的Makefile.am包含一个文件(带有各种定义的变量),例如:

include make.config

...

问题是这个文件又是由一个工具(即config.generator.sh)基于一些输入文件(即input.dat)生成的。直接和错误的想法是添加一个规则来生成make.config

make.config : input.dat
    config.generator.sh input.dat > make.config

include make.config

...

尽管此内容在automake没有automake. 该make.config文件automake在我什至有机会执行之前就被包含make(并且由于文件尚未生成而失败):

automake: cannot open < make.config: No such file or directory

有没有办法将include指令make的效果推迟到运行(可能通过使用另一个指令)?

可能有一种方法可以在生成任何生成文件之前简单地运行任意命令(即AC_CONFIG_COMMANDS*)。但问题更复杂,因为config.generator.sh它应该使用在同一构建过程中又生成的可执行文件(因此存在逻辑上必须由来自同一项目的 makefile 管理的依赖链)。文档只是确认了逻辑而没有提供替代方案

4

2 回答 2

2

Automake 的邮件列表中描述了该解决方案

include这个想法是在小型常规“包装器”中使用指令,makefile并将 Automake-generated 包含Makefile在其中(注意大写M)。因为makefile不是 Automake 模板,所以include按预期工作会触发不存在文件的构建。

注意:

  • 默认情况下make,实用程序将首先搜索makefile(而不是搜索Makefile),从而使这种方法无缝工作。
  • 仍然建议在内部指定所有规则Makefile.am并保持“包装器”makefile简单。不存在文件的规则自然会来自生成Makefile的反正。
于 2012-07-29T15:47:12.277 回答
2

今天将我的 OCaml 项目移动到 Autotools 时,我遇到了同样令人讨厌的问题。我的解决方案是使用autoconf's 替换来解决automake。对于上面的示例,我将添加一个替换configure.ac

AC_SUBST([include_make_config], ["include make.config"])

和 adjust ,用变量引用Makefile.am替换include指令:autoconf

make.config : input.dat
    config.generator.sh input.dat > make.config

@include_make_config@
...

automake不触及@include_make_config@线,因此它被带到生成的Makefile.in. 接管时autoconf,它将变量替换include make.config为 final Makefile

注意:我将它与 OCaml 的ocamldep依赖生成器一起使用。

于 2014-06-27T17:50:30.963 回答