VxWorks 用 Qt

Qt Companyへのお問い合わせはこちら: https://www.qt.io/contact-us/

Qt for VxWorks ライセンス

Qt for VxWorks は Qt for Device Creation Professional (DCP) ライセンスでご利用いただけます。詳細はQt Pricing を参照してください。

サポートされるアーキテクチャと VxWorks リリース

Qt 6.8 は VxWorks 24.03 で検証済みです。

サポートされているアーキテクチャ

  • ARM-v7 - BD-SL-i.MX6 でテスト済み。使用 BSP:fsl_imx6
  • x86_64-Intel製NUC6i3SYHでテスト済み。使用した BSP: itl_generic

それ以降の Qt リリースに興味がある場合は、Qt プロフェッショナルサービスにお問い合わせください。

VxWorks の要件

Qt ウィジェットアプリケーション

  • POSIX サポート
  • C++17 サポート

Qt Quick 2 アプリケーション

Qt Widgets アプリケーションに必要なすべての機能、および以下の機能:

  • OpenGL ES 2.0 用 GPU デバイス (GPUDEV)

サポートされるモジュール

ほとんどのQt 必須モジュールといくつかのアドオンモジュールがサポートされています。

サポートされている必須モジュール

Qt モジュールサポートされる機能備考
Qt CoreQProcess をサポートしていません。QLocalSocketQLocalServer は SOCK_SEQPACKET のみをサポートしています。
Qt GUI
Qt ネットワーク
Qt Qml
Qt Quick
Qt Quick コントロール
Qt Quick ダイアログ
Qt クイックレイアウト
Qt Quick テスト
Qt テスト
Qt ウィジェット

対応アドオン

Note: configure ツールを実行する際に -skip <module> オプションを指定することで、サポートされていないモジュールや使用されていないモジュールをビルドから明示的に除外することができます。

プラットフォーム

Qt 5.0 のリリースにより、Qt は独自のウィンドウシステム実装を含まなくなりました:QWS はもはやサポートされたプラットフォームではありません。シングルプロセスで使用する場合は、Qt Platform Abstractionが優れたソリューションです。

VxWorksで使えるプラグインが1つあります:EGLFSです。このプラグインを使用できるかどうかは、Qtの設定に依存します。

特定のデバイス用に設定する

VxWorks SDKをインストールし、インストーラとVxWorksイメージのビルドに必要なWindRiverライセンスを取得して環境を準備します。https://gallery.windriver.com/portal/products}から適切なインストーラを検索してください。

特定のデバイス用に Qt をビルドするには、コンパイルホスト、ツールチェーン、および sysroot 用に Qt 6 をインストールする必要があります。さらに、デバイスによっては、EGL および OpenGL 2.0 サポートのためにベンダー固有のアダプテーションコードが必要です。

VxWorks イメージの要件

Qt for VxWorks では、Qt をコンパイルして正しく動作させるために、特定の VxWorks イメージバンドルとコンポーネントをベースソフトウェアに組み込む必要があります。このリストは、ハードウェア、ソフトウェア、およびプロジェクトのシステム要件に依存するため、決して完全ではありません。しかし、以下の表には、特定の機能(タッチスクリーンのサポートを含む)を動作させるために必須であるものが含まれています。また、これらはVxWorksのバージョンによって変更される可能性があることに注意してください。

fsl_imx6 および itl_generic BSP の VSB 設定例

Qtを正しく動作させるには、VSBに以下の機能を追加する必要があります。詳細はWindRiver VxWorks Documentationを参照してください。

機能備考
DSI_DSI_KERNEL
IPNET_COREIP
IPNET_DHCPC
SDMMC_DEVICE
SDMMC_HOST
SDMMC_SDHC
SDMMC_STORAGE
SERVICE_UN
SOCKET
USB_EHCI
USB_KEYBOARD
USB_MOUSE
USB_STORAGE
USB_TOUCHSCREEN
EVDEV
EVDEV_LIB
EVDEV_TI_TSC2004_TS
EVDEV_EETI_EXC7200_TS
AUDIO
GPUDEV_FSLVIVGPUfsl_imx6専用
HASH
OPENSSL
RANDOM_ENTROPY_INJECT
IPNET_SSH
USER_MANAGEMENT
ICU
DRMitl_generic専用
ITLI915itl_generic専用
LIBDRMitl_generic指定
MESAitl_generic specific

以下の設定変数は暗黙的に追加されているので、削除する必要があります:

