MinGW パッケージガイドライン

提供: ArchWiki
ナビゲーションに移動 検索に移動

このページでは、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-configureAURmingw-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 を使用する。
  • パッケージがモジュール型の場合 (特定のビルド依存関係が必要ですが、その依存関係はエンドユーザーにとってオプションです) これらを makedependsoptdepends に追加します。既存のパッケージを更新する場合は、必ず 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
}