3

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

基本上我希望这个文件有最后的构建日期/时间,所以任何链接到库的应用程序都可以检查最后的构建时间/日期。有没有其他方法可以做到这一点?

4

2 回答 2

8

让包含构建时间戳的目标文件依赖于所有其他目标文件:

version.o: $(OBJECTS)
于 2008-11-26T12:59:42.037 回答
4

稍微扩展 JesperE 的解决方案。

让目标文件依赖于可执行文件所依赖的所有目标(不包括自身)。

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

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

示例可能包括您静态链接的库,或者一些用于进行链接并且更改很多的脚本,因此为了方便开发人员而将其作为依赖项。

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

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

或其他任何东西(如果您使用make,可能不是.exe,但您永远不知道)。实际上那里的错误处理有点狡猾,因为如果最后一行失败,不会删除 version.o。

我还要补充一点,如果你要向用户发布一些东西(我的意思是基本上任何离你办公桌超过 10 英尺的人),无论如何从头开始构建而不是仅仅运行 make 来更新可能是一个想法,并运送它。否则很容易搞砸makefile,从而错过依赖项,意外构建“混合版本”,并且无法重现您发布的内容。

如果它是由开发人员构建的,我之前已经修改过makefile,因此版本号被故意破坏(设置为“0.0 private build”) - 只有构建服务器设置了用于启用正确版本号的选项。对于那个项目,在没有通过标签检查源代码控制并从那里构建的东西上加上一个数字是没有意义的。

于 2008-11-26T13:32:42.143 回答