我遇到了使用automake的问题,我似乎无法找到一个干净的解决方案,看起来它应该是可能的(甚至很简单),但没有什么简单的工作。
基本上我遇到的问题是源文件包含自动生成的头文件。我可以添加依赖项来生成头文件只是文件,一旦标题存在,一切正常,因为automake的自动依赖生成负责一切。问题是你在干净的树中运行make的第一次时间,依赖文件不存在,所以automake不知道生成头文件,这使得编译包含标头的文件失败而不生成任何依赖项。这是一个鸡蛋问题 - 你需要手动告诉(自动)make来构建头文件。
显而易见的解决方案只是为头文件的Makefile.am文件添加一个依赖项,但这不起作用,因为对目标的依赖关系会覆盖automake的自动规则生成,如docs说:
请注意,Automake不区分具有命令的规则和仅指定依赖关系的规则。因此,如果不重新定义整个规则,就无法将新的依赖项附加到automake定义的目标。
现在我已经通过隐藏'来解决这个问题。来自automake的依赖,但这只适用于GNU-make:
Makefile.am:
bin_PROGRAMS = foo
foo_SOURCES = main.c foobar.c baz.c
gen.h: system.spec
...command to regen gen.h
# foobar.c #includes gen.h, so it needs to exist prior to compiling foobar.c
$(eval foo-foobar.o: gen.h)
这就是诀窍,但看起来很难看。是否有更好的自动安全方式来做到这一点?
答案 0 :(得分:5)
自动提供耗材BUILT_SOURCES
以解决此问题。添加到此的文件是在完成普通编译之前构建的 - 它专门用于生成的标题和源。
在你的情况下,这应该足够了:
BUILT_SOURCES = gen.h