変数備考
_WRS_CONFIG_EVDEV_OPTIMIZED_MODE
_WRS_CONFIG_EVDEV_DISPLAY_POINT_TRANSLATE
_WRS_CONFIG_MESA_MANGLEitl_generic specific

以下の変数をコンフィグに追加する必要があります:

変数備考
_WRS_CONFIG_RTP_SSPy
_WRS_CONFIG_RTP_STACK_PROTECTORy
_WRS_CONFIG_MESA_GPUDEV_INTEL_GEN90yitl_generic specific
_WRS_CONFIG_EVDEV_COMPATIBLE_MODEyQt がタッチスクリーンで正しく動作するために必要です。

fsl_imx6およびitl_generic BSPのVIP設定例

詳細については、WindRiver VxWorksのドキュメントを参照してください。

バンドル注意事項
BUNDLE_POSIXこのバンドルは、Qt が必要とする POSIX 関連の機能との互換性のために必要です。
BUNDLE_RTP_DEPLOY
BUNDLE_RTP_DEVELOP
BUNDLE_STANDALONE_SHELL
コンポーネント注意事項
INCLUDE_TMP_DIR INCLUDE_RAM_DISK_FORMAT_HRFSQTemporaryFile を使いたい場合は、この2つのコンポーネントを含める必要があります。TMP_DIR_SIZE も適切な値に設定してください。
DRV_AUDIO_FSL_SSI
DRV_AUDIO_FSL_SGTL5000
DRV_FSL_SDHC_CTRL
DRV_IMX_SDHC_CTRL
INCLUDE_EHCI_INIT
INCLUDE_FSL_IMX6Q_SABRELITE
DRV_MMCSTORAGE_CARD
DRV_SDSTORAGE_CARD
INCLUDE_AUDIO_LIB_CORE
INCLUDE_AUDIO_LIB_WAV
INCLUDE_CUSTOM_ENTROPY_ADD
INCLUDE_DEBUG_AGENT_START
INCLUDE_DEFAULT_TIMEZONE
INCLUDE_DISK_UTIL
INCLUDE_DOSFS
INCLUDE_DSAPARAM_CMD
INCLUDE_END
INCLUDE_EVDEV_LIB_CORE
INCLUDE_EVDEV_LIB_KBD
INCLUDE_EVDEV_LIB_KBD_MAP_US
INCLUDE_EVDEV_LIB_PTR
INCLUDE_EVDEV_LIB_TS
INCLUDE_GENDSA_CMD
INCLUDE_GENRSA_CMD
INCLUDE_GETADDRINFO
INCLUDE_GETNAMEINFO
INCLUDE_HRFS
INCLUDE_HRFS_ACCESS_TIMESTAMP
INCLUDE_HRFS_FORMAT
INCLUDE_HRFS_HISPEED_WRITE_MODE
INCLUDE_IFCONFIG
INCLUDE_IO_REALPATHに必要な realpath 関数を使えるようにするために必要です。QFileInfo
INCLUDE_IPATTACH
INCLUDE_IPCOM_SYSLOGD_CMD
INCLUDE_IPCOM_SYSVAR_CMD
INCLUDE_IPCOM_USE_RAM_DISK
INCLUDE_IPCOM_USE_TIME_CMD
INCLUDE_IPDHCPC
INCLUDE_IPDNSC
INCLUDE_IPD_CMD
INCLUDE_IPFTPC
INCLUDE_IPFTP_CMD
INCLUDE_IPIFCONFIG_CMD
INCLUDE_IPNETSTAT_CMD
INCLUDE_IPNSLOOKUP_CMD
INCLUDE_IPPING_CMD
INCLUDE_IPROUTE_CMD
INCLUDE_IPTRACE_ROUTE_CMD
INCLUDE_IPWRAP_GETHOSTBYADDR
INCLUDE_IPWRAP_GETHOSTBYNAME
INCLUDE_IPWRAP_GETNAMEINFO
INCLUDE_IPWRAP_IFNAME
INCLUDE_IPWRAP_ROUTECMD
INCLUDE_MMAP
INCLUDE_PING
INCLUDE_PIPES
INCLUDE_POSIX_MAPPED_FILES
INCLUDE_POSIX_PIPES
INCLUDE_POSIX_PTHREAD_SCHEDULER
INCLUDE_POSIX_SHM
INCLUDE_RAM_DISK
INCLUDE_RAM_DISK_FORMAT_HRFS
INCLUDE_RANDOM_NUM_GEN
INCLUDE_ROMFS
INCLUDE_ROUTECMD
INCLUDE_SC_PIPE
INCLUDE_SC_POSIX_PIPE
INCLUDE_SD_BUS
INCLUDE_SECURITY
INCLUDE_SEC_KEY_STORE_CMD
INCLUDE_SHELL
INCLUDE_SSH
INCLUDE_STANDALONE_SYM_TBL
INCLUDE_STARTUP_SCRIPT
INCLUDE_TMP_DIR
INCLUDE_UN_COMP
INCLUDE_USB_GEN2_KEYBOARD
INCLUDE_USB_GEN2_MOUSE
INCLUDE_USB_GEN2_STORAGE_INIT
INCLUDE_USB_TOUCH_SCREEN
INCLUDE_USB_TOUCH_SCREEN_INIT
INCLUDE_USER_DATABASE
INCLUDE_USER_IDENTIFICATION
INCLUDE_VRFS
INCLUDE_VXBUS_SHOW
DRV_TOUCH_SCREEN_TI_TSC2004
DRV_TOUCH_SCREEN_EETI_EXC7200
INCLUDE_FBDEV_FSLIPU_0fsl_imx6 固有
INCLUDE_FBDEV_SPLASH
INCLUDE_GPUDEV_FSLVIV_APIfsl_imx6 固有
INCLUDE_GPUDEV_FSLVIV_API_INITfsl_imx6専用
INCLUDE_GPUDEV_ITLGMC_2itl_generic指定
INCLUDE_I915itl_generic specific
INCLUDE_MESA_FBDEVイトルジェネリック指定
INCLUDE_MESA_GPUDEV_DRIイットルジェネリック指定
INCLUDE_MESA_GPUDEV_DRI_I965itl_generic specific

