第一章第二主要說明為甚麼要用CMake與跨平台, UI的使用方式, 在這裡就不說明了. 從這篇開始主要從第三張開始說明我抓到的重點
Chapter 3.1
- cmake 的最底層是source code, 主要是C 或 C++ . source code可以組成target, target通常是可執行檔或 library .
- 目錄用來存放source code並且有一個 CMakeLists檔案, 可以用來產生一個或多個target
- 每個目錄有一個local generator來負責產生Makefile
- 所有的local generator共享一個global generator來負責整個build的過程, global generator被cmake 產生並且驅動
- cmake被command line呼叫後會產生一個cmake class, 並且根據使用的generator (例如 Makefiles in Unix系統) 來產生對應的global generator, 之後便交由global generator來管理每個configuration 與產生所有makefiles,至於產生makefiles則是根據不同的目錄由產生不同的local generator來處理
- CMakeLists 由 CMake command組成. 每個command是Cmake程式中的一個class, 主要可以分成兩個部分:InitialPass與FinalPass,
- InitialPass 將command的參數送進cmake class的instance中, 並且表現出他的操作. 而大部分的command沒有FinalPass,
- FinalPass主要是整個專案所有的command的InitialPass都處理完後才會開始處理, 主要是負責一些在InitialPass中還無法使用的global information.
- 當所有的InitialPass與FinalPass都載入cmake 中後便可以產生makefiles
- 整個cmake最重要的就是target, 以下cmake command可以產生target
- add_library
- add_executable
- add_custom_target
- 舉例來說, 使用a.c, b.c來建立一個靜態library的指令如下
- add_library(foo STATIC a.c b.c)
- 在這個指令之後, foo這個target 名稱可以在此專案的其他地方當作library使用
- add_library選擇的模式有三種, STATIC, SHARED, MODULE
- 其中Module模式產生的library在大部分的OS中與shared library類似,但在OS X中有差異
- 如果不選擇模式, 預設會是STATIC, 但可以透過CMAKE設定變數BUILD_SHARED_LIBS來改變預設是STATIC或SHARED
- target會紀錄general properties, 可以透過set_target_properties , get_target_properties或 set_properties, get_properties來設定或查看, 最常使用的properties是用來設定Link_flags
- target 使用 target_link_libraries來儲存所需要的library清單
- target_link_libraries的參數可以是library的名字, library的路徑 或者是透過 add_library指令產生的library名稱
- 每個CMake產生的library會紀錄所有此library的相依library, 所以可以透過target_link_libraries把 B library link到 CMake產生的A library, 在透過target_link_library把A link到 執行檔E, 這樣E就會link到 lib A與 lib B
Chapter 3.3 Source Files
- source files的結構與target很像, 主要是用來存filename, extension與 general properties.
- 可以透過set_source_files_properties 或 get_source_files_properties來設定
- 常見的properties如下
- COMPILE_FLAGS : compile flags, 包含 -D或-I
- GENERATED : GENERATED property表示這個source file是在build的過程中產生的, 這樣cmake在處理相依性時會與一般檔案不同, 因為在cmake開始執行時這些檔案是不存在的
- OBJECT_DEPENDS : 用來加入這些source file 應該相依的其他檔案, 此指令較少使用
- ABSTRACT WRAP_EXCLUDE : cmake不直接使用這個properties, 某些loading command或extensions會根據此properties來決定把c++的class包裝成其他語言
待續