オープンソースソフトウェアの台頭とこれらのソリューションの複雑なシステムの作成における受け入れにより、複数のハードウェアプラットフォームでシームレスに実行できるアプリケーションを開発できる能力が重要になっています。特定のアーキテクチャでソフトウェアを開発する必要がありますが、他のターゲットアーキテクチャでこれらを実行できる能力を持つことが求められます。これを実現するための一般的な技術の1つは、ターゲットアーキテクチャ用にアプリケーションをクロスコンパイルすることです。
クロスコンパイルは、ARMやPowerPCボードなどの専用ハードウェア上でアプリケーションを実行する場合に重要です。これらのシステムはリソースに制約があり、直接コンパイルすることは選択肢にありません。そのため、開発者は一般的なx86アーキテクチャをホストとし、対象ハードウェア向けのツールチェーンを使用して、対象ハードウェアと互換性のあるバイナリを生成します。
この記事では、PowerPC向けにオープンソースパッケージのクロスコンパイルを行ったケーススタディを取り上げます。記事では、使用されたツールやツールチェーンの詳細、およびこのアーキテクチャ向けにクロスコンパイルがどのように達成されたかについて、ステップバイステップのチュートリアルが説明されます。
The 問題の声明
PowerPCアーキテクチャを持つターゲットボードが与えられた場合、このボードにL3ルーティング機能を追加することが意図されていました。この目的のために、人気のあるオープンソースのルーティングプロトコルスイート、FRRouting(FRR)が検討されました。
FRRは、任意のLinuxマシンを完全なルーターのように動作させることを可能にするプロトコルスイートです。 amd64、arm64、armhf、およびi386用にパッケージ化されていますが、PowerPC用には提供されていません。 これにより、FRRのクロスコンパイルが必要となりました。
Build host | target host | |
---|---|---|
CPUアーキ |
x86_64 |
Powerpc(32-bit) |
Operating System |
Ubuntu 18.4 |
QorIQ SDK |
CPU |
12 |
2 (e5500) |
RAM |
12GB |
1GB |
Table 1。ビルドとターゲットプラットフォームの違い
Tクロスコンパイルの旅
クロスコンパイルには2つの主要なステージがあります:
ビルド環境の設定と事前コンパイルされたツールチェーン
1. 環境に必要なビルドツールをインストールします。一般的なビルドツールには、autoconf、make、cmake、build-essentials、pkg-config、libtoolなどがあります。
2. ターゲットホスト環境に特化した事前コンパイルされたツールチェーンを設定します。CPU/ボードベンダーは独自のアーキテクチャ固有のツールチェーンを提供しています。ターゲットボード専用のツールチェーンは、ベンダーの製品ウェブサイトから取得しました。
3. ツールチェーンには環境ファイルが付属しており、クロスコンパイルに必要な環境変数(CC、GCC、PKG_CONFIG_PATHなど)を設定するために使用されます。環境ファイル/opt/fsl-qoriq/2.0/environment-setup-ppce5500-fsl-linux
を編集し、ツールチェーンディレクトリのパスに応じて変数のパスを更新します。
export SDKTARGETSYSROOT=/opt/fsl-qoriq/2.0/sysroots/ppce5500-fsl-linux
export PATH=/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/../x86_64-fslsdk-linux/bin:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux-uclibc:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux-musl:$PATH
export CCACHE_PATH=/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/../x86_64-fslsdk-linux/bin:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux-uclibc:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux-musl:$CCACHE_PATH
export PKG_CONFIG_SYSROOT_DIR=$SDKTARGETSYSROOT
export PKG_CONFIG_PATH=$SDKTARGETSYSROOT/usr/lib/pkgconfig
export CONFIG_SITE=/opt/fsl-qoriq/2.0/site-config-ppce5500-fsl-linux
export PYTHONHOME=/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr unset command_not_found_handle
export CC="powerpc-fsl-linux-gcc -m32 -mhard-float -mcpu=e5500 --sysroot=$SDKTARGETSYSROOT"
export CXX="powerpc-fsl-linux-g++ -m32 -mhard-float -mcpu=e5500 --sysroot=$SDKTARGETSYSROOT"
export CPP="powerpc-fsl-linux-gcc -E -m32 -mhard-float -mcpu=e5500 --sysroot=$SDKTARGETSYSROOT"
export AS="powerpc-fsl-linux-as "
export LD="powerpc-fsl-linux-ld --sysroot=$SDKTARGETSYSROOT"
export GDB=powerpc-fsl-linux-gdb
export STRIP=powerpc-fsl-linux-strip
export RANLIB=powerpc-fsl-linux-ranlib
export OBJCOPY=powerpc-fsl-linux-objcopy
export OBJDUMP=powerpc-fsl-linux-objdump
export AR=powerpc-fsl-linux-ar
export NM=powerpc-fsl-linux-nm
export M4=m4
export TARGET_PREFIX=powerpc-fsl-linux-
export CONFIGURE_FLAGS="--target=powerpc-fsl-linux --host=powerpc-fsl-linux --build=x86_64-linux --with-libtool-sysroot=$SDKTARGETSYSROOT"
export CFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types"
export CXXFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types"
export LDFLAGS="-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed"
export CPPFLAGS=""
export KCFLAGS="--sysroot=$SDKTARGETSYSROOT"
export OECORE_DISTRO_VERSION="2.0"
export OECORE_SDK_VERSION="2.0"
export ARCH=powerpc
export CROSS_COMPILE=powerpc-fsl-linux-
事前にコンパイルされたツールチェーンでの依存関係の解決
各ソフトウェアにはそれぞれの依存関係(ツール/ライブラリ)があり、クロスコンパイルの前にこれらを解決する必要があります。
これらのツール/ライブラリがターゲットアーキテクチャで利用可能なパッケージに依存する場合、これらを解決するためには2つのオプションがあります。利用可能なパッケージから直接インストールするか、ソースからクロスコンパイルするかです。
FRRのコンパイルに関しては、libpcre2、libyang、clippy、libelf、およびjson-cライブラリをソースからビルドする必要があります。これら以外にも、protobufおよびlibcapライブラリパッケージがPPC(PowerPC)アーキテクチャ向けに利用可能で、ツールチェーンに直接インストールできます。
1. パッケージからライブラリをインストールする
ターゲットアーキテクチャ向けに利用可能なライブラリパッケージは、2つの方法でツールチェーンのsysrootにインストールできます。
- 最初の方法は、以下に示すように、Debianパッケージを直接インストールするためのUbuntu/Debianベースの
dpkg-deb
ツールを使用します:シェル$ dpkg-deb -x <pkg_name>.deb <toolchain_directory_path>
#libcapの例:
$ wget http://launchpadlibrarian.net/222364908/libcap-dev_2.24-12_powerpc.deb
$ dpkg-deb -x libcap-dev_2.24-12_powerpc.deb /opt/fsl-qoriq/2.0/sysroots/ppce5500-fsl-linux/
注意:
- すべての依存パッケージをダウンロードし、順番にインストールしてください。
- ライブラリパッケージは異なるディレクトリ構造にインストールされる場合があります。それらのライブラリファイルをツールチェーンに従って正しいディレクトリにコピーしてください。
- 第2の方法では、Debian/RPMパッケージは以下に示すように手動で抽出され、ツールチェーンディレクトリパスに配置されます:
- Debianパッケージを抽出するには、次のように
ar
およびtar
ツールを使用します:プレーンテキスト$ ar -x <package>.deb
$ tar -xJf data.tar.xz
注意:この方法は
dpkg-deb
のサポートがないシステムに有用です。 - RPMパッケージを抽出するには、以下のコマンドで
rpm2cpio
ツールを使用します:プレーンテキスト$ rpm2cpio <package>.rpm | cpio -idmv
-
libcapの例を使用したパッケージの抽出とファイル配置:
シェル# .debパッケージを抽出
$ ar -x libcap-dev_2.24-12_powerpc.deb
# 3つのファイルが抽出されます(control.tar.gz、data.tar.xz、debian-binary)
$ ls
control.tar.gz data.tar.xz debian-binary libcap-dev_2.24-12_powerpc.deb
# data.tar.xzにはパッケージのプログラムファイルが含まれています
# control.tar.gzにはパッケージのメタデータが含まれています
# debian-binaryにはdebファイル形式のバージョンが含まれています
# data.tar.xzをuntarしてパッケージのプログラムファイルを抽出します。
$ tar -xJf data.tar.xz
# 注意:rpm2cpio <package>.rpmは直接プログラムファイルを抽出します。
# 同じパスに依存するすべてのDebianまたはRPMパッケージに対して同じことを行うと、すべてのプログラムファイルとシンボリックリンクが同じディレクトリ構造内に抽出されます。
# usr/lib、usr/include、usr/binディレクトリにある抽出されたファイルは、toolchain_directory_pathの/usrディレクトリにコピーされ、すでに存在するファイルと並列に配置されるべきです。
$ cp usr/include/sys/capability.h /opt/fsl-qoriq/2.0/sysroots/ppce5500-fsl-linux/usr/include/sys/
-
パッケージ/ライブラリが正常にインストールされたかを確認するには、以下のコマンドを実行してください:
シェル# ツールチェーンの環境ファイルからPKG_CONFIG_PATH変数をエクスポートすることを確認してください
$ pkg-config --list-all | grep <package_library_name>
注意:すでにインストールされていない場合は、
pkg-config
をインストールしてください。
- Debianパッケージを抽出するには、次のように
2. クロスコンパイルライブラリ
ライブラリパッケージは対象アーキテクチャ用に利用できず、ソースからコンパイルされます。コンパイルを開始する前に、クロスコンパイルに必要なすべてのパラメータを設定するためのツールチェーンとパッケージ化された環境ファイルを読み込んでください。
$ source <env_file_path>
ライブラリのREADMEファイルに記載されているコンパイル手順に従ってください。さらに、ビルド手順の中で以下のパラメータを設定してください。
./configure
スクリプトを実行する際に--hostパラメーター
を設定します。シェル$ ./configure --host=<target_host_parameter>
# 例:
$ ./configure --host=powerpc-fsl-linux
注意:
- <target_host_parameter>は、ライブラリ/ツールが構築されているシステムです。これは、ツールチェーンの環境ファイルで見つけることができます。$CC、$LDなどで共通の接頭辞です。
- 依存ライブラリには2種類あります。1つはコンパイルプロセスにのみ必要なものであり、もう1つはターゲットホストで実行するための依存性要件です。
--hostパラメーター
を適切に設定してください。
- “make install”を使用して依存ライブラリをビルドする際は、DESTDIRをツールチェーンのsysrootディレクトリに設定してください。
Shell
$ make DESTDIR=<toolchain_directory_path> install
Examlple:
$ make DESTDIR=/opt/fsl-qoriq/2.0/sysroots/ppce5500-fsl-linux/ install
結論
システムアーキテクチャ、ライブラリ、依存関係、およびツールチェーンの違いにより、クロスコンパイルは実行が複雑な技術です。この記事では、クロスコンパイルのフェーズを明らかにすることで、複雑さを軽減します。望ましいソフトウェアと対象ハードウェアの例として、FRRとPowerPCが取り上げられました。ただし、この記事でカバーされている手順は、特定のハードウェア上の任意のソフトウェアのクロスコンパイルに対する合理的な戦略を提供します。環境設定、ツールチェーン、および依存関係は、要件に基づいて異なります。
Source:
https://dzone.com/articles/heterogeneity-computing-environments-cross-compilation