一步一步学CMake 之 必学的二十个指令(11-20)

Table of Contents

1. include_directories

3. find_library

4. list

5. file

6. string

7. find_package

10. cmake_parse_arguments


继上篇:一步一步学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>> 变量中。

WRITEAPPEND

写入 <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)

本例中 可选值OPTIONALFAST,函数调用时只传入了OPTIONAL 

单值关键词列表包含DESTINATIONRENAME,本例函数调用时只传入了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"

猜你喜欢

转载自blog.csdn.net/wanzew/article/details/83350990