【问题标题】:Is there a way to perform atomic CMake build?有没有办法执行原子 CMake 构建?
【发布时间】:2013-11-14 19:22:49
【问题描述】:

我正在考虑在CMake 中重新实现我们的构建系统(目前基于GNU Make)。

免责声明:这更像是一个理论和“最佳实践”问题。我不深入了解CMake。另外,如果问题更切题,请随时将问题转移给程序员。

据我了解,CMake 的标准工作流程是

cmake .
make

我怀疑CMake 文件和 Makefile 可能存在去同步问题。

因此,在通常的开发过程中,您应该运行make 以避免不必要地重新构建CMakeCacheMakefiles,并且通常会使过程更加直接。但是,如果你向CMakeLists 添加一个新的源文件并运行make,它将使用旧的CMakeCacheMakefiles,并且不会自动重新生成它们。我认为它在大规模使用时可能会导致重大问题,因为如果某些东西没有按应有的方式构建,您将不得不尝试执行make clean,然后,如果它没有帮助,您将需要删除CMakeCache 并重新生成所有内容(手动!)。

如果我对上面的某些事情不正确,请纠正我。

我只想做

awesome-cmake

并让它更新所有需要更新和构建项目的东西。

那么,问题来了:有没有办法使用 CMake 进行“原子构建”,以便跟踪所有必需的信息并抽象出 make 的使用?

【问题讨论】:

    标签: build makefile cmake build-process


    【解决方案1】:

    我认为您在这里有几个不正确的想法:

    我怀疑可能存在 CMake 文件和 Makefile 不同步的问题。

    最终,CMake 就是要生成正确的 Makefile(或 Visual Studio 解决方案文件,或 XCode 项目文件,或其他任何东西)。除非您手动修改生成的 Makefile,否则 CMake 和 Makefile 之间不会存在同步问题,因为 CMake 会生成 Makefile。


    但是,如果您向CMakeLists 添加一个新的源文件并运行make,它将使用旧的CMakeCacheMakefiles,并且不会自动重新生成它们。

    实际上,情况正好相反:如果您修改 CMakeLists.txt(例如添加新源、更改编译器标志、添加新依赖项)然后运行 ​​make 将自动触发重新运行 CMake。 CMake 将读取其先前缓存的值(包括先前提供给 CMake 的任何命令行参数)并生成更新的 Makefile。


    如果某些东西没有按应有的方式构建,您必须尝试执行 make clean,然后,如果它没有帮助,您需要删除 CMakeCache 并重新生成所有内容(手动!) .

    是的,如果出现问题,这将是一个非常正常的工作流程。但是,根据我的经验,事情并不经常变得那么糟糕。


    那么,问题来了:有没有办法使用 CMake 进行“原子构建”,以便跟踪所有必需的信息并抽象出 make 的使用?

    鉴于运行 make 将导致 CMake “做正确的事情”,即在需要时重新运行,我猜想使用 make 尽可能接近“原子构建”。

    这里要注意的一点是使用file(GLOB ...) 或类似名称来生成源文件列表。来自文档:

    我们不建议使用 GLOB 从源代码树中收集源文件列表。如果在添加或删除源时没有 CMakeLists.txt 文件发生更改,则生成的构建系统无法知道何时要求 CMake 重新生成。

    换句话说,如果您确实使用file(GLOB ...) 来收集源列表,则需要养成在从源树中添加/删除文件后重新运行 CMake 的习惯;在这种情况下,运行 make 不会触发 CMake 的重新运行。

    【讨论】:

    • "如果您修改 CMakeLists.txt(例如添加新源、更改编译器标志、添加新依赖项),则运行 make 将自动触发重新运行 CMake。"这几乎涵盖了整个问题。
    【解决方案2】:

    CMake 的标准工作流程是源外构建

    mkdir build
    cd build
    cmake ..
    make
    

    【讨论】:

      猜你喜欢
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-18
      • 1970-01-01
      相关资源
      最近更新 更多