CMake中的变量
 
-  
变量和含义
常用变量 含义 PROJECT_NAME工程名变量 PROJECT_SOURCE_DIR顶层的项目目录 PROJECT_BINARY_DIR使用 cmake的路径CMAKE_ROOTCMAKE安装的根目录CMAKE_BUILD_TYPE编译类型: empty,Debug,Release…CMAKE_SOURCE_DIR顶层的 CMakeLists.txt所在路径CMAKE_BINARY_DIR顶层的 CMakeLists.txt的build所在目录CMAKE_<LANG>_COMPILER设定某个语言 LANG的编译器,比如g++CMAKE_INSTALL_PREFIX指令 install的路径CMAKE_CURRENT_SOURCE_DIR当前 CMakeLists.txt所在路径CMAKE_CURRENT_BINARY_DIR当前 CMakeLists.txt的build所在目录EXECUTABLE_OUTPUT_PATH可执行文件输出路径 LIBRARY_OUTPUT_PATH库输出路径  -  
个别变量解释
源码目录结构jmudou ├── build.sh├── CMakeLists.txt└── muduo└── base├── Atomic.h├── CMakeLists.txt├── copyable.h├── tests│ ├── Atomic_unittest.cc│ ├── CMakeLists.txt│ └── Timestamp_unittest.cc├── Timestamp.cc├── Timestamp.h└── Types.h三个
CMakeLists.txt输出jmuduo/CMakeLists.txt: PROJECT_SOURCE_DIR= 11/jmuduoPROJECT_BINARY_DIR= 11/build/debug CMAKE_SOURCE_DIR= 11/jmuduo # 指定顶层的CMakeLists.txt的,因此所有的都相同CMAKE_BINARY_DIR= 11/build/debug# 上面四项都是与整个项目相关,因此都是一致的。CMAKE_CURRENT_SOURCE_DIR= 11/jmuduo # 指定当前层的CMakeLists.txt的,因此与层相关CMAKE_CURRENT_BINARY_DIR= 11/build/debugmuduo/base/test/CMakeLists.txt: PROJECT_SOURCE_DIR= 11/jmuduoPROJECT_BINARY_DIR= 11/build/debugCMAKE_SOURCE_DIR= 11/jmuduoCMAKE_BINARY_DIR= 11/build/debugCMAKE_CURRENT_SOURCE_DIR= 11/jmuduo/muduo/base/testsCMAKE_CURRENT_BINARY_DIR= 11/build/debug/muduo/base/testsmuduo/base/CMakeLists.txt: PROJECT_SOURCE_DIR= 11/jmuduoPROJECT_BINARY_DIR= 11/build/debugCMAKE_SOURCE_DIR= 11/jmuduoCMAKE_BINARY_DIR= 11/build/debugCMAKE_CURRENT_SOURCE_DIR= 11/jmuduo/muduo/baseCMAKE_CURRENT_BINARY_DIR= 11/build/debug/muduo/base 
函数
所有的函数列表中,<>表示的参数必须要有,[]表示的参数为可选。
-  
set
可以设置三个类型的变量值:正常变量,cache variable、环境变量。Normal Variable:set(<variable> <value>... [PARENT_SCOPE])cache:set(<variable> <value>... CACHE <type> <docstring> [FORCE])env:set(ENV{<variable>} [<value>])
 -  
OPTION:提供用户可以选择的选项- 格式:
option(<variable> "description" [initial value]) - 比如:
option(USE_MYPATH"user path"ON) 
 - 格式:
 -  
aux_source_directory- 语法:
aux_source_directory(<dir> <variable>) - 查找目录
dir下的所有源文件(即.c, .cpp, .cc等文件),并将名称保存到variable变量 
 - 语法:
 -  
add_subdirectoryadd_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])- 添加一个将被编译的子目录。指明
CMakeLists.txt所在目录下包含了一个子目录source_dir。这样source_dir下的源文件和CMakeLists.txt等也会被处理。 
 -  
target_link_librariestarget_link_libraries(exec libs)- 表示可执行程序
exec需要链接到一个名为libs的链接库。 
 -  
add_libraryadd_library (name dir)- 用在目录
dir下的源文件生成一个名为name的静态链接库:libname.a 
 -  
