依存関係

ごくわずかなアプリケーションを除き、ほとんどのアプリケーションは完全に自己完結しているわけではなく、外部ライブラリやフレームワークを利用して動作しています。Mesonを使用すると、外部依存関係を簡単に見つけて使用できます。以下は、zlib圧縮ライブラリを使用する方法です。

zdep = dependency('zlib', version : '>=1.2.8')
exe = executable('zlibprog', 'prog.c', dependencies : zdep)

まず、Mesonに外部ライブラリzlibを検索するように指示し、見つからない場合はエラーを出力します。versionキーワードはオプションで、依存関係のバージョン要件を指定します。次に、指定された依存関係を使用して実行可能ファイルがビルドされます。ユーザーがコンパイラフラグやリンカフラグを手動で処理したり、その他の細かいことに対応したりする必要がないことに注意してください。

複数の依存関係がある場合は、それらを配列として渡します

executable('manydeps', 'file.c', dependencies : [dep1, dep2, dep3, dep4])

依存関係がオプションの場合、依存関係が見つからない場合にMesonがエラーを出力しないように指示し、さらに構成を行うことができます。

opt_dep = dependency('somedep', required : false)
if opt_dep.found()
  # Do something.
else
  # Do something else.
endif

実際の依存関係が見つかったかどうかに関係なく、ターゲット構築関数にopt_dep変数を渡すことができます。Mesonは、見つからなかった依存関係を無視します。

Mesonでは、pkg-configファイルで定義されている変数も取得できます。これは、dep.get_pkgconfig_variable()関数を使用することで可能です。

zdep_prefix = zdep.get_pkgconfig_variable('prefix')

これらの変数は、define_variableパラメーターを渡すことによって再定義することもできます。これは、特定の状況で役立つ場合があります

zdep_prefix = zdep.get_pkgconfig_variable('libdir', define_variable: ['prefix', '/tmp'])

依存関係検出器は、pkg-configファイルを提供するすべてのライブラリで動作します。残念ながら、いくつかのパッケージはpkg-configファイルを提供していません。Mesonには、これらのいくつかに対する自動検出サポートがあり、それらはこのページの後半で説明されています。

複数の方法で見つけることができる依存関係からの任意の変数

0.51.0の新機能 0.54.0の新機能、internalキーワード

複数の方法で見つけることができる依存関係から任意の変数を取り出す必要があり、型を制約したくない場合は、汎用のget_variableメソッドを使用できます。現在、これはcmake、pkg-config、およびconfig-toolベースの変数をサポートしています。

foo_dep = dependency('foo')
var = foo_dep.get_variable(cmake : 'CMAKE_VAR', pkgconfig : 'pkg-config-var', configtool : 'get-var', default_value : 'default')

これは、「cmake」、「pkgconfig」、「pkgconfig_define」、「configtool」、「internal」、「system」、および「default_value」のキーワードを受け入れます。「pkgconfig_define」は、get_pkgconfig_variableの「define_variable」引数とまったく同じように機能します。このメソッドが呼び出されると、依存関係の基礎となる型に対応するキーワードが変数検索に使用されます。その変数が見つからない場合、または呼び出し元が依存関係の型の引数を指定しない場合は、次のいずれかが発生します。「default_value」が指定されている場合はその値が返され、「default_value」が指定されていない場合はエラーが発生します。

リソースファイルを提供する依存関係

依存関係によっては、他のプロジェクトが使用する必要があるインストール可能なファイルを提供することがあります。たとえば、wayland-protocols XMLファイルなどです。

foo_dep = dependency('foo')
foo_datadir = foo_dep.get_variable('pkgdatadir')
custom_target(
    'foo-generated.c',
    input: foo_datadir / 'prototype.xml',
    output: 'foo-generated.c',
    command: [generator, '@INPUT@', '@OUTPUT@']
)

