CMake モジュール

注記: このモジュールの機能は、ビルドシステムの混在に関するMesonのルールによって管理されています。

このモジュールは、CMakeパッケージファイル生成のためのヘルパーツールを提供します。また、通常のMesonサブプロジェクトと同様に、CMakeベースのサブプロジェクトの使用もサポートしています。

使用方法

このモジュールを使用するには、cmake = import('cmake') とします。その後、次の関数はcmakeという名前のオブジェクトのメソッドとして使用できます。もちろん、cmakeという名前は他の名前に置き換えることができます。

最高の互換性を得るために、最新のMesonバージョンとCMake >= 3.17を使用することをお勧めします。CMakeサブプロジェクトは、通常、古いCMakeバージョンでも動作します。ただし、まれに予期しない問題が発生する可能性があります。

CMakeサブプロジェクト

"通常の"Mesonサブプロジェクトの使用と同様に、CMakeサブプロジェクトを使用します。それらも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()関数とほぼ同じです。唯一の違いは、MesonプロジェクトではなくCMakeプロジェクトが設定されることです。

返されたsub_projは、「通常の」サブプロジェクトと同じオプションをサポートします。MesonはCMakeビルドターゲットを自動的に検出し、下記にリストされているメソッドでアクセスできます。

ビルドターゲットでdependency()メソッドによって返される依存オブジェクトを使用するだけで十分な場合が多いです。これは、通常のMesonサブプロジェクトからのdeclare_dependency()オブジェクトの使用とほぼ同じです。

target()メソッドを使用して、CMakeプロジェクトで定義された実行可能ファイルをコードジェネレーターとして使用することも可能です。

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オブジェクトと非常によく似ています。これは、subproject_optionsメソッドによって生成されます。

すべての設定オプションは、サブプロジェクトが設定されるに設定する必要があり、optionsキーを介してsubprojectメソッドに渡す必要があります。設定オブジェクトを変更しても、以前のcmake.subproject呼び出しには影響しません。

以前のMesonバージョンでは、cmake_optionsキーワード引数を使用してCMakeコマンドラインパラメーターを設定できました。ただし、この機能は0.55.0以降非推奨となり、互換性のためにのみ保持されています。これはoptionsキーワード引数と同時に動作しません。

subprojectオブジェクト

このオブジェクトは、上記で説明したsubprojectメソッドによって返され、次のメソッドをサポートします。

  • dependency(target)は、任意のCMakeターゲットの依存オブジェクトを返します。include_typeキーワード引数(0.56.0の新機能)は、dependency()関数と同じキーワード引数と同様に、返される依存オブジェクトのincludeタイプを制御します。
  • 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キーワード引数によって消費されます。次のメソッドがサポートされています。

  • add_cmake_defines({'opt1': val1, ...}) 追加のCMakeコマンドライン定義を追加します。
  • set_override_option(opt, val) ターゲットの特定のビルドオプションを設定します。これにより、build_target()override_options配列にopt=valが効果的に追加されます。
  • set_install(bool) ターゲットをインストールするかどうかをオーバーライドします。
  • append_compile_args(lang, arg1, ...) 特定の言語のコンパイルフラグをターゲットに追加します。
  • append_link_args(arg1, ...)リンカ引数をターゲットに追加します。
  • clear() cmake optionsオブジェクト内のすべてのデータをリセットします。

set_override_optionset_installappend_compile_argsappend_link_argsメソッドは、オプションのtargetキーワード引数をサポートしています。指定した場合、設定されたオプションは特定のターゲットに影響します。それ以外の場合は、サブプロジェクト全体にグローバルに影響します。

たとえば、opt_var.set_install(false)が呼び出された場合、CMakeで設定されている内容に関係なく、ターゲットはインストールされません。ただし、targetキーワード引数を設定することで、特定のターゲット(ここでは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が含まれます。

詳細については、クロスファイルとネイティブファイルの仕様を参照してください。

CMake設定ファイル

cmake.write_basic_package_version_file()

このメソッドは、対応するCMake関数と同等で、nameパッケージバージョンファイルを生成します。

  • name: パッケージの名前。
  • version: 生成されたパッケージファイルのバージョン。
  • compatibility: 互換性の種類を示す文字列。許容される値はAnyNewerVersionSameMajorVersionSameMinorVersion、または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)

検索結果は以下のとおりです。