cmake主要概念

系统学习cmake请参考mastering camke
windows安装cmake请移步scoop

主要结构

在这里插入图片描述
cmake持有一个GlobalGenerator实例,而GlobalGenerator实例持有多个LocalGenerator,每个LocalGenerator实例对应一个CMakeLists.txt。最终LocalGenerator实例根据CMakeLists.txt配置的内容初始化。

目标

在这里插入图片描述
cmake的目标分为三种,可执行文件,资源库和工具。目标可以通过target_link_libraries命令链接一系列的资源库。

源文件

和目标一样,可以通过set_source_file_properties和get_source_file_property设置属性。
完整的属性名查看cmake官方文档。

目录 生成器 测试和属性

更通用的设置属性的命令是set_property和get_property。
完整的属性名可以通过cmake -help-property-list查看

变量和缓存

变量可以表示一个单值也可以表示一个列表。
cmake预定了一系列的系统变量。
变量可以通过${VARIABLE}格式引用,使用set命令定义。
cmake的变量作用域和一般的语言不同。cmake定义了一个变量之后,对当前CMakeLists文件、函数,以及子目录的CMakeLists文件、函数或者宏,以及使用include命令包含的文件都是可见的。
当处理一个子目录或者调用一个函数时,一个新的变量作用域创建,并且使用当前调用域的所有变量进行初始化。但是在子作用域创建的变量或者对现有变量的修改不会影响父作用域。
有些时候需要一个函数或者子目录改变父作用域的变量。可以使用set命令的PARENT_SCOPE选项来给父作用域的变量赋值。
变量也可以表示一个列表。
通过cmake用户界面设置的变量称为选项。当cmake运行的时候,会在二进制文件目录下生成一个缓存文件。
一是用来存储用户选项。再次运行cmake,无需重新录入这些信息。用户可以通过用户界面来设置变量的值,并且用户再次运行cmake时,这个值还在。创建一个缓存变量可以通过option, find_file和set命令搭配CACHE选项。
创建一个缓存变量需要提供类型和文档说明。类型用来决定变量如何设置和显示,包括BOOL,PATH,FILEPATH,SRTING;文档说明提供GUI的帮助。
二是用来存储一些难以抉择的高级选项。这些变量对用户来说可能是不可见的或者是不能修改的。这些通常是系统相关的变量,比如CMAKE_WORDS_BIGENDIAN,这个值由cmake运行一个程序决定的。一旦这些值确定,这些值会存储在缓存中,避免cmake运行时重新计算他们。一般情况下,cmake会控制这些不会变的变量的数量。更换电脑,改变操作系统,或者切换编译器时,需要删除缓存文件(包括所有二进制树的对象文件,资源库和可执行文件)。
有一个属性标记了缓存中的选项是否是高级的。默认情况下,运行cmake gui(ccmake或者cmake-gui)时,这些高级选项不会被显示。用户只需关注那些可以改变的选项。高级选项是那些用户可以改但是一般不会去改的选项。一般情况下,一个大型的软件项目有50个甚至更多的选项,高级选项把软件项目分成了对大多数用户的关键选项和对高级用户的高级选项。有些项目可能没有非高级选项,依项目而定。使用命令mark_as_advanced并传入变量名称可以把选项变成高级选项。有些情况下,需要限定选项的范围是一些预定义的值集。可以通过设置选项的STRINGS属性来实现这个效果。
set创建选项。
set_property设置选项的范围。
一个选项定义在缓存之后,可以通过不带CACHE的set命令来重载。缓存中选项的值只有在处理CMakeLists文件之前cmMakefile没有定义这个选项时才会起作用。在处理CMakefile时,set命令会设置这个选项的值,但不会改变该选项缓存中原有的值。
一旦缓存中定义了一个选项,它的值不能被CMakeLists文件修改。原因是一旦CMake在缓存中置入一个有初值的选项,用户就只能通过GUI来修改它的值。要是CMake运行时把选项的值重写为set设置的值,那么用户将不能定义一个不被CMake修改的选项。所以set(FOO ON CACHE BOOL “doc”)命令只在缓存中没有FOO选项时才会起作用。一旦缓存中有这个选项,这条命令不起任何作用。
极少数情况下,需要改变缓存中选项的值,使用set命令的FORCE选项结合CACHE选项可以实现这点。FORCE选项使得set命令重载和改变缓存中选项的值。

构建配置

构建配置使得项目能够用不同的标记进行构建。CMake默认支持Debug, Release, MinSizeRel和RelWithDebInfo。每个配置会携带不同的标记。
CMake处理配置的方式取决于使用的生成器。还和本地构建系统的约定有关。也就是使用Makefiles和VS项目文件时,这些配置对构建过程的影响不同。
VS支持构建配置。VS项目默认有Debug和Release配置。在IDE中选择Debug,文件就会以Debug标记构建。IDE把所有的二进制文件放入以当前配置为名称的文件夹内。
使用Makefile生成器时,CMake每次运行只有一个配置激活,这个配置使用CMAKE_BUILD_TYPE变量指定。如果变量是空的,就没有标记添加到构建中。如果变量设置为一个配置,那相应的变量和规则(比如CMAKE_CXX_FLAGS_)会添加到编译行。Makefiles不会为对象文件创建以指定配置为名称的子目录。为了构建debug和release树,可以利用CMake可以在源文件目录外构建的特性,创建多个构建目录,并且每次构建都设置CMAKE_BUILD_TYPE。

发布了21 篇原创文章 · 获赞 0 · 访问量 831

猜你喜欢

转载自blog.csdn.net/ssehs/article/details/103644931