以下のコンポーネントは暗黙的に追加されているので、削除する必要がある:

レイヤー備考
INCLUDE_FTP
INCLUDE_SHELL_SECURITY
VIPパラメータ

VxWorks上でQtを正しく実行するには、以下のパラメータを追加する必要があります:

パラメータ値の例備考
SEC_VAULT_KEY_ENCRYPTING_PW'"vxTarget"'値の例
UDB_STORAGE_PATH'"/ram/vxUserDB.txt"'
UDB_HASH_KEY'"123456789"'
UDB_HASH_KEY_LEN9前の例を参照
FSLVIV_RTP_COMMAND_BUFFER_QUEUE32arm' アーキテクチャ用
SYS_CLK_RATE100
RTP_PTHREAD_STACK_SIZE_DEFAULT262144qtquick3d のサンプルを動作させるために必要です。PTHREAD_STACK_SIZE_DEFAULT 環境変数でオーバーライドできます。
TMP_DIR_SIZE614400Qt 内部テストに合格するための最小値。
NUM_FILES300
RTP_FD_NUM_MAX300
HRFS_DEFAULT_MAX_FILES300
ITLGMC_FBDEV_RESOLUTION_2'"1024x768-32"'Xenarc 706TSA タッチスクリーンを HDMI で接続した場合の例。

VxWorks 用 Qt 6 のビルド

ホスト用 Qt 6 のビルド

Qt 6 for VxWorks をクロスビルドする場合、クロスビルドと同じソースコードを使用するホストツールを使用するのがベストプラクティスです。そのためには、まずホスト用の Qt 6 をビルドする必要がありますが、サブモジュールのサブセットを限定してビルドする必要があります:

  • qtbase
  • qtdeclarative
  • qtquick3d
  • qtshadertools

Qt 6 for host のビルドに必要な前提条件がすべて揃っていることを確認してください。詳細はBuilding Qt Sources を参照してください。

Configure スクリプトの実行

ホスト用の Qt 6 を設定、ビルド、インストールするコマンドは以下の通りです:

./configure \
    -cmake-generator "Ninja" \
    -extprefix <path/to/Qt6/host/installation/dir> \
    -submodules qtbase,qtdeclarative,qtquick3d,qtshadertools \
    -nomake tests \
    -nomake examples \
    -- \
    -B <host/build/directory>
cd <host/build/directory>
ninja
ninja install

これらのコマンドは<path_to_Qt 6_host_installation_dir> にホスト用の Qt 6 をインストールします。

ターゲット用に Qt 6 をビルドする

ビルド環境のセットアップ

configure を実行して Qt 6 をビルドする前に、コマンドプロンプトでVxWorks Development Shell を開く必要があります。

  • Linux の場合
    cd <VxWorks installation directory>
    ./wrenv.sh -p vxworks
    export WIND_CC_SYSROOT=<path to VxWorks VSB directory>
  • Windows
    cd <VxWorks installation directory>
    wrenv -p vxworks
    export WIND_CC_SYSROOT=<path to VxWorks VSB directory>

