vir*_*tor 5 automake dependencies header-files
我想创建一个Makefile.am文件,生成文件中提到的一个头xxx.c文件.
假设xxx.c包含:
#include <version.h>
...
Run Code Online (Sandbox Code Playgroud)
并且我有一条规则在最后创建它Makefile.am:
version.h:
echo '#define VERSION "'`hg id`'"' > version.h.tmp
cmp version.h.tmp version.h || mv version.h.tmp version.h
Run Code Online (Sandbox Code Playgroud)
我需要更改以使xxx.c编译依赖于version.h什么?我试过了nodist_progname_SOURCES=version.h,但似乎没有这样做.
ndi*_*dim 11
BUILT_SOURCES = version.h
Run Code Online (Sandbox Code Playgroud)
提到的所有文件BUILT_SOURCES将在任何正常编译规则运行之前构建.
然而,这将创建一个小问题:由于version.h需要在每次重新构建make调用,每次的重新编译foo.c的文件#include小号version.h将在每一个再次触发make运行.我们希望重新编译只在实际发生了某些变化的情况下发生.
要解决此问题,请BUILT_SOURCES对每次"创建"的戳记文件使用依赖项(它实际上从未创建过,因此每次都会运行构建规则).该戳记文件的构建规则创建一个新version.h文件version.h.tmp,并且只复制version.h.tmp到version.hif version.h.tmp实际上不同version.h(就像您的version.h规则一样).因此,如果没有任何变化version.h,它的时间戳(mtime)保持不变,并且不会version.h触发依赖于构建的对象:
BUILT_SOURCES = version.stamp
version.stamp:
echo '#define VERSION "'`hg id`'"' > version.h.tmp
cmp version.h.tmp version.h || mv version.h.tmp version.h
Run Code Online (Sandbox Code Playgroud)
这个解决方案将满足您的要求.
不幸的是,当你从一个dist tarball构建时会出现一些小问题:然后hg id会给你伪造的信息,version.h你的tarball中可能没有,所以构建将失败或包含伪造的版本信息.
我已经为正在使用的xf86-video-radeonhd项目解决了这个问题git.git-version.h此解决方案中生成的文件包含的版本信息比单个版本号更多.你可以看到这个更新只-IF-不同,在结束我的解决方案git_version.sh和BUILT_SOURCES联播(的希望所有的,包括处理外的源树和从-DIST-tar文件中建立的情况下)RadeonHD.am如果你感兴趣.