在automake中的头部依赖性

时间:2009-11-22 21:00:33

标签: dependencies automake header-files

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

1 个答案:

答案 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-radeonhdBUILT_SOURCES连接结束时看到我的仅在更新时使用的解决方案(包括希望所有 out-of-of如果您有兴趣,可以在git_version.sh中使用-source-tree from-dist-tarball 构建案例。