0.63.0以降、これらは、(適切に作成された)内部依存関係からの場合でも、期待どおりに機能します。これは、取得するファイルをシステム依存関係と交換可能として扱う場合にのみ機能します。たとえば、公開ファイルのみを使用でき、依存関係が指すディレクトリを離れることは許可されていません。

独自の依存関係の宣言

システムから取得した依存関係オブジェクトと互換性のある独自の依存関係オブジェクトを宣言できます。構文は簡単です

my_inc = include_directories(...)
my_lib = static_library(...)
my_dep = declare_dependency(link_with : my_lib,
  include_directories : my_inc)

これは、指定されたインクルードディレクトリと静的ライブラリを、それを使用するすべてのターゲットに追加する依存関係を宣言します。

サブプロジェクトとしての依存関係の構築

多くのプラットフォームは、システムパッケージマネージャーを提供していません。これらのシステムでは、依存関係はソースからコンパイルする必要があります。Mesonのサブプロジェクトを使用すると、システム依存関係が利用可能な場合はシステム依存関係を使用し、利用できない場合は依存関係を手動でビルドするのが簡単になります。

これを機能させるには、依存関係にMesonビルド定義があり、次のように独自の依存関係を宣言する必要があります

    foo_dep = declare_dependency(...)

次に、それを使用するプロジェクトは、メインのmeson.buildファイルに次の宣言を記述できます。

    foo_dep = dependency('foo', fallback : ['foo', 'foo_dep'])

この宣言の意味は、まずMesonがシステムから(pkg-configを使用するなどして)依存関係を検索しようとすることです。利用できない場合は、fooという名前のサブプロジェクトをビルドし、そこから変数foo_depを抽出します。つまり、この関数の戻り値は、外部または内部の依存関係オブジェクトのいずれかです。これらは互換性があるため、残りのビルド定義では、どちらであるかを気にする必要はありません。Mesonがこの動作を可能にするために、舞台裏ですべての作業を行います。

依存関係検出方法

キーワードmethodを使用して、依存関係を検索するときに使用するメソッドをMesonに通知できます。デフォルト値はautoです。追加のメソッドはpkg-configconfig-toolcmakebuiltinsystemsysconfigqmakeextraframework、およびdubです。

cups_dep = dependency('cups', method : 'pkg-config')

特定の検出ロジックがない依存関係の場合、autoの依存関係メソッドの順序は次のとおりです。

  1. pkg-config
  2. cmake
  3. extraframework(OSXのみ)

システム

一部の依存関係は、検出に有効なメソッドを提供しないか、一部の場合にのみ提供します。この例としては、pkg-configとcmakeの両方を提供するZlibがあります。ただし、FreeBSDやmacOSのように、ベースOSイメージの一部である場合は例外です。OpenGLは、glvndまたはmesaからのUnicesではpkg-configがありますが、macOSとWindowsにはpkg-configがありません。

これらの場合、Mesonはsystem依存関係の形式で便利なラッパーを提供します。内部的には、これらの依存関係は、ユーザーがビルドシステムDSLまたはスクリプトで実行するであろうこと、おそらくcompiler.find_library()を呼び出し、link_withinclude_directoriesを設定することを正確に行います。これらをMesonアップストリームに配置することで、それらを使用する障壁が低くなります。Mesonを使用するプロジェクトは、ロジックを再実装する必要がないためです。

組み込み

一部の依存関係は、言語によって内部的に提供されるため、一部のシステムでは検出に有効なメソッドを提供しません。この例の1つはintlです。これは、GNUまたはmusl libcに組み込まれていますが、それ以外の場合はsystem依存関係として提供されます。

これらの場合、Mesonはsystem依存関係の便利なラッパーを提供しますが、まず機能がデフォルトで使用可能かどうかを確認します。

CMake

Mesonは、CMake find_package()関数を使用して、組み込みのFind<NAME>.cmakeモジュールとエクスポートされたプロジェクト構成(通常は/usr/lib/cmake内)を持つ依存関係を検出できます。Mesonは、旧式の<NAME>_LIBRARIES変数とインポートされたターゲットの両方を使用できます。

