目录
1.find_file命令
命令语法:find_file(<VAR> name1 [path1 path2 ...])
命令描述:VAR 变量代表(在默认路径下,以及path1,path2...)找到的文件name1的 全路径,包含文件名
2.find_path 命令
命令语法:find_path(<VAR> name1 [path1 path2 ...])
命令简述:用于查找(在默认路径下,以及path1,path2...)包含文件 name1 的路径,如果找到则将路径保存在 VAR 中(此路径为一个绝对路径),如果没有找到则结果为 <VAR>-NOTFOUND。默认的情况下,VAR 会被保存在 Cache 中,这时候我们需要清除 VAR 才可以进行下一次查询(使用 unset 命令)。
find_path(LUA_INCLUDE_PATH lua.h ${LUA_INCLUDE_FIND_PATH})
3.find_library 命令
命令语法:find_library(<VAR> name1 [path1 path2 ...])
命令简述:用于查找(在默认路径下,以及path1,path2...)库文件 name1 的路径,如果找到则将路径保存在 VAR 中(此路径为一个绝对路径),如果没有找到则结果为 <VAR>-NOTFOUND。
FIND_LIBRARY(libX X11 /usr/lib)
4.find_package命令
命令语法:find_package(<name> [ [REQUIRED|COMPONENTS] [componets...] ])
命令简述:
find_package()命令是用来查找依赖包的,理想情况下,一句find_package()把一整个依赖包的头文件包含路径、库路径、库名字、版本号等情况都获取到,后续只管用就好了。
该命令用来调用预定义在 CMAKE_MODULE_PATH 下的 Find<name>.cmake 模块,你也可以自己定义 Find<name>模块,通过 SET(CMAKE_MODULE_PATH dir)将其放入工程的某个目录中供工程使用
find_package( Qt5 COMPONENTS Core Widgets Gui Multimedia PrintSupport REQUIRED )
find_package ( Subversion )
5.add_definitions 命令
命令语法:add_definitions(-DFOO -DBAR …)
命令简述:用于添加编译器命令行标志(选项),通常的情况下我们使用其来添加预处理器定义
add_definitions( -rdynamic -frtti ) # 添加编译器命令行标志
6. find_program命令
命令语法:find_program (<VAR> name1 [path1 path2 ...])
命令简述:用于查找(在默认路径下,以及path1,path2...)程序 name1 的路径,如果找到则将路径保存在 VAR 中(此路径为一个绝对路径),如果没有找到则结果为 <VAR>-NOTFOUND。
find_program ( SVNVERSION svnversion NO_CMAKE_FIND_ROOT_PATH )
7. configure_file命令
命令语法:configure_file( <input> <output> options )
命令简述:将一个文件(由input
参数指定)拷贝到指定位置(由output
参数指定),并根据options
修改其内容。
configure_file命令会根据options指定的规则,自动对input文件中cmakedefine关键字及其内容进行转换。
具体来说,会做如下几个替换:
1. 将input文件中的@var@或者${var}替换成cmake中指定的值。
2. 将input文件中的#cmakedefine var关键字替换成#define var或者#undef var,取决于cmake是否定义了var
configure_file (config.h.in config.h)
8. file命令
file — CMake 3.23.1 Documentation
命令语法:常用的如下
file(READ <filename> <out-var> [...]) 从 <filename> 读内容并保存在 <out-var> file({WRITE | APPEND} <filename> <content>...) 把内容 <content> 写入文件 <filename> file({GLOB | GLOB_RECURSE} <out-var> [...] [<globbing-expr>...]) 用满足 <globbing-expr> 的所有文件,生成一个列表,并保存在 <out-var>
9. install命令
命令语法:
install(TARGETS <target>... [...])
install({FILES | PROGRAMS} <file>... [...])
install(DIRECTORY <dir>... [...])
install(SCRIPT <file> [...])
install(CODE <code> [...])
install(EXPORT <export-name> [...])
命令简述:用于定义安装规则,安装的内容可以包括目标二进制、动态库、静态库以及文件、目录、脚本等。
普通文件的安装:
install(<FILES|PROGRAMS> files...
TYPE <type> | DESTINATION <dir>
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[RENAME <name>] [OPTIONAL] [EXCLUDE_FROM_ALL])
将 <FILES|PROGRAMS> 安装(复制)到 <dir> 中,FILES为普通的文本文件,PROGRAMS指的是非目标文件的可执行程序(如脚本文件)。
DESTINATION:指定磁盘上要安装文件的目录;
PERMISSIONS:指定安装文件的权限。有效权限是OWNER_READ,OWNER_WRITE,OWNER_EXECUTE,GROUP_READ,GROUP_WRITE,GROUP_EXECUTE,WORLD_READ,WORLD_WRITE,WORLD_EXECUTE,SETUID和SETGID;
CONFIGURATIONS:指定安装规则适用的构建配置列表(DEBUG或RELEASE等);
EXCLUDE_FROM_ALL:指定该文件从完整安装中排除,仅作为特定于组件的安装的一部分进行安装;
OPTIONAL:如果要安装的文件不存在,则指定不是错误;
RENAME:指定已安装文件的名称,该名称可能与原始文件不同。仅当命令安装了单个文件时,才允许重命名。
install ( FILES ${MYPROJ_HEADERS} DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/../include/myproj )
目录的安装:
install(DIRECTORY dirs...
TYPE <type> | DESTINATION <dir>
[FILE_PERMISSIONS permissions...]
[DIRECTORY_PERMISSIONS permissions...]
[USE_SOURCE_PERMISSIONS] [OPTIONAL] [MESSAGE_NEVER]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>] [EXCLUDE_FROM_ALL]
[FILES_MATCHING]
[[PATTERN <pattern> | REGEX <regex>]
[EXCLUDE] [PERMISSIONS permissions...]] [...])
该命令将一个或多个目录的内容安装到给定的目的地,目录结构被逐个复制到目标位置。如果指定了 USE_SOURCE_PERMISSIONS
而未指定 FILE_PERMISSIONS
,则将从源目录结构中复制文件权限。/ 的作用是只安装目录下的文件,而不安装目录本身。
install(DIRECTORY icons scripts/ DESTINATION share/myproj
PATTERN "CVS" EXCLUDE
PATTERN "scripts/*"
PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ
GROUP_EXECUTE GROUP_READ)
这条命令的执行结果是:将icons目录安装到share/myproj,将scripts/中的内容安装到share/myproj,两个目录均不包含目录名为CVS的子目录,对于scripts/*的文件指定权限为OWNER_EXECUTE,OWNER_WRITE,OWNER_READ,GROUP_EXECUTE,GROUP_READ。
10. CMake 自定义函数
命令格式:
function ( <func name> arg1 arg2 arg3 ... )
COMMAND( arg1 .. )
COMMAND( arg2 .. )
endfunction( <func name> ) #可省略func name
命令简述:自定义一个函数
function(adder name num)
message("${name} is ${num} years old!")
endfunction()
adder( "Cjh" 18 )
11. 条件语句
if( WIN32 )
cmd
elseif( UNIX )
cmd
else()
cmd
endif()
12. 循环语句
foreach(<loop_var> <items>)
<commands>
endforeach()
foreach(<loop_var> RANGE <stop>) #foreach遍历数字0,1,…直到(并包括)非负整数< stop >。
<commands>
endforeach()
foreach(<loop_var> RANGE <start> <stop> [<step>])
<commands>
endforeach()