Cmake (2) - set, message and if

這次要介紹的 Cmake 功能有 set, message 跟 if。

1. 專案結構:

cpp hpp 的內容可以參考 Cmake (0) - 簡單 Project

lib/CmakeLists.txt 的內容可以參考Cmake (1) - add_subdirectory

.
├── CmakeLists.txt
├── build
├── include
│   └── greet.hpp
├── lib
│   ├── CmakeLists.txt
│   └── greet.cpp
└── src
    └── main.cpp

2. 專案主 CmakeLists.txt:

編輯專案主 CmakeLists.txt。

.
├── CmakeLists.txt
├── build
├── include
│   └── greet.hpp
├── lib
│   ├── CmakeLists.txt
│   └── greet.cpp
└── src
    └── main.cpp

專案主要的 CmakeLists.txt 設定如下。我們定義一個變數 USE_GREET,下面的 if 會參考 USE_GREET 決定編譯的方式。

當 USE_GREET = True 時會編譯執行檔 main。message 可以用來確認變數的值。

cmake_minimum_required(VERSION 3.11.0)
project(HELLO_CMAKE)

set(USE_GREET True)
message(STATUS "USE_GREET: " ${USE_GREET})

if(USE_GREET)
    add_subdirectory(lib)
    target_include_directories(greet PUBLIC include)

    add_executable(main src/main.cpp)
    target_link_libraries(main greet)
endif()

跑一下 Cmake 及 make 確定 main 有被 build 出來。

$ cd build
$ cmake ..
$ make

3. Cached variable:

編輯專案主 CmakeLists.txt。

cmake_minimum_required(VERSION 3.11.0)
project(HELLO_CMAKE)

set(USE_GREET True CACHE BOOL "Description")
message(STATUS "USE_GREET: " ${USE_GREET})

if(USE_GREET)
    add_subdirectory(lib)
    target_include_directories(greet PUBLIC include)

    add_executable(main src/main.cpp)
    target_link_libraries(main greet)
endif()

Cached variable 在已定義的情形下不會複寫既有的值,我們可以在執行 Cmake 時定義變數。

$ cd build
$ rm -fr *
$ cmake -D USE_GREET=False ..

Cmake 執行過程會出現 USE_GREET: False 然後我們可以 make 看看,這時候 main 不會被 build 出來。

4. 結論:

一般來說需要透過外部進行修改或設定的變數就會使用 cache。

留言

熱門文章