cmake基本用法

一、cmake命令

1、基本用法

cmake [选项] <源码路径>

CMake可执行程序是CMake的命令行界面。它可以用脚本对工程进行配置。工程配置设置可以在命令行中使用-D选项指定。使用-i选项,cmake将通过提示交互式地完成该设置。
CMake是一个跨平台的构建系统生成工具。它使用平台无关的CMake清单文件CMakeLists.txt,指定工程的构建过程;源码树的每个路径下都有这个文件。CMake产生一个适用于具体平台的构建系统,用户使用这个系统构建自己的工程。
-D:创建一个CMake的缓存条目
当cmake第一次运行于一个空的构建数时,它会创建一个CMakeCache.txt文件,并且使用可定制的工程设置来填充这个文件。这个选项可以用来指定优先级高于工程的默认值的工程设置值。这个参数可以被重复多次,用来填充所需要数量的缓存条目(cache entries)。
-E: CMake命令行模式
为了真正做到与平台无关,CMake提供了一系列可以用于所有系统上的的命令。以-E参数运行CMake会帮助你获得这些命令的用法。可以使用的命令有:chdir, copy, copy_if_different copy_directory, compare_files, echo, echo_append, environment, make_directory, md5sum, remove_directory, remove, tar, time, touch, touch_nocreate, write_regv, delete_regv, comspec, create_symlink。
例如:

#改变当前的目录,然后执行命令
chdir <dir> <cmd> [<arg>...]

-P : 处理脚本模式
将给定的cmake文件按照CMake语言编写的脚本进行处理。如果要使用-D选项定义变量,-D选项必须在-P选项之前。
参考:
https://www.cnblogs.com/lsgxeva/p/9454443.html
https://cmake.org/cmake/help/v3.6/manual/cmake.1.html?highlight=chdir

2、install

install用于指定在安装时运行的规则。它可以用来安装很多内容,可以包括目标二进制、动态库、静态库以及文件、目录、脚本等:

install(TARGETS <target>... [...])
install({FILES | PROGRAMS} <file>... [...])
install(DIRECTORY <dir>... [...])
install(SCRIPT <file> [...])
install(CODE <code> [...])
install(EXPORT <export-name> [...])

3、include

作用:从文件或模块加载并运行CMake代码。
可以指定载入一个文件,如果定义的是一个模块,那么将在 CMAKE_MODULE_PATH 中搜 索这个模块并载入,如果没有指定CMAKE_MODULE_PATH,那么从当前的CMakeLists.txt所在的目录查找。 载入的内容将在处理到 INCLUDE 语句是直接执行。
用法:

include(<file|module> [OPTIONAL] [RESULT_VARIABLE ]
[NO_POLICY_SCOPE])
    
#例如,加载预定义的cmake模块
include (tools.cmake)

说明:

  • 变量读写范围为调用此指令的调用者的范围,因此,具有动态范围即取决于调用者;
  • 如果“OPTIONAL”被指定,则指定的文件不存在时,不会产生任何错误;
  • 如果“RESULT_VARIABLE”被给予了变量,则会赋值给变量完整的文件名(即<file|module>)或者在失败时赋值为“NOTFOUND ”。

参考:
https://blog.csdn.net/RobotLife/article/details/85416226

4、config_file

指令说明:

configure_file(<input> <output>
               [COPYONLY] [ESCAPE_QUOTES] [@ONLY]
               [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])

configure_file 主要实现如下两个功能:

  • 将 文件里面的内容全部复制到 文件中;
  • 根据参数规则,替换 @VAR@ 或 ${VAR} 变量;

参数解析:
(1) COPYONLY
仅拷贝 文件里面的内容到 文件, 不进行变量的替换;
(2) ESCAPE_QUOTES
使用反斜杠(C语言风格)来进行转义;
(3) @ONLY
限制替换, 仅仅替换 @VAR@ 变量, 不替换 ${VAR} 变量
(4) NEWLINE_STYLE
指定输入文件的新行格式, 例如:Unix 中使用的是 \n, windows 中使用的 \r\n
注意: COPYONLY 和 NEWLINE_STYLE 是冲突的,不能同时使用;

参考:https://www.cnblogs.com/gaox97329498/p/10952732.html

5、set_property和get_property

set_property: 在指定域中设置一个命名属性

set_property(<GLOBAL |
                DIRECTORY [dir] |
                TARGET [target1 [target2 ...]] |
                SOURCE [src1 [src2 ...]] |
                TEST [test1 [test2 ...]] |
                CACHE [entry1 [entry2 ...]]>
               [APPEND][APPEND_STRING]
               PROPERTY <name>[value1 [value2 ...]])

在某个域中对零个或多个对象设置一个属性。第一个参数决定该属性设置所在的域。它必须为下面中的其中之一:

  • GLOBAL域是唯一的,并且不接特殊的任何名字。
  • DIRECTORY域默认为当前目录,但也可以用全路径或相对路径指定其他的目录(前提是该目录已经被CMake处理)。
  • TARGET域可命名零或多个已经存在的目标。
  • SOURCE域可命名零或多个源文件。注意:源文件属性只对在相同目录下的目标是可见的(CMakeLists.txt)。
  • TEST域可命名零或多个已存在的测试。
  • CACHE域必须命名零或多个已存在条目的cache。

