cmakelists實操記錄

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

常用命令收藏


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