modulesプロパティで使用するCMakeターゲットのリストを手動で指定することもできます。ただし、Mesonは依存関係の名前に基づいて適切なターゲットを自動的に推測しようとするため、この手順はオプションです。

依存関係によっては、Mesonが自動的に推測できない場合に、modulesプロパティを使用してCMakeターゲットを明示的に指定する必要がある場合があります。

    cmake_dep = dependency('ZLIB', method : 'cmake', modules : ['ZLIB::ZLIB'])

CMake find_packageルックアップに追加のCOMPONENTSを追加するためのサポートは、components kwarg(0.54.0で導入)で提供されます。指定されたすべてのコンポーネントは、find_package(COMPONENTS)に直接渡されます。

CMake find_packageを成功させるために特定のバージョンが必要なパッケージのサポートは、cmake_package_version kwarg(0.57.0で導入)で提供されます。指定されたcmake_package_versionは、find_packageの2番目のパラメーターとして直接渡されます。

既存のFind<name>.cmakeファイルをcmake_module_pathプロパティ(0.50.0以降)で再利用することも可能です。このプロパティを使用することは、CMakeでCMAKE_MODULE_PATH変数を設定することと同等です。cmake_module_pathに指定されたパスはすべて、プロジェクトソースディレクトリからの相対パスである必要があります。CMakeファイルがプロジェクト自体に保存されていない場合にのみ、絶対パスを使用する必要があります。

追加のCMakeパラメーターは、cmake_argsプロパティ(0.50.0以降)で指定できます。

Dub

MesonはローカルDubリポジトリに存在する依存関係のみを検索できることに注意してください。ターゲットの依存関係を手動でフェッチしてビルドする必要があります。

urldの場合。

dub fetch urld
dub build urld

その他、注意する必要があるのは、MesonとDubの両方が同じコンパイラを使用している必要があるということです。これは、Dubの-compiler引数を使用するか、Mesonの実行時にDC環境変数を手動で設定することで実現できます。

dub build urld --compiler=dmd
DC="dmd" meson setup builddir

Config tool

CUPSLLVMObjFWpcapWxWidgetslibwmfGCryptGPGME、およびGnuStepは、pkg-configモジュールを提供していないか、configツール(cups-config、llvm-config、libgcrypt-configなど)を介して追加で検出できます。Mesonにはこれらのツールに対するネイティブサポートがあり、他の依存関係と同様に見つけることができます

pcap_dep = dependency('pcap', version : '>=1.0')
cups_dep = dependency('cups', version : '>=1.4')
llvm_dep = dependency('llvm', version : '>=4.0')
libgcrypt_dep = dependency('libgcrypt', version: '>= 1.8')
gpgme_dep = dependency('gpgme', version: '>= 1.0')
objfw_dep = dependency('objfw', version: '>= 1.0')

0.55.0以降、クロスコンパイル時にconfigツールがクロスファイルにエントリがない場合、Mesonはconfigツールバイナリを$PATHで検索しなくなります。

カスタムルックアップ機能を持つ依存関係

一部の依存関係には、特定の検出ロジックがあります。

一般的な依存関係名は1で大文字と小文字が区別されますが、これらの依存関係名は、大文字と小文字を区別せずに一致します。推奨されるスタイルは、すべて小文字で記述することです。

場合によっては、複数の検出方法が存在し、methodキーワードを使用して使用する検出方法を選択できます。autoメソッドは、Mesonが最適と考える順序でチェックメカニズムを使用します。

たとえば、libwmfとCUPSはpkg-configとconfig-toolの両方のサポートを提供します。methodキーワードを使用して、一方または他方を強制できます

cups_dep = dependency('cups', method : 'pkg-config')
wmf_dep = dependency('libwmf', method : 'config-tool')

AppleFrameworks

必要なフレームワークを一覧表示するには、modulesキーワードを使用します。例:

dep = dependency('appleframeworks', modules : 'foundation')

これらの依存関係は、OSX以外のホストでは見つかりません。

ブロック

Clang の blocks 拡張機能のサポートを有効にします。

dep = dependency('blocks')

(0.52.0 で追加)

Boost

Boost は単一の依存関係ではなく、異なるライブラリのグループです。Boost のヘッダーのみのライブラリを使用するには、単に Boost を依存関係として追加してください。

boost_dep = dependency('boost')
exe = executable('myprog', 'file.cc', dependencies : boost_dep)

Meson で Boost に対してリンクするには、使用したいライブラリをリストアップするだけです。

boost_dep = dependency('boost', modules : ['thread', 'utility'])
exe = executable('myprog', 'file.cc', dependencies : boost_dep)

dependency() を異なるモジュールで複数回呼び出し、それらを使用してターゲットにリンクできます。

Boost のヘッダーまたはライブラリが標準以外の場所にある場合は、BOOST_ROOT、または BOOST_INCLUDEDIR および BOOST_LIBRARYDIR 環境変数を設定できます。(0.56.0 で追加) これらのパラメーターは、ネイティブまたはクロスコンパイルのマシンファイルで boost_rootboost_includedirboost_librarydir として設定することもできます。マシンファイルの変数は環境変数よりも優先され、これらのいずれかを指定すると、システム全体での Boost の検索が無効になることに注意してください。

引数 threadingsingle に設定すると、シングルスレッドで使用するためにコンパイルされた Boost ライブラリを使用できます。

CUDA

(0.53.0 で追加)

CUDA Toolkit に対してコンパイルおよびリンクを有効にします。version および modules キーワードを渡して、特定の CUDA Toolkit バージョンや、対応する追加の CUDA ライブラリの使用を要求できます。

dep = dependency('cuda', version : '>=10', modules : ['cublas'])

この依存関係を明示的に追加する必要があるのは、C/C++ ファイルまたはプロジェクトから CUDA Toolkit を使用している場合、または明示的にリンクする必要がある追加のツールキットライブラリを利用している場合のみであることに注意してください。システムのデフォルトパスで CUDA Toolkit が見つからない場合は、CUDA_PATH を使用してパスを明示的に設定できます。

CUPS

method は、autoconfig-toolpkg-configcmake、または extraframework のいずれかです。

Curses

(0.54.0 以降)

Curses (および ncurses) は、クロスプラットフォームで厄介なものです。Meson は、これらの依存関係を curses 依存関係にラップします。これは、ncurses (推奨) とその他の curses 実装の両方をカバーします。

method は、autopkg-configconfig-tool、または system のいずれかです。

0.56.0 の新機能 config-tool および system メソッド。

curses autoconf ドキュメントで言及されているプリプロセッサシンボルのいくつかを定義するには

conf = configuration_data()
check_headers = [
  ['ncursesw/menu.h', 'HAVE_NCURSESW_MENU_H'],
  ['ncurses/menu.h', 'HAVE_NCURSES_MENU_H'],
  ['menu.h', 'HAVE_MENU_H'],
  ['ncursesw/curses.h', 'HAVE_NCURSESW_CURSES_H'],
  ['ncursesw.h', 'HAVE_NCURSESW_H'],
  ['ncurses/curses.h', 'HAVE_NCURSES_CURSES_H'],
  ['ncurses.h', 'HAVE_NCURSES_H'],
  ['curses.h', 'HAVE_CURSES_H'],
]

foreach h : check_headers
  if compiler.has_header(h.get(0))
    conf.set(h.get(1), 1)
  endif
endforeach

dl (libdl)

(0.62.0 で追加)

動的リンクインターフェース (関数: dlopen、dlclose、dlsym など) へのアクセスを提供します。これが libc に組み込まれていないシステム (主に glibc < 2.34) では、代わりにそれらを提供する外部ライブラリを見つけようとします。

method は、autobuiltin、または system のいずれかです。

