この記事は、 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の動作を体験してみたいと思います。
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。