变量
预定义变量
1 2 3 4 5 6 7 8 9 10 |
PROJECT_SOURCE_DIR # 工程的根目录 PROJECT_BINARY_DIR # 运行 cmake 命令的目录,通常是 ${PROJECT_SOURCE_DIR}/build PROJECT_NAME # 返回通过 project 命令定义的项目名称 CMAKE_CURRENT_SOURCE_DIR # 当前处理的 CMakeLists.txt 所在的路径 CMAKE_CURRENT_BINARY_DIR # target 编译目录 CMAKE_CURRENT_LIST_DIR # CMakeLists.txt 的完整路径 CMAKE_CURRENT_LIST_LINE # 当前所在的行 CMAKE_MODULE_PATH # 定义自己的 cmake 模块所在的路径,SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake),然后可以用INCLUDE命令来调用自己的模块 EXECUTABLE_OUTPUT_PATH # 重新定义目标二进制可执行文件的存放位置 LIBRARY_OUTPUT_PATH # 重新定义目标链接库文件的存放位置 |
环境变量
1 2 3 4 5 |
# 使用环境变量 $ENV{Name} # 写入环境变量, 这里没有`$`符号 set(ENV{Name} value) |
系统信息
1 2 3 4 5 6 7 8 9 |
CMAKE_MAJOR_VERSION # cmake 主版本号, 比如 3.4.1 中的 3 CMAKE_MINOR_VERSION # cmake 次版本号,比如 3.4.1 中的 4 CMAKE_PATCH_VERSION # cmake 补丁等级,比如 3.4.1 中的 1 CMAKE_SYSTEM # 系统名称,比如 Linux-2.6.22 CMAKE_SYSTEM_NAME # 不包含版本的系统名,比如 Linux CMAKE_SYSTEM_VERSION # 系统版本,比如 2.6.22 CMAKE_SYSTEM_PROCESSOR # 处理器名称,比如 i686 UNIX # 在所有的类 UNIX 平台下该值为 TRUE,包括 OS X 和 cygwin WIN32 # 在所有的 win32 平台下该值为 TRUE,包括 cygwin |
主要开关
1 2 3 4 5 6 7 8 9 10 11 12 |
# 这个开关用来控制默认的库编译方式,如果不进行设置,使用 add_library 又没有指定库类型的情况下,默认编译生成的库都是静态库。 # 如果 set(BUILD_SHARED_LIBS ON) 后,默认生成的为动态库 BUILD_SHARED_LIBS # 设置 C 编译选项,也可以通过指令 add_definitions() 添加 CMAKE_C_FLAGS # 设置 C++ 编译选项,也可以通过指令 add_definitions() 添加 CMAKE_CXX_FLAGS # exp: 参数之间用空格分隔 add_definitions(-DENABLE_DEBUG -DABC) |
语法
set
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# 1、set 直接设置变量的值 set(SRC_LIST main.cpp test.cpp) add_executable(demo ${SRC_LIST}) # 2、set 追加设置变量的值 set(SRC_LIST main.cpp) set(SRC_LIST ${SRC_LIST} test.cpp) add_executable(demo ${SRC_LIST}) # 3、list 追加或者删除变量的值 set(SRC_LIST main.cpp) list(APPEND SRC_LIST test.cpp) list(REMOVE_ITEM SRC_LIST main.cpp) add_executable(demo ${SRC_LIST}) # Reading list(LENGTH <list> <out-var>) # 返回list的长度 list(GET <list> <element index> [<index> ...] <out-var>) # 返回list中index的element到value中 list(JOIN <list> <glue> <out-var>) list(SUBLIST <list> <begin> <length> <out-var>) # Search list(FIND <list> <value> <out-var>) # Modification list(APPEND <list> [<element>...]) # 添加新element到list中 list(FILTER <list> {INCLUDE | EXCLUDE} REGEX <regex>) list(INSERT <list> <index> [<element>...]) list(POP_BACK <list> [<out-var>...]) list(POP_FRONT <list> [<out-var>...]) list(PREPEND <list> [<element>...]) list(REMOVE_ITEM <list> <value>...) list(REMOVE_AT <list> <index>...) list(REMOVE_DUPLICATES <list>) # 从list中删除重复的element list(TRANSFORM <list> <ACTION> [...]) # Ordering list(REVERSE <list>) list(SORT <list> [...]) |
if
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# 1、逻辑判断和比较: if (expression) # expression 不为空(0,N,NO,OFF,FALSE,NOTFOUND)时为真 if (not exp) # 与上面相反 if (var1 AND var2) # 与 if (var1 OR var2) # 或 if (COMMAND cmd) # 如果 cmd 确实是命令并可调用为真 if (EXISTS dir)/if (EXISTS file) # 如果目录或文件存在为真 if (file1 IS_NEWER_THAN file2) # 当 file1 比 file2 新,或 file1/file2 中有一个不存在时为真,文件名需使用全路径 if (IS_DIRECTORY dir) # 当 dir 是目录时为真 if (DEFINED var) # 如果变量被定义为真 if (var MATCHES regex) # 给定的变量或者字符串能够匹配正则表达式 regex 时为真,此处 var 可以用 var 名,也可以用 ${var} if (string MATCHES regex) # 同上 # 2、数字比较: if (variable LESS number) # LESS 小于 if (string LESS number) if (variable GREATER number) # GREATER 大于 if (string GREATER number) if (variable EQUAL number) # EQUAL 等于 if (string EQUAL number) # 3、字母表顺序比较: if (variable STRLESS string) if (string STRLESS string) if (variable STRGREATER string) if (string STRGREATER string) if (variable STREQUAL string) if (string STREQUAL string) # 4、示例 if(${CMAKE_BUILD_TYPE} MATCHES "debug") ... endif() if(UNIX) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fpermissive -g") else() add_definitions(-D_SCL_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -D_WIN32_WINNT=0x601 -D_WINSOCK_DEPRECATED_NO_WARNINGS) endif() |
while
1 2 3 |
while(condition) ... endwhile() |
foreach
1 2 3 4 5 6 7 8 9 |
# start 表示起始数,stop 表示终止数,step 表示步长 foreach(loop_var RANGE start stop [step]) ... endforeach(loop_var) # 示例(输出:1、3、5、7、9) foreach(i RANGE 1 9 2) message(${i}) endforeach(i) |
macro
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# MACRO: 用宏来实现封装,自定义一个命令 # 宏的ARGN、ARGV等参数不是通常CMake意义上的变量。 它们是字符串替换,很像C预处理器对宏的处理。 # ARGV 是一个下标,0指向第一个参数,累加 # ARGV 所有的定义时要求传入的参数 # ARGN 定义时要求传入的参数以外的参数,比如定义宏(函数)时,要求输入1个,书记输入了3个,则剩下的两个会以数组形式存储在ARGN中 # ARGC 传入的实际参数的个数,也就是调用函数是传入的参数个数 MACRO(<name> [arg1 [arg2 [arg3 ...]]]) COMMAND1(ARGS ...) COMMAND2(ARGS ...) ... ENDMACRO(<name>) # 定义一个宏,用来简化测试工作 macro (do_test arg1 arg2 result) add_test (test_${arg1}_${arg2} Demo ${arg1} ${arg2}) set_tests_properties (test_${arg1}_${arg2} PROPERTIES PASS_REGULAR_EXPRESSION ${result}) endmacro (do_test) # 使用该宏进行一系列的数据测试 do_test (5 2 "is 25") do_test (10 5 "is 100000") do_test (2 10 "is 1024") |
function
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# function: 用函数来实现封装,自定义一个命令 function(<name> [<arg1> ...]) <commands> endfunction() # 定义一个简单的打印函数 function(_foo) foreach(arg IN LISTS ARGN) message(STATUS "this in function is ${arg}") endforeach() endfunction() _foo(a b c) # this in function is a # this in function is b # this in function is c |
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Macos开发问题:aarch64架构宏不识别06/25
- ♥ cmake命令参数10/02
- ♥ CLion:配置C++下Nasm开发环境(debian)08/06
- ♥ Cmake应用记述二05/12
- ♥ Cmake应用记述一04/16
- ♥ Why CMake?10/02