Building Qt for Qualcomm Snapdragon 8155P Board on Ubuntu

Having Green Hills INTEGRITY and Qualcomm development environments setup is a required before proceeding. See Installing Platform Dependencies.

Creating a set environment shell script

To set up the development environment for Qt for INTEGRITY, build Qt from the sources for the Qualcomm Snapdragon 8155P board. Before building Qt for INTEGRITY, set up build environment. Here a batch script to automate that, as it needs to be done before each build.

Create a new shell script setEnvironment.sh, and save it under your home folder. Add the following export commands to the script:

 export PATH=$PATH:/work/ghs/sa8155/es7/es7_dev_env/hlos_dev_boot/apps/ghs_apps_proc/comp
 export INTEGRITY_DIR=/work/ghs/sa8155/es7/es7_dev_env/hlos_dev_boot/apps/ghs_apps_proc/integrity
 export INTEGRITY_BSP=platform-sa8155
 export INTEGRITY_BUILD_TARGET=chk
 export QC_MULTIMEDIA_INC_DIR=/work/ghs/sa8155/es7/es7_dev_env/hlos_dev_boot/apps/ghs_apps_proc/qc_bsp/include/amss/multimedia
 export GL_INC_DIR=/work/ghs/sa8155/es7/es7_dev_env/hlos_dev_boot/apps/ghs_apps_proc/qc_bsp/AMSS/multimedia/graphics/include/public
 export GL_LIB_DIR=/work/ghs/sa8155/es7/es7_dev_env/hlos_dev_boot/apps/ghs_apps_proc/qc_bsp/out/rel/libs/base:/work/ghs/sa8155/es7/es7_dev_env/hlos_dev_boot/apps/ghs_apps_proc/qc_bsp/out/rel/libs/multimedia/display:/work/ghs/sa8155/es7/es7_dev_env/hlos_dev_boot/apps/ghs_apps_proc/qc_bsp/out/rel/libs/multimedia/graphics:/work/ghs/sa8155/es7/es7_dev_env/hlos_dev_boot/apps/ghs_apps_proc/qc_bsp/out/rel/libs/platform/:/work/ghs/sa8155/es7/es7_dev_env/hlos_dev_boot/apps/ghs_apps_proc/qc_bsp/AMSS/multimedia/graphics/opengl/esx/build/integrity/prebuilt/

