1.cmake 常用的一些宏
PROJECT_BINARY_DIR CMAKE_BINARY_DIR 工程二进制文件输出目录
PROJECT_SOURCE_DIR CMAKE_SOURCE_DIR 工程顶层目录
EXECUTABLE_OUTPUT_PATH 可执行文件输出目录
LIBRARY_OUTPUT_PATH 库文件输出目录
CMAKE_INSTALL_PREFIX 安装位置前缀 相对路径
OUTPUT_NAME 二进制输出名字
VERSION 动态库版本 SOVERSION 指代API版本
两个环境变量(不是cmake变量):CMAKE_INCLUDE_PATH 和CMAKE_LIBRARY_PATH
CMAKE_CURRENT_SOURCE_DIR 当前处理的CMakeLists.txt所在路径
CMAKE_CURRENT_BINARY_DIR :target编译目录
CMAKE_CURRENT_LIST_FILE 输出调用这个变量的CMakeLists.txt的完整路径
CMAKE_CURRENT_LIST_LINE 输出这个变量所在的行
CMAKE_MODULE_PATH 这个变量用来定义自己的cmake模块所在的路径
系统信息变量
CMAKE_MAJOR_VERSION CMAKE 主版本号
CMAKE_MINOR_VERSION CMAKE 次版本号
CMAKE_PATCH_VERSION CMAKE 补丁等级
CMAKE_SYSTEM 系统名称
CMAKE_SYSTEM_NAME 不包含版本的系统名
CMAKE_SYSTEM_VERSION 系统版本号
CMAKE_SYSTEM_PROCESSOR 处理器名称 比如i686
UNIX 在所有的类UNIX平台为TRUE 包括OS X和cygwin
WIN32,在所有的win32平台为TRUE,包括cygwin
主要开关选项
CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS 用来 控制IF ESLE 语法的书写方式,
BUILD_SHARED_LIBS 这个开关用来控制默认的库编译方式,如果不进行设置,使用ADD_LIBRARY并没有指定库类型的情况下,默认编译生成的都是静态库
CMAKE_C_FLAGS 设置C编译选项,也可以通过指定ADD_DEFINITIONS()添加
CMAKE_CXX_FLAGS 设置C++编译选项,也可以通过指令ADD_DEFINITIONS()添加
2:指令
PROJECT :语法 PROJECT( projectname [CXX ] [C] [JAVA] ) 指定工程的名字以及工程支持的语言 , 默认情况下支持所有语言;
SET :语法 SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])只需要了解SET指令可以用来显示的定义变量即可 例如:set(SRC_LIST main.c)
MESSAGE: 语法 MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display") 这个指令用于向终端用户定义的信息 :
SEND_ERROR:产生错误 ,生成过程被跳过
STATUS:输出前缀w为-的信息
FATAL_ERROR:立即终止所有cmake过程
ADD_EXECUTABLE:ADD_EXECUTABLE( BINARY_NAME ${SRC_LIST} ) 生成可执行文件 后跟源文件列表
ADD_SUBDIRECTORY: ADD_SUBDIRECTORY( source_dir [binary_dir] [EXCLUDE_FROM_ALL] ) 添加子目录,并可以指定中间二进制和目标二进制存放的位置,EXCLUDE_FROM_ALL 参数的含义是将这个目录从编译过程中排除
INSTALL :用于定义安装规则,安装的内容可以包括目标二进制、动态库/静态库以及文件/目录/脚本等
目标文件安装: INSTALL (TARGETS targets ....)
[ [ARCHIVE|LIBRARY|RUNTIME]
[DESTINATION (dir)]
[PERMISSIONS permissions] [CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>] [OPTIONAL] ] [ ..... ])
TARGETS 后面跟就是我们 通过ADD_EXECUTABLE或者ADD_LIBRARY定义的目标文件,可能是可执行文件
/动态库/静态库
目标类型有三种:ARCHIVE 特指静态库,LIBRARY特指动态库 RUMTIME 特指可执行目标文件
DESTINATION:定义了安装路径,如果路径以/开头 ,那么指的是绝对路径,这个时候CMAKE_INSTALL_PREFIX其实就无效了,如果你希望使用CMAKE_INSTALL_PREFIX来定义安装 路径,就要写成相对路径,即不要以/开头 ,那末安装路径后的路径就是${CMAKE_INSTALL_PREFIX}/<DESTINATION定义的路径>
例子:INSTALL (TARGETS myrun mylib mystaticlib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION libstatic)
INSTALL ( FILES files ... DESTINATION <dir> [PERMISSIONS permissions ...] [CONFIGURATIONS [Debug | Release |..]] [COMPONENT <component>] [RENAME <name>] [OPTIONAL] ) 可用于安装一般文件,并可以指定访问权限,文件名是此指令所在路径下的相对路径,如果默认不定义PERMISSIONS,安装后的权限为OWNER_WRITE, OWNER_READ, GROUP_READ和WORLD_READ 即644权限
安装时CMAKE脚本的执行
INSTALL ([[SCRIPT <file>] [CODE <code>]] [...])
SCRIPT 参数用于在安装时调用cmake脚本文件( 也就是<abc>.cmake )
CODE 参数用于执行CMAKE指令,必须以双引号括起来,比如:INSTALL (CODE "MESSAGE(\"Sample install message.\")")
ADD_LIBRARY : 语法 ADD_LIBRARY( libname [SHARED|STATIC|MODULE] [EXCLUDE_REOM_ALL] libsrc_list)
SET_TARGET_PROPERTIES:语法 SET_TARGET_PROPERIES( target1 target2 .... PROPERTIES prop1 value1 prop2 values ... )
INCLUDE_DIRECTORIES:语法 INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...) 向工程添加多个特定的头文件搜索路径,路径之间用空格分割 默认的行为是追加到当前的头文件搜索路径的后面,可以通过两种方式来进行控制搜索路径添加的方式:
a:CMAKE_INCLUDE_DIRECTORIES_BEFORE 通过SET这个cmake变量为on,可以将添加的头文件搜索路径放在已有路径的前面
b:通过AFTER 或者BEFORE参数,也可以控制是追加还是置前
LINK_DIRECTORIES:语法 LINK_DIRECTORIES( directory1 directory2 ... ) 添加非标准的共享库搜索路径
TARGET_LINK_LIBRARIES : 语法 TARGET_LINK_LIBRARIES( TARGET library1 <debug|optimized> library2 ... ) 这个指令可以用来为target 添加需要链接的共享库,同样也可以用于为自己编写的共享库添加共享库链接
FIND_PATH:语法 FIND_PATH(myHeader NAMES hello.h PATHS /usr/include /usr/include/hello)
ADD_DEFINITIONS: 向C/C++编译其添加-D定义, 定义预编译宏
ADD_DEPENDENCIES :语法 ADD_DEPENDENCIES(target-name depend-target1 depend-target2 ....)
ADD_TEST 与ENABLE_TESTING指令: ENABLE_TESTING指令用来控制Makefile是否构建test目标,涉及工程所有目录 。一般情这个指令放在工程 的主CMakeLists.txt中 ADD_TEST( testname Exename arg1 arg2 ... ) 如果没有在同一个 CMakeLists.txt中打开ENABLE_TESTING()指令,任何ADD_TEST都是无效的
AUX_SOURCE_DIRECTORY :语法 AUX_SOURCE_DIRECTORY( dir VARIABLE ) 作用是发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指令临时被用来自动创建源文件列表。因为目前cmake还不能自动发现新添加的源文件
EXEC_PROGRAM( Executable [directory in which to run] [ARGS <argument to executable>] [OUTPUT_VARIABLE <var> ] [RETURN_VALUE <var>]) 用于在指定的目录运行某个程序,通过ARGS添加参数,如果需要获取输出和返回值,可以通过OUTPUT_VARIABLE和RETURN_VALUE分别定义两个变量
FIND_系列指令主要包含 以下指令: FIND_FILE(找文件) FIND_LIBRARY:找库 FIND_PATH:找文件路径 FIND_PROGRAM:可执行程序的全路径 语法:FIND_XXX( <VAR> name1 path1 path2 ) 结果放在VAR变量中
控制指令:
1: IF 指令,基本语法为:
IF(expression)
#then section
COMMAND1( ARGS ... )
COMMAND2( ARGS ... )
ELSE( expression )
COMMAND1( ARGS ... )
COMMAND2(ARGS ...)
ENDIF(expression)