必选项PROPERTY后面紧跟着要设置的属性的名字。其他的参数用于构建以分号隔开的列表形式的属性值。如果指定了APPEND选项,则指定的列表将会追加到任何已存在的属性值当中。如果指定了APPEND_STRING选项,则会将值作为字符串追加到任何已存在的属性值。
get_property: 获取一个属性值

get_property(<variable>
               <GLOBAL |
                DIRECTORY [dir] |
                TARGET <target> |
                SOURCE <source> |
                TEST <test> |
                CACHE <entry> |
                VARIABLE>
               PROPERTY <name>
               [SET | DEFINED |BRIEF_DOCS | FULL_DOCS])

相关域的说明与set_property意义相同。
必选项PROPERTY后面紧跟着要获取的属性的名字。如果指定了SET选项,则变量会被设置为一个布尔值,表明该属性是否已设置。如果指定了DEFINED选项,则变量也会被设置为一个布尔值,表明该属性是否已定义(如通过define_property)。如果定义了BRIEF_DOCS或FULL_DOCS选项,则该变量被设置为一个字符串,包含了对请求的属性的文档。如果该属性没有相关文件,则会返回NOTFOUND。
参考:
https://blog.csdn.net/fuyajun01/article/details/9036485

5、set

CMake 变量包含 常规变量Normal Variables和全局变量Cache Variables。通过 set 指令可以设置两种不同的变量。也可以在 CMake 脚本中使用和设置环境变量。set(ENV{} …),本文重点讲述 CMake 脚本语言特有的两种变量。
(1)两种变量的定义参考
Normal Variables

set(<variable> <value>... [PARENT_SCOPE])

这个命令来设置的变量就是 Normal Variables。例如 set(MY_VAL “666”) ,此时 MY_VAL 变量的值就是 666。
Cache Variables

set(<variable> <value>... CACHE <type> <docstring> [FORCE])

这个命令来设置的变量就是 Cache Variables。例如 set(MY_CACHE_VAL “666” CACHE STRING INTERNAL),此时 MY_CACHE_VAL 就是一个 CACHE 变量。
CMake 规定,有一个与 Cache 变量同名的 Normal 变量出现时,后面使用这个变量的值都是以 Normal 为准,如果没有同名的 Normal 变量,CMake 才会自动使用 Cache 变量。

set(TAF_WEB_HOST "" CACHE STRING "set web host")
IF (TAF_WEB_HOST STREQUAL "")
	set(TAF_WEB_HOST "http://taf.test.com")
ENDIF ()

缓存变量由如下特点:

  • 缓存变量是全局作用域, 变量的值会从CMakeCache.txt中获取,缓存变量在写入CMakeCache.txt以后, 每次都从这个缓存文件中读取该值, 而不会重新调用set(… CACHE …)!!!(Cache变量只会初始化一次,在CMakeCache.txt中存储以后, 多次调用set(… CACHE …)不起作用!!!)。
  • 缓存变量的常规初始化的方式是set(abc “789” CACHE STRING “”)。
  • 当常规变量和缓存变量重名时, 如果缓存变量声明在后面, 会覆盖常规变量。
  • 除了使用set(… CACHE …)可以声明缓存, 也可以在命令行使用-Dxxx=xxx修改缓存变量的值!!!
  • 如果某个Cache变量已经存在于CMakeCache.txt中, 代码中的set(… CACHE …)将不会对这个值有影响, 如果我们在代码中需要强制修改Cache变量的值, 需要使用FORCE字段 — set(abc “123” CACHE STRING “” FORCE)。
    参考:
    https://www.jianshu.com/p/72b07f886820
    https://www.cnblogs.com/ncuneugcj/p/9756324.html

二、常用变量

1、CMAKE_BINARY_DIR和CMAKE_SOURCE_DIR

好多网上的文章,都说CMAKE_BINARY_DIR和CMAKE_SOURCE_DIR是等价的。实际不然。一般来说,都是这样用

cmake ./

上面的方式一般称之为内部编译,这样CMAKE_BINARY_DIR和CMAKE_SOURCE_DIR是等价的。也就是当前源码的目录。如果执行cmake的时候,并不在源码的路径的话,比如:

cmake ../src

这样编译一般称之为外部编译,外部编译的好处是cmake生成的文件和编译出来的东西,就不放在源码路径下了,保证了源码路径的干净整洁。比如可以在src的同级目录下建立build目录。然后在build目录下执行cmake …/src。这样编译出来的东西和cmake生成的东西,都放到了build目录下了。

CMAKE_BINARY_DIR=全路径/build
CMAKE_SOURCE_DIR=全路径/src

2、PROJECT_BINARY_DIR和

  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值