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"