CMake流程控制一、IF条件判断1.基本语法2.条件类型3.布尔False类型二、列表循环foreach三、条件循环while四、循环控制break与continue五、函数与宏 (function / macro)命令分类核心命令功能说明典型使用场景条件判断if(condition) ... elseif(...) ... else() ... endif()根据条件表达式的真假选择性地执行代码块。区分操作系统如 Windows/Linux、判断构建类型Debug/Release、控制可选组件的编译。列表循环foreach()/endforeach()遍历列表中的元素或指定的数值范围对每个元素执行循环体。批量处理源文件、遍历依赖库列表、批量添加测试用例。条件循环while()/endwhile()只要指定的条件表达式为真就持续执行循环体。循环计数、持续检查某个文件是否生成、复杂的迭代逻辑。循环控制break()/continue()break用于跳出整个循环continue用于跳过当前迭代进入下一次循环。在满足特定条件时提前终止遍历或跳过不符合要求的元素。函数/宏定义function()/macro()封装可复用的代码块。function具有独立的变量作用域macro则是文本替换无独立作用域。封装复杂的编译选项设置、自定义查找依赖的逻辑、代码复用。一、IF条件判断1.基本语法结构语法说明示例基本ifif(condition)单一条件判断if(WIN32)if-elseif(condition) ... else()二选一分支if(DEBUG) ... else()if-elseif-elseif() ... elseif() ... else()多分支选择if(A) ... elseif(B) ... else()结束标记endif()必须的结束标记endif()2.条件类型类别语法说明示例逻辑运算NOT condition逻辑非if(NOT WIN32)condition1 AND condition2逻辑与if(UNIX AND NOT APPLE)condition1 OR condition2逻辑或if(DEBUG OR TEST_MODE)字符串比较var STREQUAL string字符串相等if(TYPE STREQUAL Debug)var STRLESS string字符串小于字典序if(NAME STRLESS zzz)var STRGREATER string字符串大于if(VER STRGREATER 1.0)var MATCHES regex正则匹配if(FILE MATCHES .*\\.cpp$)数值比较var EQUAL number数值相等if(COUNT EQUAL 5)var LESS number小于if(AGE LESS 18)var GREATER number大于if(SIZE GREATER 1024)var LESS_EQUAL number小于等于if(N LESS_EQUAL 100)var GREATER_EQUAL number大于等于if(N GREATER_EQUAL 0)文件/目录EXISTS path文件或目录存在if(EXISTS /tmp/file)IS_DIRECTORY path是否为目录if(IS_DIRECTORY /usr)IS_SYMLINK path是否为符号链接if(IS_SYMLINK /link)IS_ABSOLUTE path是否为绝对路径if(IS_ABSOLUTE ${PATH})变量检查DEFINED var变量已定义if(DEFINED MY_VAR)var变量非空且非假值if(MY_VAR)目标检查TARGET name目标是否存在if(TARGET mylib)COMMAND name命令是否存在if(COMMAND add_test)3.布尔False类型假值说明0数字零OFF关闭标志NO否定标志FALSE布尔假N否定简写IGNORE忽略标志NOTFOUND未找到标志空字符串*-NOTFOUND任何以-NOTFOUND结尾的字符串# 判断是否为 Windows 系统if(WIN32)message(STATUS当前系统为 Windows)# 判断是否为 Linux 系统 (UNIX 且非 APPLE)elseif(UNIX AND NOT APPLE)message(STATUS当前系统为 Linux)else()message(STATUS其他操作系统)endif()message(CMAKE_SYSTEM_NAME:${CMAKE_SYSTEM_NAME})变量名为 TRUE 的条件说明‌WIN32‌Windows 系统包括 32位 和 64位 Windows。‌注意‌在 Cygwin 中也可能为真需结合 CYGWIN 判断。‌APPLE‌Apple 系统包括 macOS (Darwin) 和 iOS。‌UNIX‌类 Unix 系统包括 Linux, macOS, BSD, AIX, Solaris 等。‌注意‌macOS 既是 APPLE 也是 UNIX。‌ANDROID‌Android 系统基于 Linux 内核但通常单独处理。‌IOS‌iOS 系统Apple 移动操作系统。MSVCMSVC编译器使用Microsoft Visual CCMAKE_COMPILER_IS_GNUCXXGCC编译器使用GNU C编译器‌CYGWIN‌Cygwin 环境Windows 下的 POSIX 兼容层。‌MSYS‌MSYS/MinGW 环境Windows 下的另一种 POSIX 兼容层。具体系统名称可以读取变量CMAKE_SYSTEM_NAME操作系统CMAKE_SYSTEM_NAME 的值备注‌Windows‌“Windows”‌Linux‌“Linux”各种发行版Ubuntu, CentOS等均为此值。‌macOS‌“Darwin”‌注意‌不是 “macOS” 或 “Apple”。‌iOS‌“iOS”‌Android‌“Android”‌FreeBSD‌“FreeBSD”‌AIX‌“AIX”IBM Unix 系统。‌Solaris‌“SunOS”Oracle Solaris。二、列表循环foreach# 定义一个listset(TEST_FILES TestA.cpp TestB.cpp TestC.cpp)# 遍历listforeach(file_name IN LISTS TEST_FILES)message(STATUSfile_name:${file_name})endforeach()# 从 1 遍历到 5步长为 2foreach(i RANGE152)message(STATUS指定步长:${i})endforeach()# 从 1 遍历到 5默认步长为 1foreach(i RANGE15)message(STATUS默认步长:${i})endforeach()三、条件循环whileset(count0)while(count LESS3)message(STATUS当前结果:${count})math(EXPR count${count} 1)endwhile()四、循环控制break与continue# 跳过偶数foreach(i RANGE110)math(EXPR temp${i}% 2)if(${temp}EQUAL0)message(STATUS跳过偶数:${i})continue()endif()# 输出奇数message(STATUS输出奇数:${i})# 如果数字大于7退出循环if(${i}GREATER7)message(STATUS数字${i}大于7循环结束)break()endif()endforeach()五、函数与宏 (function/macro)function(my_func value)set(name value)message(STATUS赋值 name -${value})endfunction()my_func(张三)