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)
は、指定されたターゲットの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
キーワード引数によって消費されます。次のメソッドがサポートされています。
-
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_option
、set_install
、append_compile_args
、append_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
: 互換性の種類を示す文字列。許容される値は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)
検索結果は以下のとおりです。