我的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
答案 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
依赖关系生成器中使用它。