LINUX.ORG.RU

Сборка Qt для платы на i.MX6

 ,


1

3

Доброго всем дня. Возможно, я наркоман, но что я пытаюсь сделать. Я хочу собрать Qt5 для одноплатного компьютера WB-IMX6U-BW, который построен на чипе i.MX6 Dual. Изначально я хотел это сделать из-под Windows 10, но потом понял, что это сделать сложнее, поэтому поставил KUbuntu 18.04 на VirtualBox.

Ещё я нашел статью о том, как один человек собирал этот Qt5 для Rasberry Pi, и я решил сделать по аналогии. Я поправил пути, в соответствии с тем, что у меня в системе, и заменил в одном скрипте параметр

linux-rasp-pi3-g++ 
на
integrity-armv7-imx6
пробую ставить это дело на сборку, и система мне ругается, что нет g++, хотя на мой взгляд он не нужен, т.к. я собираю arm-linux-gnueabihf-g++, который лежит у меня в
/home/kirra/imx6/gcc-linaro-5.4.1-2017.05-x86_64_arm-linux-gnueabihf
вот лог

root@virtual-box:/home/kirra/imx6# ./buildQt.sh make: *** Нет правила для сборки цели «clean». Останов. + cd qtbase + /home/kirra/imx6/qt-src/qt-everywhere-src-5.14.1/qtbase/configure -top-level -debug -qt-zlib -qt-libjpeg -qt-libpng -system-xcb -opengl es2 -device integrity-armv7-imx6 -device-option CROSS_COMPILE=/home/kirra/imx6/gcc-linaro-5.4.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- -sysroot /home/kirra/imx6/curler.imx6/curler.fs/ -opensource -confirm-license -optimized-qmake -make libs -prefix /home/ubuntu/qt5 -no-pch -nomake examples -nomake tests -no-xcb -eglfs -evdev -v -skip webengine -no-use-gold-linker Performing shadow build... Preparing build tree... Creating qmake... g++ -c -o main.o -std=c++11 -ffunction-sections -fdata-sections -O2 -g -I/home/kirra/imx6/qt-src/qt-everywhere-src-5.14.1/qtbase/qmake -I/home/kirra/imx6/qt-src/qt-everywhere-src-5.14.1/qtbase/qmake/library -I/home/kirra/imx6/qt-src/qt-everywhere-src-5.14.1/qtbase/qmake/generators -I/home/kirra/imx6/qt-src/qt-everywhere-src-5.14.1/qtbase/qmake/generators/unix -I/home/kirra/imx6/qt-src/qt-everywhere-src-5.14.1/qtbase/qmake/generators/win32 -I/home/kirra/imx6/qt-src/qt-everywhere-src-5.14.1/qtbase/qmake/generators/mac -I/home/kirra/imx6/qt-src/qt-everywhere-src-5.14.1/qtbase/include -I/home/kirra/imx6/qt-src/qt-everywhere-src-5.14.1/qtbase/include/QtCore -I/home/kirra/imx6/qt-src/qt-everywhere-src-5.14.1/qtbase/include/QtCore/5.14.1 -I/home/kirra/imx6/qt-src/qt-everywhere-src-5.14.1/qtbase/include/QtCore/5.14.1/QtCore -I../src/corelib/global -I/home/kirra/imx6/qt-src/qt-everywhere-src-5.14.1/qtbase/mkspecs/linux-g++ -DQT_VERSION_STR=\«5.14.1\» -DQT_VERSION_MAJOR=5 -DQT_VERSION_MINOR=14 -DQT_VERSION_PATCH=1 -DQT_BUILD_QMAKE -DQT_BOOTSTRAPPED -DPROEVALUATOR_FULL -DQT_NO_FOREACH /home/kirra/imx6/qt-src/qt-everywhere-src-5.14.1/qtbase/qmake/main.cpp make: g++: Command not found Makefile:248: recipe for target 'main.o' failed make: *** [main.o] Error 127 root@virtual-box:/home/kirra/imx6#

