📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
ページの作成:「== 概要 == PinePhoneに搭載されているAllwinner A64 SoC(sun50iw1)は、Cortex-A53 ARM CPU(クアッドコア)とARM社のMali400 MP2 GPUを搭載している。<br> <br> A64は、基本的にAllwinner H3のCortex-A7コアをCortex-A53コアに置き換えたものである。<br> メモリマップ、クロック、割り込みのほとんどを共有しており、IPブロックも同じものを使用している。<br> <br> H3とA64の違いは以下の…」 |
細 文字列「presire220a-22」を「presire2-22」に置換 |
||
| (同じ利用者による、間の13版が非表示) | |||
| 23行目: | 23行目: | ||
顕著な例は(デバッグ用の)UART0で、H3ではPortAにあるが、A64ではPortBにある。<br> | 顕著な例は(デバッグ用の)UART0で、H3ではPortAにあるが、A64ではPortBにある。<br> | ||
H3にはPortBが無い。<br> | H3にはPortBが無い。<br> | ||
<br> | |||
PinePhoneとQtでのクロス開発は、以下に示すような手順で行う。<br> | |||
Qtはクロスプラットフォーム開発が容易になっており、また、Qt CreatorによるGUI設計ツールもあるため、開発が効率化されている。<br> | |||
ただし、PinePhoneのハードウェア固有の機能を扱う場合は、さらに注意が必要となる。<br> | |||
* 開発環境の構築 | |||
*: ホストPCにQt SDKをインストールする。Qtは、クロスプラットフォームのアプリケーション開発が可能である。 | |||
*: PinePhoneのAArch64アーキテクチャ向けのQtクロスコンパイラツールチェーンをインストールする。 | |||
*: <br> | |||
* 統合開発環境を使用してアプリケーション開発 | |||
*: Qt CreatorまたはCLionのようなIDEを使用して、UI設計やコーディングを行う。 | |||
*: シグナル / スロット、Qt Quick、QML等、Qtの機能を活用してアプリケーションを開発する。 | |||
*: <br> | |||
* クロスコンパイル | |||
*: アプリケーションのコードをPinePhoneのAArch64アーキテクチャ向けにクロスコンパイルする。 | |||
*: この時、事前にインストールしたクロスコンパイラツールチェーンを利用する。 | |||
*: <br> | |||
* PinePhoneへのデプロイ | |||
*: クロスコンパイルされたバイナリをPinePhoneに転送する。 | |||
*: PinePhoneでアプリケーションを実行して、動作確認を行う。 | |||
<br> | |||
<center> | |||
{| class="wikitable" | style="background-color:#fefefe;" | |||
|- | |||
! colspan="3" style="background-color:#44CC99;" | 参考書 | |||
|- style="text-align: center;" | |||
| <center><html><a href="https://www.amazon.co.jp/Mastering-Qt-stunning-cross-platform-applications-ebook/dp/B07DH9YK9Q?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=29KSQHSJC9DB3&keywords=Qt+5&qid=1667806384&qu=eyJxc2MiOiIwLjAwIiwicXNhIjoiMC4wMCIsInFzcCI6IjAuMDAifQ%3D%3D&sprefix=qt+5%2Caps%2C196&sr=8-1&linkCode=ll1&tag=presire2-22&linkId=2118a0260e6e51aa7f7440827dee4266&language=ja_JP&ref_=as_li_ss_tl" target="_blank"><img style="width: 250px; height: auto;" src="https://m.media-amazon.com/images/I/71ZdxoixPvL._SL1500_.jpg" ></a></html><br>[https://www.amazon.co.jp/Mastering-Qt-stunning-cross-platform-applications-ebook/dp/B07DH9YK9Q?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=29KSQHSJC9DB3&keywords=Qt+5&qid=1667806384&qu=eyJxc2MiOiIwLjAwIiwicXNhIjoiMC4wMCIsInFzcCI6IjAuMDAifQ%3D%3D&sprefix=qt+5%2Caps%2C196&sr=8-1&linkCode=ll1&tag=presire2-22&linkId=2118a0260e6e51aa7f7440827dee4266&language=ja_JP&ref_=as_li_ss_tl Mastering Qt 5<br>C++, Qt Widgets, QMLを使用したクロスプラットフォームアプリケーションの作成]</center> | |||
| <center><html><a href="https://www.amazon.co.jp/Hands-Mobile-Embedded-Development-Raspberry-ebook/dp/B07RH6QM95?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=29KSQHSJC9DB3&keywords=Qt+5&qid=1667806384&qu=eyJxc2MiOiIwLjAwIiwicXNhIjoiMC4wMCIsInFzcCI6IjAuMDAifQ%3D%3D&sprefix=qt+5%2Caps%2C196&sr=8-6&linkCode=ll1&tag=presire2-22&linkId=fabbe4470bf7cb690cadc2cf00e7af96&language=ja_JP&ref_=as_li_ss_tl" target="_blank"><img style="width: 250px; height: auto;" src="https://m.media-amazon.com/images/I/91V16o+L03L._SL1500_.jpg" ></a></html><br>[https://www.amazon.co.jp/Hands-Mobile-Embedded-Development-Raspberry-ebook/dp/B07RH6QM95?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=29KSQHSJC9DB3&keywords=Qt+5&qid=1667806384&qu=eyJxc2MiOiIwLjAwIiwicXNhIjoiMC4wMCIsInFzcCI6IjAuMDAifQ%3D%3D&sprefix=qt+5%2Caps%2C196&sr=8-6&linkCode=ll1&tag=presire2-22&linkId=fabbe4470bf7cb690cadc2cf00e7af96&language=ja_JP&ref_=as_li_ss_tl Hands-On Mobile and Embedded Development with Qt 5<br>C++/QtでAndroid, iOS, Raspberry Pi用のアプリケーションを作成]</center> | |||
| <center><html><a href="https://www.amazon.co.jp/Qt5-GUI-Programming-Cookbook-cross-platform/dp/1789803829?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=29KSQHSJC9DB3&keywords=Qt+5&qid=1667806384&qu=eyJxc2MiOiIwLjAwIiwicXNhIjoiMC4wMCIsInFzcCI6IjAuMDAifQ%3D%3D&sprefix=qt+5%2Caps%2C196&sr=8-14&linkCode=ll1&tag=presire2-22&linkId=981d01e080c07e69b683bbd3eee91fd9&language=ja_JP&ref_=as_li_ss_tl" target="_blank"><img style="width: 250px; height: auto;" src="https://m.media-amazon.com/images/I/717s6aji8ZL._SL1360_.jpg" ></a></html><br>[https://www.amazon.co.jp/Qt5-GUI-Programming-Cookbook-cross-platform/dp/1789803829?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=29KSQHSJC9DB3&keywords=Qt+5&qid=1667806384&qu=eyJxc2MiOiIwLjAwIiwicXNhIjoiMC4wMCIsInFzcCI6IjAuMDAifQ%3D%3D&sprefix=qt+5%2Caps%2C196&sr=8-14&linkCode=ll1&tag=presire2-22&linkId=981d01e080c07e69b683bbd3eee91fd9&language=ja_JP&ref_=as_li_ss_tl Qt5 C++ GUI Programming Cookbook<br>Qt5でクロスプラットフォームのアプリケーションの作成]</center> | |||
|} | |||
</center> | |||
<br><br> | <br><br> | ||
| 204行目: | 234行目: | ||
</center> | </center> | ||
<br> | <br> | ||
上表のライブラリを全てインストールする場合<br> | |||
* | * Mobianの場合 | ||
sudo apt install bluez bluez-tools libbluetooth-dev libjpeg-dev libpng-dev libtiff-dev libmng-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev \ | |||
libx264-dev libx265-dev \ | |||
libgstreamer1.0-dev libgstreamermm-1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev libopenal-dev libsndio-dev libwayland-dev \ | |||
unixodbc-dev libsqlite3-dev libcups2-dev \ | |||
libx11-dev libxcb1-dev libxext-dev libxi-dev libxcomposite-dev libxcursor-dev libxtst-dev libxrandr-dev libx11-xcb-dev libxext-dev \ | |||
libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev \ | |||
libxcb-sync-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-util0-dev libxcb-xinerama0-dev libxcb-xkb-dev \ | |||
libxkbcommon-dev libxkbcommon-x11-dev \ | |||
flex bison gperf libre2-dev libnss3-dev libdrm-dev \ | |||
libxml2-dev libxslt1-dev libminizip-dev libjsoncpp-dev liblcms2-dev libevent-dev libprotobuf-dev protobuf-compiler libopus-dev libvpx-dev \ | |||
libatspi2.0-dev libsctp1 libsctp-dev | |||
<br> | |||
* | * Manjaro ARMの場合 | ||
sudo pacman -S --needed bluez bluez-libs openjpeg2 libjpeg-turbo libpng libtiff libmng \ | |||
gstreamer gstreamermm gst-plugins-base gst-plugins-base-libs gst-plugins-good gst-plugins-bad gst-plugins-bad-libs gst-plugins-ugly \ | |||
gst-libav gst-plugin-wpe gst-plugin-pipewire gst-plugin-gtk qt-gstreamer gst-plugin-qmlgl gst-plugin-opencv \ | |||
alsa-lib pulseaudio-alsa openal flite \ | |||
libserialport sensorfw unixodbc sqlite libcups xorg-xwayland flex bison gperf readline nss libdrm libxml2 libxml++ libxslt \ | |||
minizip jsoncpp lcms2 libevent protobuf protobuf-c opus libvpx at-spi2-core at-spi2-atk lksctp-tools | |||
<br> | <br> | ||
次のセクションにおいて、rsyncコマンドを使用してLinux PCとPinePhoneのファイルを同期する。<br> | 次のセクションにおいて、rsyncコマンドを使用してLinux PCとPinePhoneのファイルを同期する。<br> | ||
| 242行目: | 274行目: | ||
~/Program/Qt_Embedded/sysroot/usr/share | ~/Program/Qt_Embedded/sysroot/usr/share | ||
<br> | <br> | ||
<code>rsync</code> | <code>rsync</code>コマンドを使用して、PinePhoneに存在するいくつかのディレクトリから、ファイルをダウンロードする。<br> | ||
rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" <PinePhoneのユーザ名>@<PinePhoneのホスト名またはIPアドレス>:/lib ~/Program/Qt_Embedded/sysroot | rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" <PinePhoneのユーザ名>@<PinePhoneのホスト名またはIPアドレス>:/lib ~/Program/Qt_Embedded/sysroot | ||
rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" <PinePhoneのユーザ名>@<PinePhoneのホスト名またはIPアドレス>:/usr/include ~/Program/Qt_Embedded/sysroot/usr | rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" <PinePhoneのユーザ名>@<PinePhoneのホスト名またはIPアドレス>:/usr/include ~/Program/Qt_Embedded/sysroot/usr | ||
| 351行目: | 383行目: | ||
== Qtのビルド == | == Qtのビルド == | ||
==== GCC 11以降を使用する場合 ==== | ==== GCC 11以降を使用する場合 ==== | ||
GCC 11以降のツールチェーンを使用する場合、Qt 5. | GCC 11以降のツールチェーンを使用する場合、Qt 5.15のビルド時において、以下に示すエラーが発生する場合がある。<br> | ||
error: 'numeric_limits' is not a member of 'std' static_cast<quint16>(numbers.size()) : std::numeric_limits<quint16>::max(); | error: 'numeric_limits' is not a member of 'std' static_cast<quint16>(numbers.size()) : std::numeric_limits<quint16>::max(); | ||
| 382行目: | 414行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
==== GCC 13を使用する場合 ==== | ==== GCC 13を使用する場合 ==== | ||
GCC 13を使用する場合、QtLocationのビルドにおいて、以下に示すようなビルドエラーが出力される場合がある。<br> | GCC 13を使用する場合、QtLocationのビルドにおいて、以下に示すようなビルドエラーが出力される場合がある。<br> | ||
| 553行目: | 586行目: | ||
# /etc/ld.so.conf.d/00-Qt_5_x_x.confファイルに設定した場合 | # /etc/ld.so.conf.d/00-Qt_5_x_x.confファイルに設定した場合 | ||
sudo ldconfig | sudo ldconfig | ||
<br> | <br><br> | ||
== Qtライブラリの設定 == | |||
さらに、PinePhoneの~/.profileファイルまたは~/.bashrcファイルに、以下の設定を追記する。<br> | さらに、PinePhoneの~/.profileファイルまたは~/.bashrcファイルに、以下の設定を追記する。<br> | ||
# Enable Qt Debug | # Enable Qt Debug | ||
| 569行目: | 603行目: | ||
export QT_QPA_PLATFORM_PLUGIN_PATH="/home/<PinePhoneのユーザ名>/InstallSoftware/Qt_5_x_x/plugins/platforms" | export QT_QPA_PLATFORM_PLUGIN_PATH="/home/<PinePhoneのユーザ名>/InstallSoftware/Qt_5_x_x/plugins/platforms" | ||
export QML_IMPORT_TRACE=1 | export QML_IMPORT_TRACE=1 | ||
<br> | <br><br> | ||
== Qt Creatorの設定 == | |||
次に、Qt Creatorでソフトウェアを開発する時の環境設定を行う。<br> | 次に、Qt Creatorでソフトウェアを開発する時の環境設定を行う。<br> | ||
<br> | <br> | ||
| 672行目: | 707行目: | ||
<br><br> | <br><br> | ||
== PinePhone向けソフトウェアの設計 == | |||
PinePhone向けソフトウェアのUIをデザインする場合、375x812[px]のウィンドウサイズで動作するように指定する。<br> | |||
これは、PhoshシェルでPinephoneに表示されるソフトウェアのサイズである。(2倍の拡大率で700x1200[px]の解像度まで)<br> | |||
<br> | |||
また、画面を横向きする場合は、812x375[px]に反転させる。<br> | |||
<br><br> | |||
== CLion / Qt 5との連携 == | |||
==== CMakeツールチェーンファイルの作成 ==== | |||
任意のディレクトリにCMakeツールチェーンファイルの作成する。<br> | |||
vi /<任意のディレクトリ>/ToolChain_for_PinePhone.cmake | |||
<br> | |||
<syntaxhighlight lang="cmake"> | |||
# /<任意のディレクトリ>/ToolChain_for_PinePhone.cmakeファイル | |||
cmake_minimum_required(VERSION 3.18) | |||
include_guard(GLOBAL) | |||
set(CMAKE_SYSTEM_NAME Linux) | |||
set(CMAKE_SYSTEM_PROCESSOR arm) | |||
set(TARGET_SYSROOT <PinePhoneのシステムルートディレクトリ>) | |||
set(CMAKE_SYSROOT ${TARGET_SYSROOT}) | |||
set(ENV{PKG_CONFIG_PATH} $PKG_CONFIG_PATH:${TARGET_SYSROOT}/usr/lib/pkgconfig:${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig) | |||
set(ENV{PKG_CONFIG_LIBDIR} /usr/lib64/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig/:${TARGET_SYSROOT}/usr/lib/pkgconfig:${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig:${TARGET_SYSROOT}/usr/share/pkgconfig) | |||
set(ENV{PKG_CONFIG_SYSROOT_DIR} ${CMAKE_SYSROOT}) | |||
set(CMAKE_C_COMPILER /<GCCツールチェーンのインストールディレクトリ>/bin/aarch64-linux-gnu-gcc) | |||
set(CMAKE_CXX_COMPILER /<GCCツールチェーンのインストールディレクトリ>/bin/aarch64-linux-gnu-g++) | |||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${TARGET_SYSROOT}/usr/include -I${TARGET_SYSROOT}/usr/include/aarch64-linux-gnu") | |||
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}") | |||
set(CMAKE_EXE_LINKER_FLAGS_INIT "-Wl,-rpath-link,${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu") | |||
set(CMAKE_MODULE_LINKER_FLAGS_INIT "-Wl,-rpath-link,${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu") | |||
set(CMAKE_SHARED_LINKER_FLAGS_INIT "-Wl,-rpath-link,${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu") | |||
# PinePhoneの場合 | |||
set(QT_COMPILER_FLAGS "-march=armv8-a -mtune=cortex-a53") | |||
set(QT_COMPILER_FLAGS_RELEASE "-O2 -pipe") | |||
set(QT_LINKER_FLAGS "-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed") | |||
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) | |||
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) | |||
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) | |||
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) | |||
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) | |||
set(CMAKE_BUILD_RPATH ${TARGET_SYSROOT}) | |||
set(XCB_PATH_VARIABLE ${TARGET_SYSROOT}) | |||
set(GL_INC_DIR ${TARGET_SYSROOT}/usr/include) | |||
set(GL_LIB_DIR ${TARGET_SYSROOT}:${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/:${TARGET_SYSROOT}/usr:${TARGET_SYSROOT}/usr/lib) | |||
set(EGL_INCLUDE_DIR ${GL_INC_DIR}) | |||
set(EGL_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/aarch64-linux-gnu/libEGL.so) | |||
set(OPENGL_INCLUDE_DIR ${GL_INC_DIR}) | |||
set(OPENGL_opengl_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/aarch64-linux-gnu/libOpenGL.so) | |||
set(GLESv2_INCLUDE_DIR ${GL_INC_DIR}) | |||
set(GLIB_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/aarch64-linux-gnu/libGLESv2.so) | |||
set(GLESv2_INCLUDE_DIR ${GL_INC_DIR}) | |||
set(GLESv2_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/aarch64-linux-gnu/libGLESv2.so) | |||
set(gbm_INCLUDE_DIR ${GL_INC_DIR}) | |||
set(gbm_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/aarch64-linux-gnu/libgbm.so) | |||
set(Libdrm_INCLUDE_DIR ${GL_INC_DIR}) | |||
set(Libdrm_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/aarch64-linux-gnu/libdrm.so) | |||
set(XCB_XCB_INCLUDE_DIR ${GL_INC_DIR}) | |||
set(XCB_XCB_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/aarch64-linux-gnu/libxcb.so) | |||
</syntaxhighlight> | |||
<br> | |||
==== Qt 5向けCMakeツールチェーン設定ファイルの作成 ==== | |||
PinePhone向けのQt 5ライブラリのインストールディレクトリ内のlib/cmake/Qt5ディレクトリにCMakeツールチェーン設定ファイルの作成する。<br> | |||
vi /<Qt 5ライブラリのインストールディレクトリ>lib/cmake/Qt5/qt.toolchain.cmake | |||
<br> | |||
<syntaxhighlight lang="cmake"> | |||
# /<Qt 5ライブラリのインストールディレクトリ>lib/cmake/Qt5/qt.toolchain.cmakeファイル | |||
set(__qt_toolchain_used_variables | |||
QT_CHAINLOAD_TOOLCHAIN_FILE | |||
QT_TOOLCHAIN_INCLUDE_FILE | |||
QT_TOOLCHAIN_RELOCATABLE_CMAKE_DIR | |||
QT_TOOLCHAIN_RELOCATABLE_PREFIX | |||
QT_ADDITIONAL_PACKAGES_PREFIX_PATH | |||
) | |||
list(APPEND CMAKE_TRY_COMPILE_PLATFORM_VARIABLES ${__qt_toolchain_used_variables}) | |||
list(REMOVE_DUPLICATES CMAKE_TRY_COMPILE_PLATFORM_VARIABLES) | |||
if($ENV{_QT_TOOLCHAIN_VARS_INITIALIZED}) | |||
foreach(var ${__qt_toolchain_used_variables}) | |||
set(${var} "$ENV{_QT_TOOLCHAIN_${var}}") | |||
endforeach() | |||
endif() | |||
set(__qt_initially_configured_toolchain_file "<PinePhone向けCMakeツールチェーンファイルのパス>") | |||
set(__qt_chainload_toolchain_file "${__qt_initially_configured_toolchain_file}") | |||
if(NOT QT_QMAKE_TARGET_MKSPEC) | |||
set(QT_QMAKE_TARGET_MKSPEC <Qt 5のクロスコンパイルで使用したPinePhone向けデバイス定義ファイルのパス> CACHE STRING "") | |||
endif() | |||
if(NOT "${QT_CHAINLOAD_TOOLCHAIN_FILE}" STREQUAL "") | |||
set(__qt_chainload_toolchain_file "${QT_CHAINLOAD_TOOLCHAIN_FILE}") | |||
endif() | |||
if(__qt_chainload_toolchain_file) | |||
get_filename_component(__qt_chainload_toolchain_file_real_path | |||
"${__qt_chainload_toolchain_file}" REALPATH) | |||
if(__qt_chainload_toolchain_file_real_path STREQUAL CMAKE_CURRENT_LIST_FILE) | |||
message(FATAL_ERROR | |||
"Woah, the Qt toolchain file tried to include itself recursively! '${__qt_chainload_toolchain_file}' " | |||
"Make sure to remove qtbase/CMakeCache.txt and reconfigure qtbase with 'cmake' " | |||
"rather than 'qt-cmake', and then you can reconfigure your own project." | |||
) | |||
elseif(NOT EXISTS "${__qt_chainload_toolchain_file_real_path}") | |||
message(WARNING "The toolchain file to be chainloaded " | |||
"'${__qt_chainload_toolchain_file}' does not exist.") | |||
else() | |||
include("${__qt_chainload_toolchain_file}") | |||
set(__qt_chainload_toolchain_file_included TRUE) | |||
endif() | |||
unset(__qt_chainload_toolchain_file) | |||
endif() | |||
get_filename_component(QT_TOOLCHAIN_RELOCATABLE_INSTALL_PREFIX ${CMAKE_CURRENT_LIST_DIR}/../../../ ABSOLUTE) | |||
get_filename_component(QT_TOOLCHAIN_RELOCATABLE_CMAKE_DIR "${CMAKE_CURRENT_LIST_DIR}/.." ABSOLUTE) | |||
list(PREPEND CMAKE_PREFIX_PATH "${QT_TOOLCHAIN_RELOCATABLE_CMAKE_DIR}") | |||
list(PREPEND CMAKE_FIND_ROOT_PATH "${QT_TOOLCHAIN_RELOCATABLE_INSTALL_PREFIX}") | |||
if(NOT QT_AVOID_CUSTOM_PLATFORM_MODULES) | |||
list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/platforms") | |||
endif() | |||
set(__qt_toolchain_additional_packages_prefixes "") | |||
if(QT_ADDITIONAL_PACKAGES_PREFIX_PATH) | |||
list(APPEND __qt_toolchain_additional_packages_prefixes ${QT_ADDITIONAL_PACKAGES_PREFIX_PATH}) | |||
endif() | |||
if(DEFINED ENV{QT_ADDITIONAL_PACKAGES_PREFIX_PATH} AND NOT "$ENV{QT_ADDITIONAL_PACKAGES_PREFIX_PATH}" STREQUAL "") | |||
set(__qt_env_additional_packages_prefixes $ENV{QT_ADDITIONAL_PACKAGES_PREFIX_PATH}) | |||
if(NOT CMAKE_HOST_WIN32) | |||
string(REPLACE ":" ";" __qt_env_additional_packages_prefixes | |||
"${__qt_env_additional_packages_prefixes}") | |||
endif() | |||
list(APPEND __qt_toolchain_additional_packages_prefixes ${__qt_env_additional_packages_prefixes}) | |||
unset(__qt_env_additional_packages_prefixes) | |||
endif() | |||
if(__qt_toolchain_additional_packages_prefixes) | |||
set(__qt_toolchain_additional_packages_root_paths "") | |||
set(__qt_toolchain_additional_packages_prefix_paths "") | |||
foreach(__qt_additional_path IN LISTS __qt_toolchain_additional_packages_prefixes) | |||
file(TO_CMAKE_PATH "${__qt_additional_path}" __qt_additional_path) | |||
get_filename_component(__qt_additional_path "${__qt_additional_path}" ABSOLUTE) | |||
set(__qt_additional_path_lib_cmake "${__qt_additional_path}") | |||
if(NOT __qt_additional_path_lib_cmake MATCHES "/lib/cmake$") | |||
string(APPEND __qt_additional_path_lib_cmake "/lib/cmake") | |||
endif() | |||
list(APPEND __qt_toolchain_additional_packages_root_paths "${__qt_additional_path}") | |||
list(APPEND __qt_toolchain_additional_packages_prefix_paths "${__qt_additional_path_lib_cmake}") | |||
endforeach() | |||
list(PREPEND CMAKE_PREFIX_PATH ${__qt_toolchain_additional_packages_prefix_paths}) | |||
list(PREPEND CMAKE_FIND_ROOT_PATH ${__qt_toolchain_additional_packages_root_paths}) | |||
unset(__qt_additional_path) | |||
unset(__qt_additional_path_lib_cmake) | |||
unset(__qt_toolchain_additional_packages_root_paths) | |||
unset(__qt_toolchain_additional_packages_prefix_paths) | |||
endif() | |||
unset(__qt_toolchain_additional_packages_prefixes) | |||
set(__qt_toolchain_extra_file "${CMAKE_CURRENT_LIST_DIR}/qt.toolchain.extra.cmake") | |||
if(EXISTS "${__qt_toolchain_extra_file}") | |||
include("${__qt_toolchain_extra_file}") | |||
endif() | |||
if(QT_TOOLCHAIN_INCLUDE_FILE) | |||
get_filename_component(__qt_toolchain_include_file_real_path "${QT_TOOLCHAIN_INCLUDE_FILE}" REALPATH) | |||
if(EXISTS "${__qt_toolchain_include_file_real_path}") | |||
include("${__qt_toolchain_include_file_real_path}") | |||
else() | |||
message(WARNING "The passed extra toolchain file to be included does not exist: " "${__qt_toolchain_include_file_real_path}") | |||
endif() | |||
endif() | |||
if(DEFINED CACHE{CMAKE_BUILD_TYPE}) | |||
set(__qt_toolchain_cmake_build_type_before_project_call "${CMAKE_BUILD_TYPE}") | |||
endif() | |||
if(NOT "$ENV{_QT_TOOLCHAIN_VARS_INITIALIZED}") | |||
set(ENV{_QT_TOOLCHAIN_VARS_INITIALIZED} ON) | |||
foreach(var ${__qt_toolchain_used_variables}) | |||
set(ENV{_QT_TOOLCHAIN_${var}} "${${var}}") | |||
endforeach() | |||
endif() | |||
</syntaxhighlight> | |||
<br> | |||
==== ツールチェーンの設定 ==== | |||
[ファイル]メニューバー - [設定]を選択する。<br> | |||
[設定]画面の左ペインにある[ビルド、実行、デプロイ] - [ツールチェーン]を選択する。<br> | |||
[設定]画面の右ペインにある[+]アイコンを選択して、[システム]を選択する。<br> | |||
<br> | |||
* ツールチェーンの設定項目 | |||
** [名前] | |||
**: 任意の名前を入力する。 | |||
** [CMake:] | |||
**: PinePhone向けQtライブラリのビルドに使用したCMakeファイルのパスを入力する。 | |||
** [ビルドツール:] | |||
**: PinePhone向けQtライブラリのビルドに使用したNinjaファイルのパスを入力する。 | |||
** [C コンパイラー:] | |||
**: PinePhone向けQtライブラリのビルドに使用したGCCファイルのパスを入力する。 | |||
**: 例: /<GCCツールチェーンのインストールディレクトリ>/bin/aarch64-linux-gnu-gcc | |||
** [C++ コンパイラー:] | |||
**: PinePhone向けQtライブラリのビルドに使用したG++ファイルのパスを入力する。 | |||
**: 例: /<GCCツールチェーンのインストールディレクトリ>/bin/aarch64-linux-gnu-g++ | |||
** [デバッガー:] | |||
**: GCCツールチェーンのGDBファイルのパスを入力する。 | |||
**: 例: /<GCCツールチェーンのインストールディレクトリ>/bin/aarch64-linux-gnu-gdb | |||
<br> | |||
[設定]画面の右ペイン下部にある[適用]ボタンを押下する。<br> | |||
<br> | |||
==== CMakeの設定 ==== | |||
[ファイル]メニューバー - [設定]を選択する。<br> | |||
[設定]画面の左ペインにある[ビルド、実行、デプロイ] - [CMake]を選択する。<br> | |||
[設定]画面の右ペインにある[+]アイコンを選択する。<br> | |||
<br> | |||
* CMakeの設定項目 | |||
** [名前] | |||
**: 任意の名前を入力する。 | |||
** [ビルドタイプ:]プルダウン | |||
**: [Debug]または[Release]を選択する。 | |||
** [ツールチェーン:]プルダウン | |||
**: 上記で設定したツールチェーン名を選択する。 | |||
** [ジェネレーター:]プルダウン | |||
**: [デフォルトを使用する]を選択する。 | |||
**: 例: /<GCCツールチェーンのインストールディレクトリ>/bin/aarch64-linux-gnu-gcc | |||
** [環境:]<br>[環境:]のテキストアイコンを選択して、[環境設定]画面を開く。<br>画面右上の[+]ボタンを押下して、各環境変数を設定する。 | |||
*** CMAKE_C_COMPILER | |||
***: PinePhone向けQtライブラリのビルドに使用したGCCファイルのパスを入力する。 | |||
***: 例: /<GCCツールチェーンのインストールディレクトリ>/bin/aarch64-linux-gnu-gcc | |||
*** CMAKE_CXX_COMPILER | |||
***: PinePhone向けQtライブラリのビルドに使用したG++ファイルのパスを入力する。 | |||
***: 例: /<GCCツールチェーンのインストールディレクトリ>/bin/aarch64-linux-gnu-g++ | |||
*** CMAKE_PREFIX_PATH | |||
***: PinePhone向けQtライブラリのインストールディレクトリのパスを入力する。 | |||
***: 例: <PinePhone向けQtライブラリのインストールディレクトリ> | |||
*** CMAKE_TOOLCHAIN_FILE | |||
***: PinePhone向けQtライブラリのインストールディレクトリにあるビルド向けツールチェーンファイルのパスを入力する。 | |||
***: 例: /<PinePhone向けQtライブラリのインストールディレクトリ>/lib/cmake/Qt5/qt.toolchain.cmake | |||
*** QT_QMAKE_EXECUTABLE | |||
***: PinePhone向けQtライブラリのインストールディレクトリにあるqmakeファイルのパスを入力する。 | |||
***: 例: /<PinePhone向けQtライブラリのインストールディレクトリ>/bin/qmake-host | |||
<br> | |||
[設定]画面の右ペイン下部にある[適用]ボタンを押下する。<br> | |||
<br> | |||
==== SSHの設定 ==== | |||
[ファイル]メニューバー - [設定]を選択する。<br> | |||
[設定]画面の左ペインにある[ツール] - [SSH 構成]を選択する。<br> | |||
[設定]画面の右ペインにある[+]アイコンを選択する。<br> | |||
<br> | |||
* SSH構成の設定項目 | |||
** [ホスト:] | |||
**: PinePhoneのIPアドレスまたはホスト名を入力する。 | |||
** [ユーザー名:] | |||
**: PinePhoneのユーザ名を入力する。 | |||
** [認証タイプ:]プルダウン | |||
**: [パスワード]または[キーペア]を選択する。 | |||
** [秘密鍵ファイル:] (キーペアを選択した場合) | |||
**: 秘密鍵ファイルのパスを入力する。 | |||
** [パスフレーズ:] (キーペアを選択した場合、かつ、パスフレーズを設定した場合) | |||
**: 秘密鍵のパスフレーズを入力する。 | |||
** [構成ファイル ~/.ssh/configの構文解析]チェックボックス | |||
**: 任意 | |||
<br> | |||
[接続テスト]ボタンを押下して、PinePhoneにSSH接続する。<br> | |||
<br> | |||
[設定]画面の右ペイン右下にある[適用]ボタンを押下する。<br> | |||
<br> | |||
==== 各プロジェクトの設定 ==== | |||
CLionを起動して、[ファイル]メニューバー - [新規] - [プロジェクト...]を選択する。<br> | |||
[新規プロジェクト]画面から、[Qt Console 実行可能ファイル]または[Qt Widgets 実行可能ファイル]を選択する。<br> | |||
<br> | |||
新規プロジェクトの作成後、[実行]メニューバー - [実行構成の編集...]を選択する。<br> | |||
[実行/デバッグ構成]画面が開くので、画面左上にある[+]ボタンを押下して、[リモート GDB サーバー]を選択する。<br> | |||
画面左ペインに[リモート GDB サーバー]が追加される。<br> | |||
画面左ペインに[リモート GDB サーバー]を選択して、各種設定を行う。<br> | |||
<br> | |||
* [ターゲット:]プルダウン | |||
*: プロジェクト名を選択する。 | |||
* [実行可能ファイル:]プルダウン | |||
*: プロジェクト名を選択する。 | |||
* [GDB:]プルダウン | |||
*: 上記のツールチェーンの作成セクションで設定したGDBを選択する。 | |||
* [資格情報:]プルダウン | |||
*: 上記のSSHの設定セクションで設定したSSHを選択する。 | |||
* [実行可能ファイル...]ラジオボタン | |||
*: 任意 | |||
* [アップロードパス:] | |||
*: 実行可能バイナリが配置されるPinePhone上のディレクトリを入力する。 | |||
*: 例: /home/<PinePhoneのユーザ名>/CLion/Sample1/debug | |||
* ['target remote' ...] | |||
*: 自動的に入力される。 | |||
*: 例: <IPアドレスまたはホスト名>:1234 | |||
* [GDB サーバー引数:] | |||
*: Qt WidgetsまたはQMLを使用するプロジェクトの場合、デバッグまたは実行時において、実行可能バイナリに<code>-platform wayland</code>オプションを付加する必要がある。 | |||
*: 例: <code>:<GDBサーバのポート番号 例: 1234> /<実行可能バイナリが配置されるPinePhone上のディレクトリ>/debug/<実行バイナリのファイル名> -platform wayland</code> | |||
<br> | |||
次に、[拡張 GDB サーバーオプション]項目を設定する。<br> | |||
この設定は、PinePhoneにアップロードしたQtライブラリにおいて、デバッグまたは実行に関する設定を行う。<br> | |||
* [作業ディレクトリ:] | |||
*: 何も入力しない。 | |||
* [環境変数:]<br>[環境変数:]項目の右にあるテキストアイコンを選択する。<br>[環境変数]画面が開くので、画面左上にある[+]ボタンを押下して各種設定を入力する。 | |||
** DISPLAY | |||
**: :0 | |||
** QT_QPA_PLATFORMTHEME | |||
**: Qt 5の場合 : qt5ct | |||
** PATH | |||
**: PinePhone上のQt5ライブラリをアップロードしたbinディレクトリのパスを入力する。 | |||
**: 例: /<Qt5ライブラリをアップロードしたディレクトリ>/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games | |||
** LD_LIBRARY_PATH | |||
**: PinePhone上のQt5ライブラリをアップロードしたlibディレクトリのパスを入力する。 | |||
**: 例: /<Qt5ライブラリをアップロードしたディレクトリ>/lib:/<Qt5ライブラリをアップロードしたディレクトリ>/plugins/qmltooling | |||
** QT_PLUGIN_PATH | |||
**: /<Qt5ライブラリをアップロードしたディレクトリ>/plugins | |||
** QT_QPA_PLATFORM_PLUGIN_PATH | |||
**: /<Qt5ライブラリをアップロードしたディレクトリ>/plugins/platforms | |||
** QML_IMPORT_PATH | |||
**: /<Qt5ライブラリをアップロードしたディレクトリ>/qml | |||
** QML2_IMPORT_PATH | |||
**: /<Qt5ライブラリをアップロードしたディレクトリ>/qml | |||
** QT_DEBUG_PLUGINS | |||
**: 0または1を入力する。 | |||
** LANG | |||
**: 日本語を設定する場合は、<code>ja_JP.UTF-8</code>と入力する。 | |||
<br> | |||
また、[拡張 GDB サーバーオプション]項目の設定は、プロジェクトディレクトリ内の<u>.idea/runConfigurations/<プロジェクト名>.xml</u>ファイルに保存されている。<br> | |||
このファイルを直接編集することにより、上記の設定を行うこともできる。<br> | |||
<br> | |||
CLion上で上記の設定を行うには煩雑なため、ファイルを直接編集することを推奨する。<br> | |||
cd <プロジェクトディレクトリ> | |||
vi .idea/runConfigurations/<プロジェクト名>.xml | |||
<br> | |||
<syntaxhighlight lang="xml"> | |||
<!-- .idea/runConfigurations/<プロジェクト名>.xml --> | |||
<component name="ProjectRunConfigurationManager"> | |||
<configuration ...略> | |||
<envs> | |||
<env name="DISPLAY" value=":0" /> | |||
<env name="LANG" value="ja_JP.UTF-8" /> | |||
<env name="QML2_IMPORT_PATH" value="/<Qt5ライブラリをアップロードしたディレクトリ>/qml" /> | |||
<env name="QML_IMPORT_PATH" value="/<Qt5ライブラリをアップロードしたディレクトリ>/qml" /> | |||
<env name="QT_DEBUG_PLUGINS" value="0" /> | |||
<env name="QT_PLUGIN_PATH" value="/<Qt5ライブラリをアップロードしたディレクトリ>/plugins" /> | |||
<env name="QT_QPA_PLATFORM_PLUGIN_PATH" value="/<Qt5ライブラリをアップロードしたディレクトリ>/plugins/platforms" /> | |||
<env name="QT_QPA_PLATFORMTHEME" value="Qt5ct" /> | |||
<env name="LD_LIBRARY_PATH" value="/<Qt5ライブラリをアップロードしたディレクトリ>/lib:/<Qt5ライブラリをアップロードしたディレクトリ>/plugins/qmltooling" /> | |||
<env name="PATH" value="/<Qt5ライブラリをアップロードしたディレクトリ>/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games" /> | |||
</envs> | |||
<!-- ...略 --> | |||
</configuration> | |||
</component> | |||
</syntaxhighlight> | |||
<br> | |||
==== GDBの設定 ==== | |||
プロジェクトにデバッグのためのより多くの設定が必要な場合、デバッガの初期化ファイル (GDBの場合は.gdbinit、LLDBの場合は.lldbinit) をプロジェクトディレクトリ直下に作成する。<br> | |||
このファイルは、他のプロジェクトと一緒にVCSで共有することもできる。<br> | |||
<br> | |||
一般的に、GDB / LLDBは起動時に初期化ファイルを一定の順序で読み込む。<br> | |||
まず、デバッガはユーザのホームディレクトリにある初期化ファイルを探して、次に、現在のプロジェクトディレクトリ直下にある初期化ファイルを探す。<br> | |||
<br> | |||
ただし、デフォルトの設定では、セキュリティ上の理由から、プロジェクト固有の初期化ファイルからのコマンドは実行されない。<br> | |||
そのため、ホームディレクトリの初期化ファイルである<u>~/.gdbinit</u>ファイルまたは<u>~/.lldbinit</u>ファイルを、以下に示すように編集する。<br> | |||
vi ~/.gdbinit または vi ~/.lldbinit | |||
<br> | |||
<syntaxhighlight lang="sh"> | |||
# ~/.gdbinitファイル または ~/.lldbinitファイル | |||
set auto-load safe-path / | |||
# または | |||
set auto-load local-gdbinit on | |||
add-auto-load-safe-path / | |||
</syntaxhighlight> | |||
<br> | |||
次に、プロジェクトディレクトリの直下に.gdbinitファイルを作成する。<br> | |||
cd <プロジェクトディレクトリ> | |||
vi .gdbinit または vi .lldbinit | |||
<br> | |||
<syntaxhighlight lang="sh"> | |||
# /<プロジェクトディレクトリ>/.gdbinitファイル または /<プロジェクトディレクトリ>/.lldbinitファイル | |||
set sysroot <PinePhoneのシステムルートディレクトリ> | |||
</syntaxhighlight> | |||
<br> | |||
CLionを起動して、任意のプロジェクトを開く。<br> | |||
CLionのメイン画面左にあるプロジェクトに.gdbinitファイル、または、.lldbinitファイルが追加されているかどうかを確認する。<br> | |||
<br><br> | |||
{{#seo: | |||
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki | |||
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 | |||
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux | |||
|image=/resources/assets/MochiuLogo_Single_Blue.png | |||
}} | |||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:RHEL]][[カテゴリ:SUSE]][[カテゴリ:PinePhone]][[カテゴリ:Qt]] | [[カテゴリ:RHEL]][[カテゴリ:SUSE]][[カテゴリ:PinePhone]][[カテゴリ:Qt]] | ||