我有一个包含大约100个源文件的库。如果已经编译了任何其他文件,我希望其中一个源始终重建,但我不希望每次运行make / build时都构建它。
基本上我希望此文件内置最后的构建日期/时间,因此链接到库的任何应用程序都可以检查上次构建时间/日期。还有其他办法吗?
答案 0 :(得分:8)
让包含构建时间戳的目标文件依赖于所有其他目标文件:
version.o: $(OBJECTS)
答案 1 :(得分: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”),如果它是由开发人员构建的 - 只有构建服务器设置用于启用正确版本号的选项。对于那个项目,将一个数字放在没有通过标签检查源代码控制的东西上并且从那里构建它是没有意义的。