вот такие использую скрипты, по аналогии как делал человек в статье

mountImage.sh

#!/bin/bash
rootdir=/home/kirra/imx6/curler.imx6;
fsdir=$rootdir/curler.fs;
image=/home/kirra/imx6/wandboard-all-ubuntu-16.04-sdcard-20171213.img;
mkdir -p $fsdir;
umount $fsdir;
mount -o loop,offset=$((24576*512)) $image $fsdir;
build_variables.sh
#!/bin/bash
export PATH_TO_CC=/home/kirra/imx6/gcc-linaro-5.4.1-2017.05-x86_64_arm-linux-gnueabihf/bin
export PATH_TO_CC_TARGET=$PATH_TO_CC/arm-linux-gnueabihf-
export CC=${PATH_TO_CC_TARGET}gcc
export CXX=${PATH_TO_CC_TARGET}g++
export AR=${PATH_TO_CC_TARGET}ar
export AS=${PATH_TO_CC_TARGET}as
export LD=${PATH_TO_CC_TARGET}ld
export RANLIB=${PATH_TO_CC_TARGET}ranlib
export READELF=${PATH_TO_CC_TARGET}readelf
export STRIP=${PATH_TO_CC_TARGET}strip
export RPI_ROOT=/home/kirra/imx6/curler.imx6/curler.fs/
export PATH_TO_QT_SOURCES=/home/kirra/imx6/qt-src/qt-everywhere-src-5.14.1
export PATH_TO_QT_RPI=/home/ubuntu/qt5
buildQt.sh
#!/bin/bash
source ./build_variables.sh
make clean -j16
BUILDPATH=/home/kirra/imx6/projects/rpi.curler/qt.shadow.build
rm -Rf $BUILDPATH 
mkdir $BUILDPATH
cd $BUILDPATH
$PATH_TO_QT_SOURCES/configure -debug -qt-zlib -qt-libjpeg -qt-libpng -system-xcb -opengl es2 -device integrity-armv7-imx6 -device-option CROSS_COMPILE=$PATH_TO_CC_TARGET -sysroot $RPI_ROOT -opensource -confirm-license -optimized-qmake -make libs -prefix $PATH_TO_QT_RPI -no-pch -nomake examples -nomake tests -no-xcb -eglfs -evdev -v -skip webengine -no-use-gold-linker
В чем может быть проблема? как я понял, при сборке система пытается использовать просто g++, а не linux-gnueabihf-g++? Очень надеюсь на вашу помощь P.S. Почему-то эта KUbuntu сильно лагает в VirtualBox...


я установил набор компиляторов arm-linux-gnueabi и сделал ссылки

sudo ln -s /usr/bin/arm-linux-gnueabi-as as
sudo ln -s /usr/bin/arm-linux-gnueabi-gcc gcc
sudo ln -s /usr/bin/arm-linux-gnueabi-g++ g++
sudo ln -s /usr/bin/arm-linux-gnueabi-ar ar

процесс сборки вроде пошел, но собирает в одном потоке, хотя я вроде указал ему ключ -j16. Когда запускал систему в VirtualBox я выделил системе 16 из 32 доступных процессорных ядер и 96ГБ оперативной памяти

kirra@virtual-box:/usr/local/bin$ free
              всего        занято        свободно      общая  буф./врем.   доступно
Память:    98896372     2393760    86361236      278556    10141376    95237980
Подкачка:     2097148           0     2097148
kirra@virtual-box:/usr/local/bin$ 
но похоже система решила не использовать эти ресурсы..

Я что-то сделал не так?

https://ibb.co/KVb5BvN

S9 ()
Последнее исправление: S9 (всего исправлений: 1)
Ответ на: комментарий от S9

Мимо проходил.

процесс сборки вроде пошел, но собирает в одном потоке, хотя я вроде указал ему ключ -j16.

У Тебя в buildQt.sh

make clean -j16

выполняется цель clean в 16 потоков и все.

Mixa ()
Последнее исправление: Mixa (всего исправлений: 1)

