是否可以先编译最近更改的文件?

Posted

技术标签:

【中文标题】是否可以先编译最近更改的文件?【英文标题】:Is it possible to compile recently changed files first? 【发布时间】:2021-01-21 23:23:09 【问题描述】:

以下场景经常发生:

我更改了包含在很多地方的标题,例如添加函数声明。 我在对应的源文件中添加了一个函数定义,因为我笨,所以有错误。 我在编译,并等待了很长时间编译了一堆不相关的东西,然后才看到我正在处理的代码中的错误。

如果 cmake 会优先编译最近修改的文件,那么在这些情况下我的测试周期时间会减少几分钟。这可能吗?

【问题讨论】:

用一个单独的(子)项目(例如测试套件)编译更改的文件怎么样,然后再将它粘到整个野外?这可能更像是您如何水平和垂直布局架构的问题。 不是标准品牌。我怀疑cmake 是否有可能。在添加函数定义之前在后台运行构建? 您可以使用 makefile 或 ninja 生成器构建特定的 .o 文件。通过这样做,您可以专门为您更改的源构建 .o 文件。 潜在方法:使用 shell 命令(make 中的$(shell …),CMake 中的execute_process?我不使用 CMake。)以修改时间的相反顺序列出文件。用目标模块扩展名(.o 或 .obj)替换源扩展名(.c 等)。现在您有了一个按照您希望它们构建的顺序排列的对象列表。让他们成为目标的附属物,比如 OrderedObjects。制定目标。 Visual Studio 有一个按钮来编译当前文件。我一直在使用它... 【参考方案1】:

我在 CMake 中找不到任何通用的允许您指定构建顺序的内容,但您可以使用允许您编译单个 .o 或 .obj 文件的特定构建系统生成器来执行此操作。例如,使用 Ninja 生成器:

add_executable(mytarget the-suspect-src.cpp)

生成的 Ninja 构建系统允许我通过明确指定来构建相应的 .o 文件:

ninja CMakeFiles/mytarget.dir/the-suspect-src.cpp.o

因此您可以通过以下方式实现您想要的行为:

ninja CMakeFiles/mytarget.dir/the-suspect-src.cpp.o && ninja

请注意,我不会记住 .o 文件的这些路径,而是在终端中使用制表符完成。


我碰巧知道 Makefile 生成器也具有构建单个 .o 文件的类似能力,但我不知道有任何其他生成器具有这种能力。

【讨论】:

以上是关于是否可以先编译最近更改的文件?的主要内容,如果未能解决你的问题,请参考以下文章

是否有任何软件可以在文件更改时重新编译基于 CMake 的软件项目?

更改打字稿目标会影响编译性能吗?

在编译时重命名符号而不以跨平台方式更改代码

使用 -pg 编译时更改 gmon.out 文件的名称 [重复]

根据条件编译符号更改exe的名称

一周碎碎念,2021.7.25,ansible文件传输有问题?