These export paths assume you have used the /work/ghs/* installation directories while installing the MULTI IDE and INTEGRITY (see Installing Platform Dependencies). If you have not used the default directories, adjust the export paths accordingly.

To initialize your build environment, run the following command in a terminal:

 source ~/setEnvironment.sh

Note: Run this command in your terminal every time you build Qt, or use the qmake or CMake build systems.

Getting Qt sources

You can download the Qt source code from your Qt Account.

You can also get the Qt sources from the Git repo, see Getting source code.

Note: Qt sources version must be 6.2 or later.

Note: Qt modules supported by Qt for INTEGRITY are listed in Supported Qt Modules.

Building Qt Desktop for cross-compiling tools usage

The cross-compiling Qt requires a host build of Qt being available. During the build, tools such as moc, rcc, qmlcachegen, qsb, and others, are invoked from there. For more detailed information please read Cross-compiling Qt.

Run the following commands:

 mkdir hostbuild
 cd hostbuild/
 ../qt5/configure -nomake tests -nomake examples -release -prefix /work/ghs/hostbuild
 cmake --build . --parallel 6
 cmake --install .

Note: configure always uses the Ninja generator and build tool if a ninja executable is available. Ninja is cross-platform, feature-rich, performant, and recommended on all platforms. The use of other generators might work but is not officially supported.

Creating a toolchain file for INTEGRITY

To cross-compile a project with CMake, one must specify a toolchain file. This CMake-language file sets the right values for the platform name, the compiler/linker used, and a whole bunch of other toolchain-specific things. For Integrity build on Ubuntu create a toolchain.cmake file with content:

 # Copyright (C) 2022 The Qt Company Ltd.
 # SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause

 set(TARGET_ROOT_PATH "/work/ghs/sa8155/es7/es7_dev_env/hlos_dev_boot")
 set(CMAKE_BUILD_TYPE "Release")

 set(CMAKE_C_COMPILER cxintarm64)
 set(CMAKE_CXX_COMPILER cxintarm64)
 set(CMAKE_ASM_COMPILER cxintarm64)

 #generic
 set(CMAKE_SYSTEM_NAME Integrity)
 set(CMAKE_SYSTEM_PROCESSOR arm)
 set(CMAKE_CROSSCOMPILING True)

 set(EGL_FOUND True)
 set(UNIX True)

 set (CMAKE_C_COMPILE_FEATURES c_std_99)
 set (CMAKE_CXX_COMPILE_FEATURES
 cxx_alias_templates
 cxx_alignas
 cxx_alignof
 cxx_attributes
 cxx_auto_type
 cxx_constexp
 cxx_decltype
 cxx_delegating_constructors
 cxx_explicit_conversions
 cxx_extern_templates
 cxx_inheriting_constructors
 cxx_lambdas
 cxx_noexcept
 cxx_nonstatic_member_init
 cxx_nullptr
 cxx_override
 cxx_range_for
 cxx_raw_string_literals
 cxx_reference_qualified_functions
 cxx_rvalue_references
 cxx_static_assert
 cxx_std_17
 cxx_thread_local
 cxx_unicode_literals
 cxx_uniform_initialization
 cxx_unrestricted_unions
 cxx_variadic_macros
 cxx_variadic_templates)

 #graphical lib paths
 set(EGL_LIBRARY_GRAPHIC_PATH ${TARGET_ROOT_PATH}/apps/ghs_apps_proc/qc_bsp/out/chk/libs/multimedia/graphics)
 set(EGL_LIBRARY_PLATFORM_PATH ${TARGET_ROOT_PATH}/apps/ghs_apps_proc/qc_bsp/out/chk/libs/platform)
 set(EGL_LIBRARY_BASE_PATH ${TARGET_ROOT_PATH}/apps/ghs_apps_proc/qc_bsp/out/chk/libs/base)
 set(EGL_LIBRARY_CHK_PATH ${TARGET_ROOT_PATH}/apps/ghs_apps_proc/integrity/libs/arm64/chk)
 set(EGL_LIBRARY_PREBUILD_PATH ${TARGET_ROOT_PATH}/apps/ghs_apps_proc/qc_bsp/AMSS/multimedia/graphics/opengl/esx/build/integrity/prebuilt)
 set(EGL_LIBRARY_OPENWFD_PATH ${TARGET_ROOT_PATH}/apps/ghs_apps_proc/qc_bsp/out/chk/libs/multimedia/display)

 #base
 set(CMAKE_C_FLAGS  "-bsp $ENV{INTEGRITY_BSP} -os_dir $ENV{INTEGRITY_DIR} -non_shared -startfile_dir=$ENV{INTEGRITY_DIR}/libs/$ENV{INTEGRITY_BSP}/$ENV{INTEGRITY_BUILD_TARGET} --rtos_library_directory=libs/$ENV{INTEGRITY_BSP}/$ENV{INTEGRITY_BUILD_TARGET} --rtos_library_directory=libs/arm64/$ENV{INTEGRITY_BUILD_TARGET} -bigswitch -DINTEGRITY -llibposix.a")
 set(CMAKE_C_FLAGS_DEBUG "-g -Omaxdebug")
 set(CMAKE_C_FLAGS_RELEASE "-Ospeed -Olink -Omax -no_uvfd")
 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --signed_fields --diag_suppress=1,82,228,236,381,611,961,997,1795,1931,1974,3148 --c++17 --thread_local_storage --exceptions --defer_parse_function_templates")
 set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -frigor=accurate --signed_fields --no_implicit_include --link_once_templates -non_shared --new_outside_of_constructor --commons -I $ENV{QC_MULTIMEDIA_INC_DIR}")
 set(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG})
 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
 set(CMAKE_FIND_LIBRARY_PREFIXES "lib")
 set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
 set(BUILD_SHARED_LIBS OFF)
 set(QT_CFLAGS_OPTIMIZE_FULL "-Ospeed -Olink -Omax -no_uvfd")
 set(GLSLANG_OSDEP_PATH ../3rdparty/glslang/glslang/OSDependent/Unix)
 set(GL_INC_DIR ${TARGET_ROOT_PATH}/apps/ghs_apps_proc/qc_bsp/AMSS/multimedia/graphics/include/public)
 set(PKG_EGL_LIBRARY_DIRS ${TARGET_ROOT_PATH})

 set(EGL_INCLUDE_DIR ${GL_INC_DIR})
 set(EGL_LIBRARY "${EGL_LIBRARY_GRAPHIC_PATH}/libESXEGL_Adreno.a")

 set(GLESv2_INCLUDE_DIR ${GL_INC_DIR})
 set(GLESv2_LIBRARY "${EGL_LIBRARY_GRAPHIC_PATH}/libESXGLESv2_Adreno.a")

 set(IntegrityPlatformGraphics_INCLUDE_DIR ${GL_INC_DIR})
 set(IntegrityPlatformGraphics_LIBRARY "${EGL_LIBRARY_GRAPHIC_PATH}/libadreno_utils.a")
 set(IntegrityPlatformGraphics_LIBRARIES_PACK
     "${EGL_LIBRARY_BASE_PATH}/libplanedef.a"
     "${EGL_LIBRARY_BASE_PATH}/libmmosalfile.a"
     "${EGL_LIBRARY_BASE_PATH}/libOSAbstraction.a"
     "${EGL_LIBRARY_OPENWFD_PATH}/libopenwfd.a"
     "${EGL_LIBRARY_GRAPHIC_PATH}/libOSUser.a"
     "${EGL_LIBRARY_GRAPHIC_PATH}/libpanel.a"
     "${EGL_LIBRARY_GRAPHIC_PATH}/libGSLUser.a"
     "${EGL_LIBRARY_PREBUILD_PATH}/libglnext-llvm.a"
     "${EGL_LIBRARY_PLATFORM_PATH}/libpmem.a"
     "${EGL_LIBRARY_CHK_PATH}/libposix.a"
     "${EGL_LIBRARY_CHK_PATH}/libivfs.a"
 )

 list(APPEND _qt_igy_gui_libs
     "${GLESv2_LIBRARY}"
     "${IntegrityPlatformGraphics_LIBRARY}"
     "${IntegrityPlatformGraphics_LIBRARIES_PACK}")

 set(OPENGL_INCLUDE_DIR ${GL_INC_DIR})
 set(OPENGL_opengl_LIBRARY ${EGL_LIBRARY})

Configuring Qt for INTEGRITY

Configure Qt for the Qualcomm Snapdragon 8155P board using these following commands:

 cd /work/ghs/targetbuild // Path to Qt installation directory
 cmake ../qt5/ -DQT_HOST_PATH=/work/ghs/hostbuild/qtbase
 -DCMAKE_TOOLCHAIN_FILE=/work/ghs/sa8155/es7/es7_dev_env/hlos_dev_boot/apps/ghs_apps_proc/toolchain_integrity.cmake
 -DQT_QMAKE_TARGET_MKSPEC=devices/integrity-armv8-SA8155P -DBUILD_qtdoc=OFF
 -DBUILD_qttranslations=OFF -DFEATURE_printdialog=OFF --debug-trycompile -DFEATURE_dbus=OFF
 -GNinja -DUNIX=ON
 -DEGL_LIBRARY=/work/ghs/sa8155/es7/es7_dev_env/hlos_dev_boot/libeglmegapack.a
 -DEGL_INCLUDE_DIR=/work/ghs/sa8155/es7/es7_dev_env/hlos_dev_boot/apps/ghs_apps_proc/qc_bsp/AMSS/multimedia/graphics/include/public
 -DFEATURE_dnslookup=OFF -DFEATURE_glib=OFF -DFEATURE_libudev=OFF -DFEATURE_system_pcre2=OFF -DFEATURE_sql_mysql=OFF
 -DCMAKE_INSTALL_PREFIX=/work/ghs/targetbuild

Note: INTEGRITY supports only static Qt builds.

Note: QT_HOST_PATH variable introduced in Qt 6. When cross-compiling, this must be set to the install location of Qt for the host platform. It is used to locate tools to be run on the host (moc, rcc, androiddeployqt, and so on).

Building Qt for INTEGRITY

Build Qt by calling cmake in the terminal. You can run cmake with as many cores on your host machine as you desire. In our example we use six cores:

 cmake --build . --parallel 6

Installing Qt

If you have not used the configure option -prefix $PWD/qtbase in Configuring Qt, run the following commands in a terminal:

 cd <Qt installation directory>
 cmake --install .

If you have used the configure option -prefix $PWD/qtbase, you can use Qt from the build directory, without running the cmake install command.

Qt is now configured and built for the sa8155 board.