у тебя в скрипте нет сборки, только очистка каталогов сборки и конфигурация.

пока можно выполнить установку переменных в текущей оболочке

source ./build_variables.sh

просто руками выполнить три команды:

mkdir $BUILDPATH
cd $BUILDPATH
$PATH_TO_QT_SOURCES/configure your params

но это очень упоротый путь. лучше научись yocta http://wiki.wandboard.org/Getting_started_with_Yocto_on_Wandboard

http://wiki.wandboard.org/Building_Qt5_using_yocto_on_Wandboard

или сразу установи ubuntu https://www.wandboard.org/downloads/ и используй библиотеку qt из реп.

zudwa ()
Последнее исправление: zudwa (всего исправлений: 2)
Ответ на: комментарий от anonymous

Это, как понимаю, если я буду собирать Qt на одноплатном ПК i.MX6, а не на стацианарном ПК.

Я сейчас подумал головой, и понял, что мне надо лишь правильно вызвать .configure, чтобы он понял, что я собирают Qt для ARM, и то, что собранный Qt надо полодить в примонтированный образ. Надо понять, как это передать этому configure

S9 ()

Чёт я немного не догоняю (или много) Я установил Qt из репозитория на этот i.MX6 компьютер, Qt поставился версии 5.5.1, что вполне сойдет. Теперь, если я на Windows-ПК (или Linux-ПК в VirtualBox) хочу писать для него приложение, то делал что:

  • Добавил этот ПК в QtCreator (Tools->Option->Devices), тест прошел, написал Device test finished successfully.
  • Надо добавить Kits (Tools->Option->Build&Run, Kits), который состоит из Qt и компилятора. Добавил компилятор LinaroGCC, всё ок. С Qt Version засада, похоже нужен qmake. Этот qmake, на мой взгляд должен быть весьма упоротым, ведь он должен запускаться на x64 машине, но всякие библиотеки прилеплять от ARM. Получается, мне надо собрать этот qmake в Windows (или в Linux на VirtualBox), и добавить в этот Kits.

Пробую собрать qmake я скачиваю исходный код Qt 5.5.1 (файл qt-everywhere-opensource-src-5.1.1, взятый отсюда) Как понимаю, надо просто вызвать configure с нужными параметрами, потом make и make install Почитал документацию на Qt про этот configure https://doc.qt.io/qt-5/configure-options.html

в документации сказано, что

xplatform - the target platform. Valid xplatform options are the same as the -platform options which are found in qtbase/mkspecs

-device - a specific device or chipsets. The list of devices that configure is compatible with are found in qtbase/mkspecs/devices. For more information, visit the Devices Wiki page.

-device-option - sets additional qmake variables. For example, -device-option CROSS_COMPILE=<path-to-toolchain> provides the environment variable, CROSS_COMPILE, as needed by certain devices.
configure говорит, что нет опции -device-option и поэтому ничего не хочет делать.

и пробую сделать вот так, но это не правильно, потому, что он тогда наверное собирает этот Qt для x64, а не ARM-компилятором.

configure -xplatform linux-arm-gnueabi-g++ -confirm-license -opensource -nomake examples -nomake tests -no-dbus -opengl es2 -no-angle -static -platform win32-g++ -device linux-imx6-g++ 

Я верно понимаю, что надо мне указать каким-то образом этот пусть для ARM-компилятора -device-option CROSS_COMPILE=<путь к LinaroGCC>, и тогда конфигурация этого кода может быть выполнена успешно? Или ещё что стоит добавить?

S9 ()
Последнее исправление: S9 (всего исправлений: 1)
Ответ на: комментарий от S9

Покамест все неправильно!

