“重新运行 cmake 没有构建系统参数”是什么意思?

car*_*man 4 cmake

我一直在收到消息

Re-run cmake no build system arguments
Run Code Online (Sandbox Code Playgroud)

以及我新生的 CMake 构建系统的各种失败。我还用谷歌搜索并找到了大约十几个出现该错误消息的结果,但这些命中都没有告诉您特定消息的含义。这些案例大部分都在具体项目的网站上,所以具体的项目维护者只是跳过几个小时的分析,吐出一个消息的原因,项目用户很乐意使用。

我还偶然发现了发出此文本的 CMake 源代码行。

if (this->CheckBuildSystemArgument.empty()) {
  if (verbose) {
    cmSystemTools::Stdout("Re-run cmake no build system arguments\n");
  }
  return 1;
}
Run Code Online (Sandbox Code Playgroud)

所以一个论点是空的。这不能解释任何事情,因为 'cmake' 的最小有效调用是

cmake .
Run Code Online (Sandbox Code Playgroud)

这不是最好的调用:

cmake ..
Run Code Online (Sandbox Code Playgroud)

被 CMake mavens 认为要好得多,假设当前目录是空的并且父目录有 CMakeLists.txt。一直使用 CMake 的人会认识到命令行上通常没有“构建系统参数”。如果您搜索 cmake.org 文档,则没有诸如“构建系统”或“构建系统参数”之类的概念的文档。

我试图实现的构建系统有点复杂,在这里忠实地总结一下。所以相反,我想了解这条消息的实际含义以及如何让它消失的一些想法。事实上,我尝试最小化我的构建系统来解决一个不同的问题,我什至没有重现这个问题。此外,最小化位于外层,它实际上是一个 Makefile,涵盖了使用环境变量控制事物的问题。

那么,有人能告诉我“重新运行 cmake 没有构建系统参数”是什么意思吗?

squ*_*les 5

首先从一些上下文开始,CMake 文档中有很多关于构建系统的信息,因为这是 CMake 的主要功能。CMake一个构建系统生成器。从文档中,总结了 CMake 在构建系统方面的作用:

一个构建系统介绍了如何从它的源代码使用建项目的可执行文件和库构建工具的过程自动化。例如,构建系统可能Makefile与命令行 make 工具或集成开发环境 (IDE) 的项目文件一起使用。为了避免维护多个这样的构建系统,项目可以使用以 CMake 语言编写的文件抽象地指定其构建系统。从这些文件中,CMake 通过称为generator的后端为每个用户在本地生成首选构建系统。

考虑到这一点,CMake 试图通过为我们检查构建系统来使事情变得简单。这样,如果我们更新 CMake 文件,我们就不必记住重新运行 CMake 并重新生成构建系统。从命令行调用时,默认情况下会运行此“构建系统检查” cmake。但是,它也会在您构建代码时运行(例如通过运行make),以验证您的构建系统是最新的。

您实际上可以看到检查构建系统的特殊预定义 CMake 目标。对于基于 Makefile 的构建系统,它在你的 Makefile 中看起来像这样:

cmake_check_build_system:
    $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles\Makefile.cmake 0
.PHONY : cmake_check_build_system
Run Code Online (Sandbox Code Playgroud)

未记录的 CMake 命令行选项--check-build-system后跟CMakeFiles/Makefile.cmake是您正在寻找的“构建系统参数”。

这条信息:

Re-run cmake no build system arguments
Run Code Online (Sandbox Code Playgroud)

运行时出现,cmake因为 CMake 仍在内部执行构建系统检查。在这种情况下,--check-build-system未提供参数,因此 CMake 始终按预期重新生成。因此,它不是错误消息,而只是一个详细的日志消息,提供有关 CMake 正在做什么的更多信息。


值得一提的是,所有CMake 构建系统应该进行这种“构建系统检查” 。例如,Visual Studio 创建一个ZERO_CHECK具有相同行为的目标。它使用--check-stamp-list命令行选项(也未记录)来检查以确保您的项目/解决方案是最新的。


另注:您可以禁用通过切换的CMake的自动生成系统检查CMAKE_SUPPRESS_REGENERATION变量ON。只需将其放在顶级 CMake 文件的底部:

set(CMAKE_SUPPRESS_REGENERATION ON)
Run Code Online (Sandbox Code Playgroud)

当然,当你cmake直接调用时,CMake 总会重新生成。但是当这个变量是 时ON,特殊的重新生成目标将被删除(cmake_check_build_system对于 Makefiles、ZERO_CHECK对于 Visual Studio 等)。