Table of Contents
继上篇:一步一步学Cmake 之 必学的二十个指令(1-10)
1. include_directories
作用:添加头文件目录,相当于把路径添加到环境变量中。
2. link_directories
作用:添加库文件目录,相当于把需要链接的库文件目录添加到LD_LIBRARY_PATH中。
3. find_library
作用:查找库所在的目录
4. list
列表操作,可以将其想象成Python的列表,提供的方法有:
list(LENGTH <list> <output variable>)
list(GET <list> <element index> [<element index> ...]
<output variable>)
list(APPEND <list> [<element> ...])
list(FIND <list> <value> <output variable>)
list(INSERT <list> <element_index> <element> [<element> ...])
list(REMOVE_ITEM <list> <value> [<value> ...])
list(REMOVE_AT <list> <index> [<index> ...])
list(REMOVE_DUPLICATES <list>)
list(REVERSE <list>)
list(SORT <list>)
LENGTH 返回list的长度
GET 返回list中index的element到value中
APPEND 添加新element到list中
FIND 返回list中element的index,没有找到返回-1
INSERT 将新element插入到list中index的位置
REMOVE_ITEM 从list中删除某个element
REMOVE_AT 从list中删除指定index的element
REMOVE_DUPLICATES 从list中删除重复的element
REVERSE 将list的内容反转
SORT 将list按字母顺序排序
举个栗子:
往变量里追加内容,比如往Driveworks_LIBRARIES里追加${CUDA_LIBRARIES} 和 ${CUDA_cublas_LIBRARY}):
list(APPEND Driveworks_LIBRARIES ${CUDA_LIBRARIES})
list(APPEND Driveworks_LIBRARIES ${CUDA_cublas_LIBRARY})
从变量里获取内容,比如分别从CEPH_RELEASE_FIL中获取索引为0,1,2的内容:
list(GET CEPH_RELEASE_FILE 0 CEPH_RELEASE)
list(GET CEPH_RELEASE_FILE 1 CEPH_RELEASE_NAME)
list(GET CEPH_RELEASE_FILE 2 CEPH_RELEASE_TYPE)
5. file
文件操作命令
Reading
file(READ <filename> <out-var> [...])
file(STRINGS <filename> <out-var> [...])
file(<HASH> <filename> <out-var>)
file(TIMESTAMP <filename> <out-var> [...])
file(GET_RUNTIME_DEPENDENCIES [...])
Writing
file({WRITE | APPEND} <filename> <content>...)
file({TOUCH | TOUCH_NOCREATE} [<file>...])
file(GENERATE OUTPUT <output-file> [...])
Filesystem
file({GLOB | GLOB_RECURSE} <out-var> [...] [<globbing-expr>...])
file(RENAME <oldname> <newname>)
file({REMOVE | REMOVE_RECURSE } [<files>...])
file(MAKE_DIRECTORY [<dir>...])
file({COPY | INSTALL} <file>... DESTINATION <dir> [...])
file(SIZE <filename> <out-var>)
file(READ_SYMLINK <linkname> <out-var>)
file(CREATE_LINK <original> <linkname> [...])
Path Conversion
file(RELATIVE_PATH <out-var> <directory> <file>)
file({TO_CMAKE_PATH | TO_NATIVE_PATH} <path> <out-var>)
Transfer
file(DOWNLOAD <url> <file> [...])
file(UPLOAD <file> <url> [...])
Locking
file(LOCK <path> [...])
READ:读取文件名为 <filename>
的文件并将其内容存储到 <out-var>>
变量中。
WRITE 和 APPEND
写入 <content>
到 <filename>
文件中。如果文件不存在则创建。如果文件已存在,WRITE
模式将覆盖内容,如果为 APPEND
模式将追加内容。任何在 <filename>
文件路径中的不存在文件夹都将被创建。
6. string
用法类似list 和 file,请参考上面两条,语法如下:
Search and Replace
string(FIND <string> <substring> <out-var> [...])
string(REPLACE <match-string> <replace-string> <out-var> <input>...)
Regular Expressions
string(REGEX MATCH <match-regex> <out-var> <input>...)
string(REGEX MATCHALL <match-regex> <out-var> <input>...)
string(REGEX REPLACE <match-regex> <replace-expr> <out-var> <input>...)
Manipulation
string(APPEND <string-var> [<input>...])
string(PREPEND <string-var> [<input>...])
string(CONCAT <out-var> [<input>...])
string(JOIN <glue> <out-var> [<input>...])
string(TOLOWER <string> <out-var>)
string(TOUPPER <string> <out-var>)
string(LENGTH <string> <out-var>)
string(SUBSTRING <string> <begin> <length> <out-var>)
string(STRIP <string> <out-var>)
string(GENEX_STRIP <string> <out-var>)
string(REPEAT <string> <count> <out-var>)
Comparison
string(COMPARE <op> <string1> <string2> <out-var>)
Hashing
string(<HASH> <out-var> <input>)
Generation
string(ASCII <number>... <out-var>)
string(CONFIGURE <string> <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> ...)
7. find_package
寻找外部项目 并加载设置
find_package(<package> [version] [EXACT] [QUIET] [MODULE]
[REQUIRED] [[COMPONENTS] [components...]]
[OPTIONAL_COMPONENTS components...]
[NO_POLICY_SCOPE])
举个栗子:
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
project(recipe-01 LANGUAGES NONE)
# detect python
find_package(PythonInterp REQUIRED)
# Execute a tiny Python script
execute_process(
COMMAND
${PYTHON_EXECUTABLE} "-c" "print('Hello, world!')"
RESULT_VARIABLE _status
OUTPUT_VARIABLE _hello_world
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE
)
message(STATUS "RESULT_VARIABLE is: ${_status}")
message(STATUS "OUTPUT_VARIABLE is: ${_hello_world}")
# compare the "manual" messages with the following handy helper
include(CMakePrintHelpers)
cmake_print_variables(_status _hello_world)
该命令会寻找一个叫做 FindPythonInterp.cmake 的文件,找到之后会运行其中包含的命令,该文件运行完事之后,CMakeLists.txt 文件中就可以使用下面的几个变量了:
PYTHON_EXECUTABLE: Python解释器的路径
PYTHON_VERSION_STRING:Python解释器的版本号
PYTHON_VERSION_MAJOR :Python解释器的主版本号
PYTHON_VERSION_MINOR: Python解释器的子版本号
PYTHON_VERSION_PATCH: Python解释器的补丁版本号
输出的结果:
cmake ..
-- Found PythonInterp: /usr/bin/python (found version "2.7.12")
-- RESULT_VARIABLE is: 0
-- OUTPUT_VARIABLE is: Hello, world!
-- _status="0" ; _hello_world="Hello, world!"
-- Configuring done
-- Generating done
8. link_libraries
作用:添加需要链接的库文件路径,跟link_directories()不同的是,前者是库文件的路径,后者添加的是库文件所在的路径。
举个栗子:
link_libraries(“/home/xwang/third/lib/libhello.a”)
9. target_link_libraries
作用:设置目标生成是做需要链接的库文件
10. cmake_parse_arguments
CMake参数解析命令,可以用于解析函数或宏的参数列表。
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>
: 可选值
- 此处包含可选项的变量名称, 对应的值为
TRUE
或FALSE
; - 如果传递进来的参数包含此变量,则为
TRUE
反之为FALSE
<one_value_keywords>
: 单值关键词列表
- 每个关键词仅仅对应一个值
<multi_value_keywords>
: 多值关键词列表
- 每个关键词可对应多个值
<args>...
参数, 一般传入 ${ARGN}
即可
<prefix>
前缀, 解析出的参数都会按照 prefix_参数名
的形式形成新的变量
举个栗子:
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(TARGETS foo bar DESTINATION bin OPTIONAL blub)
本例中 可选值OPTIONAL 和 FAST,函数调用时只传入了OPTIONAL
单值关键词列表包含DESTINATION 和 RENAME,本例函数调用时只传入了DESTINATION 参数名为: bin
多值关键词列表包含TARGETS 和 CONFIGURATIONS,本例函数调用时只传入了TARGETS 参数名为: foo bar
未解析的参数:blub
MY_INSTALL_OPTIONAL = TRUE
MY_INSTALL_FAST = FALSE (this option was not used when calling 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" (no value expected after "OPTIONAL"