CMake基本语法规则:
1,变量引用:使用${varname}方式取值,但是在 IF 控制语句中直接使用变量名;C中也可以引用相关的变量
2,指令格式为:指令(参数1 参数2 ...),参数之间使用空格或分号分开。
3,指令大小写无关,参数和变量大小写相关。推荐全部使用大写指令。
4,字符串可以不用" ",但如果中间需要空格则一定要用
5,源文件的后缀可以省略,系统会自动寻找添加后缀
cmake_minimum_required (VERSION 2.6)
定义至少需要的Cmake版本号
PROJECT(projectname [CXX]|[C]|[Java])
定义项目名称,可以指定支持的语言。
同时定义了PROJECT_BINARY_DIR、PROJECT_SOURCE_DIR,前者指向编译文件存放的目录,后者指向项目所在目录
set (VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
定义变量
SET(EXECUTABLE_OUTPUT_PATH PATH)
SET(LIBRARY_OUTPUT_PATH PATH)
改变最终目标的存放位置,优先于ADD_SUBDIRECTORY定义的输出目录,可以随时改变ADD_EXECUTABLE、ADD_LIBRARY的存放地
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)
用于向终端输出信息:
SEND_ERROR,产生错误,生成过程被跳过;
STATUS,输出前缀为-的信息;
FATAL_ERROR,同时终止cmake
常用系统变量
${CMAKE_ROOT}
${CMAKE_BINARY_DIR}
${CMAKE_SOURCE_DIR}
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}
CMAKE_INSTALL_PREFIX
add_executable(exename srcfile1 srcfile2 ... srcfileN)
定义生成可执行文件的组成文件。
add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL]
source1 source2 ... sourceN)
生成库文件。libname不需要写全名,例如库文件libhello.so,只需要写hello即可。
类型有三种:SHARED,动态库;STATIC,静态库;MODULE,在使用dyld的系统有效,如果不支持dyld,则被当作SHARED对待。
EXCLUDE_FROM_ALL 指库不会被默认构建,除非有其他的组件依赖或者手工构建。
target_link_libraries (target library1 library2 ... libraryN)
为target添加需要链接的共享库,target可以是可执行文件,也可以是库
SET_TARGET_PROPERTIES(target1 target2 ...
PROPERTIES prop1 value1
prop2 value2 ...)
GET_TARGET_PROPERTY(VAR target property)
设置目标的属性名字和取值,属性有
OUTPUT_NAME为输出名字,
OUTPUT_VALUE为取值,
CLEAN_DIRECT_OUTPUT,1时不清理
VERSION, 版本号
SOVERSION, API版本
configure_file (
"${PROJECT_SOURCE_DIR}/TutorialConfig.h.in"
"${PROJECT_BINARY_DIR}/TutorialConfig.h"
)
生成配置文件,用var1生成var2
include_directories(directory1 directory2 ... directoryN)
增加头文件的搜索路径
add_subdirectory (source_dir [binary_dir] [EXCLUDE_FROM_ALL])
增加需要处理的子目录,binary_dir可以指定生成目标的存放位置,这个路径下应该有一个cMakeLists.txt
最后的参数指将此目录从编译过程排除,需要最后单独构建。
ADD_DEPENDENCIES(target-name depend-target1 depend-target2 ...)
定义target依赖的其他target,确保在编译本target之前,其他的target已经被构建。
option (USE_MYMATH
"Use tutorial provided math implementation" ON)
在CmakeGUI上增加一个USE_MYMATH的选项,默认值为ON,也等同于定义了一个变量
if (USE_MYMATH)
include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions")
add_subdirectory (MathFunctions)
set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif (USE_MYMATH)
INSTALL(TARGETS targets1 ...
[[ARCHIVE|LIBRARY|RUNTIME]
[DESTINATION ]
[PERMISSIONS permissions...]
[CONFIGURATIONS
[Debug|Release|...]]
[COMPONENT ]
[OPTIONAL]
] [...])
用于安装TARGETS到DESTINATION目录下。
目标文件targets可以是三种类型:RUNTIME可执行二进制、LIBRARY动态库、ARCHIVE静态库。
DESTINATION 定义安装路径,使用相对路径则由CMAKE_INSTALL_PREFIX指定,使用绝对路径则CMAKE_INSTALL_PREFIX无效。
INSTALL(FILES files... DESTINATION
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT ]
[RENAME ] [OPTIONAL])
FILES表明用于安装普通文件,files文件名是此指令所在路径下的相对路径。
如果不定义 PERMISSIONS,安装后的权限为OWNER_WRITE,OWNER_READ,GROUP_READ和 WORLD_READ
INSTALL(PROGRAMS files... DESTINATION
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT ]
[RENAME ] [OPTIONAL])
非目标文件的可执行程序安装(如脚本):同FILES使用,但安装后权限默认为:
OWNER_EXECUTE, GROUP_EXECUTE, 和 WORLD_EXECUTE
INSTALL(DIRECTORY dirs... DESTINATION
[FILE_PERMISSIONS permissions...]
[DIRECTORY_PERMISSIONS permissions...]
[USE_SOURCE_PERMISSIONS]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT ]
[[PATTERN | REGEX ]
[EXCLUDE] [PERMISSIONS permissions...]] [...])
目录安装,DIRECTORY 指所在 Source 目录的相对路径,但务必注意:如果目录名不以/结尾,那么这个目录将被安装为目标路径下的 abc;如果目录名以/结尾,
代表将这个目录中的内容安装到目标路径,但不包括这个目录本身。
PATTERN 用于使用正则表达式进行过滤,PERMISSIONS 用于指定 PATTERN 过滤后的文件权限。
add_test (TutorialRuns Tutorial 25)
does the application run?
add_test (TutorialComp25 Tutorial 25)
set_tests_properties (TutorialComp25
PROPERTIES PASS_REGULAR_EXPRESSION "25 is 5")
does it sqrt of 25,可以测试输出的语句
macro (do_test arg result)
add_test (TutorialComp${arg} Tutorial ${arg})
set_tests_properties (TutorialComp${arg}
PROPERTIES PASS_REGULAR_EXPRESSION ${result})
endmacro (do_test)
do_test (25 "25 is 5")
宏,define a macro to simplify adding tests, then use it
CheckFuntionExists.cmake检查系统是否存在某个函数
include (CheckFunctionExists.cmake)
check_function_exists (log HAVE_LOG)
函数名为log,结果在HAVE_LOG中,
用生成.h文件的办法定义HAVE_LOG,如果有log函数,则定义HAVE_LOG
#cmakedefine HAVE_LOG
# add the command to generate the source code
add_custom_command (
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Table.h
COMMAND MakeTable ${CMAKE_CURRENT_BINARY_DIR}/Table.h
DEPENDS MakeTable
)