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 行為依定義為 deprecated by definition,並可能在未來的 CMake 版本中移除。