6

我想创建一个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了,但这似乎没有做到。

4

1 回答 1

11
BUILT_SOURCES = version.h

提到的所有文件BUILT_SOURCES都将在任何正常编译规则运行之前构建。

但是,这会产生一个小问题:由于每次调用version.h都需要重新编译,因此每次运行都会再次触发每个文件的重新编译。如果重新编译仅在实际发生更改时发生,我们更愿意。makefoo.c#includeversion.hmake

要解决此问题,请使用BUILT_SOURCES对每次“创建”的标记文件的依赖项(它实际上从未被创建,因此构建规则每次都运行)。该标记文件的构建规则将创建一个新version.h文件作为version.h.tmp,并且仅复制version.h.tmpversion.hifversion.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

于 2009-11-22T21:03:28.073 回答