【问题标题】:Header dependency in automakeautomake中的头文件依赖
【发布时间】:2009-11-25 20:33:58
【问题描述】:

我想创建一个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,但好像不行。

【问题讨论】:

    标签: dependencies automake header-files


    【解决方案1】:
    BUILT_SOURCES = version.h
    

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

    但是,这会产生一个小问题:因为 version.h 需要在每次 make 调用时重新编译,所以 #includes version.h 的每个 foo.c 文件的重新编译将在每次调用时再次触发make 运行。我们希望仅在实际发生更改时才进行重新编译。

    要解决此问题,请对每次“创建”的标记文件使用BUILT_SOURCES 依赖项(它实际上从未创建,因此每次都会运行构建规则)。该标记文件的构建规则会创建一个新的version.h 文件为version.h.tmp,并且如果version.h.tmp 实际上与version.h 不同,则仅将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,因此构建将失败或包含伪造的版本信息。

    我已经为使用gitxf86-video-radeonhd 项目解决了这个问题。此解决方案中生成的git-version.h 文件包含更多的版本信息,而不仅仅是一个版本号。您可以在 git_version.shBUILT_SOURCES 连接的末尾看到我的 update-only-if-different 解决方案(包括处理希望所有 out-of-source-tree from-dist-tarball 构建案例)在RadeonHD.am 如果您有兴趣。

    【讨论】:

    • 这很好用,只有一个条件。来自 automake 手册:“强调 BUILT_SOURCES 仅受 'make all'、'make check' 和 'make install' 支持可能很重要。这意味着您不能在如果它依赖于已构建的源,则为干净的树。”尽管如此,这是我所知道的最好的解决方案。
    • 你必须通过&amp;&amp; 操作符把这些放到一行中,否则make会很乐意并行化你的version.h构造。
    • @JanKundrát No. make 只为parallel 中的目标运行完整的recipes。单个目标配方中的 shell 命令 按顺序运行
    • 有趣——当我尝试为 Ragel repo.or.cz/w/ragel-jkt.git/commitdiff/… 准备补丁时,当我没有使用单个命令时,并行构建被破坏了。但是,我不能排除一些愚蠢的错误,比如即使在第一行也使用&gt;&gt; 重定向。您一定是对的——如果单个命令默认并行运行,那将没有任何意义。
    猜你喜欢
    • 2012-01-03
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 2011-07-11
    相关资源
    最近更新 更多