cmake_policy

管理 CMake 政策設定。請參閱 cmake-policies(7) 手冊以了解已定義的政策。

隨著 CMake 的發展,有時需要變更現有的行為,以修正錯誤或改進現有功能的實作。CMake 政策機制旨在協助現有專案在新的 CMake 版本引入行為變更時,仍能繼續建置。每個新政策(行為變更)都會被賦予一個 CMP<NNNN> 形式的識別符號,其中 <NNNN> 是一個整數索引。每個政策的相關文件都會描述 OLDNEW 行為,以及引入該政策的原因。專案可以設定每個政策來選擇所需的行為。當 CMake 需要知道要使用哪個行為時,它會檢查專案指定的設定。如果沒有可用的設定,則會假定 OLD 行為,並產生一個警告,要求設定該政策。

依據 CMake 版本設定政策

cmake_policy 命令用於將政策設定為 OLDNEW 行為。雖然支援個別設定政策,但我們鼓勵專案根據 CMake 版本設定政策。

cmake_policy(VERSION <min>[...<max>])

新增於 3.12 版本: 可選的 <max> 版本。

<min> 和可選的 <max> 各自都是 major.minor[.patch[.tweak]] 形式的 CMake 版本,而 ... 是字面值。<min> 版本必須至少為 2.4,且至多為執行的 CMake 版本。<max> 版本(如果指定)必須至少為 <min> 版本,但可能會超過執行的 CMake 版本。如果執行的 CMake 版本早於 3.12,則額外的 ... 點將被視為版本元件分隔符號,導致 ...<max> 部分被忽略,並保留基於 <min> 的政策的 pre-3.12 行為。

這指定目前的 CMake 程式碼是為給定的 CMake 版本範圍編寫的。執行中的 CMake 版本已知且在 <min>(或 <max>,如果指定)版本或更早版本中引入的所有政策都將設定為使用 NEW 行為。在較新版本中引入的所有政策都將取消設定(除非 CMAKE_POLICY_DEFAULT_CMP<NNNN> 變數設定了預設值)。這實際上要求偏好自給定 CMake 版本起的行為,並告訴較新的 CMake 版本警告他們的新政策。

請注意,cmake_minimum_required(VERSION) 命令也會隱式呼叫 cmake_policy(VERSION)

變更於 3.31 版本: 已棄用與舊於 3.10 的 CMake 版本的相容性。呼叫 cmake_minimum_required(VERSION)cmake_policy(VERSION),且未將至少 3.10 指定為其政策版本(可選地透過 ...<max>)將會在 CMake 3.31 及更高版本中產生棄用警告。

變更於 3.27 版本: 已棄用與舊於 3.5 的 CMake 版本的相容性。呼叫 cmake_minimum_required(VERSION)cmake_policy(VERSION),且未將至少 3.5 指定為其政策版本(可選地透過 ...<max>)將會在 CMake 3.27 及更高版本中產生棄用警告。

變更於 3.19 版本: 已棄用與舊於 2.8.12 的 CMake 版本的相容性。呼叫 cmake_minimum_required(VERSION)cmake_policy(VERSION),且未將至少 2.8.12 指定為其政策版本(可選地透過 ...<max>)將會在 CMake 3.19 及更高版本中產生棄用警告。

明確設定政策

cmake_policy(SET CMP<NNNN> NEW|OLD)

告訴 CMake 對於給定的政策使用 OLDNEW 行為。依賴給定政策舊行為的專案可以透過將政策狀態設定為 OLD 來靜音政策警告。或者,您可以修正專案以使用新行為,並將政策狀態設定為 NEW

請注意

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

檢查政策設定

cmake_policy(GET CMP<NNNN> <variable>)

檢查給定的政策是否設定為 OLDNEW 行為。如果設定了政策,則輸出 <variable> 值將為 OLDNEW,否則為空。

CMake 政策堆疊

CMake 將政策設定保留在堆疊上,因此 cmake_policy 命令所做的變更只會影響堆疊的頂端。每個子目錄都會自動管理政策堆疊上的新項目,以保護其父目錄和同級目錄。CMake 也會為 include()find_package() 命令載入的指令碼管理新項目,但使用 NO_POLICY_SCOPE 選項叫用時除外(另請參閱政策 CMP0011)。cmake_policy 命令提供了一個介面來管理政策堆疊上的自訂項目。

cmake_policy(PUSH)

在政策堆疊上建立一個新項目。

cmake_policy(POP)

移除最後一個使用 cmake_policy(PUSH) 建立的策略堆疊項目。

每個 PUSH 都必須有一個匹配的 POP 來清除任何變更。這對於臨時更改策略設定很有用。呼叫 cmake_minimum_required(VERSION)cmake_policy(VERSION)cmake_policy(SET) 命令僅會影響策略堆疊的目前頂部。

加入於 3.25 版本:block(SCOPE_FOR POLICIES) 命令提供了一種更靈活、更安全的方式來管理策略堆疊。當離開區塊範圍時,pop 動作會自動完成,因此無需在每個 return() 之前呼叫 cmake_policy(POP)

# stack management with cmake_policy()
function(my_func)
  cmake_policy(PUSH)
  cmake_policy(SET ...)
  if (<cond1>)
    ...
    cmake_policy(POP)
    return()
  elseif(<cond2>)
    ...
    cmake_policy(POP)
    return()
  endif()
  ...
  cmake_policy(POP)
endfunction()

# stack management with block()/endblock()
function(my_func)
  block(SCOPE_FOR POLICIES)
    cmake_policy(SET ...)
    if (<cond1>)
      ...
      return()
    elseif(<cond2>)
      ...
      return()
    endif()
    ...
  endblock()
endfunction()

function()macro() 命令建立的命令,會在建立時記錄策略設定,並在被呼叫時使用預先記錄的策略。如果函數或巨集實作設定了策略,這些變更會自動向上傳播,通過呼叫者,直到它們到達最近的巢狀策略堆疊項目。

參見