代码之家  ›  专栏  ›  技术社区  ›  Tim Ring

如何自动创建具有最新编译时间的文件并将其包含到库中?

  •  3
  • Tim Ring  · 技术社区  · 17 年前

    我有一个由大约100个源文件组成的库。如果编译了任何其他文件,我希望始终重建其中一个源代码,但我不希望每次运行make/build时都构建它。

    2 回复  |  直到 12 年前
        1
  •  8
  •   JesperE    17 年前

    让包含生成时间戳的对象文件依赖于所有其他对象文件:

    version.o: $(OBJECTS)
    
        2
  •  4
  •   Steve Jessop    17 年前

    因此,如果所有可执行文件都依赖于is对象,那么JesperE是完全正确的。

    否则,您可以在不更新时间戳的情况下重新生成可执行文件,如果其他依赖项之一发生了更改,但对象文件都没有更改。因此,问题中提到的两件事,“是否具有上次构建时间/日期”和“如果任何源代码已编译,则重新构建”,实际上不是同一件事,因此这取决于您想要的是哪一个。

    如果您只是删除可执行文件并重新生成它,这仍然不会更新时间戳(可能是因为某些相关的内容发生了更改,但不是依赖项,例如您获取了链接器的最新版本,或者您在环境中更改了影响链接器和/或生成文件的内容)。因此,最好的做法可能是将对象编译为构建可执行文件规则的一部分,如下所示:

    blah.exe : whatever
        rm -f version.o
        $(CC) $(CFLAGS) -c version.c
        $(CC) $(CFLAGS) $(OBJFILES) version.o -o blah.exe
    

    我之前已经Jigger过makefiles,因此如果版本号是由开发人员生成的,那么它会被故意破坏(设置为“0.0 private build”)——只有生成服务器设置用于启用正确版本号的选项。对于那个项目来说,在没有通过标记签出源代码管理并从中构建的东西上加上一个数字是没有意义的。