CMP0077

加入於版本 3.13。

option() 尊重一般變數。

option() 命令通常用於建立快取條目,以允許使用者設定選項。然而,在某些情況下,專案可能會在呼叫 option() 命令之前,定義與選項同名的一般(非快取)變數。例如,將另一個專案作為子目錄嵌入的專案可能希望硬編碼子專案的選項,以按照其需求進行建置。

由於歷史原因,在 CMake 3.12 及更早版本中,當發生以下情況時,option() 命令會移除同名的一般(非快取)變數:

  • 完全不存在指定名稱的快取條目,或

  • 存在指定名稱的快取條目,但尚未給定類型(例如,透過命令列上的 -D<name>=ON)。

在這兩種情況下(通常在新的建置樹中的首次執行時),option() 命令會給予快取條目類型 BOOL,並移除任何同名的一般(非快取)變數。在剩餘的情況下,如果指定名稱的快取條目已存在且具有類型(通常在建置樹中的後續執行時),option() 命令不會進行任何變更,並且任何同名的一般變數仍保持設定。

在 CMake 3.13 及更高版本中,當給定名稱的一般變數已存在時,option() 命令傾向於不執行任何操作。它不會建立或更新快取條目,也不會移除一般變數。新行為在建置樹的首次執行和後續執行之間保持一致。此策略為尚未更新以預期新行為的專案提供相容性。

option() 命令看到給定名稱的一般變數時:

  • 此策略的 OLD 行為是即使在存在同名的一般變數時也繼續執行。如果快取條目尚不存在且沒有類型,則會建立快取條目和/或給予類型,並移除一般變數。

  • 此策略的 NEW 行為是在存在同名的一般變數時不執行任何操作。不會移除一般變數。不會建立或更新快取條目,如果快取條目存在,則會忽略它。

請參閱 CMP0126,以了解關於 set(CACHE) 命令的類似策略,但請注意,這兩個策略之間的 NEW 行為存在一些差異。

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

使用 CMAKE_POLICY_DEFAULT_CMP0077 變數來為子目錄中的第三方專案設定策略,而無需修改它。

注意

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