我想创建一个Makefile.am
文件,生成xxx.c
文件中提到的一个头文件。
假设xxx.c
包含:
#include <version.h>
...
并且我有一条规则在Makefile.am
:
version.h:
echo '#define VERSION "'`hg id`'"' > version.h.tmp
cmp version.h.tmp version.h || mv version.h.tmp version.h
我需要更改什么才能使xxx.c
编译取决于version.h
?我试过了nodist_progname_SOURCES=version.h
,但似乎没有这样做。
答案 0 :(得分:11)
BUILT_SOURCES = version.h
所有提及为BUILT_SOURCES
的文件都将在任何正常的编译规则运行之前构建。
但是,这会产生一个小问题:由于version.h
需要在每次make
调用时重建,所以foo.c
{#include
{version.h
make
文件的重新编译每次BUILT_SOURCES
次运行都会再次触发{1}}。我们希望重新编译只在实际发生了某些变化的情况下发生。
要解决此问题,请对每次“创建”的戳记文件使用version.h
依赖项(它实际上从未创建过,因此每次都会运行构建规则)。该戳记文件的构建规则会将version.h.tmp
新文件创建为version.h.tmp
,如果version.h
实际上与{{1}不同,则仅将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
此解决方案将满足您的要求。
不幸但是,当你使用dist tarball构建时会出现一些小问题:然后hg id
会给你伪造的信息,你的tarball中可能没有version.h
,所以构建将失败或包含虚假版本信息。
我已针对使用git
的{{3}}项目解决了此问题。此解决方案中生成的git-version.h
文件包含的版本信息比单个版本号更多。您可以在xf86-video-radeonhd和BUILT_SOURCES
连接结束时看到我的仅在更新时使用的解决方案(包括希望所有 out-of-of如果您有兴趣,可以在git_version.sh中使用-source-tree 和 from-dist-tarball 构建案例。