cmake_minimum_required
描述:指定能够支持构建本工程的CMake的最低版本
使用:
cmake_minimum_required(VERSIONmajor[.minor[.patch[.tweak]]][FATAL_ERROR])
举例:
<span style="color:#000000;">cmake_minimum_required(VERSION 2.8) #要求CMake的最低版本是2.8,如果当前的cmake程序的版本低于2.8将停止构建过程并产生一个错误。</span>
project
描述:指定待构建工程的名称
使用:
project(<projectname> [languageName1 languageName2 ...])
举例:
<pre class="cpp" name="code"><span style="color:#000000;">project(myapp) #如果没有指定语言,将使用默认语言C和CXX。
project(myapp C) #指定使用C语言,不使用CXX。
project(myapp CXX) #指定使用CXX,不使用C。</span>
set
描述:给CMake变量,缓存变量或环境变量赋值,或创建一个变量并赋值
使用:
set(<variable> <value> [[CACHE <type> <docstring> [FORCE]] |PARENT_SCOPE])
举例:
<span style="color:#000000;">set(PREFIX${CMAKE_INSTALL_PREFIX}) #创建变量PREFIX并设置其值为${CMAKE_INSTALL_PREFIX}
set(SRCS a.c b.c c.c) #创建变量SRCS,其值为以分号分隔的一组值"a.c;b.c;c.c"
set(ENV{PATH} /home/martink) #设置环境变量PATH</span>
if
描述:条件判断
使用:
if(expression)
# then section.
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
elseif(expression2)
# elseif section.
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
else(expression)
# else section.
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
endif(expression)
举例:表达式是常量,如果常量是1,ON,YES,TRUE,Y或非0数字返回True;如果常量是0,OFF,NO,FALSE,N,IGNORE,NOTFOUND或以"-NOTFOUND"结尾返回False。
if(<constant>)
举例:表达式是变量
if(<variable>)
if(NOT <expression>)
if(<expr1> AND <expr2>)
if(<expr1> OR <expr2>)
举例:
if(EXISTS file-name) #文件存在
if(EXISTS directory-name) #目录存在
if(IS_DIRECTORY directory-name) #是目录
if(<variable|string> MATCHES regex) #匹配正规表达式
#数字比较
if(<variable|string> LESS <variable|string>)
if(<variable|string> GREATER <variable|string>)
if(<variable|string> EQUAL <variable|string>)
#字符串比较
if(<variable|string> STRLESS <variable|string>)
if(<variable|string> STRGREATER <variable|string>)
if(<variable|string> STREQUAL <variable|string>)
#变量已定义
if(DEFINED <variable>)
message
描述:打印信息
使用:
message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] "message to display" ...)
举例:
<span style="color:#000000;">message("hello world!") #
message(STATUS "Install Path: ${CMAKE_INSTALL_PREFIX}") #
message(FATAL_ERROR "can't find db file") # 打印信息并终止</span>
include
描述:从另外一个文件或模块加载和执行CMake代码
使用:
include(<file|module> [OPTIONAL] [RESULT_VARIABLE <VAR>] [NO_POLICY_SCOPE])
举例:
include(${MODEL_CONFIG_INCLUDE_DIRS}/model-config-options.cmake) #包含文件
#包含模块
include(FindPkgConfig)
pkg_check_modules(LIB_PKGS REQUIRED gtk+-2.0)
FOREACH(flag ${LIB_PKGS_CFLAGS})
SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
ENDFOREACH(flag)
SET(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS} -fPIC -Wall")
SET(CMAKE_C_FLAGS_DEBUG "-O0 -g")
SET(CMAKE_C_FLAGS_RELEASE "-O2 -g")
add_definitions
描述:为源文件添加宏定义
使用:
add_definitions(-DFOO -DBAR ...)
举例:
ADD_DEFINITIONS("-DIMAGEDIR=\"${IMAGEDIR}\"") # 设置宏IMAGEDIR,源程序可以直接使用该宏
ADD_DEFINITIONS("-D\"${RESOLUTION}\"")
ADD_DEFINITIONS("-D_LINUX")
include_directories
描述:为构建指定头文件所在路径
使用:
include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
举例:
include_directories(src/include include)
add_subdirectory
描述:增加子目录到本构建,source_dir中包括源文件和CMakeLists.txt文件
使用:
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
举例:
<pre class="cpp" name="code">add_subdirectory(src) # src子目录的源代码和CMakeLists.txt参与本工程的构建
add_subdirectory(examples EXCLUDE_FROM_ALL) # 子目录example的目标文件不随本工程一起产生
add_library
描述:使用指定的源文件构建一个名称为name的库, lib<name>.a lib<name>.so
使用:
add_library(<name> [STATIC|SHARED|MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)
举例:
<pre class="cpp" name="code">add_library(${PROJECT_NAME} STATIC ${SRC}) # src子目录的源代码和CMakeLists.txt参与本工程的构建
add_library(${PROJECT_NAME} SHARED ${SRC}) # 子目录example的目标文件不随本工程一起产生
add_executable
描述:使用指定的源文件构建一个名称为name的应用程序
使用:
add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FORM_ALL] source1 source2 ... sourceN)
举例:
<pre class="cpp" name="code">add_executable(${PROJECT_NAME} ${SRC}) # src子目录的源代码和CMakeLists.txt参与本工程的构建
target_link_libraries
描述:使用指定的库与目标链接
使用:
target_link_libraries(<target> [item1 [item2 [...]]] [[debug|optimized|general] <item>] ...)
举例:
<pre class="cpp" name="code">target_link_libraries(${PROJECT_NAME} ${PKGS_LDFLAGS}) # ${PKGS_LDFLAGS}由pkg_check_modules(PKGS REQUIRED gtk+-2.0)产生
set_target_properties
描述:设置目标属性
使用:
set_target_properties(target1 target2 ... PROPERTIES prop1 value1 prop2 value2 ...)
举例:
<pre class="cpp" name="code">set_target_properties(mylib-static PROPERTIES OUT_NAME "mylib" PERFIX "lib") # libmylib-static.a -> libmylib.a
set(VERSION 0.0.1)
add_library(mylib SHARED ${SRCS})
set_target_properties(mylib PROPERTIES SOVERSION ${VERSION}) # create symblink mylib.so.0.0.1
configure_file
描述:配置目标属性
使用:
configure_file(<input> <output> [COPYONLY] [ESCAPE_QUOTES] [@ONLY] [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])
举例:
CMakeLists.txt
set(PREFIX ${CMAKE_INSTALL_PREFIX})
set(LIBDIR "${PREFIX}/lib")
set(INCLUDEDIR "${PREFIX}/include")
set(VERSION 0.0.1)
configure_file(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY) # 只替换文件中@var@变量
####################################################
pc.in file:
prefix=@PREFIX@
exec_prefix=@PREFIX@
libdir=@LIBDIR@
includedir=@INCLUDEDIR@
Name: XXXXXX
Description: XXX library
Version: @VERSION@
Libs: -L${libdir} -l@PROJECT_NAME@
Cflags: -I${includedir}
####################################################
pc file: if CMAKE_INSTALL_PREFIX=/usr
prefix=/usr
exec_prefix=/usr
libdir=/usr/lib
includedir=/usr/include
Name: XXXXXX
Description: XXX library
Version: 0.0.1
Libs: -L${libdir} -l@PROJECT_NAME@
Cflags: -I${includedir}
install
描述:定义安装阶段的脚本
使用:
install(type src DESTINATION dest)
举例:
install(TARGETS ${PROJECT_NAME} DESTINATION /usr/lib) # install the shared library to /usr/lib
install(FILES ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION /usr/lib/pkgconfig) # install pc file to /usr/lib/pkgconfig
install(DIRECTORY ${CMAKE_SOURCE_DIR}/images DESTINATION /usr/share/project) # install images fold to /usr/share/project/images