CMP0069

在版本 3.9 中新增。

INTERPROCEDURAL_OPTIMIZATION 在啟用時強制執行。

CMake 3.9 及更新版本傾向於在啟用 INTERPROCEDURAL_OPTIMIZATION 目標屬性時添加 IPO 旗標,並且如果 CMake 不知道目前編譯器的旗標,則會產生錯誤。由於給定的編譯器可能在其使用的所有環境中都不支援 IPO 旗標,因此現在專案有責任在使用 CheckIPOSupported 模組檢查支援後,再啟用 INTERPROCEDURAL_OPTIMIZATION 目標屬性。這種方法允許專案在支援時有條件地啟用 IPO。它還允許最終使用者在已知支援 IPO 的環境中設定 CMAKE_INTERPROCEDURAL_OPTIMIZATION 變數,即使專案未啟用該屬性。

由於 CMake 3.8 及更低版本僅針對 Linux 上的 Intel 編譯器支援 INTERPROCEDURAL_OPTIMIZATION,因此某些專案可能會無條件啟用目標屬性。政策 CMP0069 提供了與此類專案的相容性。

此政策在啟用 IPO 屬性時生效。此政策的 OLD 行為是僅針對 Linux 上的 Intel 編譯器添加 IPO 旗標。此政策的 NEW 行為是為目前編譯器添加 IPO 旗標,或者如果 CMake 不知道這些旗標,則產生錯誤。

此政策在 CMake 3.9 版本中引入。它可以透過 cmake_policy()cmake_minimum_required() 進行設定。如果未設定,CMake 會發出警告,並使用 OLD 行為。

注意

政策的 OLD 行為依照定義 已棄用,並可能在未來版本的 CMake 中移除。

範例

行為類似 CMake 3.8,並且除了 Linux 上的 Intel 編譯器外,不套用任何 IPO 旗標

cmake_minimum_required(VERSION 3.8)
project(foo)

# ...

set_property(TARGET ... PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)

使用 CheckIPOSupported 模組來偵測目前編譯器、環境和 CMake 版本是否支援 IPO。如果支援不可用,則產生嚴重錯誤

cmake_minimum_required(VERSION 3.9) # CMP0069 NEW
project(foo)

include(CheckIPOSupported)
check_ipo_supported()

# ...

set_property(TARGET ... PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)

僅在編譯器支援時套用 IPO 旗標

cmake_minimum_required(VERSION 3.9) # CMP0069 NEW
project(foo)

include(CheckIPOSupported)

# ...

check_ipo_supported(RESULT result)
if(result)
  set_property(TARGET ... PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
endif()

不經任何檢查套用 IPO 旗標。如果目前環境中的編譯器不支援 IPO,這可能會導致建置錯誤。如果 CMake 不知道目前編譯器的 IPO 旗標,則產生錯誤

cmake_minimum_required(VERSION 3.9) # CMP0069 NEW
project(foo)

# ...

set_property(TARGET ... PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)