MinGW PKGBUILD Guidelines (日本語)
CLR – Cross – Eclipse – Free Pascal – GNOME – Go – Haskell – Java – KDE – Kernel – Lisp – MinGW – Nonfree – OCaml – Perl – Python – Ruby – VCS – Web – Wine
このページでは、GCC を使って Windows で動作するソフトウェアの PKGBUILD を記述する方法を説明しています。Linux 上で Windows のソフトウェアをビルドする方法は2つあります:
- Mingw-w64: secure crt, Vista+ API, DDK (ReactOS), DirectX (WINE) をサポートする32ビットと64ビットのツールチェイン。サポートされている機能の完全なリストと、MinGW.org と違うところについては、こちら を見て下さい。Arch の [community] リポジトリにある mingw-w64-gcc でインストールできます。
- MinGW.org: DirectX を部分的にサポートする32ビットのツールチェイン。スレッドローカルストレージと浮動小数点ライブラリのサポートの実装に長年問題を抱えています。公式リポジトリと AUR からは削除されました。
Contents
パッケージの命名規則
mingw-w64 のパッケージには mingw-w64-pkgname という名前を付けて下さい。パッケージの静的なバージョンをビルドする場合は、パッケージの名前に -static を付けます (必要な場合については下を参照)。
パッケージング
Packaging for cross platform packages can be fairly tricky as there are many different build systems and low-level quirks. Take a note of the following things though:
- always add mingw-w64-crt to
depends - always add mingw-w64-gcc to
makedepends - always add
!strip,staticlibsand!buildflagstooptions - always use the original
pkgdescand append(mingw-w64)to the end ofpkgdesc - always use and follow the original
pkgverof the official package - always add
unset LDFLAGS CPPFLAGSin front of toolchain configure/Makefile generation sequences - always build both 32-bit and 64-bit versions of libraries, unless of course the package can only target, or is meant to only target, 32-bit or 64-bit, or if problems arise building one of the two.
- always put all stuff under the
/usr/i686-w64-mingw32and/usr/x86_64-w64-mingw32prefix - always use
anyas the architecture - always build both shared and static binaries, unless they conflict
- always remove Win32 executables (*.exe) if the intended package is a library (
rm "$pkgdir"/usr/${_arch}/bin/*.exe) - consider removing unneeded documentation (
rm -r $pkgdir/usr/i686-w64-mingw32/share/{doc,info,man},rm -r $pkgdir/usr/x86_64-w64-mingw32/share/{doc,info,man}) - consider using mingw-w64-pkg-config for building with configure scripts
- consider using mingw-w64-cmake for building with CMake
- consider explicitly stripping symbols with
${_arch}-stripinpackage()'s for-loop as demonstrated in the below PKGBUILD examples.- consider using the `find` command to iterate over
$pkgdirsince not all DLLs, static libraries, or executables may reside in their appropriate locations.- if the binary is a DLL, use
${_arch}-strip --strip-unneeded *.dll - if the binary is a static lib, use
${_arch}-strip -g *.a
- if the binary is a DLL, use
- consider using the `find` command to iterate over
- if a package is modular (requires certain build dependencies, but said dependencies are optional to the end user) add these to
makedependsandoptdepends. Be sure to subtract them fromdependsif updating an existing package. Example of this in use: mingw-w64-ruby, mingw-w64-allegro - if a package installs a
$pkgdir/usr/${_arch}/bin/*-configscript, symlink it to$pkgdir/usr/bin/${_arch}-*-config - if a package uses autoconf, explicitly set
--build="$CHOST"forconfigureto workaround autoconf bug #108405
As mentioned above, the files should all be installed into /usr/i686-w64-mingw32 and /usr/x86_64-w64-mingw32. Specifically, all DLLs should be put into /usr/*-w64-mingw32/bin as they are dynamic libraries needed at runtime. Their corresponding .dll.a files should go into /usr/*-w64-mingw32/lib. Please delete any unnecessary documentation and perhaps other files from /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.
Always try to match the pkgver in your mingw-w64 packages to the 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.
サンプル
The following examples will try to cover some of the most common conventions and build systems.
Autotools
# Maintainer: yourname <yourmail>
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-gcc')
depends=('mingw-w64-crt')
options=('!strip' '!buildflags' 'staticlibs')
source=("http://www.foo.bar/foobar.tar.gz")
md5sums=('4736ac4f34fd9a41fa0197eac23bbc24')
_architectures="i686-w64-mingw32 x86_64-w64-mingw32"
build() {
unset LDFLAGS
cd "${srcdir}/foo-$pkgver/"
for _arch in ${_architectures}; do
mkdir -p build-${_arch} && pushd build-${_arch}
../configure \
--prefix=/usr/${_arch} \
--host=${_arch} --build="$CHOST"
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
# Maintainer: yourname <yourmail>
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")
md5sums=('4736ac4f34fd9a41fa0197eac23bbc24')
_architectures="i686-w64-mingw32 x86_64-w64-mingw32"
build() {
unset LDFLAGS
cd "$srcdir/foo-$pkgver/"
for _arch in ${_architectures}; do
mkdir -p build-${_arch} && pushd build-${_arch}
${_arch}-cmake \
-DCMAKE_BUILD_TYPE=Release \
..
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
}