Blog:
組み込みArmプラットフォーム向けQt5ソースコードのクロスコンパイル

はじめに
Qtグラフィックス開発フレームワークは、組み込みArmプラットフォームおよび組み込みLinuxシステム向けのグラフィカルユーザーインターフェースとして最も広く使われてきました。Yocto Projectに基づいてコンパイルされた組み込みLinuxシステムでは、OpenEmbedded開発環境を利用した、特定のQtオープンソースバージョンへの変換が非常に便利です。ランタイムライブラリは組み込みLinuxシステムに統合されています。例えば、Yoctoリリース2.4はQt5.9バージョンに対応しており、Qt5.12など、これと異なるバージョンの場合は、ソースコードを介してクロスコンパイルする必要があります。この記事では、関連するテストの例を利用します。
このデモンストレーションで利用するArmプラットフォームは、NXP i.MX6Q SoCを搭載したToradexのApalis iMX6 Armコアボードです。
準備
Apalis i.MX6QArmコアバージョンはApalis評価ボードキャリアボードと連携してデバッグシリアルポートUART1(キャリアボード X29)を開発ホストに接続し、デバッグを可能にします。Apalis 評価ボードキャリアボードとApalis iMX6についての詳しい説明は、データシート と開発ガイドを参照してください。
Apalis i.MX6QはToradex Linux BSP V2.8組み込みLinuxをインストールします。システムはYocto Project/OpenEmbeddedコンパイル環境に基づいています。コンパイル方法についてはこちらを、コンパイルされたLinuxイメージのインストール方法についてはこちらを参照してください。
コンパイル環境設定
まずは、Apalis i.MX6に対応するSDKをダウンロードします。ダウンロードリンクはこちら:https://developer.toradex.com/files/toradex-dev/uploads/media/Colibri/Linux/SDKs/
ダウンロードするバージョンとモジュールを選択します。ここでは、2.8/apalis-imx6/angstrom-lxde-image/に移動してダウンロードします。
SDKをインストールします。デフォルトの/usr/local/oecore-x86_64にインストールすることも、$home配下など、ほかの好きなディレクトリにインストールすることもできます。
user@host:~$ cd
user@host:~$ chmod +x angstrom-glibc-x86_64-armv7at2hf-neon-v2016.12-toolchain.sh
user@host:~$ ./angstrom-glibc-x86_64-armv7at2hf-neon-v2016.12-toolchain.sh
Angstrom SDK installer version nodistro.0
=========================================
Enter target directory for SDK (default: /usr/local/oecore-x86_64):
You are about to install the SDK to "/usr/local/oecore-x86_64". Proceed[Y/n]? y
インストールディレクトリにある環境変数出力構成ファイルを編集します。
デフォルトの環境変数構成ファイルは/usr/local/oecore-x86_64/environment-setup-armv7at2hf-neon-angstrom-linux-gnueabiです。これを次のように変更します。
https://github.com/simonqin09/Qt5.12_source_code_compile/blob/master/environment-setup-qt-default
Qt5.12ソースコードのダウンロードと設定
次のアドレスから、Qt5.12オープンソースバージョンの最新ソースコードのtar.xz圧縮パッケージをダウンロードして解凍します。これの最新バージョンは5.12.4です。
https://download.qt.io/archive/qt/5.12/
$ wget https://download.qt.io/archive/qt/5.12/5.12.4/single/qt-everywhere-src-5.12.4.tar.xz
$ tar Jxf qt-everywhere-src-5.12.4.tar.xz
$ cd qt-everywhere-src-5.12.4
qmake構成ファイルについて
クロスコンパイルするには、qtbase/mkspecs/devicesディレクトリ内の組み込みデバイスに対応するqmake構成ファイルを利用する必要があります。しかし、NXP iMX6向けlinux-imx6-g++に対応する事前設定されたqmake.confではデフォルトでeglfsファイルシステムになっており、このテストで利用するToradexのデフォルトLinux BSPはX11ディスプレイに基づいているため、必要に応じて変更する必要があります。
qtbase/mkspecs/devices/linux-imx6-g++/qmake.confを次のように変更します。
https://github.com/simonqin09/Qt5.12_source_code_compile/blob/master/qmake.conf
そして、configure構成ファイルbuild_configure.shを次のように作成します。これは主に構成パラメーター設定や一部のxcb(X11)のサポートなどに利用されます。-skip-
https://github.com/simonqin09/Qt5.12_source_code_compile/blob/master/build_configure.sh
configure --helpを利用すればほかのconfigureオプションを見ることができます。helpすべての内容は次のとおりです。
https://github.com/simonqin09/Qt5.12_source_code_compile/blob/master/qt5.12_configure-help-printout
Qt5.12ソースコードのクロスコンパイル
上記の3章で用意したコンパイルされた環境変数を出力します。
$ source /usr/local/oecore-x86_64/environment-setup-qt-default
そして、configureと同じシェルの下でbuild_configure.shを実行します。
$ ./ build_configure.sh
その後、Configureが成功した場合は、コンパイルする関連コンポーネントが出力されるので、必要条件が満たされているかどうかを再度確認できます。Configure summary:
Building on: linux-g++ (x86_64, CPU features: mmx sse sse2)
Building for: devices/linux-imx6-g++ (arm, CPU features: neon)
Target compiler: gcc 6.2.1
Configuration: cross_compile use_gold_linker compile_examples enable_new_dtags largefile neon shared rpath release c++11 c++14
concurrent dbus reduce_exports stlBuild options:
Mode ................................... release
Optimize release build for size ........ no
Building shared libraries .............. yes
Using C standard ....................... C11
Using C++ standard ..................... C++14
Using ccache ........................... no
Using gold linker ...................... yes
Using new DTAGS ........................ yes
Using precompiled headers .............. no
Using LTCG ............................. no
Target compiler supports:
NEON ................................. yes
Build parts ............................ libs
…
OpenGL:
Desktop OpenGL ....................... no
OpenGL ES 2.0 ........................ yes
OpenGL ES 3.0 ........................ yes
OpenGL ES 3.1 ........................ no
OpenGL ES 3.2 ........................ no
…
X11 specific:
XLib ................................. yes
XCB Xlib ............................. yes
EGL on X11 ........................... yes
…
makeを実行してコンパイルします。全体のコンパイルには長時間かかるため、まずはqtbaseのコンポーネントを別個にコンパイルするようにします。コンパイルが成功したら、完全なコンパイルを行えば効率的です。# compile qt-base
$ make module-qtbase
# compile all components
$ make
makeがエラーなしで成功したら、make installを実行してインストールします。インストールディレクトリは、上記のbuild_configure.shスクリプトの-prefixパラメーターによって定義されます。例えば、これは${SDKTARGETSYSROOT}/usr/local/Qt-5.12.4にあります。$ make install
インストールが成功したら、Apalis i.MX6システムへの導入とテスト用にQtコンパイル出力ディレクトリをパッケージ化してアップロードします。# pack Qt related outputs
$ cd ${SDKTARGETSYSROOT}/usr/local/
$ tar cvf Qt-5.12.4.tar.bz2 Qt-5.12.4/
# scp tar package to Apalis iMX6 Linux $HOME
$ scp Qt-5.12.4.tar.bz2 root@apalis_imx6_ipaddress:/home/root
Qt5.12導入テスト
まず、Qt5.12関連ファイルをApalis i.MX6 Linux /optディレクトリに導入します。
root@apalis-imx6$ cd /opt
root@apalis-imx6$ tar xvf ~/ Qt-5.12.4.tar.bz2
アプリケーションのテストの準備が終わったら、次の2つのQt WidgetとQt Quickアプリケーションを使ってテストします。
- helloworldUI-Qt Widgetアプリケーション、GPIOを呼び出してLEDを稼働。詳しいコードと説明についてはこちらを参照してください。
- videotest-Qt Quickアプリケーション、QtMultimediaコンポーネントを通じてビデオ再生およびカメラ呼び出し。詳しいコードと説明については、こちらを参照してください。
Apalis i.MX6向けにコンパイルされた実行可能ファイルと上記2つのプロジェクトの必要なビデオファイルをApalis iMX6のLinuxの$HOMEにコピーします。$ scp helloworldUI videotest ready-player-one-trailer-2_h720p.mov root@apalis_imx6_ipaddress:/home/root
次のテスト用スクリプト、qttest.shをApalis i.MX6のLinux $HOMEに作成し、2つのアプリケーションを1つずつ順番にコメントアウトしてテストします。
qttest.sh - https://github.com/simonqin09/Qt5.12_source_code_compile/blob/master/qttest.sh
helloworldUIアプリケーションをテストすると、次のようにインターフェースディスプレイとGPIO制御は正常に動作し、抵抗膜方式タッチも動作します。
videotestアプリケーションをテストすると、次のようにビデオ再生とカメラキャプチャは正常に動作し、抵抗膜方式タッチも動作します。
まとめ
この記事では、Arm組み込みプラットフォームを利用した、クロスコンパイルとQt5.12ソースコード導入の例を紹介しました。