Fortran Coarrays

(0.50.0 で追加)

Coarray は Fortran 言語の組み込み機能であり、dependency('coarray') によって有効になります。

GCC は、存在する場合は OpenCoarrays を使用して coarray を実装しますが、Intel と NAG は内部の coarray サポートを使用します。

GPGME

(0.51.0 で追加)

method は、autoconfig-tool、または pkg-config のいずれかです。

GL

これは、プラットフォームに適した方法で OpenGL ライブラリを検索します。

method は、autopkg-config、または system のいずれかです。

GTest および GMock

GTest および GMock は、プロジェクトの一部としてコンパイルする必要があるソースとして提供されます。Meson では、詳細を気にする必要はありません。単に gtest または gmockdependency に渡すだけで、すべてが実行されます。GMock を使用する場合は、スタンドアロンで動作させるのが難しいので、GTest も使用することをお勧めします。

main キーワード引数を true に設定すると、GTest によって提供される main() 関数を使用できます。

gtest_dep = dependency('gtest', main : true, required : false)
e = executable('testprog', 'test.cc', dependencies : gtest_dep)
test('gtest test', e)

HDF5

(0.50.0 で追加)

HDF5 は C、C++、および Fortran でサポートされています。依存関係は言語固有であるため、language キーワード引数を使用して、要求された言語を指定する必要があります。つまり、

  • C HDF5 ヘッダーとライブラリの場合は dependency('hdf5', language: 'c')
  • C++ HDF5 ヘッダーとライブラリの場合は dependency('hdf5', language: 'cpp')
  • Fortran HDF5 ヘッダーとライブラリの場合は dependency('hdf5', language: 'fortran')

標準のローレベル HDF5 関数と、HL ハイレベル HDF5 関数が各言語に対してリンクされます。

method は、autoconfig-tool、または pkg-config のいずれかです。

0.56.0 の新機能 config-tool メソッド。0.56.0 の新機能 依存関係は適切な依存関係型を返し、get_variable および同様のメソッドは期待どおりに動作するようになりました。

iconv

(0.60.0 で追加)

iconv ファミリの C 関数へのアクセスを提供します。これが libc に組み込まれていないシステムでは、代わりにそれらを提供する外部ライブラリを見つけようとします。

method は、autobuiltin、または system のいずれかです。

intl

(0.59.0 で追加)

*gettext ファミリの C 関数へのアクセスを提供します。これが libc に組み込まれていないシステムでは、代わりにそれらを提供する外部ライブラリを見つけようとします。

method は、autobuiltin、または system のいずれかです。

JDK

(0.58.0 で追加) (0.62.0 で非推奨)

JNI の非推奨名。dependency('jni') の代わりに dependency('jdk')

JNI

(0.62.0 で追加)

modules は、jvm および awt のいずれかを含む文字列のオプションリストです。

Java Native Interface (JNI) を使用したコンパイルへのアクセスを提供します。検索では、まず環境で JAVA_HOME が設定されているかどうかを確認し、設定されていない場合は javac の解決されたパスを使用します。システムは通常、推奨される JDK を、たとえば Linux では /usr/bin/javac のような既知のパスにリンクします。JAVA_HOME または解決された javac からのパスを使用して、この依存関係は、JDK インストールの include ディレクトリとそのプラットフォーム依存のサブディレクトリをコンパイラのインクルードパスに配置します。modules が空でない場合、適切なリンカー引数も追加されます。

dep = dependency('jni', version: '>= 1.8.0', modules: ['jvm'])

注意: 解決されたパスの使用により、JDK をアップグレードすると、さまざまなパスが見つからなくなる可能性があります。その場合は、ビルドディレクトリを再構成してください。1 つの回避策は、フォールバックの javac 解決パスの動作に依存する代わりに、JAVA_HOME を明示的に設定することです。

注意: インクルードパスは、linuxwindowsdarwin、および sunos 以外のプラットフォームでは壊れている可能性があります。この場合は、PR を提出するか、問題をオープンしてください。

