動機
因爲某種原因,我最近又開始寫起 C++ 程式,除了要熟悉 C++ 11/14 的新特性外,比較頭疼的是 Makefile 的撰寫。
C/C++ 開發者了解基本的 Makefile 寫法是有必要的,但是大多數情況下,我認為使用 autotools 或是 CMake 這類 Makefile generator 是比較合理的選擇,因爲這些工具可以幫你產生出專家等級的 Makefile 並且處理可能的跨平台問題。至於 autotools 或是 CMake 的選擇,對我來說是很明顯的:autotools 是出了名的難用,而 CMake 是相對容易的。
本文嘗試整理一些網路上的 CMake 教學資源,並且加上自己的一些心得。
CMake 入門
我會建議先看 Eric Noulard 的 CMake tutorial presentation,相當地棒:
然後你會需要實際動手演練一下,有下面幾個選擇:
- CMake 官網上的基本範例:文字說明比較少,但可以讓你先感覺一下 CMake 的運作方式。我自己根據這個範例建了這個 GitHub project 來練習。
- 維基教科書上的 CMake 入門
- John Lamp 的 CMake Tutorial 提供了一個更實際的範例讓你練習,並且詳細解釋了每一行用到的 CMake 指令。
CMake 基礎知識
再來就是要花時間把官網的這篇 cmake-buildsystem(7) 讀一讀,有幾個重點要搞懂:
- 如何使用
add_library
及add_executable
來新增 build target - 了解STATIC
,SHARED
,MODULE
, 以及OBJECT
library 的差異 - 了解 build specification:
INCLUDE_DIRECTORIES
,COMPILE_DEFINITIONS
以及COMPILE_OPTIONS
的意義
- 了解 usage requirement:
INTERFACE_INCLUDE_DIRECTORIES
,INTERFACE_COMPILE_DEFINITIONS
及INTERFACE_COMPILE_OPTIONS
的意義
- 如何使用
target_include_directories()
,target_compile_definitions()
及target_compile_options()
來修改 build specification 及 usage requirement- 了解
PRIVATE
,PUBLIC
及INTERFACE
mode 的差異 - 跟 directory-scoped 命令的差異:
include_directories()
,add_definitions()
, 及add_compile_options()
- 了解
- 常用的內建變數
CMAKE_CURRENT_SOURCE_DIR
CMAKE_CURRENT_BINARY_DIR
- 如何使用
set_target_properties
來修改 target property - 了解 generator expression 的用法
上面提到的這些重要觀念可以參考 Introduction to CMake in 30 Minutes 的說明。
結論
CMake 熟悉了它的基本概念及內建命令語法後其實不難懂,我唯一的抱怨就是 CMakeLists.txt
這個預設檔名的風格有點奇怪。