如何延迟Makefile.am中“include”指令的效果直到make(避免“包括”被Automake看到)?

时间:2012-07-27 16:13:53

标签: automake

我的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的情况下完全可以使用makefile,但这个想法注定会失败automake。在我甚至有机会执行make.config之前automake包含make文件(由于文件尚未生成而失败):

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

有没有办法推迟include指令的效果直到make运行(可能是通过使用其他指令)?

可能有一种方法可以在任何makefile生成完成之前简单地运行任意命令(即AC_CONFIG_COMMANDS*)。但问题更复杂,因为config.generator.sh应该使用可执行文件,而这些可执行文件也是在同一个构建过程中生成的(因此存在依赖链,逻辑上必须由来自同一项目的makefile管理)。 The documentation simply confirms the logic without providing alternatives

2 个答案:

答案 0 :(得分:2)

解决方案在Automake邮件列表的this email中有描述。

我们的想法是在小型常规“包装器”include中使用makefile指令,并在其中包含Automake生成的Makefile(请注意大写M)。由于makefile不是Automake模板,因此include可以按预期触发不存在文件的构建。

请注意:

  • 默认情况下,make实用程序会首先搜索makefile(不是Makefile),使此方法无缝运行。
  • 仍然建议在Makefile.am中指定所有规则,并保持“包装器”makefile简单。不存在的文件的规则自然会来自生成的Makefile

答案 1 :(得分:2)

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

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

并调整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中用Makefile替换变量。

注意:我在OCaml的ocamldep依赖关系生成器中使用它。