コンテンツにスキップ

「Meson パッケージガイドライン」の版間の差分

提供: ArchWiki
削除された内容 追加された内容
Kgx (トーク | 投稿記録)
Kgx (トーク | 投稿記録)
 
(同じ利用者による、間の5版が非表示)
14行目: 14行目:
このドキュメントは [https://mesonbuild.com/ Meson] を使うソフトウェアのための [[PKGBUILD]] を書くための標準ガイドラインを扱っています。
このドキュメントは [https://mesonbuild.com/ Meson] を使うソフトウェアのための [[PKGBUILD]] を書くための標準ガイドラインを扱っています。


== Usage ==
== 使い方 ==


=== 必要条件 ===
=== 必要条件 ===


{{Pkg|meson}} は [[PKGBUILD]] の [[PKGBUILD#makedepends|makedepends]] の配列に含まれなければなりません
{{Pkg|meson}} は [[PKGBUILD]] の [[PKGBUILD#makedepends|makedepends]] の配列に含める必要がありま

makedepends=(meson ''other_deps'')

=== prepare() ===

Meson にはサブプロジェクトを管理するためのユーティリティがあり、すべてのサブプロジェクトを事前にダウンロードできます。このコマンドを prepare() ステージで実行することで、build() やその他のステージを完全にオフラインで実行できるようになります。

例:

prepare() {
meson subprojects download --sourcedir=''source''
}

{{Note|この手順は、プロジェクトにダウンロード可能なサブプロジェクトが含まれている場合にのみ必要であり、これらがシステムライブラリのフォールバックとして提供されるだけの場合は不要です。}}


=== build() ===
=== build() ===


設定とビルドは通常 [[#Meson バイナリを直接使用する|''meson'' バイナリを使]] すが、[[#arch-meson ラッパースクリプトの使用|Arch Linux ''arch-meson'' ラッパースクリプトを使う]] ことによっても行うことができます。
設定とビルドは通常 [[#Meson バイナリを直接使用する|''meson'' バイナリを使]] すが、[[#arch-meson ラッパースクリプトの使用|Arch Linux ''arch-meson'' ラッパースクリプトを使う]] ことによっても行うことができます。


''meson'' と ''arch-meson'' コマンドはどちらも '''options''' と '''source directory''' と '''build directory''' を使用法のシンタックスに含んでいます。
''meson'' と ''arch-meson'' コマンドはどちらも '''options''' と '''source directory''' と '''build directory''' を使用法のシンタックスに含んでいます。


* '''オプション'''少なくとも {{ic|--prefix /usr}} を含める必要がありますが、その他のオプションは {{ic|meson configure --help}} で確認してください。また [[#ソフトウェア固有の構築オプションの設定|ソフトウェア固有の構築オプション]] も確認してください。
* '''オプション''': 少なくとも {{ic|--prefix /usr}} を含める必要がありますが、その他のオプションは {{ic|meson configure --help}} で確認してください。また [[#ソフトウェア固有の構築オプションの設定|ソフトウェア固有の構築オプション]] も確認してください。
* '''ソースディレクトリ''' (または "sourcedir"): ソフトウェアのソースコードが格納されている場所です。例えば {{ic|.}}, {{ic|$pkgname}} または {{ic|$pkgname-$pkgver}} などです。
* '''ソースディレクトリ''' (または "sourcedir"): ソフトウェアのソースコードが格納されている場所です。例えば {{ic|.}}, {{ic|$pkgname}} または {{ic|$pkgname-$pkgver}} などです。
* 一般的には {{ic|build}} または {{ic|_build}} という名前ですが、任意で指定できます。
* 一般的には {{ic|build}} または {{ic|_build}} という名前ですが、任意で指定できます。
38行目: 52行目:
==== arch-meson ラッパースクリプトの使用 ====
==== arch-meson ラッパースクリプトの使用 ====


''arch-meson'' は {{Pkg|meson}} パッケージに含まれるラッパースクリプトで、Arch パッケージで使われるであろう Meson 組み込みのオプションのいくつかを設定し、パッケージ製作者の時間と PKGBUILD のコードを節約する利点があります。''arch-meson'' に書かれている説明を引用すると、''Highly opinionated wrapper for Arch Linux packaging''(Arch Linux のパッケージングのための高度なラッパーです。
''arch-meson'' は {{Pkg|meson}} パッケージに含まれるラッパースクリプトで、Arch パッケージで使われるであろう Meson 組み込みのオプションのいくつかを設定し、パッケージ製作者の時間と PKGBUILD のコードを節約する利点があります。''arch-meson'' に書かれている説明を引用すると、''Highly opinionated wrapper for Arch Linux packaging'' (Arch Linux のパッケージングのための高度なラッパー) です。


例:
例:
59行目: 73行目:
}}
}}


したがって、そのドキュメントを構築するためには、Meson を実行する必要があります。 {{ic|1=-D gtk_doc=true}} build オプションを指定する、コマンドラインは次のようになります。
したがって、そのドキュメントを構築するためには、Meson を実行する必要があります。{{ic|1=-D gtk_doc=true}} build オプションを指定する場合、コマンドラインは次のようになります。


arch-meson $pkgname-$pkgver build -Dgtk_doc=true
arch-meson $pkgname-$pkgver build -Dgtk_doc=true
67行目: 81行目:
パッケージ化されるソフトウェアがテストスイートを提供しているなら、PKGBUILD の [[パッケージの作成#関数 check()|check()]] 関数で実行することを検討してください。これは {{ic|meson test}} コマンドで実行することができます。
パッケージ化されるソフトウェアがテストスイートを提供しているなら、PKGBUILD の [[パッケージの作成#関数 check()|check()]] 関数で実行することを検討してください。これは {{ic|meson test}} コマンドで実行することができます。


:


check() {
check() {
75行目: 89行目:
ここで {{ic|''build''}} は、上記の [[#build()]] ステップで使用したものと同じビルドディレクトリ名です。
ここで {{ic|''build''}} は、上記の [[#build()]] ステップで使用したものと同じビルドディレクトリ名です。


{{Tip|{{ic|--print-errorlogs}} パラメーターを {{ic|meson test}} に追加することで、失敗したテストによって生成された出力や環境変数などの有益な情報をレポートできます。}}
{{Tip|
* 代わりに {{ic|ninja test -C ''build''}} を直接使用することができます。
* 失敗したテストによって生成された出力を、環境変数として他の有用な情報と共に報告するために、 {{ic|--print-errorlogs}} パラメータを {{ic|meson test}} に追加することができます。
}}


詳細については {{ic|meson test --help}} と [https://mesonbuild.com/Unit-tests.html Unit tests in Meson docs] を参照してください。
詳細については {{ic|meson test --help}} と [https://mesonbuild.com/Unit-tests.html Unit tests in Meson docs] を参照してください。
84行目: 95行目:
=== package() ===
=== package() ===


パッケージングには通常 {{ic|meson install}} のみの実行が必要ですが、他のインストールコマンドが必要な場合は確認してください例えば [[PKGBUILD#license|uncommon license]] など上記と同じビルドディレクトリを使い、{{ic|--destdir}} フラグをセットしてください。
パッケージングには通常 {{ic|meson install}} のみの実行が必要ですが、他のインストールコマンドが必要な場合は確認してください(例えば [[PKGBUILD#license|uncommon license]] など)上記と同じビルドディレクトリを使い、{{ic|--destdir}} フラグをセットしてください。


package() {
package() {
92行目: 103行目:
{{Note|{{ic|1=DESTDIR="$pkgdir"}} を追加することも有効です。{{ic|--destdir}} の代わりです [https://mesonbuild.com/Release-notes-for-0-57-0.html#specify-destdir-on-command-line]}}
{{Note|{{ic|1=DESTDIR="$pkgdir"}} を追加することも有効です。{{ic|--destdir}} の代わりです [https://mesonbuild.com/Release-notes-for-0-57-0.html#specify-destdir-on-command-line]}}


== トラブルシューティング ==
{{Tip|{{ic|ninja install -C ''build''}} の代わりに直接使用することができます。}}

=== ERROR: Function does not take positional arguments ===

エラー出力の例:

data/meson.build:21:5: ERROR: Function does not take positional arguments.

Meson 0.60 以降、位置引数の使用が警告からエラーに昇格したエラーが存在します。このエラーのよくある例の 1 つは、無効な引数を i18n.merge_file() に追加することです。たとえば、{{Pkg|aisleriot}} には次のものが含まれていました。

i18n.merge_file(
'sol.metainfo.xml',
input: desktop_in,
output: '@BASENAME@',
type: 'desktop',
po_dir: po_dir,
install: true,
install_dir: desktopdatadir,
)

ここで、{{ic|'sol.metainfo.xml'}} は現在無効な引数であり、削除する必要があります。アップストリームに適用された修正については、[https://gitlab.gnome.org/GNOME/aisleriot/-/commit/4bf6fcf5c8043adfcadd948e678cc68f150cc998 this commit] を参照してください。

この場合に取るべき措置は次のとおりです。

# エラーで報告された meson.build にパッチを適用してビルドを修正し、更新された PKGBUILD を公開します。
# パッチを使用してアップストリームリポジトリに貢献して、全員が修正できるようにし、次のバージョンでソース配列にパッチが含まれないようにします。


== テンプレート ==
== テンプレート ==


上の説明をまとめ、コピーペーストのワンポイントを提供するめに、以下のテンプレートをご覧ください
手順をまとめ、コピー&ペースト一箇所にまとめたテンプレートは以下をご覧ください:


{{bc|1=
{{bc|1=
107行目: 143行目:


check() {
check() {
meson test -C build
meson test -C build --print-errorlogs
}
}


117行目: 153行目:
== サンプルパッケージ ==
== サンプルパッケージ ==


これは、Meson を使用するパッケージの小さなリストです。{{Pkg|meson}} の ''必要とするパッケージ'' のリストにある他のパッケージも参照してください。
これは、Meson を使用するパッケージの小さなリストです。{{Pkg|meson}} の "必要とするパッケージ" のリストにある他のパッケージも参照してください。


* {{Pkg|gstreamer}}
* {{Pkg|gstreamer}}

2025年2月10日 (月) 01:44時点における最新版

Meson 公式サイトより。

Meson はオープンソースのビルドシステムで、非常に高速で、さらに重要なことに、可能な限りユーザーフレンドリーであることを意図しています。

Python で書かれた Meson は、マルチプラットフォームのサポート、複数のプログラミング言語のサポート、クロスコンパイルなどを特徴としています。

Meson はソフトウェアを直接ビルドするのではなく、バックエンドのビルドシステムをセットアップします。一般的には ninja と共に使われますが、他のビルドシステムを使うこともできます。一般的には、GNU ビルドシステム を置き換えるために使われます。

このドキュメントは Meson を使うソフトウェアのための PKGBUILD を書くための標準ガイドラインを扱っています。

使い方

必要条件

mesonPKGBUILDmakedepends の配列に含める必要があります。

makedepends=(meson other_deps)

prepare()

Meson にはサブプロジェクトを管理するためのユーティリティがあり、すべてのサブプロジェクトを事前にダウンロードできます。このコマンドを prepare() ステージで実行することで、build() やその他のステージを完全にオフラインで実行できるようになります。

例:

prepare() {
  meson subprojects download --sourcedir=source
}
ノート この手順は、プロジェクトにダウンロード可能なサブプロジェクトが含まれている場合にのみ必要であり、これらがシステムライブラリのフォールバックとして提供されるだけの場合は不要です。

build()

設定とビルドは通常 meson バイナリを使い ますが、Arch Linux arch-meson ラッパースクリプトを使う ことによっても行うことができます。

mesonarch-meson コマンドはどちらも optionssource directorybuild directory を使用法のシンタックスに含んでいます。

  • オプション: 少なくとも --prefix /usr を含める必要がありますが、その他のオプションは meson configure --help で確認してください。また ソフトウェア固有の構築オプション も確認してください。
  • ソースディレクトリ (または "sourcedir"): ソフトウェアのソースコードが格納されている場所です。例えば ., $pkgname または $pkgname-$pkgver などです。
  • 一般的には build または _build という名前ですが、任意で指定できます。
ノート ソースディレクトリがビルドディレクトリの前に meson に渡される場合と、その逆の場合がありますが、Meson はどちらがどちらかを知っていて適切に環境をセットアップするので問題ありません。

meson バイナリを直接使用する場合

Arch Linux のパッケージはファイルを /usr/local にインストールしてはいけないため、--prefix=/usr は常に meson のバイナリに渡す必要があります、これは Arch パッケージガイドライン#パッケージエチケット に従っています。--buildtype=plain 組み込みのオプションは、あなたが何をしているかを知っていれば、他の値を設定することができます。

arch-meson ラッパースクリプトの使用

arch-mesonmeson パッケージに含まれるラッパースクリプトで、Arch パッケージで使われるであろう Meson 組み込みのオプションのいくつかを設定し、パッケージ製作者の時間と PKGBUILD のコードを節約する利点があります。arch-meson に書かれている説明を引用すると、Highly opinionated wrapper for Arch Linux packaging (Arch Linux のパッケージングのための高度なラッパー) です。

例:

build() {
  arch-meson source build
  meson compile -C build
}

ソフトウェア固有のビルドオプションを設定する

Meson にはいくつかの 組み込みビルドオプション (たとえば --prefix) がありますが、パッケージ化されるソフトウェアには、パッケージャーが考慮すべき、他の ビルドオプション があるかもしれません。有効なソフトウェア固有のビルドオプションは、通常 meson_options.txt という名前のファイルに書かれています。(存在する場合) と meson.build にあります。これらのファイルで option(settings) を探し、settings を読みます。

ソフトウェア固有のビルドオプションを使用するには、-D key=value という記法を使います。ここで key はプロジェクトで設定したビルドオプション名、 value は例えば true などの有効な値です。

例えば、gtranslator は以下のようなビルドオプションを持っています。

meson_options.txt
option('gtk_doc', type: 'boolean', value: false, description: 'use gtk-doc to build documentation')

したがって、そのドキュメントを構築するためには、Meson を実行する必要があります。-D gtk_doc=true build オプションを指定する場合、コマンドラインは次のようになります。

arch-meson $pkgname-$pkgver build -Dgtk_doc=true

check()

パッケージ化されるソフトウェアがテストスイートを提供しているなら、PKGBUILD の check() 関数で実行することを検討してください。これは meson test コマンドで実行することができます。

例:

check() {
  meson test -C build
}

ここで build は、上記の #build() ステップで使用したものと同じビルドディレクトリ名です。

ヒント --print-errorlogs パラメーターを meson test に追加することで、失敗したテストによって生成された出力や環境変数などの有益な情報をレポートできます。

詳細については meson test --helpUnit tests in Meson docs を参照してください。

package()

パッケージングには通常 meson install のみの実行が必要ですが、他のインストールコマンドが必要な場合は確認してください(例えば uncommon license など)上記と同じビルドディレクトリを使い、--destdir フラグをセットしてください。

package() {
  meson install -C build --destdir "$pkgdir"
}
ノート DESTDIR="$pkgdir" を追加することも有効です。--destdir の代わりです [1]

トラブルシューティング

ERROR: Function does not take positional arguments

エラー出力の例:

 data/meson.build:21:5: ERROR: Function does not take positional arguments.

Meson 0.60 以降、位置引数の使用が警告からエラーに昇格したエラーが存在します。このエラーのよくある例の 1 つは、無効な引数を i18n.merge_file() に追加することです。たとえば、aisleriot には次のものが含まれていました。

i18n.merge_file(
  'sol.metainfo.xml',
  input: desktop_in,
  output: '@BASENAME@',
  type: 'desktop',
  po_dir: po_dir,
  install: true,
  install_dir: desktopdatadir,
)

ここで、'sol.metainfo.xml' は現在無効な引数であり、削除する必要があります。アップストリームに適用された修正については、this commit を参照してください。

この場合に取るべき措置は次のとおりです。

  1. エラーで報告された meson.build にパッチを適用してビルドを修正し、更新された PKGBUILD を公開します。
  2. パッチを使用してアップストリームリポジトリに貢献して、全員が修正できるようにし、次のバージョンでソース配列にパッチが含まれないようにします。

テンプレート

上記の手順をまとめ、コピー&ペースト用の一箇所にまとめたテンプレートは以下をご覧ください:

makedepends=(meson)

build() {
  arch-meson $pkgname-$pkgver build
  meson compile -C build
}

check() {
  meson test -C build --print-errorlogs
}

package() {
  meson install -C build --destdir "$pkgdir"
}

サンプルパッケージ

これは、Meson を使用するパッケージの小さなリストです。meson の "必要とするパッケージ" のリストにある他のパッケージも参照してください。

参照