クロスコンパイルを利用したコンピューティング環境の異種性

オープンソースソフトウェアの台頭とこれらのソリューションの複雑なシステムの作成における受け入れにより、複数のハードウェアプラットフォームでシームレスに実行できるアプリケーションを開発できる能力が重要になっています。特定のアーキテクチャでソフトウェアを開発する必要がありますが、他のターゲットアーキテクチャでこれらを実行できる能力を持つことが求められます。これを実現するための一般的な技術の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を編集し、ツールチェーンディレクトリのパスに応じて変数のパスを更新します。

Shell

 

事前にコンパイルされたツールチェーンでの依存関係の解決

各ソフトウェアにはそれぞれの依存関係(ツール/ライブラリ)があり、クロスコンパイルの前にこれらを解決する必要があります。

これらのツール/ライブラリがターゲットアーキテクチャで利用可能なパッケージに依存する場合、これらを解決するためには2つのオプションがあります。利用可能なパッケージから直接インストールするか、ソースからクロスコンパイルするかです。

FRRのコンパイルに関しては、libpcre2、libyang、clippy、libelf、およびjson-cライブラリをソースからビルドする必要があります。これら以外にも、protobufおよびlibcapライブラリパッケージがPPC(PowerPC)アーキテクチャ向けに利用可能で、ツールチェーンに直接インストールできます。

1. パッケージからライブラリをインストールする

ターゲットアーキテクチャ向けに利用可能なライブラリパッケージは、2つの方法でツールチェーンのsysrootにインストールできます。

  1. 最初の方法は、以下に示すように、Debianパッケージを直接インストールするためのUbuntu/Debianベースのdpkg-debツールを使用します:
    シェル

     

    注意:

    • すべての依存パッケージをダウンロードし、順番にインストールしてください。
    • ライブラリパッケージは異なるディレクトリ構造にインストールされる場合があります。それらのライブラリファイルをツールチェーンに従って正しいディレクトリにコピーしてください。
  2. 第2の方法では、Debian/RPMパッケージは以下に示すように手動で抽出され、ツールチェーンディレクトリパスに配置されます:
    1. Debianパッケージを抽出するには、次のようにarおよびtarツールを使用します:
      プレーンテキスト

       

      注意:この方法はdpkg-debのサポートがないシステムに有用です。

    2. RPMパッケージを抽出するには、以下のコマンドでrpm2cpioツールを使用します:
      プレーンテキスト

       

    3. libcapの例を使用したパッケージの抽出とファイル配置:

      シェル

       

    4. パッケージ/ライブラリが正常にインストールされたかを確認するには、以下のコマンドを実行してください:

      シェル

       

      注意:すでにインストールされていない場合は、pkg-configをインストールしてください。

2. クロスコンパイルライブラリ

ライブラリパッケージは対象アーキテクチャ用に利用できず、ソースからコンパイルされます。コンパイルを開始する前に、クロスコンパイルに必要なすべてのパラメータを設定するためのツールチェーンとパッケージ化された環境ファイルを読み込んでください。

Shell

 

ライブラリのREADMEファイルに記載されているコンパイル手順に従ってください。さらに、ビルド手順の中で以下のパラメータを設定してください。

  1. ./configureスクリプトを実行する際に--hostパラメーターを設定します。
    シェル

     

    注意:

    • <target_host_parameter>は、ライブラリ/ツールが構築されているシステムです。これは、ツールチェーンの環境ファイルで見つけることができます。$CC、$LDなどで共通の接頭辞です。
    • 依存ライブラリには2種類あります。1つはコンパイルプロセスにのみ必要なものであり、もう1つはターゲットホストで実行するための依存性要件です。--hostパラメーターを適切に設定してください。
  2. “make install”を使用して依存ライブラリをビルドする際は、DESTDIRをツールチェーンのsysrootディレクトリに設定してください。
    Shell

     

結論

システムアーキテクチャ、ライブラリ、依存関係、およびツールチェーンの違いにより、クロスコンパイルは実行が複雑な技術です。この記事では、クロスコンパイルのフェーズを明らかにすることで、複雑さを軽減します。望ましいソフトウェアと対象ハードウェアの例として、FRRとPowerPCが取り上げられました。ただし、この記事でカバーされている手順は、特定のハードウェア上の任意のソフトウェアのクロスコンパイルに対する合理的な戦略を提供します。環境設定、ツールチェーン、および依存関係は、要件に基づいて異なります。

Source:
https://dzone.com/articles/heterogeneity-computing-environments-cross-compilation