Raspberry Pi

Русский сайт по микрокомпьютеру Raspberry Pi
Предложить пост

Вход








Регистрация | Забыли пароль?

Поиск



По всему сайту
По тэгам
По тэгам и заголовкам

Рубрики

  • Проекты и статьи
  • Модели
  • Новости
  • Мысли
  • Облако тэгов

    raspberry pi 3, raspbian, windows, ubuntu, linux, умный дом, windows 10, osmc, игры, python, gpio, установка ос, raspberry pi 2, raspberry pi zero, raspberry pi zero w, слежение, самолёт, http, diy, 1c-битрикс, робототехника, сеть, кластер, бесперебойник, акустика

    Боковое меню

  • RSS-канал
  • Карта сайта
  • Обратная связь
  • Пользователи


    Top.Mail.Ru

  • Ставим опыты. Raspberry PI и непрерывная cross compilation

    Если в один прекрасный момент появится необходимость в непрерывной интеграции, кросс-компилирующей сборку CMake проекта, написанного на С++ с OpenGL на одноплатнике Raspberry PI, попробуйте поэкспериментировать. Более или менее подходящий вариант всегда найдется. Конкретно меня, на поиски подвигло не только это, но еще и желание проверить не обнаружатся ли новые добротные серверы автосборки без Python и потребления внушительного количества ресурсов RAM в состоянии простоя.

    Для того, кто не осилит дочитать статью до конца: обнаружил drone, который разрешает без проблем добавлять простые файлы в корень хранилища на github/bitbucket, при этом спокойно получать автоматические Build-Deploy-Test. Похоже на Travis, только с использованием self-hosted.

    Что удалось найти?


    Теперь подробнее. Как выяснилось почти сразу, подходящих build серверов, соответствующих необходимым требованиям немного: concourse.ci и drone.io. Выбор скромный. Расскажу о последнем. Сравнивать не буду, было бы некорректно, потому что принял решение исключительно опираясь на описание.

    У drone.io есть две версии 4.0 и 5.0. Вторая, на мой взгляд, принципиальных отличий не имеет, но зато в ней исправлена одна ошибка, благодаря которой можно было запросто убрать флажок администратора по чистой случайности.
    Вся онлайн-документация доступна по ссылкам:

    http://readme.drone.io/
    http://readme.drone.io/0.5/

    По ходу выяснился еще момент. Drone всегда работает с одними поставщиками хранилищ gogs, github или bitbucket. Вдобавок конкретный экземпляр работает в дуете с одним источником. Справится с этой проблемой несложно, достаточно запустить параллельно несколько нейтральных drone, к счастью они не забирают много ресурсов. Например, пусть первый drone смотрит в gogs, а другой на этом же сервере в bitbucket.
    Запустить все это можно при помощи docker образа:

    docker run -d \
    -e REMOTE_DRIVER=bitbucket \
    -e "REMOTE_CONFIG=https://bitbucket.org?client_id=***&client_secret=***" \
    -e DRONE_DATABASE_DRIVER=sqlite3 \
    -e DRONE_DATABASE_CONFIG=/var/lib/drone/drone.sqlite \
    -v /var/lib/drone_bitbucket:/var/lib/drone \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -p 81:8000 \
    --restart=always \
    --name=drone_bitbucket \
    drone/drone:0.4


    Готово. Все элементарно.

    Что делаем дальше?


    В дальнейшем drone пойдет в битбакет за разрешениями, если все в порядке – продемонстрирует доступные репозитории. Еще нюанс. Сначала в "Active" не будет ничего. Потому что для репозиториев используется по умолчанию "Available". Придется активировать, просто давим на соответствующую кнопку и все.
    Теперь о самом главном. Здесь нет ничего сложного. В корневой папке активного хранилища предполагается нахождение файла drone.yml, с описанием того, как следует билдить и развертывать содержимое. Еще задается tag докер образа, где собственно осуществляется сборка, а также команды билда. С поправкой на нашу реальность drone.yml будет выглядеть следующим образом:

    build:
    image: notfl3/cross_raspberry_pi
    commands:
    - cmake -D CMAKE_BUILD_TYPE=Debug -D CMAKE_TOOLCHAIN_FILE=/Toolchain-RaspberryPi.cmake .
    - make

    publish:
    sftp:
    host:
    port: 22
    username: ...
    password: ...
    destination_path: ...
    files:
    - ...


    В чем нюансы?


    Самым проблемным этапом стало создание docker образа, способного на кросс-компеляцию для Raspberry. В интернете навалом готовых, но если вы не ищите легких путей и простое любопытство побеждает над разумом, то можно создать свой. Будет он выглядеть примерно так:

    FROM debian:sid

    RUN apt-get update
    RUN apt-get install -y git
    RUN apt-get install -y cmake

    ENV CROSS_TRIPLE arm-linux-gnueabihf

    RUN mkdir -p /rpi/tools && cd /rpi/tools && git init && git remote add -f origin https://github.com/raspberrypi/tools && \
    git config core.sparseCheckout true && echo "arm-bcm2708/gcc-linaro-${CROSS_TRIPLE}-raspbian-x64" >>. git/info/sparse-checkout && \
    git pull --depth=1 origin master

    RUN mkdir -p /rpi/rootfs/opt

    COPY lib/ /rpi/rootfs/lib/
    COPY usr/ /rpi/rootfs/usr/
    COPY opt/vc/ /rpi/rootfs/opt/vc/

    COPY Toolchain-RaspberryPi.cmake /Toolchain-RaspberryPi.cmake

    RUN mkdir -p /build
    WORKDIR /build


    Это моя заготовка докерфайла. Для создания полноценного образа, который можно применять для билда, необходимо будет отправить его в папку к /usr, /lib, /opt, прихваченных с Raspbian и файлом Toolchain-RaspberryPi.cmake следом за командой docker build. -t notfl3/cross_raspberry_pi. Тогда drone будет в состоянии его использовать и делать сборки. Кросс-компиляция будет проходить в соответствии с правилами CMake. Вот еще на что хотелось бы обратить внимание – прописка собственного файла Toolchain.cmake из raspberry-tools для GCC.
    В итоге получилось вот что:

    SET(CMAKE_SYSTEM_NAME Linux)
    SET(CMAKE_SYSTEM_VERSION 1)

    # Where is the target environment
    SET(CMAKE_FIND_ROOT_PATH /rpi/rootfs)

    # Specify the cross compiler
    SET(CMAKE_C_COMPILER /rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-gcc "--sysroot=${CMAKE_FIND_ROOT_PATH}")
    SET(CMAKE_CXX_COMPILER /rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-g++ "--sysroot=${CMAKE_FIND_ROOT_PATH}")

    # Search for programs only in the build host directories
    SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

    # Search for libraries and headers only in the target directories
    SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
    SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

    INCLUDE_DIRECTORIES(${CMAKE_FIND_ROOT_PATH}/usr/include/arm-linux-gnueabihf)
    INCLUDE_DIRECTORIES(${CMAKE_FIND_ROOT_PATH}/usr/include/)


    Манипуляции получились нехитрые, а на выходе имеем отлично работающий билд для Raspberry с glfw окном и быстрой сборкой на выделенном внешнем сервере. На удивление все получилось и без особых проблем!
    Источник

    17.12.2019 в 13:56, Просмотров: 183
    Опубликовал: ak167

    Короткая ссылка: http://4raspberrypi.ru/content.php?p=58

    ID: 58