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 中移除。