注意: システムが x86_64 以外の場合、JDK <= 1.8 での modules 引数の使用は壊れている可能性があります。この場合は、PR を提出するか、問題をオープンしてください。

libgcrypt

(0.49.0 で追加)

method は、autoconfig-tool、または pkg-config のいずれかです。

libwmf

(0.44.0 で追加)

method は、autoconfig-tool、または pkg-config のいずれかです。

LLVM

Meson は、LLVM バージョン 3.5 以降の LLVM をネイティブにサポートしています。他の config-tool ベースの依存関係と比較して、いくつかの追加機能をサポートしています。

0.44.0 以降、Meson は LLVM の static キーワード引数をサポートしています。これより前の LLVM >= 3.9 は常に動的にリンクし、古いバージョンは llvm-config の癖のために静的にリンクしていました。

method は、autoconfig-tool、または cmake のいずれかです。

モジュール、別名コンポーネント

Meson は、LLVM のコンポーネントの概念を独自のモジュール概念にラップします。特定のコンポーネントが必要な場合は、モジュールとして追加すると、Meson が適切な処理を行います。

llvm_dep = dependency('llvm', version : '>= 4.0', modules : ['amdgpu'])

0.44.0 以降、オプションのモジュールも使用できます (これらは静的リンク用に生成される引数に影響します)。

llvm_dep = dependency(
  'llvm', version : '>= 4.0', modules : ['amdgpu'], optional_modules : ['inteljitevents'],
)

LLVM ツールの使用

LLVM をライブラリとして使用するだけでなく、そのツールも必要とする場合、同じバージョンを使用することがしばしば有益です。これは、find_program()version 引数で部分的に実現できます。ただし、ディストリビューションは異なる LLVM バージョンをかなり異なる方法でパッケージ化する傾向があります。したがって、LLVM の依存関係を直接使用してツールを取得する方が良い場合が多くあります。

llvm_dep = dependency('llvm', version : ['>= 8', '< 9'])
llvm_link = find_program(llvm_dep.get_variable(configtool: 'bindir') / 'llvm-link')

MPI

(0.42.0 で追加)

MPI は C、C++、および Fortran でサポートされています。依存関係は言語固有であるため、language キーワード引数を使用して、要求された言語を指定する必要があります。つまり、

  • C MPI ヘッダーとライブラリの場合は dependency('mpi', language: 'c')
  • C++ MPI ヘッダーとライブラリの場合は dependency('mpi', language: 'cpp')
  • Fortran MPI ヘッダーとライブラリの場合は dependency('mpi', language: 'fortran')

Meson は MPI に pkg-config を優先しますが、MPI 実装がそれらを提供しない場合は、標準のラッパー実行可能ファイル (mpicmpicxxmpic++mpifortmpif90mpif77) を検索します。これらがパスにない場合は、構成中に標準環境変数 MPICCMPICXXMPIFCMPIF90、または MPIF77 を設定して指定できます。また、system メソッドを介して Windows 上の Microsoft 実装を使用しようとします。

method は、autoconfig-toolpkg-config、または system のいずれかです。

0.54.0 の新機能 config-tool および system メソッドの値。以前のバージョンでは、常に pkg-configconfig-toolsystem の順に試していました。

NetCDF

(0.50.0 で追加)

NetCDF は C、C++、および Fortran でサポートされています。NetCDF の依存関係は言語固有であるため、language キーワード引数を使用して、要求された言語を指定する必要があります。つまり、

  • C NetCDF ヘッダーとライブラリの場合は dependency('netcdf', language: 'c')
  • C++ NetCDF ヘッダーとライブラリの場合は dependency('netcdf', language: 'cpp')
  • Fortran NetCDF ヘッダーとライブラリの場合は dependency('netcdf', language: 'fortran')

Meson は pkg-config を使用して NetCDF を検索します。

ObjFW

(1.5.0 で追加)

