CMake 模組
注意:此模組的功能受 Meson 關於混合建構系統的規則 管轄。
此模組提供用於產生 CMake 套件檔案的輔助工具。它也支援使用基於 CMake 的子專案,類似於一般的 Meson 子專案。
使用方式
要使用此模組,只需執行: cmake = import('cmake')
。然後,以下函式將以名稱為 cmake
的物件的方法提供。當然,您可以將名稱 cmake
替換為任何其他名稱。
通常建議使用最新的 Meson 版本和 CMake >= 3.17 以獲得最佳相容性。CMake 子專案通常也適用於較舊的 CMake 版本。但是,在極少數情況下,這可能會導致意外問題。
CMake 子專案
使用 CMake 子專案與使用「一般」Meson 子專案類似。它們也必須位於 subprojects
目錄中。
範例
add_library(cm_lib SHARED ${SOURCES})
cmake = import('cmake')
# Configure the CMake project
sub_proj = cmake.subproject('libsimple_cmake')
# Fetch the dependency object
cm_lib = sub_proj.dependency('cm_lib')
executable('exe1', ['sources'], dependencies: [cm_lib])
subproject
方法幾乎與一般的 Meson subproject()
函式相同。唯一的區別是會設定 CMake 專案而不是 Meson 專案。
回傳的 sub_proj
支援與「一般」子專案相同的選項。Meson 會自動偵測 CMake 建構目標,這些目標可以使用下方列出的方法存取。
通常只需使用建構目標中 dependency()
方法回傳的相依性物件就足夠了。這幾乎等同於使用一般 Meson 子專案中的 declare_dependency()
物件。
也可以使用在 CMake 專案中定義的可執行檔作為程式碼產生器,搭配 target()
方法
add_executable(cm_exe ${EXE_SRC})
cmake = import('cmake')
# Subproject with the "code generator"
sub_pro = cmake.subproject('cmCodeGen')
# Fetch the code generator exe
sub_exe = sub_pro.target('cm_exe')
# Use the code generator
generated = custom_target(
'cmake-generated',
input: [],
output: ['test.cpp'],
command: [sub_exe, '@OUTPUT@']
)
應注意並非所有專案都能保證正常運作。最安全的方法仍然是為相關的子專案建立一個 meson.build
。
組態選項
Meson 0.55.0 中的新功能
Meson 也支援將組態選項傳遞給 CMake,並覆寫從 CMake 子專案擷取的某些建構詳細資訊。
cmake = import('cmake')
opt_var = cmake.subproject_options()
# Call CMake with `-DSOME_OTHER_VAR=ON`
opt_var.add_cmake_defines({'SOME_OTHER_VAR': true})
# Globally override the C++ standard to c++11
opt_var.set_override_option('cpp_std', 'c++11')
# Override the previous global C++ standard
# with c++14 only for the CMake target someLib
opt_var.set_override_option('cpp_std', 'c++14', target: 'someLib')
sub_pro = cmake.subproject('someLibProject', options: opt_var)
# Further changes to opt_var have no effect
如需所有支援函式的完整參考,請參閱 CMake 選項物件。
CMake 組態選項物件與 cfg_data
物件] 物件非常相似,該物件由 configuration_data()
回傳。它由 subproject_options
方法產生。
所有組態選項都必須在設定子專案之前設定,並且必須透過 options
鍵傳遞給 subproject
方法。變更組態物件不會對先前的 cmake.subproject
呼叫產生任何影響。
在較早的 Meson 版本中,可以使用 cmake_options
kwarg 設定 CMake 命令列參數。但是,此功能自 0.55.0 起已棄用,僅為相容性而保留。它不會與 options
kwarg 一起運作。
subproject
物件
此物件由上述 subproject
方法回傳,並支援以下方法
-
dependency(target)
回傳任何 CMake 目標的相依性物件。include_type
kwarg (0.56.0 中的新功能)控制回傳的相依性物件的包含類型,類似於dependency()
函式中的相同 kwarg。 -
include_directories(target)
回傳指定目標的 Mesoninc
物件。如果使用相依性物件,則不需要使用此方法。 -
target(target)
回傳原始建構目標。 -
target_type(target)
回傳目標的類型,以字串表示 -
target_list()
回傳所有目標名稱的清單。 -
get_variable(name)
從子專案內部擷取指定的變數。通常,應優先使用dependency()
或target()
來擷取建構目標。 -
found
如果子專案可用,則回傳 true,否則回傳 false Meson 0.53.2 中的新功能
cmake options
物件
此物件由 subproject_options()
方法回傳,並由 subproject
方法的 options
kwarg 取用。支援以下方法
-
add_cmake_defines({'opt1': val1, ...})
新增其他 CMake 命令列定義 -
set_override_option(opt, val)
為目標設定特定的 建構選項。這實際上會將opt=val
新增至build_target()
的override_options
陣列 -
set_install(bool)
覆寫是否應安裝目標 -
append_compile_args(lang, arg1, ...)
將特定語言的編譯旗標附加到目標 -
append_link_args(arg1, ...)
將連結器引數附加到目標 -
clear()
重設cmake options
物件中的所有資料
方法 set_override_option
、set_install
、append_compile_args
和 append_link_args
支援選用的 target
kwarg。如果指定,則設定的選項會影響特定目標。否則,該選項的效果對於子專案是全域的。
例如,如果呼叫 opt_var.set_install(false)
,則無論 CMake 設定什麼,都不會安裝任何目標。但是,仍然可以透過設定 target
kwarg 來安裝特定目標(此處為 foo
):opt_var.set_install(true, target: 'foo')
未設定的選項不會影響產生的子專案。因此,例如,如果未呼叫 set_install
,則將使用從 CMake 擷取的值。
交叉編譯
0.56.0 中的新功能
Meson 將嘗試從交叉和原生檔案中的現有項目自動推測大多數所需的 CMake 工具鏈變數。這些變數將儲存在建構目錄中自動產生的 CMake 工具鏈檔案中。無法推測的剩餘變數可以由使用者在 [cmake]
交叉/原生檔案區段中新增(0.56.0 中的新功能)。
也支援使用 [properties]
區段中的 cmake_toolchain_file
設定新增手動 CMake 工具鏈檔案。在 meson.build
中使用 -DCMAKE_TOOLCHAIN_FILE=/path/to/some/Toolchain.cmake
直接設定 CMake 工具鏈檔案不受支援,因為自動產生的工具鏈檔案也由 Meson 用於將任意程式碼注入 CMake,以啟用 CMake 子專案支援。
最接近僅使用手動 CMake 工具鏈檔案的組態將是在機器檔案中設定這些選項
[properties]
cmake_toolchain_file = '/path/to/some/Toolchain.cmake'
cmake_defaults = false
[cmake]
# No entries in this section
這將導致工具鏈檔案僅具有啟用 CMake 子專案支援的最基本資訊,並將 cmake_toolchain_file
作為最後一個指令 include()
。
如需更多資訊,請參閱交叉和原生檔案規格。
CMake 組態檔案
cmake.write_basic_package_version_file()
此方法等同於對應的 CMake 函式,它會產生一個 name
套件版本檔案。
-
name
:套件的名稱。 -
version
:產生的套件檔案的版本。 -
compatibility
:一個字串,指示相容性的類型,接受的值為AnyNewerVersion
、SameMajorVersion
、SameMinorVersion
或ExactVersion
。預設值為AnyNewerVersion
。根據您的 CMake 安裝,某些類型的相容性可能不可用。 -
arch_independent
:0.62.0 中的新功能,如果為 true,則產生的套件檔案將跳過架構檢查。對於僅標頭檔案的程式庫非常有用。 -
install_dir
:選用的安裝目錄,預設值為$(libdir)/cmake/$(name)
範例
cmake = import('cmake')
cmake.write_basic_package_version_file(name: 'myProject', version: '1.0.0')
cmake.configure_package_config_file()
此方法等同於對應的 CMake 函式,它會從 input
範本檔案產生 name
套件組態檔案。就像此檔案中的 cmake 函式一樣,@PACKAGE_INIT@
陳述式將由適當的 cmake 程式碼片段取代。等效的 PATH_VARS
引數是透過 configuration
參數給定的。
-
name
:套件的名稱。 -
input
:範本檔案,其中將針對configuration
中包含的變數替代進行處理。 -
install_dir
:選用的安裝目錄,預設值為$(libdir)/cmake/$(name)
。 -
configuration
:一個configuration_data
物件,將用於範本檔案中的變數替代。自 0.62.0 起,它可以採用字典替代。
範例
meson.build
cmake = import('cmake')
conf = configuration_data()
conf.set_quoted('VAR', 'variable value')
cmake.configure_package_config_file(
name: 'myProject',
input: 'myProject.cmake.in',
configuration: conf
)
myProject.cmake.in
@PACKAGE_INIT@
set(MYVAR VAR)
搜尋結果為