「MinGW パッケージガイドライン」の版間の差分
(→パッケージング: 翻訳) |
|||
16行目: | 16行目: | ||
多数のビルド環境が存在し低水準な問題に溢れているためクロスプラットフォームパッケージの作成は非常に困難です。以下の事柄に注意してください: |
多数のビルド環境が存在し低水準な問題に溢れているためクロスプラットフォームパッケージの作成は非常に困難です。以下の事柄に注意してください: |
||
− | * {{ic|depends}} に常に {{Pkg|mingw-w64-crt}} を追加する (依存している他のパッケージが明示的に依存している場合は除く) |
+ | * {{ic|depends}} に常に {{Pkg|mingw-w64-crt}} を追加する (依存している他のパッケージが明示的に依存している場合は除く) |
− | * {{ic|makedepends}} に常に {{Pkg|mingw-w64-gcc}} を追加する ({{AUR|mingw-w64-configure}} や {{AUR|mingw-w64-cmake}} を使用する場合は除く) |
+ | * {{ic|makedepends}} に常に {{Pkg|mingw-w64-gcc}} を追加する ({{AUR|mingw-w64-configure}} や {{AUR|mingw-w64-cmake}} を使用する場合は除く) |
* {{ic|options}} に常に {{ic|!strip}}, {{ic|staticlibs}}, {{ic|!buildflags}} を追加する。 |
* {{ic|options}} に常に {{ic|!strip}}, {{ic|staticlibs}}, {{ic|!buildflags}} を追加する。 |
||
* オリジナルの {{ic|pkgdesc}} を常に使い、{{ic|pkgdesc}} の末尾に {{ic|(mingw-w64)}} と追記する。 |
* オリジナルの {{ic|pkgdesc}} を常に使い、{{ic|pkgdesc}} の末尾に {{ic|(mingw-w64)}} と追記する。 |
||
23行目: | 23行目: | ||
* ライブラリの32ビット版と64ビット版の両方を常にビルドする。 |
* ライブラリの32ビット版と64ビット版の両方を常にビルドする。 |
||
* 全てのファイルを常に {{Ic|/usr/i686-w64-mingw32}} と {{Ic|/usr/x86_64-w64-mingw32}} プリフィックスの下に配置する。 |
* 全てのファイルを常に {{Ic|/usr/i686-w64-mingw32}} と {{Ic|/usr/x86_64-w64-mingw32}} プリフィックスの下に配置する。 |
||
− | * アーキテクチャは必ず {{ic|any}} を使う (ビルド環境で実行する必要がある実行ファイルを含む場合は除く) |
+ | * アーキテクチャは必ず {{ic|any}} を使う (ビルド環境で実行する必要がある実行ファイルを含む場合は除く) |
* 衝突が発生しないかぎり、共有・静的バイナリの両方をビルドする。 |
* 衝突が発生しないかぎり、共有・静的バイナリの両方をビルドする。 |
||
− | * 不必要なドキュメントは削除する ({{ic|<nowiki>rm -r $pkgdir/usr/i686-w64-mingw32/share/{doc,info,man}</nowiki>}}, {{ic|<nowiki>rm -r $pkgdir/usr/x86_64-w64-mingw32/share/{doc,info,man}</nowiki>}}) |
+ | * 不必要なドキュメントは削除する ({{ic|<nowiki>rm -r $pkgdir/usr/i686-w64-mingw32/share/{doc,info,man}</nowiki>}}, {{ic|<nowiki>rm -r $pkgdir/usr/x86_64-w64-mingw32/share/{doc,info,man}</nowiki>}}) |
* configure スクリプトでビルドするときは {{AUR|mingw-w64-configure}} を使用する。 |
* configure スクリプトでビルドするときは {{AUR|mingw-w64-configure}} を使用する。 |
||
* CMake でビルドするときは {{AUR|mingw-w64-cmake}} を使用する。 |
* CMake でビルドするときは {{AUR|mingw-w64-cmake}} を使用する。 |
||
35行目: | 35行目: | ||
*** バイナリが DLL の場合、{{ic|${_arch}-strip --strip-unneeded *.dll}} を使用する。 |
*** バイナリが DLL の場合、{{ic|${_arch}-strip --strip-unneeded *.dll}} を使用する。 |
||
*** バイナリが静的ライブラリの場合、{{ic|${_arch}-strip -g *.a}} を使用する。 |
*** バイナリが静的ライブラリの場合、{{ic|${_arch}-strip -g *.a}} を使用する。 |
||
+ | * パッケージがモジュール型の場合 (特定のビルド依存関係が必要ですが、その依存関係はエンドユーザーにとってオプションです) これらを {{ic|makedepends}} と {{ic|optdepends}} に追加します。既存のパッケージを更新する場合は、必ず {{ic|depends}} からそれらを減算してください。使用例: {{AUR|mingw-w64-allegro}} |
||
− | * if a package is modular (requires certain build dependencies, but said dependencies are optional to the end user) add these to {{ic|makedepends}} and {{ic|optdepends}}. Be sure to subtract them from {{ic|depends}} if updating an existing package. Example of this in use: {{AUR|mingw-w64-ruby}}{{Broken package link|パッケージが存在しません}}, {{AUR|mingw-w64-allegro}} |
||
* パッケージが {{ic|$pkgdir/usr/${_arch}/bin/*-config}} スクリプトをインストールする場合、{{ic|$pkgdir/usr/bin/${_arch}-*-config}} にシンボリックリンクを作成する。 |
* パッケージが {{ic|$pkgdir/usr/${_arch}/bin/*-config}} スクリプトをインストールする場合、{{ic|$pkgdir/usr/bin/${_arch}-*-config}} にシンボリックリンクを作成する。 |
||
* パッケージが autoconf を使用する場合、[https://savannah.gnu.org/support/?108405 autoconf bug #108405] を避けるために {{ic|configure}} で明示的に {{ic|1=--build="$CHOST"}} を設定するか {{AUR|mingw-w64-configure}} を使用する。 |
* パッケージが autoconf を使用する場合、[https://savannah.gnu.org/support/?108405 autoconf bug #108405] を避けるために {{ic|configure}} で明示的に {{ic|1=--build="$CHOST"}} を設定するか {{AUR|mingw-w64-configure}} を使用する。 |
||
+ | 上で述べたように、ファイルはすべて {{Ic|/usr/i686-w64-mingw32}} と {{Ic|/usr/x86_64-w64-mingw32}} にインストールする必要があります。具体的には、すべての DLL は実行時に必要な動的ライブラリであるため、{{Ic|/usr/*-w64-mingw32/bin}} に配置する必要があります。対応する {{Ic|.dll.a}} ファイルは {{Ic|/usr/*-w64-mingw32/lib}} に配置する必要があります。不要なドキュメントやその他のファイルを {{Ic|/usr/share}} から削除してください。クロスコンパイルパッケージはユーザー向けではなく、コンパイラとバイナリ配布のみを目的としているため、パッケージをできるだけ小さくするように努める必要があります。 |
||
− | As mentioned above, the files should all be installed into {{Ic|/usr/i686-w64-mingw32}} and {{Ic|/usr/x86_64-w64-mingw32}}. Specifically, all DLLs should be put into {{Ic|/usr/*-w64-mingw32/bin}} as they are dynamic libraries needed at runtime. Their corresponding {{Ic|.dll.a}} files should go into {{Ic|/usr/*-w64-mingw32/lib}}. Please delete any unnecessary documentation and perhaps other files from {{Ic|/usr/share}}. Cross-compilations packages are not meant for the user but only for the compiler and binary distribution, and as such you should try to make them as small as possible. |
||
+ | mingw-w64 パッケージの {{Ic|pkgver}} を、公式 Arch Linux リポジトリ (テストリポジトリではなく) の対応する通常パッケージの {{Ic|pkgver}} と常に一致させるようにしてください。これにより、クロスコンパイルされたソフトウェアが予期しないバグを発生させることなく、Windows 上でまったく同じように動作することが保証されます。Arch のパッケージが古い場合は、通常、十分な理由があるため、最新のアップストリームリリースを使用する代わりに Arch バージョンに従う必要があります。対応するネイティブパッケージが AUR にある場合、多くの AUR パッケージは孤立しているか、メンテナンスされていないことが多いため、このバージョンポリシーに従う必要はありません。 |
||
− | Always try to match the {{Ic|pkgver}} in your mingw-w64 packages to the {{Ic|pkgver}} of the corresponding regular packages in the official Arch Linux repos (not the testing repos). This ensures that the cross-compiled software works exactly the same way on Windows without any unexpected bugs. If packages in Arch are out-of-date, there usually is a good reason and you should still follow the Arch version instead of using the most recent upstream release. If the corresponding native package is in the AUR, you need not follow this version policy, as many AUR packages are often orphaned or left unmaintained. |
||
== サンプル == |
== サンプル == |
2023年6月28日 (水) 14:33時点における最新版
32ビット – CLR – クロス – Eclipse – Electron – Free Pascal – GNOME – Go – Haskell – Java – KDE – カーネル – Lisp – MinGW – Node.js – ノンフリー – OCaml – Perl – PHP – Python – R – Ruby – Rust – VCS – ウェブ – Wine
このページでは、GCC を使って Windows で動作するソフトウェアの PKGBUILD を記述する方法を説明しています。Linux 上で Windows のソフトウェアをビルドする方法は2つあります:
- mingw-w64: secure crt, Vista+ API, DDK (ReactOS), DirectX (Wine) をサポートする32ビットと64ビットのツールチェイン。サポートされている機能の完全なリストと、MinGW.org と違うところについては、こちら を見て下さい。mingw-w64-gcc パッケージでインストールできます。
- MinGW: DirectX を部分的にサポートする32ビットのツールチェイン。スレッドローカルストレージと浮動小数点ライブラリのサポートの実装に長年問題を抱えています。公式リポジトリと AUR からは削除されました。
パッケージの命名規則
mingw-w64 のパッケージには mingw-w64-pkgname
という名前を付けて下さい。パッケージの静的なバージョンをビルドする場合は、パッケージの名前に -static
を付けます (必要な場合については下を参照)。
パッケージング
多数のビルド環境が存在し低水準な問題に溢れているためクロスプラットフォームパッケージの作成は非常に困難です。以下の事柄に注意してください:
depends
に常に mingw-w64-crt を追加する (依存している他のパッケージが明示的に依存している場合は除く)makedepends
に常に mingw-w64-gcc を追加する (mingw-w64-configureAUR や mingw-w64-cmakeAUR を使用する場合は除く)options
に常に!strip
,staticlibs
,!buildflags
を追加する。- オリジナルの
pkgdesc
を常に使い、pkgdesc
の末尾に(mingw-w64)
と追記する。 - 公式パッケージのオリジナルの
pkgver
を常に使用・追従する。 - ライブラリの32ビット版と64ビット版の両方を常にビルドする。
- 全てのファイルを常に
/usr/i686-w64-mingw32
と/usr/x86_64-w64-mingw32
プリフィックスの下に配置する。 - アーキテクチャは必ず
any
を使う (ビルド環境で実行する必要がある実行ファイルを含む場合は除く) - 衝突が発生しないかぎり、共有・静的バイナリの両方をビルドする。
- 不必要なドキュメントは削除する (
rm -r $pkgdir/usr/i686-w64-mingw32/share/{doc,info,man}
,rm -r $pkgdir/usr/x86_64-w64-mingw32/share/{doc,info,man}
) - configure スクリプトでビルドするときは mingw-w64-configureAUR を使用する。
- CMake でビルドするときは mingw-w64-cmakeAUR を使用する。
- Meson でビルドするときは mingw-w64-mesonAUR を使用する。
- configure スクリプトなどを使わず直接書かれた Makefile を用いてビルドするときは mingw-w64-makeAUR を使用する。
- QMake でビルドするときは mingw-w64-qt5-baseAUR を使用する。
- 下の PKGBUILD のサンプルでしているように
package()
の for ループで${_arch}-strip
を使ってシンボルを除去する。- DLL や静的ライブラリ、実行ファイルが適切な場所に収まるまで
$pkgdir
で繰り返し find コマンドを実行すると良いでしょう。- バイナリが DLL の場合、
${_arch}-strip --strip-unneeded *.dll
を使用する。 - バイナリが静的ライブラリの場合、
${_arch}-strip -g *.a
を使用する。
- バイナリが DLL の場合、
- DLL や静的ライブラリ、実行ファイルが適切な場所に収まるまで
- パッケージがモジュール型の場合 (特定のビルド依存関係が必要ですが、その依存関係はエンドユーザーにとってオプションです) これらを
makedepends
とoptdepends
に追加します。既存のパッケージを更新する場合は、必ずdepends
からそれらを減算してください。使用例: mingw-w64-allegroAUR - パッケージが
$pkgdir/usr/${_arch}/bin/*-config
スクリプトをインストールする場合、$pkgdir/usr/bin/${_arch}-*-config
にシンボリックリンクを作成する。 - パッケージが autoconf を使用する場合、autoconf bug #108405 を避けるために
configure
で明示的に--build="$CHOST"
を設定するか mingw-w64-configureAUR を使用する。
上で述べたように、ファイルはすべて /usr/i686-w64-mingw32
と /usr/x86_64-w64-mingw32
にインストールする必要があります。具体的には、すべての DLL は実行時に必要な動的ライブラリであるため、/usr/*-w64-mingw32/bin
に配置する必要があります。対応する .dll.a
ファイルは /usr/*-w64-mingw32/lib
に配置する必要があります。不要なドキュメントやその他のファイルを /usr/share
から削除してください。クロスコンパイルパッケージはユーザー向けではなく、コンパイラとバイナリ配布のみを目的としているため、パッケージをできるだけ小さくするように努める必要があります。
mingw-w64 パッケージの pkgver
を、公式 Arch Linux リポジトリ (テストリポジトリではなく) の対応する通常パッケージの pkgver
と常に一致させるようにしてください。これにより、クロスコンパイルされたソフトウェアが予期しないバグを発生させることなく、Windows 上でまったく同じように動作することが保証されます。Arch のパッケージが古い場合は、通常、十分な理由があるため、最新のアップストリームリリースを使用する代わりに Arch バージョンに従う必要があります。対応するネイティブパッケージが AUR にある場合、多くの AUR パッケージは孤立しているか、メンテナンスされていないことが多いため、このバージョンポリシーに従う必要はありません。
サンプル
以下の例は一般的な決まり事やビルド環境をカバーしています。
Autotools
pkgname=mingw-w64-foo pkgver=1.0 pkgrel=1 pkgdesc="Foo bar (mingw-w64)" arch=('any') url="http://www.foo.bar" license=('GPL') makedepends=('mingw-w64-configure') depends=('mingw-w64-crt') options=('!strip' '!buildflags' 'staticlibs') source=("http://www.foo.bar/foobar.tar.gz") sha256sums=('8f32d4617390d1c2d16f26a27ab60d97807b35440d45891fa340fc2648b04406') _architectures="i686-w64-mingw32 x86_64-w64-mingw32" build() { cd "${srcdir}/foo-$pkgver/" for _arch in ${_architectures}; do mkdir -p build-${_arch} && pushd build-${_arch} ${_arch}-configure .. make popd done } package() { for _arch in ${_architectures}; do cd "${srcdir}/foo-$pkgver/build-${_arch}" make DESTDIR="${pkgdir}" install ${_arch}-strip --strip-unneeded "$pkgdir"/usr/${_arch}/bin/*.dll ${_arch}-strip -g "$pkgdir"/usr/${_arch}/lib/*.a done }
CMake
pkgname=mingw-w64-foo pkgver=1.0 pkgrel=1 pkgdesc="Foo bar (mingw-w64)" arch=('any') url="http://www.foo.bar" license=('GPL') makedepends=('mingw-w64-cmake') depends=('mingw-w64-crt') options=('!strip' '!buildflags' 'staticlibs') source=("http://www.foo.bar/foobar.tar.gz") sha256sums=('8f32d4617390d1c2d16f26a27ab60d97807b35440d45891fa340fc2648b04406') _architectures="i686-w64-mingw32 x86_64-w64-mingw32" build() { cd "$srcdir/foo-$pkgver/" for _arch in ${_architectures}; do mkdir -p build-${_arch} && pushd build-${_arch} ${_arch}-cmake .. make popd done } package() { for _arch in ${_architectures}; do cd "${srcdir}/foo-$pkgver/build-${_arch}" make DESTDIR="${pkgdir}" install ${_arch}-strip --strip-unneeded "$pkgdir"/usr/${_arch}/bin/*.dll ${_arch}-strip -g "$pkgdir"/usr/${_arch}/lib/*.a done }