layout: post
title: cmake常用方法
date: 2019-12-03 16:06:01
description: cmake常用方法
tag: cmake
目录,cmake是按照目录来管理维护的
有如下属性:
COMPILE_OPTIONS :
INCLUDE_DIRECTORIES :
cmake_install.cmake
:处理安装规则的CMake脚本,在项目安装时使用。CMakeCache.txt
:如文件名所示,CMake缓存。CMake在重新运行配置时使用这个文件。 if(expression)
:then section.
elseif(expression2)
:elseif section.
else(expression)
:else section.
endif(expression)
if(<variable|string>)
对字符串或者变量variable可以直接进行判断,变量无需使用$()if(<constant>)
True:1, ON, YES, TRUE, Y, 或非0. False: 0, OFF, NO, FALSE, N, IGNORE, NOTFOUND,空字符串,以OTFOUND结尾的字符串.if(NOT <expression>)
if(<expr1> AND <expr2>)
if(<expr1> OR <expr2>)
expre1和expr2都会被执行if(COMMAND command-name)
如果command-name是可别调用的函数,命令,宏,则为TRUE,否则为FALSEif(POLICY policy-id)
如果对应的policy-id设置了,则为TRUE,POLICY是cmake为了控制版本引入的类似版本控制的标识,具体详见OLICY](https://cmake.org/cmake/help/v3.0/command/cmake_policy.html?highlight=cmp nnnn)if(TARGET target-name)
TURE:target-name存在.其中target-name来源于add_executable(), add_library(), or d_custom_target() 命令if(EXISTS path-to-file-or-directory)
文件或目录是否存在,仅支持全路径if(file1 IS_NEWER_THAN file2)
TURE:file1比file2新,或一样新,或都不存在.只支持全路径if(IS_DIRECTORY path-to-directory)
是否是目录,只支持全路径if(IS_SYMLINK file-name)
是否是符号链接,只支持全路径if(IS_ABSOLUTE path)
是否是全路径if(<variable|string> MATCHES regex)
变量或字符串是否正则匹配regexif(<variable|string> LESS <variable|string>)
前边数字是否小于后边数字,同理还有大于(GREATER),等于(EQUAL),必须是数字if(<variable|string> STRLESS <variable|string>
同上,字典比较(不限于数字),同理还有大于(STRGREATER),等于(STREQUAL)if(<variable|string> VERSION_LESS <variable|string>)
前边版本是否小于后边版本号,同理还有大于(VERSION_GREATER),等VERSION_EQUAL),version format is major[.minor[.patch[.tweak]]]if(DEFINED <variable>)
变量是否定义,注意宏不是变量if((expression) AND (expression OR (expression)))
支持复杂混合list(LENGTH <list> <out-var>)
长度list(GET <list> <element index> [<index> ...] <out-var>)
获取元素list(JOIN <list> <glue> <out-var>)
组合后返回list(SUBLIST <list> <begin> <length> <out-var>)
返回子列表list(FIND <list> <value> <out-var>)
查找值,返回索引.找不到返回-1list(APPEND <list> [<element>...])
后边追加list(FILTER <list> {INCLUDE | EXCLUDE} REGEX <regex>)
list(INSERT <list> <index> [<element>...])
指定位置插入list(REMOVE_ITEM <list> <value>...)
根据内容删除list(REMOVE_AT <list> <index>...)
根据索引删除list(REMOVE_DUPLICATES <list>)
去重list(TRANSFORM <list> <ACTION> [<SELECTOR>] [OUTPUT_VARIABLE <output variable>])
执行指定操作,较复杂list(REVERSE <list>)
逆序list(SORT <list>)
排序string(FIND <string> <substring> <output variable> [REVERSE])
string(REPLACE <match_string> <replace_string> <output variable> <input> [<input>...])
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>...])
CMAKE_MATCH_<n> for <n> 0..9
string(APPEND <string-var> [<input>...])
追加到后边,类似于+string(PREPEND <string-var> [<input>...])
追加到前边string(CONCAT <out-var> [<input>...])
连接,原来out-var会被覆盖string(JOIN <glue> <out-var> [<input>...])
使用glue连接string(TOLOWER <string1> <out-var>)
变小写string(TOUPPER <string1> <out-var>)
变大写string(LENGTH <string> <out-var>)
取string的长度string(SUBSTRING <string> <begin> <length> <out-var>)
获取子串,length为-1表示到结尾string(STRIP <string> <out-var>)
去除string前后空格string(GENEX_STRIP <string> <out-var>)
去除所有格的generator expressionsstring(REPEAT <string> <count> <out-var>)
string字符串拼接count次输出string(COMPARE <op> <string1> <string2> <out-var>)
比较字符串,返回true或false
string(<HASH> <out-var> <input>)
对input字符串加密输出
string(ASCII <number>... <out-var>)
数字转字符串string(CONFIGURE <string1> <out-var> [...])
string(MAKE_C_IDENTIFIER <string> <out-var>)
加下划线string(RANDOM [<option>...] <out-var>)
生成随记字符串string(TIMESTAMP <out-var> [<format string>] [UTC])
格式化时间string(UUID <out-var> ...)
生成UUIDinclude(<file|module> [OPTIONAL] [RESULT_VARIABLE <VAR>] [NO_POLICY_SCOPE])
注释使用#
project(<PROJECT-NAME> [LANGUAGES] [<language-name>...])
project(<PROJECT-NAME>
[VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
[LANGUAGES <language-name>...])
在最外层的CMakeLists.txt中包含,最好能设置版本号语言,默认设置为C和CXX(C++)语言
option(<option_variable> "help string describing option" [initial value])
-D<option_variable>=value
修改默认参数set(<variable> <value> [[CACHE <type> <docstring> [FORCE]] | PARENT_SCOPE])
unset(<variable> [CACHE | PARENT_SCOPE])
添加一个目标,它没有输出;这样它就总是会被构建。
add_custom_target(Name [ALL] [command1 [args1…]]
[COMMAND command2 [args2…] …]
[DEPENDS depend depend depend … ]
[BYPRODUCTS [files…]]
[WORKING_DIRECTORY dir]
[COMMENT comment]
[JOB_POOL job_pool]
[VERBATIM] [USES_TERMINAL]
[COMMAND_EXPAND_LISTS]
[SOURCES src1 [src2…]])
添加具有给定名称的目标,以执行给定命令。目标没有输出文件, 即使命令尝试使用目标名称创建文件,也始终将其视为已过期。使用add_custom_command()命令生成具有依赖性的文件。默认情况下,任何内容都不取决于自定义目标。使用add_dependencies() 命令添加与其他目标之间的依赖关系。
举例:将目录
C
M
A
K
E
C
U
R
R
E
N
T
L
I
S
T
D
I
R
/
d
a
t
a
拷
贝
到
{CMAKE_CURRENT_LIST_DIR}/data拷贝到
CMAKECURRENTLISTDIR/data拷贝到{BIN_DIR}/data
add_custom_target(
copyData ALL
COMMAND cmake -E copy_directory
${CMAKE_CURRENT_LIST_DIR}/data ${BIN_DIR}/data
)
add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 [source...])
add_library(<name> <SHARED|STATIC|MODULE|UNKNOWN> IMPORTED [GLOBAL])
add_library(<name> OBJECT <src>...)
$<TARGET_OBJECTS:objlib
调用,其中objlib就是name,或者被 target_link_libraries 链接,比如即生成动态库,有生成静态库。可以先生成obj,然后再分别生成来解决同名问题。add_library(<name> ALIAS <target>)
add_library(<name> INTERFACE [IMPORTED [GLOBAL]])
add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] [source1] urce2 ...])
add_executable(<name> IMPORTED [GLOBAL])
add_executable(<name> ALIAS <target>)
add_compile_options(<option> ...)
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])
target_sources(<target> <INTERFACE|PUBLIC|PRIVATE> [items1...] [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
target_compile_definitions(<target> <INTERFACE|PUBLIC|PRIVATE> [items1...] [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
add_definitions(-DIS_LINUX)
项目级别的defintions
target_include_directories(<target> [SYSTEM] [BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
target_include_directories(mylib PUBLIC $<BUILD_INTERFACE{CMAKE_CURRENT_SOURCE_DIR}/include/mylib> $<INSTALL_INTERFACE:include/mylib:<prefix>/include/mylib)
target_compile_options(<target> [BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
target_link_libraries(<target> ... <item>... ...)
<debug, optimized, general>
target_link_libraries(<target> <PRIVATE|PUBLIC|INTERFACE> <item>... [<PRIVATE|PUBLIC|INTERFACE> <item>...]...)
target_link_libraries(<target> <item>...)
target_link_libraries(<target> <LINK_PRIVATE|LINK_PUBLIC> <lib>... [<LINK_PRIVATE|LINK_PUBLIC> <lib>...]...)
target_link_libraries(<target> LINK_INTERFACE_LIBRARIES <item>...)
target_link_options(<target> [BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
Add options to the link step for an executable, shared library or module library target.
将选项添加到可执行文件,共享库或模块库目标,此命令不能用于为静态库目标添加选项。
set_target_properties(target1 target2 ...
PROPERTIES prop1 value1
prop2 value2 ...)
设置target属性,map结构
举例如下
set_target_properties(animal-farm
PROPERTIES
CXX_STANDARD 14
CXX_EXTENSIONS OFF
CXX_STANDARD_REQUIRED ON
)
add_dependencies(<target> [<target-dependency>]...)
Add a dependency between top-level targets.
Makes a top-level <target>
depend on other top-level targets to ensure that they build before <target>
does. A top-level target is one created by one of the add_executable(), add_library(), or add_custom_target() commands
configure_file(<input> <output>
[COPYONLY] [ESCAPE_QUOTES] [@ONLY]
[NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])
if(FOO_ENABLE)
set(FOO_STRING "foo")
endif()
configure_file(foo.h.in foo.h @ONLY)
math(EXPR <variable> "<expression>" [OUTPUT_FORMAT <format>])
ExternalProject_Add(<name> [<option>...])
--prefix=<INSTALL_DIR>
等ExternalProject_Get_Property(<name> <prop1> [<prop2>...])
ExternalProject_Add_Step(<name> <step> [<option>...])
ExternalProject_Add_StepTargets(<name> [NO_DEPENDS] <step1> [<step2>...])
ExternalProject_Add_StepDependencies(<name> <step> <target1> [<target2>...])
<PROJECT-NAME>_SOURCE_DIR
源码目录<PROJECT-NAME>_BINARY_DIR
二进制目录<PROJECT-NAME>_VERSION
, 版本号,默认为空<PROJECT-NAME>_VERSION_MAJOR
<PROJECT-NAME>_VERSION_MINOR
<PROJECT-NAME>_VERSION_PATCH
<PROJECT-NAME>_VERSION_TWEAK
<LANG>
是受支持的任何一种语言,比如C/CXX/Fortran等CMAKE_<LANG>_COMPILER
: 某种语言的编译器CMAKE_<LANG>_COMPILER_LOADED
:如果为项目启用了语言<LANG>
,则将设置为TRUE或"1"。CMAKE_<LANG>_COMPILER_ID
:编译器标识字符串,编译器供应商所特有。注意,不能保证为所有编译器或语言定义此变量。举例如下:
CMAKE_<LANG>_STANDARD
: 要求版本号CMAKE_COMPILER_IS_GNU<LANG>
:如果语言<LANG>
是GNU编译器集合的一部分,则将此逻辑变量设置为TRUE。C语言为CC, C++语言为CXX, Fortran语言为G77。CMAKE_<LANG>_COMPILER_VERSION
:此变量包含一个字符串,该字符串给定语言的编译器版本。版本信息在major[.minor[.patch[.tweak]]]中给出。//可用于函数或宏
cmake_parse_arguments(<prefix> <options> <one_value_keywords>
<multi_value_keywords> args...)
//只用于函数
cmake_parse_arguments(PARSE_ARGV N <prefix> <options> <one_value_keywords>
<multi_value_keywords>)
在函数或宏中使用,用于解析输入参数。参数解析后定了一些变量,存放参数指定的选项。
<options>
包含不需要后接值的选项。
<one_value_keywords>
包含只可后接一个值的选项。
<multi_value_keywords>
包含可后接多个值的多项。
cmake_parse_arguments将会定义一系列变量,名称为<prefix>_keyword
,变量存储了从参数列表中解析到的值,对于<options>
变量的值是TRUE或FALSE。
所有未解析到的参数被收集到<prefix>_UNPARSED_ARGUMENTS
中。
举例如下:
function(MY_INSTALL)
set(options OPTIONAL FAST)
set(oneValueArgs DESTINATION RENAME)
set(multiValueArgs TARGETS CONFIGURATIONS)
cmake_parse_arguments(MY_INSTALL "${options}" "${oneValueArgs}"
"${multiValueArgs}" ${ARGN} )
endfunction(MY_INSTALL)
my_install(TARGETS foo bar DESTINATION bin OPTIONAL blub)
//结果如下:
// MY_INSTALL_OPTIONAL = TRUE
// MY_INSTALL_FAST = FALSE (was not used in call to my_install)
// MY_INSTALL_DESTINATION = "bin"
// MY_INSTALL_RENAME = "" (was not used)
// MY_INSTALL_TARGETS = "foo;bar"
// MY_INSTALL_CONFIGURATIONS = "" (was not used)
// MY_INSTALL_UNPARSED_ARGUMENTS = "blub" (nothing expected after "OPTIONAL")