代码之家  ›  专栏  ›  技术社区  ›  viraptor

automake中的头依赖项

  •  5
  • viraptor  · 技术社区  · 15 年前

    我想创建一个 Makefile.am 生成一个头文件的文件 xxx.c 文件。

    让我们说 C 包含:

    #include <version.h>
    ...
    

    我有一个规则在 制作文件 :

    version.h:
           echo '#define VERSION "'`hg id`'"' > version.h.tmp
           cmp version.h.tmp version.h || mv version.h.tmp version.h
    

    我要换什么 C 编译依赖于 version.h ?我试过 nodist_progname_SOURCES=version.h 但这似乎不行。

    1 回复  |  直到 15 年前
        1
  •  11
  •   ndim    15 年前
    BUILT_SOURCES = version.h
    

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

    然而,这将产生一个小问题:如 version.h 需要在每个 make 调用,重新编译 foo.c 文件哪个 #include S 版本h 将在每 制作 跑。如果重新编译只发生在实际发生了变化的情况下,我们更愿意这样做。

    要解决此问题,请使用 建筑源 对每次“创建”的标记文件的依赖性(它从未实际创建,因此每次都运行生成规则)。该标记文件的生成规则将创建一个新的 版本h 作为文件 version.h.tmp ,仅副本 版本:H.TMP 版本h 如果 版本.h.tmp 实际上不同于 版本h 就像你一样 版本.h 规则确实如此。所以如果没有什么变化 版本h ,它的时间戳(mtime)保持不变,并且没有根据 版本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
    

    这个解决方案可以满足您的要求。

    不过,不幸的是,当你从一个距离tarball建立时,会有一个小问题:那么 hg id 会给你虚假的信息,可能没有 版本h 在你的tarball中,那么构建将失败或包含伪造的版本信息。

    我已经解决了这个问题 xf86-video-radeonhd 正在使用的项目 git . 这个 git-version.h 此解决方案中生成的文件包含的版本信息多于单个版本号。你可以看到这个 仅当不同时更新 我的解决方案 git_version.sh 以及 建筑源 连接(包括处理 源目录树外 来自dist tarball 内置案例) RadeonHD.am 如果你感兴趣的话。