<> 翻譯 2.3 與代碼通訊

<<Modern CMake>> 翻譯 2.3 與代碼通訊

配置文件

CMake 容許您使用代碼經過 configure_file 存取 CMake 變量。 此命令複製一個文件,一般是把 .in後綴文件從一個地方拷貝到另外一個地方,替換其中的全部 CMake 變量。 若是你想避免將你的輸入文件中現有的 ${} 進行替換,能夠使用 @ONLY 關鍵字。 也有一個 COPY_ONLY 關鍵字,能夠在你只是替代 file(COPY 時使用。正則表達式

此功能使用很是頻繁; 例如,在 Version.h.in 文件中:緩存

Version.h.in

#pragma once #define MY_VERSION_MAJOR @PROJECT_VERSION_MAJOR@ #define MY_VERSION_MINOR @PROJECT_VERSION_MINOR@ #define MY_VERSION_PATCH @PROJECT_VERSION_PATCH@ #define MY_VERSION_TWEAK @PROJECT_VERSION_TWEAK@ #define MY_VERSION "@PROJECT_VERSION@" 

CMake 文件行:

configure_file ( "${PROJECT_SOURCE_DIR}/include/My/Version.h.in" "${PROJECT_BINARY_DIR}/include/My/Version.h" ) 

在構建項目時,還應包括二進制包含目錄。 若是要在頭文件中放置任何 true / false 變量,CMake 有一個專門用於 C 特定的 #cmakedefine and #cmakedefine01 替換來適當的進行定義。spa

您也能夠(而且常常)使用它來生成 .cmake 文件,例如配置文件(請參閱配置節部分)。翻譯

從代碼文件中讀取信息

另外一個方向也能夠作; 您能夠從源文件中讀取某些內容(如版本)。 例如,若是你有一個純頭文件連接庫,你能夠使用也能夠不使用 CMake,那麼這將是處理版本的最佳方法。code

寫起來像這樣:get

# Assuming the canonical version is listed in a single line # This would be in several parts if picking up from MAJOR, MINOR, etc. set(VERSION_REGEX "#define MY_VERSION[ \t]+\"(.+)\"") # Read in the line containing the version file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/include/My/Version.hpp" VERSION_STRING REGEX ${VERSION_REGEX}) # Pick out just the version string(REGEX REPLACE ${VERSION_REGEX} "\\1" VERSION_STRING "${VERSION_STRING}") # Automatically getting PROJECT_VERSION_MAJOR, My_VERSION_MAJOR, etc. project(My LANGUAGES CXX VERSION ${VERSION_STRING}) 

上面的構建中, file(STRINGS file_name variable_name REGEX regex) 選擇與正則表達式匹配的行; 而後使用相同的正則表達式來選擇提取版本部分信息的捕獲組。 替換與後置替換一塊兒使用以僅輸出該組。string

相關文章
相關標籤/搜索