一步一步學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"

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章