cmake学习笔记,尝试采取一问一答的形式记录
Ubuntu中如何一键安装cmake
sudo tar -xzvf {cmake_tarball}.tar.gz -C /usr/local --strip-components=1
其中大括号内部需要替换为你自己下载的文件名称
要让CMake文件能跑,有哪些必要的命令
cmake_minimum_required()
project()
add_executable()
其余命令均可选
如何设置C++标准
set(CMAKE_CXX_STANDARD 标准号)
比如设置C++标准为C++ 20
set(CMAKE_CXX_STANDARD 20)
Cmake语法
CMake中的常量
0 OFF N NO FALSE 这些字面量在if的判断中中转化为False
1 ON YES TRUE Y 这些字面量在在if的判断中转化为True
注释
# #号是注释
CMake如何引用变量
${<variable>}
$ENV{<variable>} 引用环境变量
$CACHE{<variable>}引用缓存变量
CMake 条件控制语法
if()
elseif()
else()
endif()
CMake 循环
foreach
foreach(<loop_var> <items>)
<commands>
endforeach()
几种foreach变体
foreach(<loop_var> RANGE <stop>)
foreach(<loop_var> RANGE <start> <stop> [<step>])
foreach(<loop_var> IN [LISTS [<lists>]] [ITEMS [<items>]])
while
while(<condition>)
<commands>
endwhile()
两种循环均可以像C一样使用break()和continue()命令终止本次循环
函数
函数名称大小写不敏感
function(<name> [<arg1> ...])
<commands>
endfunction()
如何设置变量
set() //设置变量
unset() //取消变量
变量命名规则
CMKAE_ _CMAKE_ 开头的都是保留的关键字
其余变量命名规则同C语言
如何设置列表
一堆用空格或者回车或者";"符号分隔的字符串就是列表,举例如下
set(srcs a.c b.c c.c)
CMake生成器表达式 Cmake generator expression
表达式语法为 $<>,所有表达式均在构建期间求值
表达式可以递归
表达式的几种典型类型(未完全列出)
条件表达式
$<condition:true_string>
$<IF:condition,true_string,false_string>
$<BOOL:string> 这一条是将string的值变换为0或者1 空string或者string是cmake中预定义的0, FALSE, OFF, N, NO, IGNORE, NOTFOUND,这些值的时候为0,其余为1
逻辑表达式比较
$<AND:conditions>
$<OR:conditions>
$<NOT:condition>
字符串比较
$<STREQUAL:string1,string2> 此表达式大小写敏感
$<EQUAL:value1,value2>
关于cmake版本号的比较
$<VERSION_LESS:v1,v2>
$<VERSION_GREATER:v1,v2>
$<VERSION_EQUAL:v1,v2>
$<VERSION_LESS_EQUAL:v1,v2>
$<VERSION_GREATER_EQUAL:v1,v2>
string变换
$<LOWER_CASE:string>
$<UPPER_CASE:string>
$<MAKE_C_IDENTIFIER:…> 此表达式将…中的内容转换为C标识符
列表相关表达式(未全部列出)
$<IN_LIST:string,list>
$<LIST:LENGTH,list>
$<LIST:GET,list,index,…>
$<LIST:SUBLIST,list,begin,length>
$<LIST:FIND,list,value>
$<LIST:JOIN,list,glue>
路径相关表达式(未全部列出)
$<PATH_EQUAL:path1,path2>
$<PATH:IS_ABSOLUTE,path>
$<PATH:IS_RELATIVE,path>
$<PATH:GET_ROOT_NAME,path…>
$<PATH:GET_ROOT_DIRECTORY,path…>
$<PATH:GET_ROOT_PATH,path…>
$<PATH:GET_FILENAME,path…>
$<PATH:GET_EXTENSION[,LAST_ONLY],path…>
$<PATH:GET_STEM[,LAST_ONLY],path…>
$<PATH:GET_RELATIVE_PART,path…>
$<PATH:GET_PARENT_PATH,path…>
$<PATH:APPEND,path…,input,…>
当前平台
$<PLATFORM_ID>
6226

被折叠的 条评论
为什么被折叠?



