iT邦幫忙

2023 iThome 鐵人賽

DAY 3
3

本日內容

  • 多瞭解一點 CMake
  • CMake 作為管理工具
  • CMake 可以幫我做什麼?

連結: Day 3 - Colab

多瞭解一點 CMake

如同 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 作為管理工具

與其說 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 專案會用到的重要指令

Source and binary directories

首先來看看 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.
  • source directory
    • 就是我們 source code 的路徑, 一般會放在 <project-root>/src 底下
  • build directory
    • 又叫做 binary directory, 是用來放我們 build 出來的 binary 的路徑, 通常在 <project-root>/build 底下

可以知道, 我們需要提供 source directory 和 build directory 給 cmake 來產生 build system, 即指包含 build 設定和所需要的各種檔案的環境

Generator

接著我們直接看 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 哪去了?

你可能會想, 咦? 為什麼沒有 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 可以幫我做什麼?

CMake 一手包辦了從產生 generator 對應的 build script, build code, 測試, 安裝, 到最後的打包

在 CMake 的世界中, 這些階段 (stage) 分別是

  • Configure
  • Build
  • Test (CTest)
  • Package (CPack)

每個階段都可以獨立執行, 比如

  • cmake -G <generator>
    • 產生 build script
  • cmake --build <dir>
    • 執行 build tool (ex. make) 搭配前面產生的 build script 來 build code

最後的 Test 和 Package 階段分別由 CTest 和 CPack 負責, 但這兩個 tools 也能很簡單的整合進 CMake, 當然, 也可以用其他工具, 這些會分別在第 19 天和第 22 天介紹

預告

下一篇, 會介紹 CMake 的各種變數, 包含 predefined variabls, normal variables, cache variables, environment variables 的特性及用法


上一篇
[Day 2] 環境設置與 Hello World
下一篇
[Day 4] Variables 類型
系列文
30 天 CMake 跨平台之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言