Есть два пути (оба они требуют Linux хост, например с бубунтой):

  1. Использовать Yocto - оно соберет тебе весь BSP (образ всей системы). Да, времени дохрена надо потратить чтоб разобраться как и что (проще можно взять уже «готовые» скрипты boot2qt от Ку-Тешников и посмотреть, есть ли твоя борда там: https://doc.qt.io/QtForDeviceCreation/qtee-custom-embedded-linux-image.html). Я делал именно так, у нас свои борды, на базе apalis-imx6. Если у тебя что-то другое, то, возможно, придется создать свой кастомный рецепт для сборки (с особенностями твоей борды).

  2. Использовать родной RootFs образ из твоей борды и просто скомпилять Qt.

  • Для этого надо корень RootFS «слить» из борды по SSH при помощи rsync или скачать готовый образ с сайта твоей борды и распаковать его.

  • Установить на хост эмулятор ARM (qemu-static или как он там называется).

  • Чрутнуться в твой RootFS и установить туда некоторые dev пакеты, используя пакетный менеджер твоей борды (обычно pkg?). Эти пакеты будут нужны для компиляции Qt. Узнать, какие нужны - только методом проб, смотреть на ошибки тестов ./configure, путем включения/отключения ненужных модулей и фич.

  • Для кросс компиляции Qt в ./configure нужно передать три важных параметра:

  1. Таргет:

    -device linux-imx6-g++

  2. Путь к кросс-компилятору (у тебя может быть свой путь):

    -device-option CROSS_COMPILE=/…/…/…/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-

  3. Путь к RootFS твоей борды:

    -sysroot /…/…/

ЗЫ: А так, читай доки, гугли, разбирайся сам. Никто не обещал что будет легко.

kuzulis ★★ ()
Последнее исправление: kuzulis (всего исправлений: 2)
Ответ на: комментарий от kuzulis

не обязательно, никто не запрешает собирать rootfs самому без всякого Yocto/Buildroot и co

конфигурирование сборки Qt-5.12.6, собирается под mipsel, sh4 и пару arm, конечно пришлось добавить соответствующие файлы в mkspecs/devices, но они тривиальны

$(QT_BASE_CONFIGURE_RESULT): $(QT_CONFIGURE_DEPENDS) | $(QT_BASE_BUILD_DIR)
        cd $(QT_BASE_BUILD_DIR) && \
        $(QT_BUILD_ENV) \
        PKG_CONFIG_SYSROOT_DIR=$(STAGING_DIR) \
        PKG_CONFIG_LIBDIR=$(STAGING_LIB_DIR)/pkgconfig \
        $(QT_BASE_SRC_DIR)/configure -prefix $(QT_TARGET_DIR) \
                -extprefix $(QT_INSTALL_DIR) \
                -$(if $(QT_BUILD_DEBUG),debug,release) -force-debug-info -opensource \
                -confirm-license -no-accessibility -system-zlib -no-mtdev \
                -no-journald -system-libpng -system-libjpeg $(QT_USE_FREETYPE) \
                -ssl -openssl-runtime -no-libproxy -system-pcre -no-glib \
                -gui -widgets -$(if $(SILENT_BUILD),silent,verbose) \
                -no-cups -no-iconv $(QT_USE_LIBEVDEV) \
                -no-tslib -no-icu -no-fontconfig -strip -no-pch -no-ltcg -no-dbus \
                -device $(QT_CONFIG_FILE_NAME) \
                -device-option CROSS_COMPILE=$(CROSS_COMPILE) \
                -separate-debug-info -no-kms -no-gbm \
                $(QT_USE_DIRECTFB) $(QT_USE_LINUXFB) \
                -no-mirclient -no-system-proxies $(QT_OPENGL_OPT) \
                -nomake examples -no-sql-sqlite \
                $(addprefix -I , $(QT_EXTERNAL_INCLUDE_DIR)) \
                -L $(STAGING_LIB_DIR) \
                $(QT_EXTRA_CONF_OPTIONS)
imb ★★ ()
Ответ на: комментарий от S9

Тебе надо две вещи для кросс-платформенной разработки:

  1. Rootfs с библиотеками qt
  2. Sysroot с библиотеками, заголовками и qmake

Rootfs это то, что копируешь на девайс. Sysroot лежит на твоем ПК, где ведется разработка. Там лежит qmake, который надо подключить в QtCreator. И все библитеки и заголовки qmake ищет там же в sysroot

И то и то можно скомпилить с помощью Yocto. Но можно и полностью вручную - если времени много. Сперва собираешь свою кастомную sysroot Elbe или buildroot, с помощью нее скомпилировать Qt и в конце собрать rootfs для целевого девайса. Самая засада будет с поддержкой графики - нужна либо vivante, либо etnaviv. Короче лучше использую Yocto.

Для компиляции никогда не используй стандартный компилятор, который установлен в системе. Только linaro - ставь в /opt и будет тебе счастье. Иначе после очередного upgade системы может все поломаться. Чаще всего перестает работать отладчик.

Вообщем тема эта обширная с кучей подводных камней. Начини с простого типа: https://community.nxp.com/docs/DOC-94849

guskov_roman ()
Последнее исправление: guskov_roman (всего исправлений: 1)
Ответ на: комментарий от kuzulis

Итак, я почитал доки, и, похоже собрал Qt, Yocto и SDK для разработке на Linux-Host. Откорректировал файлы bblayers.conf и local.conf, получились такие

bblayers.conf

LCONF_VERSION = "7"

BBPATH = "${TOPDIR}"
BSPDIR := "${@os.path.abspath(os.path.dirname(d.getVar('FILE', True)) + '/../..')}"

BBFILES ?= ""
BBLAYERS = " \
  ${BSPDIR}/sources/poky/meta \
  ${BSPDIR}/sources/poky/meta-poky \
  \
  ${BSPDIR}/sources/meta-openembedded/meta-oe \
  ${BSPDIR}/sources/meta-openembedded/meta-python \
  \
  ${BSPDIR}/sources/meta-freescale \
  ${BSPDIR}/sources/meta-freescale-3rdparty \
  ${BSPDIR}/sources/meta-freescale-distro \
  \
  ${BSPDIR}/sources/meta-qt5 \
  ${BSPDIR}/sources/meta-openembedded/meta-multimedia \
"

local.conf

MACHINE ??= 'wandboard'
DISTRO ?= 'fslc-xwayland'
PACKAGE_CLASSES ?= 'package_deb'

SDCARD_ROOTFS = "${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.ext4"
#IMAGE_FSTYPES += "sdcard"

#IMAGE_FSTYPES = "ext4 sdcard"

EXTRA_IMAGE_FEATURES ?= "debug-tweaks"
USER_CLASSES ?= "buildstats image-mklibs image-prelink"
PATCHRESOLVE = "noop"
BB_DISKMON_DIRS ??= "\
    STOPTASKS,${TMPDIR},1G,100K \
    STOPTASKS,${DL_DIR},1G,100K \
    STOPTASKS,${SSTATE_DIR},1G,100K \
    STOPTASKS,/tmp,100M,100K \
    ABORT,${TMPDIR},100M,1K \
    ABORT,${DL_DIR},100M,1K \
    ABORT,${SSTATE_DIR},100M,1K \
    ABORT,/tmp,10M,1K"
PACKAGECONFIG_append_pn-qemu-system-native = " sdl"
CONF_VERSION = "1"

DL_DIR ?= "${BSPDIR}/downloads/"
ACCEPT_FSL_EULA = "1"

EXTRA_IMAGE_FEATURES = "debug-tweaks ssh-server-openssh "

IMAGE_INSTALL_append = " gcc g++ binutils libgcc libgcc-dev libstdc++ libstdc++-dev libstdc++-staticdev \
autoconf automake ccache chkconfig glib-networking glibmm \
packagegroup-core-buildessential pkgconfig  \
boost cmake zlib glib-2.0 packagegroup-fsl-tools-testapps  \
    cpufrequtils \
    htop \
    mc \    
    nano \
    gdb \
    cairo pango fontconfig freetype pulseaudio dbus \
    openssh-sftp-server \
    qtbase-plugins \
    qtbase-tools \
    qtdeclarative \
    qtdeclarative-plugins \
    qtdeclarative-tools \
    qtdeclarative-qmlplugins \
    qtmultimedia \
    qtmultimedia-plugins \
    qtmultimedia-qmlplugins \
    qtsvg \
    qtsvg-plugins \
    qtsensors \
    qtimageformats-plugins \
    qtsystems \
    qtsystems-tools \
    qtsystems-qmlplugins \
    qtscript \
    qt3d \
    qt3d-qmlplugins \
    qt3d-tools \
    qtgraphicaleffects-qmlplugins \
    qtconnectivity-qmlplugins \
    qtlocation-plugins \
    qtlocation-qmlplugins \
    cinematicexperience \
    i2c-tools \ 
    "

Записал образ на SD-карточку, и одноплатник запустился.

root@wandboard:~# uname --all
Linux wandboard 5.4.20-fslc+g18d5e274c780 #1 SMP Mon Apr 6 16:23:20 UTC 2020 armv7l armv7l armv7l GNU/Linux

Вот так примерно я делал (взял из ~/.bash_history), возможно что-то мог упустить.

mkdir yocto
cd yocto/
repo init -u https://github.com/Freescale/fsl-community-bsp-platform -b zeus
repo sync
cd sources/
git clone -b zeus https://github.com/meta-qt5/meta-qt5.git
MACHINE=wandboard DISTRO=fslc-xwayland source setup-environment build
bitbake core-image-sato-sdk
bitbake meta-toolchain-qt5

cd tmp/deploy/sdk/
sh fslc-xwayland-glibc-x86_64-meta-toolchain-qt5-cortexa9t2hf-neon-wandboard-toolchain-3.0.sh 

wget http://download.qt-project.org/official_releases/qtcreator/4.11/4.11.2/qt-creator-opensource-linux-x86_64-4.11.2.run
sudo chmod +x qt-creator-opensource-linux-x86_64-4.11.2.run 
./qt-creator-opensource-linux-x86_64-4.11.2.run 

Пробую на Linux-хосте сделать приложение, собрать его и запустить на одноплатном ПК.

Но получаю следующее.

Could not determine which "make" command to run. Check the "make" step in the build configuration.
Error while building/deploying project imx6 (kit: ARM)
When executing step "qmake"

в Qt Creator я добавил одноплатник в Device (тест прошёл, связь есть) в Compilers добавил компиляторы, которые мне нагенерировал Yocto. Путь такой, сам файл arm-fslc-linux-gnueabi-gcc там есть, я его могу запустить.

/opt/fslc-xwayland/3.0/sysroots/x86_64-fslcsdk-linux/usr/bin/arm-fslc-linux-gnueabi/arm-fslc-linux-gnueabi-gcc
в Debuggers добавил отладчик GDB
/opt/fslc-xwayland/3.0/sysroots/x86_64-fslcsdk-linux/usr/bin/arm-fslc-linux-gnueabi/arm-fslc-linux-gnueabi-gdb
а в Qt Version добавил полученный qmake
/opt/fslc-xwayland/3.0/sysroots/x86_64-fslcsdk-linux/usr/bin/qmake
и сделал из всего это Kit https://ibb.co/QfFKQSL

У меня есть два вопроса. 1. Что я делаю неправильно? 2. Различие рецептов <name> и <name>_sdk в чём заключается? Рецепт с постфиксом _sdk еще собирает инструменты для разработки на хосте?

S9 ()
Ответ на: комментарий от S9
  1. А заскриньшоть и остальные вкладки из криэйтора: компиляторы куте и прочее.

  2. Также, сперва попробуй создать не-куте приложение, используя тот кит, будет ли оно компилиться.

  3. Проверь, что правильно выбрал компиляторы GCC: для Си это *-gcc, для С++ это *-g++. Также желательно указать оба компилятора (Си и С++) в ките.

  4. И еще: ты создаешь проекты qmake или cmake (наверно qmake судя по выхлопу)? Т.к. меня насторожила конфигурация CMake в твоем ките, типа ARM CMake.. Почему ARM?

kuzulis ★★ ()
Последнее исправление: kuzulis (всего исправлений: 4)