cmake 工具要領
主要工具邏輯
查看幫助
cmake --help-command
cmake set 定義變量後, 可以跟多個表達式, 來說明變量有多個數據段
set(QC_INCLUDE ${QC_INCLUDE} ${QC_SYSROOT}/usr/include/amss)
set(QC_INCLUDE ${QC_INCLUDE} ${QC_SYSROOT}/usr/include/amss/core)
檢查環境變量中是否有某個值
Check environment variables
if ("$ENV{QNX_HOST}" STREQUAL “”)
CMakeCache.txt 幹嘛用的
可以將其想象成一個配置文件(在Unix環境下,我們可以認爲它等價於傳遞給configure的參數)。
cmake 第一次運行時將生成 CMakeCache.txt 文件,我們可以通過ccmake或cmake-gui或make edit_cache對其進行編輯。
主要記錄如下途徑得到的變量:
CMakeLists.txt 中通過 set(... CACHE ...) 設置的變量
CMakeLists.txt 中的 option() 提供的選項
CMakeLists.txt 中find_package() 等find命令引入變量
命令行 cmake . -D := 定義變量
對應於命令行 -D 定義變量,-U 用來刪除變量(支持globbing_expr),比如 cmake -U/QT/ 將刪除所有名字中帶有QT的cache項。
變量與Cache
cmake 的變量系統遠比第一眼看上去複雜:
有些變量被cache,有些則不被cache
被cache的變量
有的不能通過ccmake等進行編輯(internal)
有的(帶有描述和類型)可以被編輯(external)
有的只在ccmake的 advanced 模式出現
看個例子:
SET(var1 13)
變量 var1 被設置成 13
如果 var1 在cache中已經存在,該命令不會overwrite cache中的值
SET(var1 13 ... CACHE ...)
如果cache存在該變量,使用cache中變量
如果cache中不存在,將該值寫入cache
SET(var1 13 ... CACHE ... FORCE)
不論cache中是否存在,始終使用該值
具體招式
find_xxx
爲了避免每次運行都要進行頭文件和庫文件的探測,以及考慮到允許用戶通過ccmake設置頭文件路徑和庫文件的重要性,這些東西必須進行cache。
find_path 和 find_library 會自動cache他們的變量,如果變量已經存在且是一個有效值(即不是 -NOTFOUND 或 undefined),他們將什麼都不做。
另一方面,模塊查找時輸出的變量(_FOUND,_INCLUDE_DIRS,_LIBRARIES)不應該被cache
連續定義project
一個cmake中開多個project, 連續定義多個工程和參數,編譯多個目標
file GLOB_RECURSE
遞歸查找文件, 可以避免醜陋的子目錄塞入CMakeList的問題。
cmake 複製文件方法
- file COPY
file(<COPY|INSTALL> <files>... DESTINATION <dir>
[FILE_PERMISSIONS <permissions>...]
[DIRECTORY_PERMISSIONS <permissions>...]
[NO_SOURCE_PERMISSIONS] [USE_SOURCE_PERMISSIONS]
[FOLLOW_SYMLINK_CHAIN]
[FILES_MATCHING]
[[PATTERN <pattern> | REGEX <regex>]
[EXCLUDE] [PERMISSIONS <permissions>...]] [...])
COPY將文件,目錄和符號鏈接複製到目標文件夾。相對於當前源目錄評估相對輸入路徑,相對於當前構建目錄評估相對目的地。複製會保留輸入文件的時間戳,並優化文件(如果該文件存在於具有相同時間戳的目標文件中)。複製將保留輸入權限,除非給出明確的權限或NO_SOURCE_PERMISSIONS(默認爲USE_SOURCE_PERMISSIONS)。
如果指定了FOLLOW_SYMLINK_CHAIN,則COPY將在給定的路徑上遞歸解析符號鏈接,直到找到真實文件爲止,然後在目標位置爲遇到的每個符號鏈接安裝相應的符號鏈接。
- ADD_CUSTOM_COMMAND
add_custom_command:
該命令可以爲生成的構建系統添加一條自定義的構建規則。這裏又包含兩種使用方式,一種是通過自定義命令在構建中生成輸出文件,另外一種是向構建目標添加自定義命令。命令格式分別爲:
add_custom_command(OUTPUT output1 [output2 ...]
COMMAND command1 [ARGS] [args1...]
[COMMAND command2 [ARGS] [args2...] ...]
[MAIN_DEPENDENCY depend]
[DEPENDS [depends...]]
[BYPRODUCTS [files...]]
[IMPLICIT_DEPENDS <lang1> depend1
[<lang2> depend2] ...]
[WORKING_DIRECTORY dir]
[COMMENT comment]
[DEPFILE depfile]
[JOB_POOL job_pool]
[VERBATIM] [APPEND] [USES_TERMINAL]
[COMMAND_EXPAND_LISTS])
下面命令中,TARGET是在本工程中會被執行的目標,可以是 executable, 也可以是 shared library. 需要制定對應的名字。
add_custom_command(TARGET <target>
PRE_BUILD | PRE_LINK | POST_BUILD
COMMAND command1 [ARGS] [args1...]
[COMMAND command2 [ARGS] [args2...] ...]
[BYPRODUCTS [files...]]
[WORKING_DIRECTORY dir]
[COMMENT comment]
[VERBATIM] [USES_TERMINAL])
- ADD_CUSTOM_TARGET
該命令可以給指定名稱的目標執行指定的命令,該目標沒有輸出文件,並始終被構建。命令的格式爲:
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_definitions()
爲源文件的編譯添加由-D定義的標誌。
cmake使用的變量
通過如下
cmake --help-commond-list
可以查看所有的變量
CMAKE_C_COMPILER
CMAKE_C_COMPILER_TARGET
CMAKE_CXX_COMPILER
CMAKE_CXX_COMPILER_TARGET
CMAKE_ASM_COMPILER
CMAKE_ASM_DEFINE_FLAG
CMAKE_LINKER
CMAKE_AR
CMAKE_NM
CMAKE_OBJCOPY
CMAKE_OBJDUMP
CMAKE_RANLIB
CMAKE_STRIP
CMAKE_SH
編譯so的時候不會進行link
在編譯so的時候,雖然有用到其他so中的接口,但只要有頭文件就可以,不需要link so。
使用CMAKE_TOOLCHAIN_FILE命令
cmake -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_TOOLCHAIN_FILE=/path/to/driveworks/samples/cmake/Toolchain-V5L.cmake \
-DVIBRANTE_PDK:STRING=/path/to/drive-t186ref-linux \
/path/to/driveworks/samples/folder