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>...

指定要檢查其編譯器的語言。

支援以下語言:

  • C

  • CXX

  • CUDA

    在 3.25 版被加入.

  • Fortran

如果未指定此選項,則會從目前的 ENABLED_LANGUAGES 全域屬性中選取默認語言。

備註

要使用 check_ipo_supported(),必須將方針 CMP0069 設定為 NEW;否則將會發生致命錯誤。

在 3.13 版被加入: 支援 Visual Studio 生成器

在 3.24 版被加入: 該檢查會使用呼叫端的 CMAKE_<LANG>_FLAGSCMAKE_<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()