CMAKE_SYSTEM:系統全名,如 “Linux-2.4.22″,”FreeBSD-5.4-RELEASE” 或 “Windows 5.1”
CMAKE_SYSTEM_NAME:系統名称,如 “Linux”, “FreeBSD” or “Windows”,注意大小写
CMAKE_SYSTEM_VERSION:只显示系统全名中的版本部分
CMAKE_SYSTEM_PROCESSOR:CPU名称
option( "help string describing option"
[initial value])
INCLUDE(file1[OPTIONAL])
INCLUDE(module[OPTIONAL])
OPTIONAL参数的作用是文件不存在也不会产生错误,可以指定载入一个文件,如果定义的是一个模块,那么将在
IF(expression_r_r)
#THEN section.
COMMAND1(ARGS…)
COMMAND2(ARGS…)
…
ELSE(expression_r_r)
#ELSE section.
COMMAND1(ARGS…)
COMMAND2(ARGS…)
…
ENDIF(expression_r_r)
另外一个指令是ELSEIF,总体把握一个原则,凡是出现IF的地方一定要有对应的ENDIF,出现ELSEIF的地方,
IF(var) 如果变量不是:空, 0, N, NO, OFF, FALSE, NOTFOUND 或 _NOTFOUND时,表达式为真。
IF(NOT var), 与上述条件相反。
IF(var1 AND var2), 当两个变量都为真是为真。
IF(var1 OR var2), 当两个变量其中一个为真时为真。
IF(COMM AND cmd), 当给定的cmd确实是命令并可以调用是为真。
IF(EXISTS dir) or IF(EXISTS file), 当目录名或者文件名存在时为真。
IF(file1 IS_NEWER_THAN file2), 当file1比file2新,或者file1/file2其中有一个不存在时为真文件名请使用完整路径。
IF(IS_DIRECTORY dirname), 当dirname是目录时为真。
IF(variable MATCHES regex)
IF(string MATCHES regex) 当给定的变量或者字符串能够匹配正则表达式regex时为真。比如:
IF("hello" MATCHES "hello")
MESSAGE("true")
ENDIF("hello" MATCHES "hello")
IF(variable LESS number)
IF(string LESS number)
IF(variable GREATER number)
IF(string GREATER number)
IF(variable EQUAL number)
IF(string EQUAL number)
按照字母序的排列进行比较
IF(variable STRLESS string)
IF(string STRLESS string)
IF(variable STRGREATER string)
IF(string STRGREATER string)
IF(variable STREQUAL string)
IF(string STREQUAL string)
IF(DEFINED variable),如果变量被定义,为真。
IF(WIN32)
MESSAGE(STATUS“This is windows.”) #作一些Windows相关的操作
ELSE(WIN32)
MESSAGE(STATUS“This is not windows”) #作一些非Windows相关的操作
ENDIF(WIN32)
上述代码用来控制在不同的平台进行不同的控制,但是阅读起来却并不是那么舒服, ELSE(WIN32)之类的语句很容易引起歧义。 IF(WIN32)
ELSE()
ENDIF()
如果配合ELSEIF使用,可能的写法是这样:
IF(WIN32)
#dosomething related to WIN32
ELSEIF(UNIX)
#dosomething related to UNIX
ELSEIF(APPLE)
#dosomething related to APPLE
ENDIF(WIN32)
find_path(
name | NAMES name1 [name2 ...]
[HINTS path1 [path2 ... ENV var]]
[PATHS path1 [path2 ... ENV var]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[DOC "cache documentation string"]
[NO_DEFAULT_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_CMAKE_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)
该命令用于给定名字文件所在的路径。一条名为的cache条目会被创建,并存储该命令的执行结果。如果在某个路径下发现了该文件,该结果会被存储到该变量中;除非该变量被清除,该次搜索不会继续
find_program(
name | NAMES name1 [name2 ...]
[HINTS path1 [path2 ... ENV var]]
[PATHS path1 [path2 ... ENV var]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[DOC "cache documentation string"]
[NO_DEFAULT_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_CMAKE_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)
该命令用于查找程序。一个名为的cache条目会被创建用来存储该命令的结果。如果该程
向C/C++编译器添加-D定义
ADD_DEFINITIONS(-DENABLE_DEBUG -DABC),参数之间用空格分隔
file(MAKE_DIRECTORY [directory1 directory2 ...])
MAKE_DIRECTORY在指定目录处创建子目录,如果它们的父目录不存在,也会创建它们的父目录。
file(GLOB variable [RELATIVE path] [globbing expressions]...)
注意GLOB这个参数,它不支持子目录。如果你想让它支持子目录,用GLOB_RECURSE。
add_custom_command 为生成的构建系统添加一条自定义的构建规则
add_custom_command命令有两种主要的功能;第一种是为了生成输出文件,添加一条自定义命令。
add_custom_command(OUTPUT output1 [output2 ...]
COMMAND command1 [ARGS] [args1...]
[COMMAND command2 [ARGS] [args2...] ...]
[MAIN_DEPENDENCY depend]
[DEPENDS [depends...]]
[IMPLICIT_DEPENDS depend1 ...]
[WORKING_DIRECTORY dir]
[COMMENT comment] [VERBATIM] [APPEND])
这种命令格式定义了一条生成指定的文件(文件组)的生成命令。在相同路径下创建的目标(CMakeLists.txt文件)——任何自定义命令的输出都作为它的源文件——被设置了一条规则:在构
的,它用来向visual studio建议在何处停止自定义命令。
第二种格式为一个目标——比如一个库文件或者可执行文件——添加一条自定义命令。这种格式可以用于目标构建前或构建后的一些操作。这条命令会成为目标的一部分,并且只有目标被构建
时才会执行。如果目标已经构建了,该目标将不会执行。
add_custom_command(TARGET target
PRE_BUILD | PRE_LINK | POST_BUILD
COMMAND command1 [ARGS] [args1...]
[COMMAND command2 [ARGS] [args2...] ...]
[WORKING_DIRECTORY dir]
[COMMENT comment] [VERBATIM])
这条命令定义了一个与指定目标的构建过程相关的新命令。新命令在何时执行,由下述的选项决定:
PRE_BUILD - 在所有其它的依赖之前执行;
PRE_LINK - 在所有其它的依赖之后执行;
POST_BUILD - 在目标被构建之后执行;
FOREACH指令的使用方法有三种形式:
(1)、列表
FOREACH(loop_var arg1 arg2...)
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
ENDFOREACH(loop_var)
像我们前面使用的AUX_SOURCE_DIRECTORY的例子
AUX_SOURCE_DIRECTORY(. SRC_LIST)
FOREACH(F ${SRC_LIST})
MESSAGE(${F})
ENDFOREACH(F)
(2)、范围
FOREACH(loop_var RANGE total)
ENDFOREACH(loop_var)
从0到total以1为步进举例如下:
FOREACH(VAR RANGE 10)
MESSAGE(${VAR})
ENDFOREACH(VAR)
最终得到的输出是:0-10
FOREACH(loop_var RANGE start stop [step])
ENDFOREACH(loop_var)
从start开始到stop结束,以step为步进,举例如下
FOREACH(A RANGE 5 15 3)
MESSAGE(${A})
ENDFOREACH(A)
最终得到的结果是:
5
8
11
14
list(LENGTH
CMake 的 SOURCE_GROUP 用来在 Visual Studio IDE 中对文件进行分组,当工程比较大、文件数目多时特别有意义。
在根CMakeLists.txt下开启显示目录选项。就是以下命令:
# dispaly folder in MSVS
SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON)
这个是必须的,否者就不会显示目录结构。
如果想要构建一个好的项目解决方案,那么非常有必要手工组织代码的结构。
1>、对于有编译目标的单元
SET_PROPERTY(TARGET trivial PROPERTY FOLDER "libraries")
如上,SET_PPRPERTY第一个参数TARGET是固定值,第二个trivial就是编译单元的名称,
2>、对于无编译目标的单元(比如按功能区分的头文件),使用以下命令来使得其在MSVS显示中能够分组:
SOURCE_GROUP("lookup_table" FILES ${lookup_table_headers} ${lookup_table_srcs})
SOURCE_GROUP第一个参数同样是目录路径,路径可以是层级的,用\\双反斜杠表示,如
Source files can have properties that affect how they are built.
set_source_files_properties([file1 [file2 [...]]]
PROPERTIES prop1 value1
[prop2 value2 [...]])
Set properties associated with source files using a key/value paired list.
See Properties on Source Files for the list of properties known to CMake.
Source file properties are visible only to targets added in the same directory (CMakeLists.txt).
参考网址:https://cmake.org/pipermail/cmake/2004-April/004982.html
参考网址:https://stackoverflow.com/questions/34465878/cmake-post-build-step-copy-multiple-files-dependent-on-visual-studio-configurat
参考网址:http://www.cnblogs.com/foohack/p/3494423.html
参考网址:https://stackoverflow.com/questions/18427877/add-custom-build-step-in-cmake