カスタムCMakeツールチェーンファイルの準備

BSP からグラフィック・ライブラリをインクルードするには、まず CMake toolchain ファイルを作成する必要があります。BD-SL-i.MX6 デバイス用の CMake toolchain ファイルの例:

# Copyright (C) 2024 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause

if(QT_VXWORKS_TOOLCHAIN_FILE)
    set(_original_toolchain_file "${QT_VXWORKS_TOOLCHAIN_FILE}")
elseif(DEFINED ENV{QT_VXWORKS_TOOLCHAIN_FILE})
    set(_original_toolchain_file "$ENV{QT_VXWORKS_TOOLCHAIN_FILE}")
else()
    message(FATAL_ERROR "QT_VXWORKS_TOOLCHAIN_FILE is not set.")
endif()

if(NOT EXISTS "${_original_toolchain_file}")
    message(FATAL_ERORR "${_original_toolchain_file} doesn't exists.")
endif()

include("${_original_toolchain_file}")
unset(_original_toolchain_file)

list(APPEND CMAKE_TRY_COMPILE_PLATFORM_VARIABLES QT_VXWORKS_TOOLCHAIN_FILE)

set(_common_lib_path "${CMAKE_SYSROOT}/usr/lib/common")
set(EGL_INCLUDE_DIR ${CMAKE_SYSROOT}/usr/h/public CACHE PATH "Path to EGL include directory" FORCE)
set(EGL_LIBRARY ${_common_lib_path}/libgfxFslVivEGL.so CACHE PATH "Path to EGL lib" FORCE)
set(GLESv2_INCLUDE_DIR ${CMAKE_SYSROOT}/usr/h/public CACHE PATH "Path to GLES include directory" FORCE)
set(GLESv2_LIBRARY ${_common_lib_path}/libgfxFslVivGLESv2.so CACHE PATH "Path to GLES lib" FORCE)

set(VxWorksPlatformGraphics_DEFINES "-D_FSLVIV")
set(VxWorksPlatformGraphics_LIBRARIES_PACK
    "${_common_lib_path}/libgfxFslVivGAL.so"
    "${_common_lib_path}/libgfxFslVivGLSLC.so"
    "${_common_lib_path}/libgfxFslVivVDK.so"
    "${_common_lib_path}/libxml.so"
)

set(VxWorksPlatformGraphics_REQUIRED_LIBRARIES
    ${VxWorksPlatformGraphics_LIBRARIES_PACK}
    ${EGL_LIBRARY}
    ${GLESv2_LIBRARY}
)
unset(_common_lib_path)

Intel NUC6i3SYH の例:

# Copyright (C) 2024 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause

if(QT_VXWORKS_TOOLCHAIN_FILE)
    set(_original_toolchain_file "${QT_VXWORKS_TOOLCHAIN_FILE}")
elseif(DEFINED ENV{QT_VXWORKS_TOOLCHAIN_FILE})
    set(_original_toolchain_file "$ENV{QT_VXWORKS_TOOLCHAIN_FILE}")
else()
    message(FATAL_ERROR "QT_VXWORKS_TOOLCHAIN_FILE is not set.")
endif()

if(NOT EXISTS "${_original_toolchain_file}")
    message(FATAL_ERORR "${_original_toolchain_file} doesn't exists.")
endif()

include("${_original_toolchain_file}")
unset(_original_toolchain_file)

list(APPEND CMAKE_TRY_COMPILE_PLATFORM_VARIABLES QT_VXWORKS_TOOLCHAIN_FILE)

set(_common_lib_path "${CMAKE_SYSROOT}/usr/lib/common")
set(EGL_INCLUDE_DIR ${CMAKE_SYSROOT}/usr/h/public CACHE PATH "Path to EGL include directory" FORCE)
set(EGL_LIBRARY ${_common_lib_path}/libgfxMesaEGL.so CACHE PATH "Path to EGL lib" FORCE)
set(GLESv2_INCLUDE_DIR ${CMAKE_SYSROOT}/usr/h/public CACHE PATH "Path to GLES include directory" FORCE)
set(GLESv2_LIBRARY ${_common_lib_path}/libgfxMesaGL.so CACHE PATH "Path to GLES lib" FORCE)

