pkgsrcでのクロスコンパイル方法 2018年版

この記事は、 NetBSD Advent Calendar 2018の8日目の記事です。

はじめに

pkgsrcには、今目の前にあるマシンとは違うアーキテクチャーの マシンで動くNetBSDのためのバイナリーパッケージを作る仕組みがあります。

基本的には、 pkgsrc/doc/HOWTO-use-crosscompile にあるようにすれば良い訳ですが、実際にやってみた経験のある方は 多くはないかもしれません。

今回はNetBSD/amd64 8.99.25で、 NetBSD/evbearmv7hf-el用 8.99.25のバイナリーパッケージを作成してみます。

クロスツールチェインを用意する

NetBSDはクロスビルドをするためのツールチェインを簡単に作ることができます。 具体的には、以下のようにします。

$ cd /usr/src
$ ./build.sh -U -T /usr/world/9/earmv7hf-el/tools -O /usr/world/9/earmv7hf-el/obj -D /usr/world/9/earmv7hf-el/destdir tools
$ ./build.sh -U -T /usr/world/9/earmv7hf-el/tools -O /usr/world/9/earmv7hf-el/obj -D /usr/world/9/earmv7hf-el/destdir build
これで、/usr/world/9/earmv7hf-el/tools以下にクロスコンパイラーなどが、 /usr/world/9/earmv7hf-el/destdir以下にユーザーランドが用意されます。

このクロスコンパイラーなどを使い、このユーザーランドにパッケージをインストールしつつ パッケージをビルドしていくことになります。

/etc/mk.confの設定

pkgsrcの設定は、NetBSDがホストのであって別段bootstrap pkgsrcを 実行していない場合は、/etc/mk.confに設定を書くことになります。

ここでは、以下のように実行した場合にevbearmv7hf-el用に クロスビルドするようにしてみます。

$ cd /usr/pkgsrc/www/http-parser
$ make USE_CROSS_COMPILE=YES install
/etc/mk.confに以下のように追加します。
USE_CROSS_COMPILE?=no
.if !empty(USE_CROSS_COMPILE:M[yY][eE][sS])
USE_CWRAPPERS=no
#ABI=32
CROSSBASE=${LOCALBASE}/cross
MACHINE_ARCH=earmv7hf
TOOLDIR=/usr/world/8.99/evbearmv7hf-el/tools
CROSS_DESTDIR=/usr/world/8.99/evbearmv7hf-el/destdir
PACKAGES=/usr/pkgbin/earmv7hf
WRKOBJDIR=/usr/tmp/pkgsrc/evbearmv7hf-el
.endif
最近のpkgsrcでは、ビルドを高速化するために pkgsrc/pkgtools/cwrappersというツールを使うようになっています。 ですが、このcwrappersは、クロスビルドには対応できていないようです。 USE_CWRAPPERS=noを指定しておく必要があります。

後はビルドするだけと言いたい所ですが、クロスビルド用のlibtool コマンドをネイティブ環境にインストールしておく必要があります。 クロスビルドしたearmv7hf用のバイナリーパッケージをNetBSD/amd64のユーザーランドに インストールします。 以下のように実行して準備しておきます。

# cd /usr/pkgsrc/cross/cross-libtool-base
# make USE_CROSS_COMPILE=YES package
# pkg_add -m earmv7hf /usr/pkgbin/earmv7hf/All/cross-libtool-base-earmv7hf-2.4.6nb4.tgz

後は、前述のようにコマンドを実行して待つだけです。

$ cd /usr/pkgsrc/www/http-parser
$ make USE_CROSS_COMPILE=YES install
(snip)
$ ll /usr/pkgbin/earmv7hf/All/http-parser-2.8.1.tgz
-rw-r--r--  1 ryoon  wheel  34029 Sep 28 02:08 /usr/pkgbin/earmv7hf/All/http-parser-2.8.1.tgz

ビルド結果の確認

ビルドできたパッケージを確認してみましょう。以下のようにearmv7hf用のバイナリーができている ことが分かります。

$ file libhttp_parser.so.2.0.7
libhttp_parser.so.2.0.7: ELF 32-bit LSB pie executable, ARM, EABI5 version 1 (SYSV), dynamically linked, for NetBSD 8.99.25, compiled for: earmv7hf, not stripped

全てのパッケージがクロスビルド可能な訳ではありません。私はpkgsrc/lang/rust のブートストラップキットを作成するために必要なパッケージしか試せていません。 まずはcwrappersでクロスビルドができるようにしたいと思っています。 その次にはPythonがビルドできるようになれば役立ちそうです。

明日は、最近のNetBSD/aarch64でできるようになったと言うAmazon Web Service (AWS) EC2 でのa1インスタンスでのNetBSDの動作を体験してみたいと思います。

Comments

Popular posts from this blog

#5000へCメールを送れないau端末でezweb.ne.jpの電子メールアドレスをIMAP4/SMTPで扱う方法

PostgreSQLのOracle Foreign Data WrapperをWindowsで使う

Vaio Pro 11/13用のサードパーティーのACアダプター