configure_file- 加入一个配置头文件,用于处理 CMake 对源码的设置
在配置文件configure_file ("${PROJECT_SOURCE_DIR}/config.h.in" # config.h.in文件目录"${PROJECT_BINARY_DIR}/config.h" # config.h 生成的头文件目录)config.h中,配置相关项,比如options中的USE_MYPATH:#cmakedefine USE_MYMATH 
 - 加入一个配置头文件,用于处理 CMake 对源码的设置
 -  
includeinclude(file [optional]):读取CMake的相关文件。include(moudle [optional])
the file with name .cmake is searched in theCMAKE_MODULE_PATH。
 -  
include_directoriesinclude_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])添加指定目录到编译器搜索路径。
 -  
install
使用:cmake之后,sudo make install就可以执行相应的库和头文件的安装。TARGET格式install(TARGETS targets...[[ARCHIVE|LIBRARY|RUNTIME][DESTINATION <dir>][PERMISSIONS permissions...][CONFIGURATIONS [Debug|Release|...]][COMPONENT <component>] [OPTIONAL]] [...])targets的类型
可以安装的库有[ARCHIVE|LIBRARY|RUNTIME]三种:
1) 可执行程序视为runtime
2) 静态库视为archieve
3)Module Library视为library
4) 共享库和平台有关- 参数 
-  
DESTINATION:
指定一个文件将要被安装的目录。如果给的是一个全路径,那么就直接使用;如果是相对路径,默认是相对CMAKE_INSTALL_PREFIX,其值默认是/usr/local/。
1) 头文件:inclide
2) 可执行文件:bin
3) 库:lib -  
PERMISSIONS: 指定安装文件的权限:
1) user :OWNER_READ, OWNER_WRITE, OWNER_EXECUTE
2) group:GROUP_READ, GROUP_WRITE, GROUP_EXECUTE
3) other:WORLD_READ, WORLD_WRITE, WORLD_EXECUTE
4) uid :SETUID, and SETGID。 -  
CONFIGURATIONS:为安装规则建立一个配置文件列表。 
 -  
 
 -  
installFILES格式INSTALL(FILES files... DESTINATION <dir>[PERMISSIONS permissions...][CONFIGURATIONS [Debug|Release|...]][COMPONENT <component>][RENAME <name>] [OPTIONAL])files:即文件名
 -  
测试
enanle_testing():启动测试add_test(testname Exename arg1 arg2 ...):- 需要先运行测试程序
enanle_testing(),这个指令才有效。 Exename是可执行程序名,参数arg1, arg2。
- 需要先运行测试程序
 set_tests_properties(...)- 括号内格式:
(Exename [Exename2...] PROPERTIES prop1 value1 prop2 value2),其中PROPERTIES是固定的单词不能改 - 为
Exename设置属性,如果没有这个属性,就报错,有如下属性:
1)WILL_FAIL:如果设置为true,那么会反转测试结果的pass/fail标志。
2)PASS_REGULAR_EXPRESSION: 匹配正则表达式,只少有一个匹配,则pass
2)FAIL_REGULAR_EXPRESSION: 匹配正则表达式,则fail 
- 括号内格式:
 - 宏测试
就类似于写一个函数,用宏实现,调用:macro(<name> [arg1 [arg2 [arg3 ...]]])COMMAND1(ARGS ...)COMMAND2(ARGS ...)...endmacro(<name>)name(arg1,arg2,...)。 
 -  
设置项目的版本号
- 在顶层的
CMakeLists.txt中:# 加入版本号是 1.0set (Project_VERSION_MAJOR 1) # 主版本号set (Project_VERSION_MINOR 0) # 副版本号 - 在配置文件
config.h.in中设置:#define Project_VERSION_MAJOR @Project_VERSION_MAJOR@#define Project_VERSION_MINOR @Project_VERSION_MINOR@ main函数中就可以直接使用这两个宏,代表版本号:printf("Version %d.%d\n",Project_VERSION_MAJOR,Project_VERSION_MINOR);
 - 在顶层的
 -  
