我知道cmake是构建生成器。这意味着它可以根据CMakeLists.txt的指令生成适当的构建(makefile,Visual Studio项目等)。但是我不明白我认为有两件事是相关的:
为什么cmake-gui中有两个按钮“Configure”和“Generate”?在我阅读的命令行教程中(例如this one),通常的过程是使用一个cmake
命令完成的。
cmake世界中的缓存是什么? AFAIK是按下“配置”按钮时的状态,但未按下“生成”按钮。但为什么这有用呢?按“配置”后弹出的所有变量是什么意思?为什么我应该编辑它们?是不是唯一允许通过CMakeLists.txt完成的配置?
由于
答案 0 :(得分:9)
运行CMake有两个阶段,如CMake GUI中的两个按钮所反映的那样。第一阶段是 configure 步骤,其中读入CMakeLists.txt
文件.CMake在此阶段构建项目的内部表示。之后,第二个阶段称为 generation ,其中项目文件是根据内部表示写出的。
在CMake GUI中,这两个阶段可以单独运行。运行配置步骤时,GUI显示所有缓存变量(见下文),这些变量自上次配置运行以来或自CMake GUI启动以来(如果这是第一次配置运行)更改了它们的值。通常的做法是重新运行configure阶段,直到没有变量突出显示为红色。一旦configure没有留下红色变量,你可以按下generate按钮,创建构建工具的本机项目文件,你就可以开始构建等了。
命令行cmake
工具不允许您单独运行配置和生成步骤。相反,它始终运行configure然后生成。
对于简单项目,配置和生成之间的区别并不是那么重要。简单的教程通常只是将两者结合在一起,因为读者可以在不理解基本项目安排的区别的情况下离开。但是,有一些CMake功能依赖于这种区别。特别是,generator expressions是生成时功能,其中有关构建的某些方面的决策被延迟到生成时间而不是在配置时完全处理。其中一个例子是配置特定的内容,例如编译器标志,仅为某些配置编译的源文件等。在CMake的配置步骤中,构建配置并不总是已知(例如,Xcode和Visual Studio是多配置构建工具,因此可以有多个,并且在构建时由用户选择。生成步骤将处理每种构建类型的生成器表达式,并且每个配置的结果可能不同。您可能还会发现this answer有关此特定示例的信息。有关利用配置阶段和生成阶段之间区别的技术的更高级示例,请参阅this post,但请注意,这不是常用技术。
关于什么是缓存的另一个问题,CMake在变量缓存中的运行之间记录信息。在运行结束时,它会更新构建目录中名为CMakeCache.txt
的文件。当您下次运行CMake时,它会读取该缓存以预先填充各种内容,因此它不必重新计算它们(如查找库和其他包),因此您不必提供自定义选项你想每次覆盖。您通常不会手动编辑CMakeCache.txt
(尽管可以这样做)。相反,您可以在CMake GUI中修改所需的变量,然后重新运行配置步骤(不要忘记然后运行generate来创建更新的项目文件)。您还可以使用-D
option在cmake命令行中定义或修改缓存变量。