動機

因爲某種原因,我最近又開始寫起 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-buildsystem(7) 讀一讀,有幾個重點要搞懂:

  • 如何使用 add_libraryadd_executable 來新增 build target - 了解 STATIC, SHARED, MODULE, 以及 OBJECT library 的差異
  • 了解 build specification:
    • INCLUDE_DIRECTORIES, COMPILE_DEFINITIONS 以及 COMPILE_OPTIONS 的意義
  • 了解 usage requirement:
    • INTERFACE_INCLUDE_DIRECTORIES, INTERFACE_COMPILE_DEFINITIONSINTERFACE_COMPILE_OPTIONS 的意義
  • 如何使用 target_include_directories(), target_compile_definitions()target_compile_options() 來修改 build specification 及 usage requirement
    • 了解 PRIVATE, PUBLICINTERFACE 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 的說明。

Introduction to CMake in 30 Minutes from Andrey Upadyshev

結論

CMake 熟悉了它的基本概念及內建命令語法後其實不難懂,我唯一的抱怨就是 CMakeLists.txt 這個預設檔名的風格有點奇怪。