set(VxWorksPlatformGraphics_DEFINES "-D__vxworks -D__VXWORKS")
set(VxWorksPlatformGraphics_LIBRARIES_PACK
    "${_common_lib_path}/libgfxMesaSw.so"
    "${_common_lib_path}/libgfxMesa.so"
    "${_common_lib_path}/libgfxMesaDriI965.so"
    "${_common_lib_path}/libgfxLibDRM.so"
    "${_common_lib_path}/libxml.so"
)

set(VxWorksPlatformGraphics_REQUIRED_LIBRARIES
    ${VxWorksPlatformGraphics_LIBRARIES_PACK}
    ${EGL_LIBRARY}
    ${GLESv2_LIBRARY}
)
unset(_common_lib_path)

Qt 6 の実行 ターゲットの設定

以下は、BD-SL-i.MX6 のビルド設定例です。ほとんどの VxWorks ボードでは、configure コマンドは非常によく似ています。デフォルトでは、Qt 6 は共有ライブラリを使用するように設定されています。Qt 6 を静的にビルドするには、configure に-static オプションを追加します。

WIND_CC_SYSROOT}環境変数がVxWorks VSBルートディレクトリに設定されていることを確認します。

./configure \
    -cmake-generator "Ninja" \
    -icu \
    -eglfs \
    -qpa eglfs \
    -submodules "qtbase,qtdeclarative,qtmultimedia,qtquick3d,qtgraphs,qtimageformats,qtsvg,qtshadertools,qtvirtualkeyboard" \
    -- \
    -B <target/build/directory> \
    -DQT_VXWORKS_TOOLCHAIN_FILE=<path/to/BDP/toolchain.cmake> \
    -DFEATURE_vulkan=OFF \
    -DQT_QMAKE_TARGET_MKSPEC=vxworks-clang \
    -DQT_HOST_PATH=<path/to/Qt6/host/installation/dir> \
    -DCMAKE_STAGING_PREFIX:PATH=<path/to/Qt6/target/installation/dir> \
    -DCMAKE_TOOLCHAIN_FILE=<path/to/cmake/for/graphics/file/created/above> \

RTP ではなく DKM 用にビルドする場合は、-static オプションを使用し、CMAKE_TOOLCHAIN_FILE の値を次のように変更してください。"$WIND_CC_SYSROOT/mk/dkm.toolchain.cmake"

シャドウビルドを使用して Qt 6 をビルドすることをお勧めします。詳細はQt Configure Optionsを参照してください。

設定後、Qt 6 for VxWorks を以下のコマンドでビルドしてインストールしてください:

cd <host build directory>
ninja
ninja install

VxWorks デバイス用プラットフォームプラグイン

Qt for VxWorks は EGLFS プラットフォームプラグインをサポートしています。設定についてはEGLFS を参照してください。

Qtアプリケーションのビルド

Qtアプリケーションをビルドするには、QT_VXWORKS_TOOLCHAIN_FILEを環境変数またはdefineとして設定する必要があります。

clocks Qtデモのビルド例です:

export WIND_CC_SYSROOT=<path/to/VxWorks/VSB/directory>
export QT_VXWORKS_TOOLCHAIN_FILE=<path/to/the/BSP/toolchain.cmake>
<path/to/Qt6/target/installation/dir>/bin/qt-cmake -G Ninja -S ~/Qt/Examples/Qt-6.8.0/demos/clocks -B <path/to/build/directory>
cd <path/to/build/directory>
ninja

Qtアプリケーションの実行

以下の例では、共有ライブラリを使用して Qt 6 をビルドした場合のアプリケーションの起動方法を示します。静的にビルドされた Qt 6 では、Qt ライブラリ用にLD_LIBRARY_PATH 環境変数を使用する必要はありませんが、VxWorks 共有ライブラリ(例えば libc や OpenGL ES 2.0)の場所を指定する必要があります。Qt 6のスタティック・ライブラリには必要ありません。

putenv "LD_LIBRARY_PATH=/sd0:1/lib"
cd "/sd0:1"
rtpSp("<Qt 6_app>", 200, 0x100000, 0, 0x01000000)

制限事項

ビデオメモリ

Qt Quick やQOpenGLWidget のようなクラスをベースとした Qt アプリケーションを実行する前に、専用のビデオメモリが一定量しかないシステムでは特に注意が必要です。特に、高解像度(フル HD など)の画面に表示する場合、デフォルトの設定では不十分な場合があります。このような場合、予期しない方法で失敗し始めるかもしれません。したがって、少なくとも 128 MB の GPU メモリを確保することをお勧めします。GPU のために予約された固定量のメモリがないシステムでは、これは問題ではありません。

本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。