生成安装包
需要利用CPack工具,也是CMake提供的工具。- 先在顶层
CMakeLists.txt中末尾添加:# 构建一个 CPack 安装包include(InstallRequiredSystemLibraries)set (CPACK_RESOURCE_FILE_LICENSE"${CMAKE_CURRENT_SOURCE_DIR}/License.txt")set (CPACK_PACKAGE_VERSION_MAJOR "${Project_VERSION_MAJOR}")set (CPACK_PACKAGE_VERSION_MINOR "${Project_VERSION_MINOR}")include (CPack)- 导入
InstallRequiredSystemLibraries模块,以便之后导入CPack模块 - 设置一些
CPack相关变量,包括版权信息和版本信息,其中版本信息用了上一节定义的版本号 - 导入
CPack模块 
 - 导入
 - 生成二进制安装包:
cpack -C CPackConfig.cmake - or 生成源码安装包 
- 格式:
cpack -C CPackSourceConfig.cmake
在执行该命令的目录下得到:# Demo8是项目名$ ls -l | grep Demo8-rwxrwxrwx 1 szz szz 8631 Dec 12 22:03 Demo8-1.0.1-Linux.sh-rw-rw-r-- 1 szz szz 3709 Dec 12 22:03 Demo8-1.0.1-Linux.tar.gz-rw-rw-r-- 1 szz szz 4982 Dec 12 22:03 Demo8-1.0.1-Linux.tar.Z - 安装:
sh Demo8-1.0.1-Linux.sh。
默认的安装路径:By default the Demo8 will be installed in:"~/Study/SystemProgram/CMakeExe/Demo8/build/Demo8-1.0.1-Linux"Do you want to include the subdirectory Demo8-1.0.1-Linux?Saying no will install in: "~/Study/SystemProgram/CMakeExe/Demo8/build" [Yn]: - 运行。安装后,就运行该程序
$ ./Demo8-1.0.1-Linux/bin/Demo 2 5Now we use our own Math library. 2 ^ 5 is 32 - Demo8-1.0.1-Linux下的目录结果
Demo8-1.0.1-Linux├── bin│ └── Demo # 可执行程序├── include # 头文件│ ├── config.h│ └── MathFunctions.h└── lib # 静态库└── libMathFunctions.a 
 - 格式:
 
 - 先在顶层
 -  
target_compile_definitions- 格式
target_compile_definitions(<target><INTERFACE|PUBLIC|PRIVATE> [items1...][<INTERFACE|PUBLIC|PRIVATE> [items2...] ...]) - 作用:编译时定义的宏
 
 - 格式
 -  
stringREPLACE
将所有string(REPLACE <match_string> <replace_string> <output_variable> <input> [<input>...])input中出现的match_String替换为replace_string,并且将结果存在output_variable。
 -  
messagemessage([<mode>] "message to display" ...)- 显示信息给用户
mode取决于信息的类型:STATUS:以简洁的方式显示用户感兴趣的信息。
可以理解为message(STATUS "CXX_FLAGS = " ${CMAKE_CXX_FLAGS} " " ${CMAKE_CXX_FLAGS_${BUILD_TYPE}})printf,把后面的几个信息以空格相间,然后打印出来。显示结果为(和上面对应分成三段):CXX_FLAGS = -g -D_FILE_OFFSET_BITS=64 -Wall -Wextra -Werror -Wconversion -Wno-unused-parameter -Wold-style-cast -Woverloaded-virtual -Wpointer-arith -Wshadow -Wwrite-strings -march=native -rdynamic -O0
 
 - 显示信息给用户
 -  
find_packagefind_package(<PackageName> [version] [EXACT] [QUIET] [MODULE][REQUIRED] [[COMPONENTS] [components...]][OPTIONAL_COMPONENTS components...][NO_POLICY_SCOPE])主要是寻找和加载外部项目。如果
PackageName找到了,PackageName-found会显出,当没有找到时,默认显示
PackageName-not found。通过模式的选择,可以处理在没有找到包时的解决方案。QUIET:不显示有用信息,REQUIRED:报错
 -  
find_pathfind_path (<VAR> name0|NAMES name1 [path1 path2 ...])用以寻找包含着
name1文件的目录,如果找到了结果存储在VAR,没有找到结果结果是VAR-not found。成功时,变量被清除find_path再次搜索,没有成功,fin_path再次以相同的变量被调用时搜索。 -  
find_library
同上find_pathfind_library (<VAR> name0|NAMES name1 [path1 path2 ...])- OPTIONS 
NAMES
为library指定一个或多个可能的名字。
 
 - OPTIONS 
 
- 参考 
- CMake官方文档
 - CMake API搜索
 - CMake tutorial
 
 
