BUILT_SOURCES = version.h
提到的所有文件BUILT_SOURCES
都将在任何正常编译规则运行之前构建。
但是,这会产生一个小问题:由于每次调用version.h
都需要重新编译,因此每次运行都会再次触发每个文件的重新编译。如果重新编译仅在实际发生更改时发生,我们更愿意。make
foo.c
#include
version.h
make
要解决此问题,请使用BUILT_SOURCES
对每次“创建”的标记文件的依赖项(它实际上从未被创建,因此构建规则每次都运行)。该标记文件的构建规则将创建一个新version.h
文件作为version.h.tmp
,并且仅复制version.h.tmp
到version.h
ifversion.h.tmp
实际上不同于version.h
(就像您的version.h
规则一样)。因此,如果 中没有任何变化,则其时间戳 (mtime) 保持不变,并且不会触发version.h
依赖于的对象构建: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
会给您虚假信息,并且version.h
您的 tarball 中可能没有,因此构建将失败或包含虚假版本信息。
我已经为使用git
. 此解决方案中生成的git-version.h
文件包含更多的版本信息,而不仅仅是单个版本号。您可以在git_version.sh和 RadeonHD.am 中的连接(包括处理所有源外树和from-dist-tarball构建案例)的末尾看到我的这个update-only-if-different解决方案如果你感兴趣。BUILT_SOURCES