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) 回傳指定目標的 Meson inc 物件。如果使用相依性物件,則不需要使用此方法。
  • 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_optionset_installappend_compile_argsappend_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:一個字串,指示相容性的類型,接受的值為 AnyNewerVersionSameMajorVersionSameMinorVersionExactVersion。預設值為 AnyNewerVersion。根據您的 CMake 安裝,某些類型的相容性可能不可用。
  • arch_independent0.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)

搜尋結果為