Meson は、ObjFW パッケージのサポートを含め、ObjFW をネイティブにサポートしています。

ObjFW を使用するには、単に依存関係を作成します。

objfw_dep = dependency('objfw')

ObjFW パッケージも使用するには、単にモジュールとして指定します。

objfw_dep = dependency('objfw', modules: ['SomePackage'])

テストで ObjFWTest を使用したいが、アプリケーションをテストに対してリンクしたくないなど、パッケージの有無にかかわらず依存関係が必要な場合は、2 つの依存関係を取得して、適切に使用します。

objfw_dep = dependency('objfw', modules: ['SomePackage'])
objfwtest_dep = dependency('objfw', modules: ['ObjFWTest'])

次に、ライブラリには objfw_dep を使用し、テストには objfwtest_dep (両方ではなく) のみを使用します。

OpenMP

(0.46.0 で追加)

この依存関係は、OpenMP サポートに使用する適切なコンパイラフラグやライブラリを選択します。

language キーワードを使用できます。

OpenSSL

(0.62.0 で追加)

method は、autopkg-configsystem、または cmake のいずれかです。

NumPy

(1.4.0で追加)

methodauto, pkg-config, または config-tool を指定できます。dependency('numpy') は、NumPy C APIの通常の使用をサポートします。Fortranコードをバインドするための numpy.f2py の使用はまだサポートされていません。

pcap

(0.42.0 で追加)

method は、autoconfig-tool、または pkg-config のいずれかです。

Pybind11

(1.1.0で追加)

methodauto, pkg-config, config-tool, または cmake を指定できます。

Python3

Python3 は Meson によって特別に処理されます。

  1. Meson は pkg-config を使用しようとします。
  2. pkg-config が失敗した場合、Meson はフォールバックを使用します。
    • Windows では、フォールバックは現在の python3 インタープリターです。
    • OSX では、フォールバックは /Library/Frameworks のフレームワーク依存関係です。

この依存関係で見つかった python3 は、モジュールが現在のインタープリターを使用するため、python3 モジュールで使用されるものと異なる場合があることに注意してください。ただし、依存関係は最初に pkg-config を試みます。

methodauto, extraframework, pkg-config または sysconfig を指定できます。

Qt

Meson はネイティブな Qt サポートを備えています。その使用方法は、例で説明するのが最適です。

qt5_mod = import('qt5')
qt5widgets = dependency('qt5', modules : 'Widgets')

processed = qt5_mod.preprocess(
  moc_headers : 'mainWindow.h',   # Only headers that need moc should be put here
  moc_sources : 'helperFile.cpp', # must have #include"moc_helperFile.cpp"
  ui_files    : 'mainWindow.ui',
  qresources  : 'resources.qrc',
)

q5exe = executable('qt5test',
  sources     : ['main.cpp',
                 'mainWindow.cpp',
                 processed],
  dependencies: qt5widgets)

ここでは、Qt Designer で作成された UI ファイルと、moc ツールでプリプロセスが必要なソースファイルとヘッダーファイルがそれぞれ1つずつあります。また、rcc でコンパイルされるリソースファイルも定義します。Meson にどのファイルがどれであるかを伝えるだけで、必要なすべてのツールを正しい順序で起動する処理を自動的に行います。これは、qt5 モジュールの preprocess メソッドで実行されます。その出力は、ターゲットのソースリストに単純に追加されます。dependencymodules キーワードは、Boost の場合と同様に機能します。これは、プログラムが使用する Qt のサブパーツを指示します。

main キーワード引数を true に設定すると、qtmain スタティックライブラリによって提供される WinMain() 関数を使用します (この引数は、Windows以外のプラットフォームでは何もしません)。

オプションの private_headers キーワードを true に設定すると、指定されたモジュールのプライベートヘッダーのインクルードパスがコンパイラーフラグに追加されます。(v0.47.0以降)

注意 プロジェクトでプライベートヘッダーを使用することは悪い考えです。自己責任で行ってください。

