CheckIPOSupported¶
在 3.9 版被加入.
此模組提供了一個命令,用於檢查編譯器是否支援過程間最佳化(IPO/LTO)。
在 CMake 專案中使用以下命令載入該模組:
include(CheckIPOSupported)
過程間最佳化是一種編譯器技術,它會跨編譯單元(即跨原始檔案)執行最佳化,使編譯器能夠將整個程式作為一個整體進行分析和最佳化,而不是逐檔案進行。這可以透過啟用更積極的內聯和死碼消除來提升效能。當這些最佳化在連結時套用時,這個過程通常稱為連結時期最佳化 (LTO),這是 IPO 的一種常見形式。
在 CMake 中,可以透過 INTERPROCEDURAL_OPTIMIZATION 目標屬性以每個目標為基礎啟用過程間最佳化,或使用 CMAKE_INTERPROCEDURAL_OPTIMIZATION 變數為目前作用域中的所有目標啟用。
在目標上啟用過程間最佳化之前,請使用此模組以確保編譯器支援 IPO/LTO。
命令¶
此模組提供了以下命令:
- check_ipo_supported¶
檢查編譯器是否支援過程間最佳化 (IPO/LTO):
check_ipo_supported( [RESULT <result-var>] [OUTPUT <output-var>] [LANGUAGES <lang>...] )
選項有:
RESULT <result-var>如果編譯器支援 IPO,則將
<result-var>變數設為YES,否則設為NO。如果未指定此選項,則在不支援 IPO 時命令將發出致命錯誤。OUTPUT <output-var>將
<output-var>變數設定為有關任何錯誤的詳細資訊。LANGUAGES <lang>...指定要檢查其編譯器的語言。
支援以下語言:
CCXXCUDA在 3.25 版被加入.
Fortran
如果未指定此選項,則會從目前的
ENABLED_LANGUAGES全域屬性中選取默認語言。
備註
要使用
check_ipo_supported(),必須將方針CMP0069設定為NEW;否則將會發生致命錯誤。在 3.13 版被加入: 支援 Visual Studio 生成器。
在 3.24 版被加入: 該檢查會使用呼叫端的
CMAKE_<LANG>_FLAGS和CMAKE_<LANG>_FLAGS_<CONFIG>值。請參見方針CMP0138。
範例¶
檢查編譯器是否支援 IPO,若不支援則發出致命錯誤:
include(CheckIPOSupported)
check_ipo_supported() # 若不支援 IPO 則發出致命錯誤
set_property(TARGET foo PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
以下範例示範如何使用此模組,僅在編譯器支援時為目標啟用 IPO,並在不支援時發出警告。此外,專案可能想要提供一個配置選項來控制何時啟用 IPO。例如:
option(FOO_ENABLE_IPO "Enable IPO/LTO")
if(FOO_ENABLE_IPO)
include(CheckIPOSupported)
check_ipo_supported(RESULT result OUTPUT output)
if(result)
set_property(TARGET foo PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
else()
message(WARNING "IPO is not supported: ${output}")
endif()
endif()