Кроссплатформенная сборка QT5 для Nvidia Jetson TX2
Введение.
Начать работу с Nvidia Jetson можно как с обычным персональным компьютером, подключив к нему монитор и мышку, однако это не всегда удобно. В случае, если Jetson является частью некоторого устройства и доступ к нему ограничен, то смена прошивки может превратиться в проблему. В таком случае помогает кроссплатформенная сборка. Если проект написан на C++, то кросскомпиляцию можно организовать с помощью cmake. Файл toolchain.cmake легко можно найти на просторах интернета. Однако, если проект написан на QT, то приведенные в интернете инструкции оказываются неполными и информацию приходится собирать с различных источников, попутно исправляя ошибки в них. Поэтому, мы постарались собрать в одной статье полную и достоверную инструкцию по кроссплатформенной сборке QT5 для Nvidia Jetson TX2 на момент февраля 2023 года.
Образ для Jetson.
На сайте Nvidia https://developer.nvidia.com/drive/sdk-manager скачиваем утилиту под названием sdkmanager. На момент написания статьи в sdkmanager не было поддержки ubuntu версий выше 18й. Однако это ограничение можно обойти. Для этого на хосте необходимо изменить значение поля VERSION_ID на 18.04 в файле /usr/lib/os-release: sudo vi /usr/lib/os-release
NAME="Ubuntu"
VERSION="20.04.5 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.5 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
После замены:
NAME="Ubuntu"
VERSION="20.04.5 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.5 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
Для Jetson TX2 существует множество плат-носителей (carrier board) и, как правило, производители плат предоставляют инструкцию по осуществлению патча образа для работы с их платой, поскольку образы из sdkmanager из коробки работают только с платами от Nvidia. В нашем случае используется плата носитель Auvidea J120. На сайте https://auvidea.eu/firmware/ находим подходящий патч образа (рисунок 1) и скачиваем архив. Позже он понадобится для внесения изменений в образ.
Рисунок 1: Патч ядра для платы Auvidea j120.
Вообще есть более свежий патч образа от декабря 2021 года, однако после прошивки этого образа USB порты на плате не работают, поэтому был выбран патч от февраля 2020 года.
Далее запускаем sdkmanager: sdkmanager --archivedversions
Ключ archivedversions нужен для того, чтобы в списке версий можно было выбрать нужную нам версию JetPack 4.3. Иначе она не будет представлена в списке.
После запуска sdkmanager появится меню с просьбой ввести логин и пароль от аккаунта Nvidia (Рисунок 2). Если аккаунта нет, то можно бесплатно зарегистрироваться на сайте nvidia.com.
Рисунок 2: Начальное меню sdkmanager
После регистрации появится возможность выбора версии JetPack и тип Jetson (Рисунок 3). Выбрать нужно так же как на рисунке 3.
Рисунок 3: Выбор версий JetPack и Jetson.
Далее переходим ко второму шагу (рисунок 4).На этом шаге скачивается образ и устанавливаются компоненты на хост.
Рисунок 4: Выбор компонентов для установки.
Следующий шаг пропускаем, поскольку необходимо пропатчить образ джетсона для работы с платой auvidea j120. Допустим, что директория для установки была выбрана »/tools/nvidia/». Архив с патчем, загруженный с сайта auvidea распаковываем и вносим необходимые изменения в образ в соответствии с инструкцией: cp -r kernel_out/* /tools/nvidia/JetPack_4.3_Linux_JETSON_TX2/Linux_for_Tegra/
cd /tools/nvidia/JetPack_4.3_Linux_JETSON_TX2/Linux_for_Tegra/
sudo ./apply_binaries.sh
После подключаем jetson к ПК и переводим его в recovery mode, для этого зажимаем кнопку Force recovery, затем нажимаем кнопку reset и отпускаем Force recovery. Далее прошиваем Jetson: cd /tools/nvidia/JetPack_4.3_Linux_JETSON_TX2/Linux_for_Tegra/
sudo ./flash.sh jetson-tx2 mmcblk0p1
К Jetson подключаем клавиатуру, мышку и монитор. Необходимо настроить сеть и рекомендуется выставить корректное время. Далее будем полагать, что адрес настроен такой: 192.168.0.160, пользователь — nvidia и пароль — nvidia.
Сборка QT.
На хосте переходим в директорию »rootfs» и чиним символьные ссылки: cd /tools/nvidia/JetPack_4.3_Linux_JETSON_TX2/Linux_for_Tegra/rootfs
sudo ln -sf lib/aarch64-linux-gnu/libz.so.1 usr/lib/aarch64-linux-gnu/libz.so
sudo ln -sf lib/aarch64-linux-gnu/libm.so.6 usr/lib/aarch64-linux-gnu/libm.so
sudo ln -sf lib/aarch64-linux-gnu/libdl.so.2 usr/lib/aarch64-linux-gnu/libdl.so
sudo ln -sf lib/aarch64-linux-gnu/libpng12.so.0.54.0 usr/lib/aarch64-linux-gnu/libpng.so
Клонируем репозиторий и выбираем рабочую ветку:
git clone git://code.qt.io/qt/qtbase.git -b dev
cd qtbase
git checkout v5.12.10
Переходим в папку с репозиторием и конфигурируем сборку QT:
./configure -opensource --confirm-license -no-pkg-config -device linux-jetson-tx1-g++
-device-option CROSS_COMPILE=aarch64-linux-gnu-
-sysroot /tools/tx2/nvidia/JetPack_4.3_Linux_JETSON_TX2/Linux_for_Tegra/rootfs/ -prefix
/usr/local/qt5 -extprefix /tools/tx2/qt5 -hostprefix /tools/tx2/qt5-host
-nomake examples -nomake tests -no-opengl
Далее собираем QT:
make -j8
make install
Собранные версии QT для хоста и для девайса будут лежать по адресу, указанному при конфигурации сборки, в данном случае по адресу »/tools/tx2/». На джетсоне создаём папку и назначаем ей права пользователя:
mkdir /usr/local/qt5
sudo chown nvidia:nvidia qt5
Затем синхронизируем папки с хоста:
rsync -e ssh -avz qt5 nvidia@192.168.0.160:/usr/local
Настройка сборки в QT Creator.
После сборки QT рекомендуется настроить QT Creator. Для сборки в QT Creator нужно указать компилятор, сборку QT и связать их в один комплект (Kit). В качестве компилятора мы использовали компилятор Linaro, скачать который можно на сайте https://releases.linaro.org/components/toolchain/binaries/.
Рисунок 5: Добавление компилятора в QT Creator.
На рисунке 5 изображен добавленный компилятор Linaro версии 4.9. После выбора компилятора, указываем путь до qmake (рисунок 6).
Рисунок 6: Добавление версии QT в QT Creator.
Далее объединяем добавленные инструменты в один комплект под названием »JetsonTx2» (Рисунок 7).
Рисунок 7: Создание комплекта в QT Creator.
Теперь можно собирать проекты под Jetson в QT Creator!