methodauto, pkg-config または qmake を指定できます。

SDL2

SDL2 は、pkg-configsdl2-config config ツール、OSX フレームワーク、または cmake を使用して検出できます。

methodauto, config-tool, extraframework, pkg-config または cmake を指定できます。

Shaderc

(0.51.0 で追加)

Meson は最初に pkg-config を使用して shaderc を見つけようとします。アップストリームは現在、3つの異なる pkg-config ファイルを出荷しており、デフォルトでは、shadercshaderc_combined、および shaderc_static の順序でチェックします。static キーワード引数が true の場合、Meson は代わりに shaderc_combined, shaderc_static, shaderc の順序でチェックします。

pkg-config ファイルが見つからない場合、Meson はライブラリを手動で検出しようとします。この場合、-lshaderc_shared または -lshaderc_combined のいずれかとリンクしようとします。static キーワード引数が true の場合は後者を優先します。この方法では、shaderc のバージョンを取得することはできないことに注意してください。

method は、autopkg-config、または system のいずれかです。

Threads

この依存関係は、スレッドサポートに使用する適切なコンパイラーフラグおよび/またはライブラリを選択します。

threads を参照してください。

Valgrind

Meson は pkg-config を使用して valgrind を検出しますが、コンパイルフラグのみを使用し、PIC ではないスタティックライブラリとのリンクは試行しません。

Vulkan

(0.42.0 で追加)

Vulkan は、pkg-config、または VULKAN_SDK 環境変数を使用して検出できます。

method は、autopkg-config、または system のいずれかです。

WxWidgets

Boost と同様に、WxWidgets は単一のライブラリではなく、モジュールのコレクションです。WxWidgets は wx-config を介してサポートされています。Meson は moduleswx-config の呼び出しに置き換え、次を生成します。

  • wx-config --cxxflags $modules... を使用して compile_args を生成
  • wx-config --libs $modules... を使用して link_args を生成

wx_dep = dependency(
  'wxwidgets', version : '>=3.0.0', modules : ['std', 'stc'],
)
# compile_args:
$ wx-config --cxxflags std stc

# link_args:
$ wx-config --libs std stc

Zlib

Zlib は pkg-config と cmake のサポートを備えていますが、一部のオペレーティングシステム(windows, macOs, FreeBSD, dragonflybsd, android)では、pkg-config サポートなしでベースオペレーティングシステムの一部として提供されています。新しい System ファインダーは、これらのOSでバンドルされたバージョンとリンクするために使用できます。

methodauto, pkg-config, cmake, または system を指定できます。

0.54.0 で新機能 system メソッド。

DIA SDK

(1.6.0で追加)

Microsoft の Debug Interface Access SDK (DIA SDK) は、Windows 上で、Microsoft Visual Studio の msvc、clang-cl、または clang コンパイラーを使用している場合にのみ利用できます。

DIA SDK ランタイムは、ターゲットに静的にリンクされていません。デフォルトの使用方法では、ランタイム DLL (msdiaXXX.dll) を regsrv32.exe コマンドで OS に手動で登録する必要があります。これにより、CoCreateInstance Windows 関数を使用してロードできます。

または、Meson を使用して DIA ランタイム DLL をビルドディレクトリにコピーし、DIA SDK によって提供される NoRegCoCreate 関数を使用して動的にロードすることもできます。これを容易にするために、依存関係の変数 'dll' から DLL パスを読み取り、fs モジュールを使用してコピーできます。例

dia = dependency('diasdk', required: true)
fs = import('fs')
fs.copyfile(dia.get_variable('dll'))

conf = configuration_data()
conf.set('msdia_dll_name', fs.name(dia_dll_name))

メジャーバージョンのみが利用可能です(例:msdia140.dll の場合、バージョンは 14 です)。


1: 基盤となるファイルシステムが大文字と小文字を区別しない場合は、大文字と小文字を区別しないように見える場合があります。

検索結果は