目錄
參考資料
命令行
1. cmake
| 命令 | 解釋 |
|---|---|
| Generate a Project Buildsystem |
cmake [<options>] <path-to-source>cmake [<options>] <path-to-existing-build>cmake [<options>] -S <path-to-source> -B <path-to-build>
|
| Build a Project | cmake --build <dir> [<options>] [-- <build-tool-options>] |
| Install a Project | cmake --install <dir> [<options>] |
| Open a Project | cmake --open <dir> |
| Run a Script |
cmake [{-D <var>=<value>}...] -P <cmake-script-file>可以通過-D傳遞多個變量值,格式為KeyA:ValueA[::KeyX:ValueX],其中雙冒號分隔多個表達(dá)式,單冒號分隔每個表達(dá)式的變量和值,例如-DMODULE_ARGS=KeyA:ValueA::KeyX:ValueX |
| Run a Command-Line Tool |
cmake -E <command> [<options>]調(diào)用cmake內(nèi)建的外部命令,比如拷貝命令,可以屏蔽系統(tǒng)差異 |
| Run the Find-Package Tool | cmake --find-package [<options>] |
| View Help | cmake --help[-<topic>] |
2. ctest
略
3. cpack
略
關(guān)鍵字
| 關(guān)鍵字 | 指令 & 解釋 |
|---|---|
| PUBLIC PRIVATE INTERFACE |
對于target_link_libraries(A XXX B): PUBLIC: 任何鏈接到A的目標(biāo), 必須鏈接到B, 且A本身需要鏈接B PRIVATE: 任何鏈接到A的目標(biāo), 不會鏈接到B, 但A本身需要鏈接B INTERFACE: 任何鏈接到A的目標(biāo), 都會鏈接到B, 但A本身不鏈接B 對于target_include_directories(A XXX B): PUBLIC: 任何鏈接到A的目標(biāo), 必須包含B文件夾, 且A本身需要包含B PRIVATE: 任何鏈接到A的目標(biāo), 不會包含B文件夾, 但A本身需要包含B INTERFACE: 任何鏈接到A的目標(biāo), 都會包含到B文件夾, 但A本身不包含B |
| in-source out-source |
in-source編譯就是把編譯輸出文件(包括.o文件)和CMakeLists.txt放在同一個目錄,比如直接執(zhí)行cmake . out-source編譯就是把編譯輸出文件(包括.o文件)放到與CMakeLists.txt目錄不同的其他目錄,比如先進(jìn)入build目錄再執(zhí)行cmake .. |
指令分類
Scripting Commands
| 指令 | 解釋 |
|---|---|
| aux_source_directory() | 用于自動生成目錄源文件集合 |
| configure_file() | 拷貝一份文件到指定位置并修改其內(nèi)容 |
| execute_process() | 執(zhí)行外部程序,具體參見鏈接 |
| include() | 加載并執(zhí)行指定的CMake文件或Module(即名字為<module>.cmake的文件,搜索路徑為CMAKE_MODULE_PATH) |
| find_package() | 查找CMAKE_FRAMEWORK_PATH對應(yīng)的庫,使用方法: 1)find_package(MODULE)模式,先用CMAKE_MODULE_PATH找到Find<PackageName>.cmake, 然后用<PackageName>_ROOT或者CMAKE_PREFIX_PATH找到二進(jìn)制。 2)find_package(CONFIG)模式,用<PackageName>_ROOT或者CMAKE_PREFIX_PATH找到<PackageName>Config.cmake, 然后用<PackageName>Config.cmake的相對路徑找到二進(jìn)制。 |
| file() | 文件操作,具體參見鏈接 |
| function() | 自定義函數(shù) |
| get_filename_component() | 獲取指定文件的信息,比如文件后綴名、絕對地址等 |
| list() | 鏈表操作,支持 APPEND, INSERT, FILTER, PREPEND, POP_BACK, POP_FRONT, REMOVE_AT, REMOVE_ITEM, REMOVE_DUPLICATES, REVERSE, SORT幾種操作 |
| message() | 輸出消息,不同的消息效果可能不同,比如有的會導(dǎo)致構(gòu)建停止,有的不會。等級有FATAL_ERROR、SEND_ERROR、WARNING、AUTHOR_WARNING、DEPRECATION、(none) or NOTICE、STATUS、VERBOSE、DEBUG、TRACE |
| macro() | 自定義宏 |
| option() | 自定義提供一些開關(guān)選項(xiàng),用戶可以設(shè)置成ON或OFF,默認(rèn)是OFF。 |
| string() | 字符串相關(guān)操作,具體可以參見鏈接 |
| set() | 設(shè)置normal, cache, 或 environment變量值 |
| separate_arguments() | 將空格分隔的命令行形式字符串轉(zhuǎn)換成逗號分隔的列表模式 |
| get_property(TARGET) | 獲取一個對象屬性 |
| set_property(TARGET) | 在某個域中對零個或多個對象設(shè)置一個屬性,例如修改一個文件的編譯選項(xiàng): |
set_property(
SOURCE sub.c
APPEND
PROPERTY COMPILE_OPTIONS "-DDEBUG"
)
Project Commands
| 指令 | 解釋 |
|---|---|
| add_compile_definitions() | 可以給當(dāng)前目錄以及當(dāng)前目錄以下的目錄的 sources 添加編譯選項(xiàng)。 例如:add_compile_definitions (EX1 EX2) 不建議使用,建議用target_compile_definitions ( )代替 |
| add_compile_options() | 添加編譯選項(xiàng),例如add_compile_options(-Wall -Wextra -pedantic -Werror) 不建議使用,建議用target_compile_options ( )代替 |
| add_link_options() | 添加鏈接選項(xiàng) 不建議使用,建議用target_link_options()代替 |
| add_custom_command | 添加文件依賴,當(dāng)某個文件需要被用到時,會執(zhí)行該命令。需要在同一個CMakefile.txt文件中,通常有兩個作用: 場景1:使用OUTPUT參數(shù)指定輸出target,然后在add_custom_target中指定依賴于該target,這樣在構(gòu)建add_custom_target目標(biāo)時就會執(zhí)行add_custom_command 中設(shè)定的命令; 場景2:直接使用TARGET參數(shù)指定target,并設(shè)定在該target產(chǎn)生前或產(chǎn)生后執(zhí)行指定命令 |
| add_custom_target | 添加非文件依賴,總是被執(zhí)行。 add_custom_target(DEPENDS)用于依賴add_custom_command(OUTPUT)的輸出文件,編譯custom target時custom command的輸出文件也會被更新。其他target的依賴關(guān)系,請使用add_dependencies()命令。 注意,add_custom_target(DEPENDS)只能依賴同一CMakeLists.txt中的add_custom_command(OUTPUT)輸出文件,譬如下面的例子中依賴子目錄下的add_custom_command(OUTPUT)輸出文件將會失敗。 |
| add_subdirectory() | 跳轉(zhuǎn)到子目錄 |
| add_executable() | 生成可執(zhí)行文件 |
| add_library() | 指定目標(biāo),可以是庫或者可執(zhí)行文件 |
| add_dependencies() | 為目標(biāo)設(shè)置依賴 |
| add_definitions(-DFOO -DBAR ...) | 添加宏定義,已被add_compile_definitions()取代 |
| get_target_property() | 獲取構(gòu)建對象的屬性 |
| include_directories() | 添加頭文件路徑,相當(dāng)于編譯器參數(shù) -Idir1 -Idir2 |
| link_libraries() | 為所有目標(biāo)設(shè)置需要鏈接的庫 |
| set_target_properties() | 設(shè)置構(gòu)建對象的屬性 |
| set_source_files_properties() | 設(shè)置指定文件的屬性 |
| target_sources() | 設(shè)置源碼文件 |
| target_include_directories() | 設(shè)置單個目標(biāo)頭文件引用目錄 |
| target_compile_definitions() | 設(shè)置單個目標(biāo)預(yù)編譯宏,也可以通過-D添加 |
| target_compile_features() | 設(shè)置單個目標(biāo)編譯功能 |
| target_compile_options() | 設(shè)置單個目標(biāo)編譯選項(xiàng) |
| target_link_libraries() | 設(shè)置單個目標(biāo)需要鏈接的庫 |
| target_link_directories() | 設(shè)置單個目標(biāo)鏈接目錄 |
| target_link_options() | 設(shè)置單個目標(biāo)鏈接選項(xiàng) |
CTest Commands
略
Deprecated Commands
略
CMAKE變量
Variables that Provide Information
| 變量 | 解釋 |
|---|---|
| CMAKE_AR CMAKE_<LANG>_COMPILER_AR |
CMAKE用來打靜態(tài)庫的工具名稱 |
| CMAKE_COMMAND | CMAKE可執(zhí)行文件的完整路徑,一般用于構(gòu)建過程中調(diào)用-E操作 |
| CMAKE_BINARY_DIR PROJECT_BINARY_DIR ${PROJECT_NAME}_BINARY_DIR |
這三個變量內(nèi)容一致,如果是內(nèi)部編譯,就指的是工程的頂級目錄,如果是外部編譯,指的就是工程編譯發(fā)生的目錄 |
| CMAKE_SOURCE_DIR PROJECT_SOURCE_DIR ${PROJECT_NAME}_SOURCE_DIR |
這三個變量內(nèi)容一致,都指的是工程的頂級目錄,即頂層CMakeLists.txt所在的路徑。 |
| CMAKE_CURRENT_SOURCE_DIR | 表示當(dāng)前代碼路徑,即當(dāng)前CMakeLists.txt所在的路徑。 |
| CMAKE_CURRENT_BINARY_DIR | 當(dāng)前CMakeLists.txt所在的路徑在目標(biāo)文件路徑下的映射。如果是in-source編譯,它跟CMAKE_CURRENT_SOURCE_DIR一致,如果是out-ofsource 編譯,他指的是target編譯目錄 |
| CMAKE_CURRENT_LIST_DIR | CMakeList.txt的完整路徑 |
| CMAKE_CURRENT_LIST_LINE | 當(dāng)前所在的行 |
| CMAKE_CURRENT_LIST_FILE | 輸出調(diào)用這個變量的CMakeLists.txt的完整路徑 |
| CMAKE_CROSSCOMPILING | 指示當(dāng)前是否是交叉編譯,如果CMAKE_SYSTEM_NAME變量被賦值,則該變量會自動配置為TRUE |
| CMAKE_TOOLCHAIN_FILE | 指定交叉編譯工具的路徑 |
| CMAKE_VERBOSE_MAKEFILE | 構(gòu)建過程中輸出詳細(xì)信息,默認(rèn)為OFF,打開需要改為ON |
| PROJECT_NAME | 項(xiàng)目名稱,通過project()指令配置的值 |
| PROJECT_SOURCE_DIR | 工程的根目錄 |
| PROJECT_VERSION | 項(xiàng)目版本,通過project()指令配置的值 |
| OBJECT_LIST | 當(dāng)前目標(biāo)所依賴的obj文件列表,可以通過${CMAKE_COMMAND} -E copy拷貝到指定位置 |
Variables that Change Behavior
| 變量 | 解釋 |
|---|---|
| CMAKE_MODULE_PATH | 如果工程復(fù)雜,可能需要編寫一些cmake模塊。 通過SET指定這個變量指定搜索路徑,模塊名為<modulename>.cmake。 |
| CMAKE_BUILD_TYPE | 可以是Debug, Release, RelWithDebInfo, MinSizeRel,可以通過CMAKE_C_FLAGS_<CONFIG>配置 |
| CMAKE_INSTALL_PREFIX | 最終編譯結(jié)果輸出目錄 |
| CMAKE_PREFIX_PATH | 指定package查找路徑,find_package(), find_program(), find_library(), find_file(), and find_path() commands命令會加上該路徑進(jìn)行查找 |
| CMAKE_C_OUTPUT_EXTENSION_REPLACE CMAKE_CXX_OUTPUT_EXTENSION_REPLACE |
linux系統(tǒng)上,cmake默認(rèn)生成的object文件后綴為".c.o"或者".cpp.o"等。通過設(shè)置下面的變量,可以將源文件后綴".c"或者".cpp"去掉,變成".o"。 |
| CMAKE_C_OUTPUT_EXTENSION CMAKE_CXX_OUTPUT_EXTENSION |
通過設(shè)置下面的變量,可以把object文件后綴從".c.o"或者".cpp.o"改成".c.obj"或者".cpp.obj"。 上述兩組變量同時使用,可以把object文件后綴從".c.o"或者".cpp.o"改成".obj"。 注意:1、在linux系統(tǒng)中, 即set(CMAKE_SYSTEM_NAME Linux)時,設(shè)置變量CMAKE_C_OUTPUT_EXTENSION是不生效的,需要將系統(tǒng)名稱改成Generic,如下:set(CMAKE_SYSTEM_NAME Generic) 2、上述設(shè)置必須寫在toolchain中,如果寫在CMakeLists.txt中,有時不會生效。 |
Variables that Describe the System
略
Variables that Control the Build
| 變量 | 解釋 |
|---|---|
| CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE |
設(shè)置debug和release版本輸出路徑 |
| CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE |
設(shè)置debug和release版本庫文件的輸出路徑 |
| CMAKE_DEBUG_POSTFIX CMAKE_RELEASE_POSTFIX |
設(shè)置debug和release版本庫文件的后綴名 |
| set_target_properties(${TARGET_NAME} PROPERTIES DEBUG_POSTFIX "_d") set_target_properties(${TARGET_NAME} PROPERTIES RELEASE_POSTFIX "_r") |
分別設(shè)置了Debug版本和Release版本下可執(zhí)行文件的后綴名. |
| EXECUTABLE_OUTPUT_PATH | 可執(zhí)行輸出文件的存放位置 |
| LIBRARY_OUTPUT_PATH | 庫文件的輸出位置 |
Variables for Languages
| 變量 | 解釋 |
|---|---|
| CMAKE_<LANG>_FLAGS | 指定編譯選項(xiàng),不建議通過類似set(CMAKE_C_FLAGS “”)的方式修改,而是建議通過target_compile_options ( )添加編譯選項(xiàng) |
| CMAKE_<LANG>_COMPILER | 指定語言對應(yīng)的編譯器 |
| CMAKE_<LANG>_COMPILE_OBJECT | 自定義編譯生成obj的策略,不使用cmake默認(rèn)的鏈接策略 |
| CMAKE_<LANG>_LINK_EXECUTABLE | 自定義鏈接策略,不使用cmake默認(rèn)的鏈接策略 |
Variables for CTest
略
Variables for CPack
略
Variable Expansion Operators
略
Internal Variables
略
CMAKE 屬性
Properties of Global Scope
Properties on Directories
Properties on Targets
Properties on Tests
Properties on Source Files
Properties on Cache Entries
Properties on Installed Files
Deprecated Properties on Directories
Deprecated Properties on Targets
Deprecated Properties on Source Files
CMake Module
:- | :-
CMakeDependentOption | 復(fù)雜編譯選項(xiàng)控制,如果option相互依賴關(guān)聯(lián)可以用這個模塊管理