一步一步學Cmake 之 自定義模塊(Module)

Table of Contents

1. 爲什麼要自定義模塊

2. 如何自定義模塊

2.1 準備文件

2.2 編寫CMakeLists.txt


一步一步學 CMake 系列文章

1. 爲什麼要自定義模塊

項目一般從CMakeLists.txt開始編寫,但是隨着時間的推移,CMakeLists.txt文件會變的越來越大,這個時候我們就需要將CMakeLists.txt文件拆開分寫成幾個小的模塊,這樣做的好處是:

1.主文件CMakeLists.txt易讀性強

2.CMake 模塊能夠在其它項目中重複使用

3.和CMake的函數相比,模塊能夠幫助我們限制變量的作用域

這一節我們將通過定義幷包含一個宏來展示如何編寫並使用CMake的模塊(Module)

2. 如何自定義模塊

2.1 準備文件

本例中我們將使用兩個文件:

CMakeLists.txt 和 cmake/colors.cmake
├──    cmake
│            └──    colors.cmake
└──    CMakeLists.txt

cmake/colors.cmake包含的內容如下:

macro(define_colors)
  if(WIN32)
    # has no effect on WIN32
    set(ColourReset "")
    set(ColourBold  "")
    set(Red         "")
    set(Green       "")
    set(Yellow      "")
    set(Blue        "")
    set(Magenta     "")
    set(Cyan        "")
    set(White       "")
    set(BoldRed     "")
    set(BoldGreen   "")
    set(BoldYellow  "")
    set(BoldBlue    "")
    set(BoldMagenta "")
    set(BoldCyan    "")
    set(BoldWhite   "")
  else()
    string(ASCII 27 Esc)
    set(ColourReset "${Esc}[m")
    set(ColourBold  "${Esc}[1m")
    set(Red         "${Esc}[31m")
    set(Green       "${Esc}[32m")
    set(Yellow      "${Esc}[33m")
    set(Blue        "${Esc}[34m")
    set(Magenta     "${Esc}[35m")
    set(Cyan        "${Esc}[36m")
    set(White       "${Esc}[37m")
    set(BoldRed     "${Esc}[1;31m")
    set(BoldGreen   "${Esc}[1;32m")
    set(BoldYellow  "${Esc}[1;33m")
    set(BoldBlue    "${Esc}[1;34m")
    set(BoldMagenta "${Esc}[1;35m")
    set(BoldCyan    "${Esc}[1;36m")
    set(BoldWhite   "${Esc}[1;37m")
  endif()
endmacro()

2.2 編寫CMakeLists.txt

cmake_minimum_required(VERSION 3.5 FATAL_ERROR)

project(recipe-02 LANGUAGES NONE)

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

include(colors)
define_colors()

message(STATUS "This is a normal message")
message(STATUS "${Red}This is a red${ColourReset}")
message(STATUS "${BoldRed}This is a bold red${ColourReset}")
message(STATUS "${Green}This is a green${ColourReset}")
message(STATUS "${BoldMagenta}This is bold${ColourReset}")

1. 本例並沒有源代碼需要編譯,所以不需要CMake對任何編程語言進行支持,所以

project(recipe-02 LANGUAGES NONE)

2. 我們定義了一個宏define_colors,並放在了cmake/colors.cmake中,之所以要定義宏而不是函數,是因爲我們希望在調用宏之後還繼續使用宏內部的變量值。

3. 定義好模塊之後,我們要告訴CMake到哪裏可以找到宏定義:

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

然後就是包含並調用宏,include(colors)會告訴CMake在CMAKE_MODULE_PATH路徑中尋找colors.cmake的文件。

4. 當然,我們也可以使用下面的語句來實現以上的功能

include(cmake/colors.cmake)
define_colors()

漲知識:CMake 中 function 和 macro的區別

發佈了83 篇原創文章 · 獲贊 55 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章