cmake_policy¶
管理 CMake 政策設定。請參閱 cmake-policies(7)
手冊以了解已定義的政策。
隨著 CMake 的發展,有時需要變更現有的行為,以修正錯誤或改進現有功能的實作。CMake 政策機制旨在協助現有專案在新的 CMake 版本引入行為變更時,仍能繼續建置。每個新政策(行為變更)都會被賦予一個 CMP<NNNN>
形式的識別符號,其中 <NNNN>
是一個整數索引。每個政策的相關文件都會描述 OLD
和 NEW
行為,以及引入該政策的原因。專案可以設定每個政策來選擇所需的行為。當 CMake 需要知道要使用哪個行為時,它會檢查專案指定的設定。如果沒有可用的設定,則會假定 OLD
行為,並產生一個警告,要求設定該政策。
依據 CMake 版本設定政策¶
cmake_policy
命令用於將政策設定為 OLD
或 NEW
行為。雖然支援個別設定政策,但我們鼓勵專案根據 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 對於給定的政策使用 OLD
或 NEW
行為。依賴給定政策舊行為的專案可以透過將政策狀態設定為 OLD
來靜音政策警告。或者,您可以修正專案以使用新行為,並將政策狀態設定為 NEW
。
請注意
政策的 OLD
行為 根據定義已被棄用
,並可能會在未來版本的 CMake 中移除。
檢查政策設定¶
- cmake_policy(GET CMP<NNNN> <variable>)¶
檢查給定的政策是否設定為 OLD
或 NEW
行為。如果設定了政策,則輸出 <variable>
值將為 OLD
或 NEW
,否則為空。
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()
命令建立的命令,會在建立時記錄策略設定,並在被呼叫時使用預先記錄的策略。如果函數或巨集實作設定了策略,這些變更會自動向上傳播,通過呼叫者,直到它們到達最近的巢狀策略堆疊項目。