連結: Day 3 - Colab
如同 Day 1 所說, CMake 是一個 build tool, 能夠將 source code 轉換成 binary, 讓系統對應的 processor 能夠看懂並執行
Day 2 也提到 CMake 能讓 cross-compile build 更方便
為什麼能夠更方便呢? CMake 和其他 build tool 如 GNU Make 又有什麼不同?
接下來, 為了之後的 CMake 專案做準備, 我們需要更了解 CMake 在 build code 的流程中扮演什麼角色
與其說 CMake 是一個 build tool, 不如說他是眾多 build tools 的管理工具
記得 Day 2 提到的 make
嗎? 我們需要搭配 Makefile
才能 build 比較複雜的專案, 但是寫 Makefile
也有很多技巧, 其他平台也都有各自的 build tool, 難道每換一個平台就要重頭學一個嗎?
沒錯! 這就是 CMake 要解決的事情!
只要學會 CMake, 就不需要再手刻各種 build script, 而是讓 CMake 幫你寫!
接下來, 為了瞭解如何使用 CMake, 我們先 cmake --help
來看看 (今天提供的 Colab 也有)
這邊僅簡單說明 Day 9 CMake 專案會用到的重要指令
首先來看看 cmake
binary 的介紹
Specify a source directory to (re-)generate a build system for it in the
current working directory. Specify an existing build directory to
re-generate its build system.
<project-root>/src
底下<project-root>/build
底下可以知道, 我們需要提供 source directory 和 build directory 給 cmake
來產生 build system, 即指包含 build 設定和所需要的各種檔案的環境
接著我們直接看 help 最底下的 Generator section, 可以看到各式各樣的 generator, 其中就有我們提過的 Makefile
Generators
The following generators are available on this platform (* marks default):
Green Hills MULTI = Generates Green Hills MULTI files
(experimental, work-in-progress).
* Unix Makefiles = Generates standard UNIX makefiles.
Ninja = Generates build.ninja files.
Ninja Multi-Config = Generates build-<Config>.ninja files.
Watcom WMake = Generates Watcom WMake makefiles.
CodeBlocks - Ninja = Generates CodeBlocks project files
(deprecated).
CodeBlocks - Unix Makefiles = Generates CodeBlocks project files
(deprecated).
CodeLite - Ninja = Generates CodeLite project files
(deprecated).
CodeLite - Unix Makefiles = Generates CodeLite project files
(deprecated).
Eclipse CDT4 - Ninja = Generates Eclipse CDT 4.0 project files
(deprecated).
Eclipse CDT4 - Unix Makefiles= Generates Eclipse CDT 4.0 project files
(deprecated).
Kate - Ninja = Generates Kate project files (deprecated).
Kate - Ninja Multi-Config = Generates Kate project files (deprecated).
Kate - Unix Makefiles = Generates Kate project files (deprecated).
Sublime Text 2 - Ninja = Generates Sublime Text 2 project files
(deprecated).
Sublime Text 2 - Unix Makefiles
= Generates Sublime Text 2 project files
(deprecated).
這串列表代表當前系統支援的所有 generators, 就像前面提到的, build code 的過程需要當前系統的 build tool 參與
Unix Makefiles 前面的星號 *
代表當前系統預設使用的 generator, 因為 Google Colab 是用 GNU/Linux, 所以預設會用 Unix Makefiles 作為 generator
當然, 我們可以指定 generator 來產生對應的 build script, 比如 改用 Ninja build code 而非 GNU Make
你可能會想, 咦? 為什麼沒有 Windows 的 build tool?
這是因為我們在 Linux 系統上, 正常來說是不會有其他平台的 build tool 的
但沒有其他平台的 build tool 的話, 我們要怎麼 cross compile 呢?
這時候我們就需要 toolchain file 了!
Generator 和 toolchain file 分別會在第 6 天和第 27 天深入介紹, 這邊大家只要先這樣認知即可: cmake
能夠根據指定的 generator 幫你產生對應的 build script (ex. Makefile), 就不用再花大量時間手刻這些 build script 了 😎
CMake 一手包辦了從產生 generator 對應的 build script, build code, 測試, 安裝, 到最後的打包
在 CMake 的世界中, 這些階段 (stage) 分別是
每個階段都可以獨立執行, 比如
cmake -G <generator>
cmake --build <dir>
make
) 搭配前面產生的 build script 來 build code最後的 Test 和 Package 階段分別由 CTest 和 CPack 負責, 但這兩個 tools 也能很簡單的整合進 CMake, 當然, 也可以用其他工具, 這些會分別在第 19 天和第 22 天介紹
下一篇, 會介紹 CMake 的各種變數, 包含 predefined variabls, normal variables, cache variables, environment variables 的特性及用法