吉方位確認サービス「楽方位」α版を公開しました。

Raspberry Pi 3 用のクロスコンパイル環境を crosstool-NG で構築

Sponsored Links

はじめに

Raspberry Pi 3 上で大きなプログラムをビルドするのは非常に時間が掛かるため、Linux PC 上に Raspberry Pi 3 のクロスコンパイル環境を構築してみます。Linux PC の OS としては Ubuntu 18.04.2 を使用します。Raspberry Pi 3 の OS としては Raspberry Pi Foundations の公式 OS である Raspbian を使用します。ツールチェインは crosstool-NG で生成します。

https://crosstool-ng.github.io/

Crosstool-NG is a versatile (cross) toolchain generator. It supports many architectures and components and has a simple yet powerful menuconfig-style interface.

とのことで、実際、crosstool-NG では Raspberry Pi 3 のツールチェインもサポートしています。

ただし、

macOS is no longer supported


http://crosstool-ng.github.io/2018/11/26/macos.html

とのことで、クロスコンパイル環境として macOS はサポートされません。

なお、2012-12-03 時点の Raspbian のベースとなっているのは Debian 9 Stretch です。今回は、Ubuntu 18.04.2 Desktop にクロスコンパイル環境を構築してみました。

$ uname -a
Linux dev1 4.18.0-17-generic #18~18.04.1-Ubuntu SMP Fri Mar 15 15:27:12 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

crosstool-NG のインストール

まず、crosstool-NG をインストールするための領域を作成します。今回は /opt/cross にインストールしてみます。

sudo mkdir /opt/cross
sudo chown $USER:$GROUP /opt/cross

続いて、必要なパッケージをインストールし、GitHub から crosstool-NG をクローンし、ビルドし、インストールします。

sudo apt-get -y install git autoconf gcc bison flex texinfo help2man gawk make libtool-bin libncurses5-dev g++ python-dev python3.6-dev
git clone https://github.com/crosstool-ng/crosstool-ng
cd crosstool-ng
./bootstrap
./configure --prefix=/opt/cross
make -j$(nproc)
sudo make install

パスを通しておきます。

export PATH=$PATH:/opt/cross/bin

ツールチェインの生成

Raspberry Pi 3 のツールチェインを生成します。まず、適当な作業領域を作成します。

mkdir ~/ctng
cd ~/ctng

update-samples を実行します。

ct-ng update-samples

アップデートが完了すれば、list-samples を実行し、サンプルの一覧を表示させます。

ct-ng update-samples

実行結果です。armv8-rpi3-linux-gnueabihf が存在することを確認します。これが Raspberry Pi 3 のツールチェインです。

Status  Sample name
[G...]   aarch64-rpi3-linux-gnu

...

[G...]   armv6-rpi-linux-gnueabi
[G...]   armv7-rpi2-linux-gnueabihf
[G...]   armv8-rpi3-linux-gnueabihf

...

 L (Local)       : sample was found in current directory
 G (Global)      : sample was installed with crosstool-NG
 X (EXPERIMENTAL): sample may use EXPERIMENTAL features
 B (BROKEN)      : sample is currently broken
 O (OBSOLETE)    : sample needs to be upgraded

設定ファイルを生成させます。

ct-ng armv8-rpi3-linux-gnueabihf

実行結果です。

  CONF  armv8-rpi3-linux-gnueabihf
#
# configuration written to .config
#

***********************************************************

(snip)

Comment:
crosstool-NG configuration for Raspberry Pi 3.

***********************************************************

Now configured for "armv8-rpi3-linux-gnueabihf"

詳細な設定をしたい場合、

ct-ng menuconfig

を実行すると、Crosstool-NG Configuration が起動します。

今回、クロスコンパイル環境を構築した目的の 1 つは、Raspberry Pi 3 用の OpenJDK 11 のビルドなのですが、armv8-rpi3-linux-gnueabihf のデフォルトでは glibc が 2.29 であり、一方で 2018-12-03 時点の Raspbian の glibc は 2.24 です。そのため、このデフォルト設定でクロスコンパイルした OpenJDK 11 は Raspbian では動作しません。よって、OpenJDK 11 をクロスコンパイルしたい場合、Crosstool-NG Configuration で glibc のバージョンを変更します。

Crosstool-NG Configuration の C-library —> Version 0f glibc を確認すると、デフォルトでは 2.29 となっています。ここを 2.24 に変更し、Save します。

最後に、ツールチェインを生成します。

ct-ng build

実行結果です。Core i3-4170 の Linux PC 上で、38 分程度かかりました。

作業用ディレクトリと同じ階層に、x-tools/armv8-rpi3-linux-gnueabihf という名前のディレクトリが生成されました。

[INFO ]  Performing some trivial sanity checks
[WARN ]  Number of open files 1024 may not be sufficient to build the toolchain; increasing to 2048
[INFO ]  Build started 20190508.173811
[INFO ]  Building environment variables
[WARN ]  Directory '/home/hirooka/src' does not exist.
[WARN ]  Will not save downloaded tarballs to local storage.
[EXTRA]  Preparing working directories
[EXTRA]  Installing user-supplied crosstool-NG configuration
[EXTRA]  =================================================================
[EXTRA]  Dumping internal crosstool-NG configuration
[EXTRA]    Building a toolchain for:
[EXTRA]      build  = x86_64-pc-linux-gnu
[EXTRA]      host   = x86_64-pc-linux-gnu
[EXTRA]      target = armv8-rpi3-linux-gnueabihf
[EXTRA]  Dumping internal crosstool-NG configuration: done in 0.08s (at 00:03)

...

[INFO ]  Finalizing the toolchain's directory: done in 1.98s (at 38:24)
[INFO ]  Build completed at 20190508.181634
[INFO ]  (elapsed: 38:23.06)
[INFO ]  Finishing installation (may take a few seconds)...
[38:24]