CMake 是一個功能豐富的自動化構建系統。它允許開發人員生成現代的、高效的構建過程,簡化跨平台構建工作,同時為廣大用戶提供便捷的可執行文件。
其中 ,變量是構建功能中最基本的一部分。
一、CMake 變量簡介
CMake 變量是用於存儲文本常量、數字以及布爾類型等的名稱值對,它們被廣泛用於構建腳本中的各種設置、任務和參數。
變量在 CMake 中的使用方式非常類似於其他編程語言中的變量,甚至更加靈活。它們可以被賦值、傳遞給函數、以及通過堆棧方式來管理上下文,最終用於控制構建和處理代碼的流程。
下面我們介紹幾個常用的變量:
1. CMAKE_變量 系列
CMAKE_變量 系列是一組預定義的變量,用於控制 CMake 及其生成器的行為。這些變量在 CMake 的內部使用,通常不需要修改。
cmake_minimum_required(VERSION 3.5)
message(STATUS "CMake Version: ${CMAKE_VERSION}")
message(STATUS "CMake Source Dir: ${CMAKE_SOURCE_DIR}")
message(STATUS "CMake Binary Dir: ${CMAKE_BINARY_DIR}")
上述代碼演示了如何使用 CMake 預定義變量 CMAKE_VERSION、CMAKE_SOURCE_DIR、CMAKE_BINARY_DIR 來顯示 Cmake本身的版本號及源碼路徑和目標路徑。
2. 構建選項
CMake 變量可以用於控制構建選項,比如編譯器標誌、依賴庫路徑、安裝路徑等。
下面我們定義了兩個常用的構建選項。
# Enable debug symbols by default
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Debug)
endif()
# Set the output directory
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
上述代碼片段將默認的構建類型設置為 Debug,並且定義了輸出目錄為 ${PROJECT_BINARY_DIR}/lib 或 ${PROJECT_BINARY_DIR}/bin。
3. 自定義變量
除了 CMake 預定義的變量和構建選項外,開發人員還可以自定義變量並將它們用於其他目的,例如:
1)自定義變量 PATHS,用於存儲依賴庫的位置:
set(PATHS "/usr/local/include" "/usr/include")
message(STATUS "Search paths: ${PATHS}")
2)自定義變量 SOURCES,用於存儲需要編譯的源文件列表:
file(GLOB SOURCES "${PROJECT_SOURCE_DIR}/src/*.cpp")
add_executable(myapp ${SOURCES})
二、CMake 變量的作用域
CMake 變量作為關鍵概念,它們擁有各自的作用域和生命周期。
變量的作用域被定義為變量的可見範圍,這取決於變量被定義的位置。在 CMake 中,變量的作用域主要分為以下幾種情況:
1. 全局變量
CMake 中的全局變量可以在 CMake 文件中任何地方進行定義,並且在整個 CMake 運行期間都有效。CMake 內置的變量和用戶自己定義的變量都是全局的。
下面定義了兩個全局變量:
set(GLOBAL_VAR "Global variable")
function(f)
message(STATUS "Func: ${GLOBAL_VAR}")
endfunction()
f() # "Global variable"
2. 局部變量
局部變量只在它們被定義的函數中有效。
下面定義了兩個局部變量 UNITS 和 TOTAL,分別用於計算 list 中所有元素的和。
function(sum list)
set(UNITS "")
set(TOTAL 0)
foreach(num ${list})
math(EXPR TOTAL "${TOTAL} + ${num}")
endforeach()
message(STATUS "Sum: ${TOTAL}")
endfunction()
sum(1 2 3) # "Sum: 6"
3. CACHE 變量
CACHE 變量既可以作為全局變量,也可以作為本地變量。它們可以在運行 CMake 時被設置,然後保存到 CMake 緩存中,以便在之後的構建中重複使用。
下面示例中的 CACHE 變量用法:為可自定義安裝路徑的命令行界面添加一個選項。
option(INSTALL_MYAPP "Install MyApp" OFF)
if(INSTALL_MYAPP)
set(INSTALL_DIR /usr/local/myapp CACHE PATH "Installation directory")
endif()
三、CMake 變量的擴展和轉義
CMake 提供了多種方式來擴展和轉義變量,以滿足各種複雜的需求。
1. 變量替換和擴展
CMake 支持將變量的值作為另一個變量的名稱來訪問、擴展變量以及在字符串中使用變量。
下面分別演示了三種方法:
set(FULL_NAME "Software Engineer")
set(AGE 30)
# Access variable by using another variable name
set(NEW_VAR "FULL_NAME")
message(STATUS "Access variable: ${${NEW_VAR}}")
# Expand variable in a string
set(MESSAGE "I am ${FULL_NAME}, ${AGE} years old")
message(STATUS "Expand variable in string: ${MESSAGE}")
# Append string to variable
set(PATH "/usr/local/include" CACHE PATH "Installation path")
set(PATH "${PATH}:/usr/include")
message(STATUS "Append string to variable: ${PATH}")
2. 變量引用和轉義
在一些特殊情況下,我們需要引用某些變量的文本值,例如將變量的值傳遞給 shell 命令。
下面演示了將變量作為命令行參數使用時的轉義。
set(PATH "/usr/local/my\ app" CACHE PATH "Installation path")
execute_process(COMMAND echo ${PATH}) # "/usr/local/my app"
四、CMake 命令和函數參數默認值和類型聲明
如果沒有為命令或函數傳遞足夠的參數,CMake 會發出警告並退出。
因此,CMake 允許在命令和函數中定義默認參數,以及指定參數類型,這樣可以在必要的時候在代碼中使用。
下面演示了如何為命令和函數定義默認值並聲明類型:
# Define default values
set(FILE_PATH "file.txt")
set(TEXT "Hello, World!")
# Declare parameter types
function(write_to_file FILE_NAME STRING)
file(WRITE "${FILE_NAME}" "${STRING}")
endfunction()
write_to_file(${FILE_PATH} ${TEXT}) # Write "Hello, World!" to "file.txt"
結論
CMake 變量是 CMake 構建中最基本的概念之一,開發人員可以將變量用於各種設置、任務和參數中。同時,CMake 還提供了豐富的變量擴展和轉義方式,以及將參數默認值和類型聲明方式。熟練掌握這些技巧可以幫助開發人員更高效地編寫、管理 CMake 構建腳本。
原創文章,作者:BPQTJ,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/371700.html