CMP0114

新增於版本 3.19。

ExternalProject 步驟目標完全採用它們的步驟。

ExternalProject_Add() STEP_TARGETS 選項,以及 ExternalProject_Add_StepTargets() 函式,可用於為外部專案的個別步驟建立建置目標。

在 CMake 3.18 及更早版本中,步驟目標有一些限制

  • 步驟目標總是依賴於 ExternalProject_Add() DEPENDS 選項所命名的目標,即使並非所有步驟都需要它們。為了允許建立不帶這些依賴項的步驟目標,可以使用 ExternalProject_Add() INDEPENDENT_STEP_TARGETS 選項或 ExternalProject_Add_StepTargets() NO_DEPENDS 選項。然而,新增此類「獨立」步驟目標僅對特定步驟(例如 downloadupdatepatch)才有意義,因為它們不需要任何外部專案的建置依賴項。此外,為依賴於非獨立步驟的步驟建立獨立步驟目標是沒有意義的。此類規則不會強制執行,而不遵循它們的專案可能會產生具有令人困惑和產生器特定行為的建置系統。

  • 步驟目標會保存實作其步驟的自訂命令副本,這些副本與 ExternalProject_Add() 建立的主要目標中的副本分開,而主要目標不依賴於步驟目標。在並行建置中同時驅動主要目標和步驟目標時,多個步驟命令副本可能會並行執行並互相競爭。

    此外,在策略 CMP0113 之前,Makefile 產生器產生的步驟目標也包含其步驟所依賴的所有自訂命令。即使在循序建置中,也可能導致這些步驟重複執行。

在 CMake 3.19 及更高版本中,ExternalProject 模組偏好使用修訂的設計來解決這些問題

  • 如果一個步驟不依賴於 ExternalProject_Add() DEPENDS 所命名的其他目標,則該步驟被歸類為「獨立」。預定義的步驟預設會自動分類

    • downloadupdatepatch 步驟是獨立的。

    • configurebuildtestinstall 步驟不是獨立的。

    對於自訂步驟,ExternalProject_Add_Step() 命令提供了一個 INDEPENDENT 選項來將它們標記為獨立的。如果一個步驟依賴於其他非獨立的步驟,則將其標記為獨立步驟是錯誤的。請注意,此處術語「獨立」的使用僅指與外部目標的獨立性,並且與一個步驟對其他步驟的依賴性無關。

  • ExternalProject_Add() STEP_TARGETS 選項或 ExternalProject_Add_Step() 函式建立的步驟目標現在是獨立的,當且僅當其步驟被標記為獨立的。ExternalProject_Add() INDEPENDENT_STEP_TARGETS 選項和 ExternalProject_Add_StepTargets() NO_DEPENDS 選項不再允許使用。

  • 步驟目標在建立時,完全負責保存實作其步驟的自訂命令。由 ExternalProject_Add() 建立的主要目標依賴於步驟目標,而步驟目標則互相依賴。目標層級的依賴關係與每個步驟的自訂命令所使用的檔案層級依賴關係相符。

    當使用 ExternalProject_Add() UPDATE_DISCONNECTEDTEST_EXCLUDE_FROM_MAIN 選項時,或對自訂步驟使用 ExternalProject_Add_Step() EXCLUDE_FROM_MAIN 選項時,可能會自動建立一些步驟目標。這些目標是用來保存主要目標和中斷連線的步驟目標所共同依賴的步驟。

策略 CMP0114 為尚未更新以期望新行為的專案提供相容性。此策略的 OLD 行為是使用上述文件中記錄的來自 3.18 及更早版本的行為。此策略的 NEW 行為是使用上述文件中記錄的 3.19 及更高版本偏好的行為。

此策略在 CMake 3.19 版中引入。它可以使用 cmake_policy()cmake_minimum_required() 來設定。如果未設定,CMake 會發出警告,並使用 OLD 行為。

注意

策略的 OLD 行為根據定義已棄用,並且可能會在 CMake 的未來版本中移除。