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)