UNITY_BUILD¶
在版本 3.16 中加入。
當此屬性設定為 true 時,目標原始碼檔案將會組合成批次以加速編譯。這是透過建立(一組)Unity 原始碼來完成,這些原始碼 #include
原始來源,然後編譯這些 Unity 原始碼,而不是原始來源。這被稱為 Unity 或 Jumbo 建置。
CMake 提供了不同的演算法來選擇哪些原始碼被分組到一個bucket 中。演算法選擇由 UNITY_BUILD_MODE
目標屬性決定,該屬性具有以下可接受的值
BATCH
在此模式下,CMake 決定哪些檔案被分組在一起。UNITY_BUILD_BATCH_SIZE
屬性控制每個 Unity 原始碼檔案可以組合的原始碼數量上限。GROUP
在此模式下,每個目標明確指定如何分組原始碼檔案。每個具有相同UNITY_GROUP
值的原始碼檔案將被分組在一起。任何沒有此屬性的原始碼將會個別編譯。UNITY_BUILD_BATCH_SIZE
屬性在使用此模式時會被忽略。
如果沒有明確指定 UNITY_BUILD_MODE
,CMake 將預設為 BATCH
。
以下語言支援 Unity 建置
C
在版本 3.16 中加入。
CXX
在版本 3.16 中加入。
CUDA
在版本 3.31 中加入。
OBJC
在版本 3.29 中加入。
OBJCXX
在版本 3.29 中加入。
對於混合來自多種語言的原始碼檔案的目標,CMake 會分離語言,以便每個產生的 Unity 原始碼檔案僅包含單一語言的原始碼。
此屬性由建立目標時 CMAKE_UNITY_BUILD
變數的值初始化。
注意
專案不應直接將 UNITY_BUILD
屬性或其相關聯的 CMAKE_UNITY_BUILD
變數設定為 true。根據所使用的建置機器和編譯器的功能,啟用 Unity 建置可能適合也可能不適合。因此,此功能應受開發人員控制,這通常是透過開發人員選擇是否在 CMAKE_UNITY_BUILD
變數在 cmake(1)
命令列上或其他等效方法中設定。但是,如果已知為目標啟用 Unity 建置可能會導致問題,則建議將 UNITY_BUILD
目標屬性設定為 false。
ODR (單一定義規則) 錯誤¶
當多個原始碼檔案包含到一個原始碼檔案中時,就像 Unity 建置一樣,這可能會導致 ODR 錯誤。CMake 提供了許多措施來幫助解決此類問題
任何具有非空
COMPILE_OPTIONS
、COMPILE_DEFINITIONS
、COMPILE_FLAGS
或INCLUDE_DIRECTORIES
原始碼屬性的原始碼檔案將不會組合到 Unity 原始碼中。任何透過
CXX_SCAN_FOR_MODULES
、CXX_SCAN_FOR_MODULES
掃描 C++ 模組原始碼,或屬於CXX_MODULES
檔案集的原始碼檔案將不會組合到 Unity 原始碼中。請參閱cmake-cxxmodules(7)
以取得詳細資訊。專案可以透過將其
SKIP_UNITY_BUILD_INCLUSION
原始碼屬性設定為 true,來防止個別原始碼檔案被組合到 Unity 原始碼中。對於防止特定檔案的問題,這可能比為整個目標停用 Unity 建置更有效。專案可以設定
UNITY_BUILD_UNIQUE_ID
以產生一個有效的 C 識別符,該識別符在 Unity 建置中每個檔案都是唯一的。這可以用於避免 Unity 建置中匿名命名空間的問題。UNITY_BUILD_CODE_BEFORE_INCLUDE
和UNITY_BUILD_CODE_AFTER_INCLUDE
目標屬性可用於在每個#include
陳述式之前和之後,將程式碼注入到 Unity 原始碼檔案中。透過諸如
add_library()
、add_executable()
或target_sources()
等命令添加到目標的原始碼檔案的順序,將會在產生的 Unity 原始碼檔案中保留。這可以用於根據UNITY_BUILD_BATCH_SIZE
目標屬性手動強制執行特定的分組。