已hello.cpp为源文件,构建一个CMakeLists.txthtml
cmake_minimum_required(VERSION 2.8) project(hello) add_executable(hello hello.cpp)
在目录中的build 文件夹中进行cmake ..和make ,就能够编译源文件生成可运行文件.c++
cmake的经常使用命令:正则表达式
project 命令express
语句 : project(<projectname> [languageName1 languageName2 … ] )windows
做用 : 指定项目名
函数
cmake_minimum_required 命令
测试
语句 : cmake_minimum_required(VERSION major[.minor[.patch[.tweak]]] [FATAL_ERROR])ui
做用 : 指定cmake须要的最小版本url
aux_source_directory 命令
spa
语句 : aux_source_directory(<dir> <variable>)
做用 : 获取指定目录下的全部文件,保存到variable中,包括 .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp .hxx .in .txx文件
示例 : aux_source_directory(. var)#获取当前目录中源文件
add_executable 命令
语句 : add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 source2 … sourceN)
做用 : 将指定文件source编译成可执行文件,命名位name
示例 : add_executable(hello hello.cpp)
add_library 命令
语句 : add_library([STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 source2 … sourceN)
做用 : 添加一个名为<name>的库文件,指定STATIC,SHARED,或者MODULE参数用来指定要建立的库的类型。STATIC库是目标文件的归档文件,在连接其它目标的时候使用。SHARED库会被动态连接,在运行时被加载。MODULE库是不会被连接到其它目标中的插件,可是可能会在运行时使用dlopen-系列的函数动态连接。若是没有类型被显式指定,这个选项将会根据变量BUILD_SHARED_LIBS的当前值是否为真决定是STATIC仍是SHARED
示例 : add_library(Lib ${DIR_SRCS})
add_dependencies 命令
语句 : add_dependencies(target-name depend-target1 depend-target2 …)
做用 : 用于指定某个目标(可执行文件或者库文件)依赖于其余的目标。这里的目标必须是 add_executable、add_library、add_custom_target 命令建立的目标
add_subdirectory 命令
语句 : add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
做用 : 用于添加一个须要进行构建的子目录
示例 : add_subdirectory(directory)
target_link_libraries 命令
语句 : target_link_libraries(<target> [item1 [item2 […]]] [[debug|optimized|general] ] …)
做用 : 用于指定 target 须要连接 item1 item2 …。这里 target 必须已经被建立,连接的 item 能够是已经存在的 target(依赖关系会自动添加)
示例 : target_link_libraries(Main Lib)
set 命令
语句 : set(<variable> <value> [[CACHE <type> <docstring> [FORCE]] | PARENT_SCOPE])
做用 : 用于设定变量 variable 的值为 value。variable能够本身定义
示例 : set(var "${list}_exe")
unset 命令
语句 : unset(<variable> [CACHE])
做用 : 用于移除变量 variable。若是指定了 CACHE 变量将被从 Cache 中移除。
示例 : unset(VAR CACHE)
message 命令
语句 : message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] “message to display” …)
做用 : 输出信息
示例 : message("hello world")
include_directories 命令
语句 : include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 …)
做用 : 用于设定目录,这些设定的目录将被编译器用来查找 include 文件
示例 : include_directories(${PROJECT_SOURCE_DIR}/lib)
find_path 命令
语句 : find_path(<VAR> name1 [path1 path2 …])
做用 : 用于查找包含文件 name1 的路径,若是找到则将路径保存在 VAR 中(此路径为一个绝对路径),若是没有找到则结果为 <VAR>-NOTFOUND。默认的状况下,VAR 会被保存在 Cache 中,这时候咱们须要清除 VAR 才能够进行下一次查询(使用 unset 命令)
add_definitions 命令
语句 : find_library(<VAR> name1 [path1 path2 …])
做用 : 用于添加编译器命令行标志(选项),一般的状况下咱们使用其来添加预处理器定义
示例 : add_definitions(-D_UNICODE -DUNICODE)
execute_process 命令
语句 : execute_process(COMMAND <cmd1> [args1...]] [COMMAND <cmd2> [args2...] [...]]
[WORKING_DIRECTORY <directory>]
[TIMEOUT <seconds>]
[RESULT_VARIABLE <variable>]
[OUTPUT_VARIABLE <variable>]
[ERROR_VARIABLE <variable>]
[INPUT_FILE <file>]
[OUTPUT_FILE <file>]
[ERROR_FILE <file>]
[OUTPUT_QUIET]
[ERROR_QUIET]
[OUTPUT_STRIP_TRAILING_WHITESPACE]
[ERROR_STRIP_TRAILING_WHITESPACE])
做用 : 用于执行一个或者多个外部命令。每个命令的标准输出经过管道转为下一个命令的标准输入。WORKING_DIRECTORY 用于指定外部命令的工做目录,RESULT_VARIABLE 用于指定一个变量保存外部命令执行的结果,这个结果多是最后一个执行的外部命令的退出码或者是一个描述错误条件的字符串,OUTPUT_VARIABLE 或者 ERROR_VARIABLE 用于指定一个变量保存标准输出或者标准错误,OUTPUT_QUIET 或者 ERROR_QUIET 用于忽略标准输出和标准错误。
示例 : execute_process(COMMAND ls)
file 命令
语句 : file(WRITE filename "message to write"... )
做用 : WRITE选项将会写一条消息到名为filename的文件中。若是文件已经存在,该命令会覆盖已有的文件;若是文件不存在,它将建立该文件。
===========================================================
语句 : file(APPEND filename "message to write"... )
做用 : APPEND选项和WRITE选项同样,将会写一条消息到名为filename的文件中,只是该消息会附加到文件末尾。
===========================================================
语句 : file(READ filename variable [LIMIT numBytes] [OFFSET offset] [HEX])
做用 : READ选项将会读一个文件中的内容并将其存储在变量里。读文件的位置从offset开始,最多读numBytes个字节。若是指定了HEX参数,二进制代码将会转换为十六进制表达方式,并存储在变量里。
===========================================================
语句 : file(STRINGS filename variable [LIMIT_COUNT num] [LIMIT_INPUT numBytes] [LIMIT_OUTPUT numBytes]
[LENGTH_MINIMUM numBytes] [LENGTH_MAXIMUM numBytes]
[NEWLINE_CONSUME] [REGEX regex] [NO_HEX_CONVERSION])
做用 : STRINGS将会从一个文件中将一个ASCII字符串的list解析出来,而后存储在variable变量中。文件中的二进制数据会被忽略。回车换行符会被忽略。它也能够用在Intel的Hex和Motorola的S-记录文件;读取它们时,它们会被自动转换为二进制格式。可使用NO_HEX_CONVERSION选项禁止这项功能。LIMIT_COUNT选项设定了返回的字符串的最大数量。LIMIT_INPUT设置了从输入文件中读取的最大字节数。LIMIT_OUTPUT设置了在输出变量中存储的最大字节数。LENGTH_MINIMUM设置了要返回的字符串的最小长度;小于该长度的字符串会被忽略。LENGTH_MAXIMUM设置了返回字符串的最大长度;更长的字符串会被分割成不长于最大长度的字符串。NEWLINE_CONSUME选项容许新行被包含到字符串中,而不是终止它们。REGEX选项指定了一个待返回的字符串必须知足的正则表达式。
===========================================================
语句 : file(GLOB variable [RELATIVE path] [globbing expressions]...)
做用 : GLOB选项将会为全部匹配查询表达式的文件生成一个文件list,并将该list存储进变量variable里。文件名查询表达式与正则表达式相似,只不过更加简单。若是为一个表达式指定了RELATIVE标志,返回的结果将会是相对于给定路径的相对路径。
===========================================================
语句 : file(GLOB_RECURSE variable [RELATIVE path] [FOLLOW_SYMLINKS] [globbing expressions]...)
做用 : GLOB_RECURSE选项将会生成一个相似于一般的GLOB选项的list,只是它会寻访全部那些匹配目录的子路径并同时匹配查询表达式的文件。做为符号连接的子路径只有在给定FOLLOW_SYMLINKS选项或者cmake策略CMP0009被设置为NEW时,才会被寻访到。参见cmake --help-policy CMP0009 查询跟多有用的信息。
===========================================================
语句 : file(RENAME <oldname> <newname>)
做用 : RENAME选项对同一个文件系统下的一个文件或目录重命名。
===========================================================
语句 : file(REMOVE [file1 ...])
做用 : REMOVE选项将会删除指定的文件,包括在子路径下的文件。
===========================================================
语句 : file(REMOVE_RECURSE [file1 ...])
做用 : REMOVE_RECURSE选项会删除给定的文件以及目录,包括非空目录。
===========================================================
语句 : file(MAKE_DIRECTORY [directory1 directory2 ...])
做用 : MAKE_DIRECTORY选项将会建立指定的目录,若是它们的父目录不存在时,一样也会建立。(相似于mkdir命令——译注)
===========================================================
语句 : file(RELATIVE_PATH variable directory file)
做用 : RELATIVE_PATH选项会肯定从direcroty参数到指定文件的相对路径。
===========================================================
语句 : file(TO_CMAKE_PATH path result)
做用 : TO_CMAKE_PATH选项会把path转换为一个以unix的 / 开头的cmake风格的路径。输入能够是一个单一的路径,也能够是一个系统路径,好比"$ENV{PATH}"。注意,在调用TO_CMAKE_PATH的ENV周围的双引号只能有一个参数(Note the double quotes around the ENV call TO_CMAKE_PATH only takes one argument. 原文如此。
===========================================================
语句 : file(TO_NATIVE_PATH path result)
做用 : TO_NATIVE_PATH选项与TO_CMAKE_PATH选项很类似,可是它会把cmake风格的路径转换为本地路径风格:windows下用\,而unix下用/。
===========================================================
语句 : file(DOWNLOAD url file [TIMEOUT timeout] [STATUS status] [LOG log] [EXPECTED_MD5 sum] [SHOW_PROGRESS])
做用 : DOWNLOAD 将给定的URL下载到指定的文件中。若是指定了LOG var选项,下载日志将会被输出到var中。若是指定了STATUS var选项,下载操做的状态会被输出到var中。该状态返回值是一个长度为2的list。list的第一个元素是操做的数字返回值,第二个返回值是错误的字符串值。错误信息若是是数字0,操做中没有发生错误。若是指定了TIMEOUT time选项,在time秒以后,操做会超时退出;time应该是整数。若是指定了EXPECTED_MD5 sum选项,下载操做会认证下载的文件的实际MD5和是否与指望值匹配。若是不匹配,操做将返回一个错误。若是指定了SHOW_PROGRESS选项,进度信息会以状态信息的形式被打印出来,直到操做完成。
cmake 经常使用语句
条件控制
======================
if(expression)
# ...
elseif(expression2)
# ...
else()
# ...
endif()
======================
对于 if(string) 来讲:
若是 string 为(不区分大小写)一、ON、YES、TRUE、Y、非 0 的数则表示真
若是 string 为(不区分大小写)0、OFF、NO、FALSE、N、IGNORE、空字符串、以 -NOTFOUND 结尾的字符串则表示假
若是 string 不符合上面两种状况,则 string 被认为是一个变量的名字。变量的值为第二条所述的各值则表示假,不然表示真
===========================================================
if中的语句:
if(NOT expression)
为真的前提是 expression 为假
if(expr1 AND expr2)
为真的前提是 expr1 和 expr2 都为真
if(expr1 OR expr2)
为真的前提是 expr1 或者 expr2 为真
if(COMMAND command-name)
为真的前提是存在 command-name 命令、宏或函数且可以被调用
if(EXISTS name)
为真的前提是存在 name 的文件或者目录(应该使用绝对路径)
if(file1 IS_NEWER_THAN file2)
为真的前提是 file1 比 file2 新或者 file一、file2 中有一个文件不存在(应该使用绝对路径)
if(IS_DIRECTORY directory-name)
为真的前提是 directory-name 表示的是一个目录(应该使用绝对路径)
if(variable|string MATCHES regex)
为真的前提是变量值或者字符串匹配 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)
为真的前提是 variable 表示的变量被定义了
循环结构
foreach循环
======================
set(VAR a b c)
foreach(f ${VAR})
message(${f})
endforeach()
======================
while循环
======================
set(VAR 5)
while(${VAR} GREATER 0)
message(${VAR})
math(EXPR VAR "${VAR} - 1")
endwhile()
======================
宏定义
macro循环
======================
# 定义一个宏 hello
macro(hello MESSAGE)
message(${MESSAGE})
endmacro()
# 调用宏 hello
hello("hello world")
# 定义一个函数 hello
function(hello MESSAGE)
message(${MESSAGE})
endfunction()
======================
函数定义
======================
function(get_func RESULT)
# RESULT 的值为实参的值,所以须要使用 ${RESULT}
# 这里使用 PARENT_SCOPE 是由于函数会构建一个局部做用域
set(${RESULT} "Hello Function" PARENT_SCOPE)
endfunction()
macro(get_macro RESULT)
set(${RESULT} "Hello Macro")
endmacro()
get_func(V1)
# 输出 Hello Function
message(${V1})
get_macro(V2)
# 输出 Hello Macro
message(${V2})
======================
字符串控制
string(REGEX MATCH (regular_expression) (output variable) (input) [(input)...])
string(REGEX MATCHALL (regular_expression) (output variable) (input) [(input)...])
string(REGEX REPLACE (regular_expression) (replace_expression) (output variable) (input) [(input)...])
string(REPLACE (match_string) (replace_string) (output variable) (input) [(input)...])
string(COMPARE EQUAL (string1) (string2) (output variable))
string(COMPARE NOTEQUAL (string1) (string2) (output variable))
string(COMPARE LESS (string1) (string2) (output variable))
string(COMPARE GREATER (string1) (string2) (output variable))
string(ASCII (number) [(number) ...] (output variable))
string(CONFIGURE (string1) (output variable) [@ONLY] [ESCAPE_QUOTES])
string(TOUPPER (string1) (output variable))
string(TOLOWER (string1) (output variable))
string(LENGTH (string) (output variable))
string(SUBSTRING (string) (begin) (length) (output variable))
string(STRIP (string) (output variable))
string(RANDOM [LENGTH (length)] [ALPHABET (alphabet)] (output variable))
cmake 经常使用变量
UNIX 若是为真,表示为 UNIX-like 的系统,包括 Apple OS X 和 CygWin
WIN32 若是为真,表示为 Windows 系统,包括 CygWin
APPLE 若是为真,表示为 Apple 系统
CMAKE_SIZEOF_VOID_P 表示 void* 的大小(例如为 4 或者 8),可使用其来判断当前构建为 32 位仍是 64 位
CMAKE_CURRENT_LIST_DIR 表示正在处理的 CMakeLists.txt 文件的所在的目录的绝对路径(2.8.3 以及之后版本才支持)
CMAKE_ARCHIVE_OUTPUT_DIRECTORY 用于设置 ARCHIVE 目标的输出路径
CMAKE_LIBRARY_OUTPUT_DIRECTORY 用于设置 LIBRARY 目标的输出路径
CMAKE_RUNTIME_OUTPUT_DIRECTORY 用于设置 RUNTIME 目标的输出路径
可能会用到的一些命令
get_property 获取一个属性值
get_property(<variable>
<GLOBAL |
DIRECTORY [dir] |
TARGET <target> |
SOURCE <source> |
TEST <test> |
CACHE <entry> |
VARIABLE>
PROPERTY <name>
[SET | DEFINED | BRIEF_DOCS | FULL_DOCS])
get_source_file_property 为一个源文件获取一种属性值
get_source_file_property(VAR file property)
get_target_property 从一个目标中获取一个属性值
get_target_property(VAR target property)
get_test_property 获取一个测试的属性
get_test_property(test VAR property)
get_cmake_property 获取一个CMake实例的属性
get_cmake_property(VAR property)
get_filename_component 获得一个完整文件名中的特定部分
get_filename_component(<VAR> FileName
PATH|ABSOLUTE|NAME|EXT|NAME_WE|REALPATH
[CACHE])
get_cmake_property 获取一个CMake实例的属性。
get_directory_property(<variable> [DIRECTORY <dir>] <prop-name>)
参考 : http://www.cnblogs.com/coderfenghc/archive/2012/07/08/2581734.html