From a661dd57854c4e5bf426ed8156804da0aff0d54b Mon Sep 17 00:00:00 2001 From: Bindea Cristian Date: Wed, 17 Apr 2024 19:18:24 +0300 Subject: [PATCH] test kuiper workflow Signed-off-by: Bindea Cristian --- .github/workflows/kuiperbuild.yml | 46 ++++ .gitignore | 2 + CI/kuiper/AppRun | 12 + CI/kuiper/build_qt.sh | 75 +++++++ CI/kuiper/cmake_toolchain.cmake | 89 ++++++++ CI/kuiper/copy-deps.sh | 43 ++++ CI/kuiper/create_docker_image.sh | 44 ++++ CI/kuiper/create_sysroot.sh | 68 ++++++ CI/kuiper/docker/Dockerfile | 59 +++++ CI/kuiper/inside_chroot.sh | 58 +++++ CI/kuiper/kuiper_build_config.sh | 58 +++++ CI/kuiper/kuiper_build_process.sh | 357 ++++++++++++++++++++++++++++++ CI/kuiper/qt_patch.patch | 126 +++++++++++ CI/kuiper/runtime-armhf | Bin 0 -> 147212 bytes CI/kuiper/scopy.desktop | 10 + appveyor.yml | 56 +++++ resources/Scopy.png | Bin 0 -> 23663 bytes src/tool_launcher.cpp | 2 + 18 files changed, 1105 insertions(+) create mode 100644 .github/workflows/kuiperbuild.yml create mode 100755 CI/kuiper/AppRun create mode 100755 CI/kuiper/build_qt.sh create mode 100644 CI/kuiper/cmake_toolchain.cmake create mode 100755 CI/kuiper/copy-deps.sh create mode 100755 CI/kuiper/create_docker_image.sh create mode 100755 CI/kuiper/create_sysroot.sh create mode 100644 CI/kuiper/docker/Dockerfile create mode 100644 CI/kuiper/inside_chroot.sh create mode 100644 CI/kuiper/kuiper_build_config.sh create mode 100755 CI/kuiper/kuiper_build_process.sh create mode 100644 CI/kuiper/qt_patch.patch create mode 100644 CI/kuiper/runtime-armhf create mode 100644 CI/kuiper/scopy.desktop create mode 100644 appveyor.yml create mode 100644 resources/Scopy.png diff --git a/.github/workflows/kuiperbuild.yml b/.github/workflows/kuiperbuild.yml new file mode 100644 index 0000000000..1274778bc4 --- /dev/null +++ b/.github/workflows/kuiperbuild.yml @@ -0,0 +1,46 @@ +name: Kuiper Scopy Build + +on: [push, pull_request] + +env: + BUILD_HOST: ubuntu-20.04 + USERNAME: github-actions + +jobs: + + build_scopy1_for_kuiper: + runs-on: ubuntu-20.04 + + steps: + - uses: actions/checkout@v4 + with: + set-safe-directory: 'true' + + - name: Pull the Docker Image + run: docker pull cristianbindea/scopy2-kuiper:latest + + - name: Create Scopy AppImage + shell: bash + run: | + cd $GITHUB_WORKSPACE + sudo apt update + ./CI/kuiper/create_sysroot.sh install_packages install_qemu + ./CI/kuiper/kuiper_build_process.sh generate_ci_envs + + docker run \ + --mount type=bind,source="$GITHUB_WORKSPACE",target=/home/runner/scopy \ + --env-file $GITHUB_WORKSPACE/CI/kuiper/gh-actions.envs \ + cristianbindea/scopy2-kuiper:latest \ + /bin/bash -c 'cd $HOME && \ + sudo chown -R runner:runner scopy && \ + cd $HOME/scopy && \ + ./CI/kuiper/kuiper_build_process.sh install_packages download_cmake download_crosscompiler move_sysroot build_scopy build_iio-emu create_appdir create_appimage move_appimage + ' + - name: Set short git commit SHA + shell: bash + run: echo "commit_sha=$(git rev-parse --short ${{ github.sha }})" >> "$GITHUB_ENV" + + - uses: actions/upload-artifact@v4 + with: + name: scopy-linux-armhf-${{ env.commit_sha }} + path: ${{ github.workspace }}/Scopy-armhf.AppImage diff --git a/.gitignore b/.gitignore index b070d63264..b3fa412766 100644 --- a/.gitignore +++ b/.gitignore @@ -20,5 +20,7 @@ android*.sh *.apk *.aab !CI/android/* +CI/kuiper/staging +CI/kuiper/scopy.AppDir html/ build_arm64-v8a/ diff --git a/CI/kuiper/AppRun b/CI/kuiper/AppRun new file mode 100755 index 0000000000..b936ee66ef --- /dev/null +++ b/CI/kuiper/AppRun @@ -0,0 +1,12 @@ +#!/bin/bash +set -e +SELF=$(readlink -f "$0") +HERE=${SELF%/*} + +export QT_PLUGIN_PATH=$HERE/usr/plugins +export QT_QPA_PLATFORM_PLUGIN_PATH=$HERE/usr/plugins/platforms +export LD_LIBRARY_PATH=$HERE/usr/lib + +ldd $HERE/usr/bin/scopy + +exec $HERE/usr/bin/scopy diff --git a/CI/kuiper/build_qt.sh b/CI/kuiper/build_qt.sh new file mode 100755 index 0000000000..600ca8e0a1 --- /dev/null +++ b/CI/kuiper/build_qt.sh @@ -0,0 +1,75 @@ +#!/bin/bash + +set -ex +SRC_DIR=$(git rev-parse --show-toplevel) +source $SRC_DIR/CI/kuiper/kuiper_build_config.sh + +install_packages(){ + sudo apt install -y build-essential cmake unzip gfortran gcc git bison \ + python gperf pkg-config gdb-multiarch g++ flex texinfo gawk openssl \ + pigz libncurses-dev autoconf automake tar figlet libclang-dev +} + +# Download and extract QT Source (QT 5.15.2) +download_qt(){ + mkdir -p ${STAGING_AREA} + pushd ${STAGING_AREA} + if [ ! -d qt-everywhere-src ];then + wget --progress=dot:giga ${QT_DOWNLOAD_LINK} + tar -xf qt-everywhere-src-*.tar.xz && rm qt-everywhere-src-*.tar.xz && mv qt-everywhere-src-* qt-everywhere-src # unzip and rename + cd qt-everywhere-src + patch -p1 < $SRC_DIR/CI/kuiper/qt_patch.patch # Patch QT Source + else + echo "QT already downloaded" + fi + popd +} + +download_crosscompiler(){ + mkdir -p ${STAGING_AREA} + pushd ${STAGING_AREA} + if [ ! -d cross-pi-gcc ];then + wget --progress=dot:giga ${CROSSCOMPILER_DOWNLOAD_LINK} + tar -xf cross-gcc-*.tar.gz && rm cross-gcc-*.tar.gz && mv cross-pi-* cross-pi-gcc # unzip and rename + else + echo "Crosscompiler already downloaded" + fi + popd +} + +build_qt5.15.2(){ + mkdir -p $STAGING_AREA/build-qt5.15.2 && cd $STAGING_AREA/build-qt5.15.2 + ../qt-everywhere-src/configure \ + -v \ + -release \ + -opensource \ + -confirm-license \ + -sysroot $SYSROOT \ + -prefix $QT_SYSTEM_LOCATION \ + -extprefix $QT_BUILD_LOCATION \ + -eglfs \ + -opengl es2 \ + -device linux-rasp-pi4-v3d-g++ \ + -device-option CROSS_COMPILE=$CROSS_COMPILER/bin/arm-linux-gnueabihf- \ + -skip qtscript \ + -skip qtwayland \ + -skip qtwebengine \ + -nomake tests \ + -make libs \ + -pkg-config \ + -no-use-gold-linker \ + -recheck \ + -xcb \ + -xcb-xlib \ + -bundled-xcb-xinput \ + -qt-pcre \ + -qpa eglfs \ + -L$SYSROOT/usr/lib/arm-linux-gnueabihf -I$SYSROOT/usr/include/arm-linux-gnueabihf + + make -j14 + sudo make install # installs to $QT_BUILD_LOCATION +} + +for arg in $@; do + $arg +done diff --git a/CI/kuiper/cmake_toolchain.cmake b/CI/kuiper/cmake_toolchain.cmake new file mode 100644 index 0000000000..5209043079 --- /dev/null +++ b/CI/kuiper/cmake_toolchain.cmake @@ -0,0 +1,89 @@ +cmake_minimum_required(VERSION 3.18) + +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR arm) +set(CMAKE_LIBRARY_ARCHITECTURE arm-linux-gnueabihf) + +# In this case the variables CMAKE_SYSROOT and STAGING_AREA are defined as parameters to the cmake command +set(TOOLCHAIN_FILE ${STAGING_AREA}/cross-pi-gcc) +set(TOOLCHAIN_BIN ${TOOLCHAIN_FILE}/bin) +set(CMAKE_PREFIX_PATH ${QT_LOCATION}) +list(APPEND CMAKE_PREFIX_PATH "${CMAKE_SYSROOT}/usr/lib/arm-linux-gnueabihf") +list(APPEND CMAKE_PREFIX_PATH "${CMAKE_SYSROOT}/lib") +set(CMAKE_VERBOSE ON) + +set(PKG_CONFIG_EXECUTABLE "${CMAKE_SYSROOT}/usr/bin/arm-linux-gnueabihf-pkg-config" CACHE PATH "PKG_CONFIG_EXECUTABLE" + FORCE +) +set(ENV{PKG_CONFIG_ALLOW_CROSS} 1) +set(PKG_CONFIG_USE_CMAKE_PREFIX_PATH ON) +set(RPI_PKG_CONFIG_LIBDIR "${CMAKE_SYSROOT}/usr/lib/arm-linux-gnueabihf/pkgconfig:${RPI_PKG_CONFIG_LIBDIR}") +set(RPI_PKG_CONFIG_LIBDIR "${CMAKE_SYSROOT}/usr/share/pkgconfig:${RPI_PKG_CONFIG_LIBDIR}") +set(RPI_PKG_CONFIG_LIBDIR "${CMAKE_SYSROOT}/usr/lib/pkgconfig:${RPI_PKG_CONFIG_LIBDIR}") +set(RPI_PKG_CONFIG_LIBDIR "${CMAKE_SYSROOT}/usr/local/lib/pkgconfig:${RPI_PKG_CONFIG_LIBDIR}") +set(ENV{PKG_CONFIG_LIBDIR} "${RPI_PKG_CONFIG_LIBDIR}") +set(ENV{PKG_CONFIG} "${CMAKE_SYSROOT}/usr/bin/arm-linux-gnueabihf-pkg-config") + +set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:${CMAKE_SYSROOT}/include:") +set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:${CMAKE_SYSROOT}/usr/include:") +set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:${CMAKE_SYSROOT}/usr/include/arm-linux-gnueabihf:") +set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:${CMAKE_SYSROOT}/usr/share/include:") + +set(ENV{PKG_CONFIG_SYSROOT_DIR} "${CMAKE_SYSROOT}") +set(ENV{LD_LIBRARY_PATH} "${CMAKE_SYSROOT}/usr/lib/arm-linux-gnueabihf:$ENV{LD_LIBRARY_PATH}") + +set(CMAKE_LIBRARY_PATH "${CMAKE_SYSROOT}/usr/lib") +set(CMAKE_LIBRARY_PATH "${CMAKE_LIBRARY_PATH} ${CMAKE_SYSROOT}/usr/lib/arm-linux-gnueabihf") +set(CMAKE_LIBRARY_PATH "${CMAKE_LIBRARY_PATH} ${CMAKE_SYSROOT}/usr/local/lib") +set(CMAKE_LIBRARY_PATH "${CMAKE_LIBRARY_PATH} ${CMAKE_SYSROOT}/usr/local/lib/arm-linux-gnueabihf") + +set(CMAKE_AR ${TOOLCHAIN_BIN}/arm-linux-gnueabihf-ar) +set(CMAKE_ASM_COMPILER ${TOOLCHAIN_BIN}/arm-linux-gnueabihf-gcc) +set(CMAKE_C_COMPILER ${TOOLCHAIN_BIN}/arm-linux-gnueabihf-gcc) +set(CMAKE_CXX_COMPILER ${TOOLCHAIN_BIN}/arm-linux-gnueabihf-g++) +set(CMAKE_LINKER ${TOOLCHAIN_BIN}/arm-linux-gnueabihf-ld) +set(CMAKE_OBJCOPY ${TOOLCHAIN_BIN}/arm-linux-gnueabihf-objcopy) +set(CMAKE_RANLIB ${TOOLCHAIN_BIN}/arm-linux-gnueabihf-ranlib) +set(CMAKE_SIZE ${TOOLCHAIN_BIN}/arm-linux-gnueabihf-size) +set(CMAKE_STRIP ${TOOLCHAIN_BIN}/arm-linux-gnueabihf-strip) + +set(CMAKE_C_FLAGS "-march=armv7-a -mfloat-abi=hard -mfpu=vfp") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${CMAKE_SYSROOT}/include") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${CMAKE_SYSROOT}/usr/include") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${CMAKE_SYSROOT}/usr/include/arm-linux-gnueabihf") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${CMAKE_SYSROOT}/usr/share/include") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") +set(CMAKE_CXX_FLAGS "-fexceptions -frtti ${CMAKE_C_FLAGS}") +set(CMAKE_CXX_FLAGS_DEBUG "-Os -g") +set(CMAKE_CXX_FLAGS_RELEASE "-Os -DNDEBUG") +set(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -Wl,-O1 -Wl,--hash-style=gnu -mthumb -lpthread -pthread") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${CMAKE_SYSROOT}/usr/lib/arm-linux-gnueabihf") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${CMAKE_SYSROOT}/usr/lib") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${CMAKE_SYSROOT}/usr/local/lib") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${QT_LOCATION}/lib") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${TOOLCHAIN_FILE}/arm-linux-gnueabihf/lib") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${TOOLCHAIN_FILE}/arm-linux-gnueabihf/libc/lib") +set(CMAKE_SHARED_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS}) + +#[[ +# Debug Mode +set(PKG_CONFIG_ARGN "--debug") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--verbose ") +]] + +set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) # Perform compiler test with static library +set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) +set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) +set(CMAKE_INSTALL_RPATH + "$ORIGIN" + "$ORIGIN/../lib" + "/usr/lib/arm-linux-gnueabihf" + "/lib/arm-linux-gnueabihf" + "/lib" + "/usr/local/qt5.15/lib" +) +set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) diff --git a/CI/kuiper/copy-deps.sh b/CI/kuiper/copy-deps.sh new file mode 100755 index 0000000000..33069ce9da --- /dev/null +++ b/CI/kuiper/copy-deps.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +set -e +SRC_DIR=$(git rev-parse --show-toplevel) +source $SRC_DIR/CI/kuiper/kuiper_build_config.sh + +BINARY=$1 +LOCATION=$2 + + +if [ ! -f "${SRC_DIR}"/CI/kuiper/ldd-mod ]; then + sed 's|.*RTLDLIST=.*|RTLDLIST="/usr/arm-linux-gnueabihf/lib/ld-2.31.so /usr/arm-linux-gnueabihf/lib/ld-linux-armhf.so.3"|' /usr/bin/ldd | tee "${SRC_DIR}"/CI/kuiper/ldd-mod + chmod +x "${SRC_DIR}"/CI/kuiper/ldd-mod +fi + +export LD_LIBRARY_PATH="${APP_DIR}/usr/lib:${SYSROOT}/lib:${SYSROOT}/lib/arm-linux-gnueabihf:${SYSROOT}/usr/arm-linux-gnueabihf/lib:${SYSROOT}/usr/local/qt5.15/lib:${SYSROOT}/usr/local/lib:${SRC_DIR}/build" +LIBS_ARRAY=() +run_ldd(){ + + if [ ! -z "$(${SRC_DIR}/CI/kuiper/ldd-mod $1 | grep "not found")" ]; then + echo "--- LIB NOT FOUND" + ${SRC_DIR}/CI/kuiper/ldd-mod $1 + exit 1 + fi + + for library in $("${SRC_DIR}"/CI/kuiper/ldd-mod "$1" | cut -d '>' -f 2 | awk '{print $1}') + do + # check if the library exists at that path and if it was processed already + if [ -f "${library}" ] && ! [[ "${LIBS_ARRAY[*]}" =~ "${library}" ]]; then + LIBS_ARRAY+=("${library}") + echo "---NEW: ${library}" + if [ ! -f "${LOCATION}"/"${library##*/}" ]; then + cp --verbose "${library}" "${LOCATION}" + [ -L "${library}" ] && cp --verbose "$(realpath "${library}")" "${LOCATION}" + fi + run_ldd "${library}" + fi + done +} + +for arg in $BINARY; do + run_ldd "${arg}" +done diff --git a/CI/kuiper/create_docker_image.sh b/CI/kuiper/create_docker_image.sh new file mode 100755 index 0000000000..a049943811 --- /dev/null +++ b/CI/kuiper/create_docker_image.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +set -ex +SRC_DIR=$(git rev-parse --show-toplevel) +source $SRC_DIR/CI/kuiper/kuiper_build_config.sh + +# install docker +install_packages(){ + sudo apt-get update + sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - + sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" + sudo apt-get update + sudo apt-get -y install containerd.io docker-ce docker-ce-cli docker-buildx-plugin +} + +create_sysroot(){ + $SRC_DIR/CI/kuiper/create_sysroot.sh \ + install_packages \ + download_kuiper \ + install_qemu \ + extract_sysroot \ + configure_sysroot +} + +# archive the sysroot and move it next to Dockerfile in order to copy the tar in the docker image +tar_and_move_sysroot(){ + pushd $STAGING_AREA + sudo tar -czvf "${SYSROOT_TAR##*/}" sysroot + sudo mv $SYSROOT_TAR $SYSROOT_DOCKER + popd +} + +create_image(){ + pushd ${SRC_DIR}/CI/kuiper/docker + sudo docker build --load --tag cristianbindea/scopy2-kuiper . + # sudo DOCKER_BUILDKIT=0 docker build --tag cristianbindea/scopy2-kuiper . # build the image using old backend + popd +} + +install_packages +create_sysroot +tar_and_move_sysroot +create_image diff --git a/CI/kuiper/create_sysroot.sh b/CI/kuiper/create_sysroot.sh new file mode 100755 index 0000000000..d9ae51bb5b --- /dev/null +++ b/CI/kuiper/create_sysroot.sh @@ -0,0 +1,68 @@ +#!/bin/bash + +set -ex +SRC_DIR=$(git rev-parse --show-toplevel) +source $SRC_DIR/CI/kuiper/kuiper_build_config.sh + +IMAGE_FILE=2023-12-13-ADI-Kuiper-full.img + +install_packages(){ + sudo apt -y install git wget unzip python3 python +} + +download_kuiper(){ + mkdir -p ${STAGING_AREA} + pushd ${STAGING_AREA} + wget --progress=dot:giga ${KUIPER_DOWNLOAD_LINK} + unzip image*.zip + popd +} + +# install qemu needed for the sysroot configuration +install_qemu(){ + sudo apt -y install qemu qemu-system qemu-user-static qemu-user +} + +# mount the Kuiper image and copy the entire rootfs partition +extract_sysroot(){ + sudo mkdir -p /mnt/kuiper + + # with file ${IMAGE_FILE} we can see the start sector (4218880) and the length (19947520) of the second partition contained in the Kuiper image + # using this info we can directly mount that partition + sudo mount -v -o loop,offset=$((512*4218880)),sizelimit=$((512*19947520)) ${STAGING_AREA}/${IMAGE_FILE} /mnt/kuiper + + mkdir -p ${SYSROOT} + sudo cp -arp /mnt/kuiper/* ${SYSROOT} + sudo cp /etc/resolv.conf ${SYSROOT}/etc/resolv.conf + sudo umount /mnt/kuiper + sudo rm -rf /mnt/kuiper + rm -rf ${STAGING_AREA:?}/${IMAGE_FILE} + rm -rf ${STAGING_AREA}/image*.zip +} + + +# execute chroot inside the sysroot folder and install/remove packages using apt +configure_sysroot(){ + cat $SRC_DIR/CI/kuiper/inside_chroot.sh | sudo chroot ${SYSROOT} +} + +move_and_extract_sysroot(){ + if [ -f $HOME/sysroot.tar.gz ]; then + mkdir -p $STAGING_AREA + sudo tar -xf $HOME/sysroot.tar.gz --directory $STAGING_AREA + rm $HOME/sysroot.tar.gz + fi +} + +fix_relativelinks(){ + pushd ${STAGING_AREA} + wget $SYSROOT_RELATIVE_LINKS + chmod +x sysroot-relativelinks.py + sudo ./sysroot-relativelinks.py ${SYSROOT} + popd +} + +for arg in $@; do + $arg +done + diff --git a/CI/kuiper/docker/Dockerfile b/CI/kuiper/docker/Dockerfile new file mode 100644 index 0000000000..6253b35ea2 --- /dev/null +++ b/CI/kuiper/docker/Dockerfile @@ -0,0 +1,59 @@ +FROM --platform=linux/amd64 ubuntu:20.04 AS start +SHELL ["/bin/bash", "-c"] +ARG USER=runner +ENV DEBIAN_FRONTEND=noninteractive +ENV TZ=Europe/Bucharest +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone +RUN apt-get update && \ + apt-get -y upgrade && \ + apt-get install -y apt-utils sudo git wget flex bison pkg-config make python3 pip vim +RUN groupadd -g 1000 -r $USER && \ + useradd -u 1000 -g 1000 --create-home -r $USER + +#Change password +RUN echo "$USER:$USER" | chpasswd + +#Make sudo passwordless +RUN echo "${USER} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/90-$USER && \ + usermod -aG sudo $USER && \ + usermod -aG plugdev $USER + +USER $USER +WORKDIR /home/${USER} + + + +FROM start AS sysroot_builder +ARG USER=runner +ENV DEBIAN_FRONTEND=noninteractive +COPY sysroot.tar.gz /home/${USER} +RUN git clone https://github.com/analogdevicesinc/scopy -b kuiper-worflow +WORKDIR /home/${USER}/scopy +RUN ./CI/kuiper/create_sysroot.sh \ + install_packages \ + move_and_extract_sysroot \ + fix_relativelinks +RUN ./CI/kuiper/build_qt.sh \ + install_packages \ + download_qt \ + download_crosscompiler \ + build_qt5.15.2 +RUN ./CI/kuiper/kuiper_build_process.sh \ + install_packages \ + download_cmake \ + download_crosscompiler \ + clone \ + build_deps + + + +FROM start +ARG USER=runner +ENV DEBIAN_FRONTEND=noninteractive +RUN mkdir -p /home/${USER}/sysroot +COPY --from=sysroot_builder /home/${USER}/scopy/CI/kuiper/staging/sysroot/usr /home/${USER}/sysroot/usr +COPY --from=sysroot_builder /home/${USER}/scopy/CI/kuiper/staging/sysroot/share /home/${USER}/sysroot/share +COPY --from=sysroot_builder /home/${USER}/scopy/CI/kuiper/staging/sysroot/include /home/${USER}/sysroot/include +WORKDIR /home/${USER}/sysroot +RUN ln -s usr/bin bin && ln -s usr/lib lib && ln -s usr/sbin sbin +WORKDIR /home/${USER} \ No newline at end of file diff --git a/CI/kuiper/inside_chroot.sh b/CI/kuiper/inside_chroot.sh new file mode 100644 index 0000000000..24b2d3c623 --- /dev/null +++ b/CI/kuiper/inside_chroot.sh @@ -0,0 +1,58 @@ +#!/bin/bash + +export DEBIAN_FRONTEND=noninteractive +ln -snf /usr/share/zoneinfo/Europe/Bucharest /etc/localtime && echo "Europe/Bucharest" > /etc/timezone +echo "LC_ALL=en_US.UTF-8" | tee -a /etc/environment +echo "LANG=en_US.UTF-8" | tee -a /etc/locale.conf +locale-gen en_US.UTF-8 + +sed -i 's/#deb-src/deb-src/' /etc/apt/sources.list + +apt -y purge openjdk* tex-common +apt -y remove gnuradio gnuradio-* libgnuradio-* libvolk* +apt -y remove qt* libqt5* +apt -y autoremove +apt update && apt -y upgrade +apt -y dist-upgrade +dpkg --configure -a + +rm -rf /usr/local/include/volk /usr/local/lib/libvolk* \ + /usr/local/lib/cmake/volk +rm -rf /usr/lib/arm-linux-gnueabihf/libiio.so* \ + usr/local/src/libiio \ + /usr/lib/arm-linux-gnueabihf/pkgconfig/libiio.pc +rm -rf /usr/local/lib/cmake/m2k \ + /usr/local/lib/arm-linux-gnueabihf/pkgconfig/libm2k.pc \ + /usr/local/lib/arm-linux-gnueabihf/pkgconfig/gnuradio-m2k.pc \ + /usr/local/lib/arm-linux-gnueabihf/libgnuradio-m2k.so* \ + /usr/local/lib/arm-linux-gnueabihf/libm2k.so* \ + /usr/local/lib/arm-linux-gnueabihf/cmake/libm2k \ + /usr/local/include/libm2k /usr/local/include/m2k +rm -rf /usr/local/lib/arm-linux-gnueabihf/libgnuradio-iio.so* \ + /usr/local/lib/arm-linux-gnueabihf/pkgconfig/gnuradio-iio.pc \ + /usr/local/lib/cmake/iio +rm -rf /usr/lib/arm-linux-gnueabihf/libad9361.so* \ + /usr/lib/arm-linux-gnueabihf/pkgconfig/libad9361.pc \ + /usr/lib/libad9166.so* \ + /usr/lib/pkgconfig/libad9166.pc + +apt -y build-dep qtbase5-dev || true +apt -y install build-essential gcc g++ gdb-multiarch cmake autoconf automake bison flex git wget pkg-config figlet gawk unzip libsndfile1-dev \ + libudev-dev libinput-dev libts-dev libxcb-xinerama0-dev libxcb-xinerama0 gdbserver libspeechd-dev perl \ + libgl1-mesa-dev libxcb-composite0-dev libxcb-cursor-dev libxcb-damage0-dev libxcb-xv0-dev \ + libxcb-dpms0-dev libxcb-dri2-0-dev libxcb-ewmh-dev libxcb-imdkit-dev libxcb-xvmc0-dev \ + libxcb-present-dev libxcb-record0-dev libxcb-res0-dev libxcb-xrm-dev libx11-xcb-dev libxcb-glx0-dev libxcb-icccm4 libxcb-icccm4-dev libxcb-xkb-dev libxkbcommon-x11-dev \ + libxcb-screensaver0-dev libxcb-util0-dev libxcb-xf86dri0-dev libxcb-xtest0-dev +apt -y install libunwind-dev libsndfile1-dev mesa-utils* mesa-common-dev libglu1-mesa-dev freeglut3-dev mesa-common-dev python2 libopenal-dev || true +apt -y install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev || true + +wget https://raw.githubusercontent.com/abhiTronix/raspberry-pi-cross-compilers/master/utils/SSymlinker +sed -i 's/sudo//g' SSymlinker +chmod +x SSymlinker +./SSymlinker -s /usr/include/arm-linux-gnueabihf/asm -d /usr/include +./SSymlinker -s /usr/include/arm-linux-gnueabihf/gnu -d /usr/include +./SSymlinker -s /usr/include/arm-linux-gnueabihf/bits -d /usr/include +./SSymlinker -s /usr/include/arm-linux-gnueabihf/sys -d /usr/include +./SSymlinker -s /usr/lib/arm-linux-gnueabihf/crtn.o -d /usr/lib/crtn.o +./SSymlinker -s /usr/lib/arm-linux-gnueabihf/crt1.o -d /usr/lib/crt1.o +./SSymlinker -s /usr/lib/arm-linux-gnueabihf/crti.o -d /usr/lib/crti.o \ No newline at end of file diff --git a/CI/kuiper/kuiper_build_config.sh b/CI/kuiper/kuiper_build_config.sh new file mode 100644 index 0000000000..d9d53f5683 --- /dev/null +++ b/CI/kuiper/kuiper_build_config.sh @@ -0,0 +1,58 @@ +#!/bin/bash + +LIBIIO_VERSION=v0.25 +LIBAD9361_BRANCH=main +GLOG_BRANCH=v0.4.0 +LIBM2K_BRANCH=main +SPDLOG_BRANCH=v1.x +VOLK_BRANCH=main +GNURADIO_BRANCH=maint-3.10 +GRSCOPY_BRANCH=3.10 +GRM2K_BRANCH=main +LIBSIGROKDECODE_BRANCH=master +QWT_BRANCH=qwt-multiaxes-updated +LIBTINYIIOD_BRANCH=master +IIOEMU_BRANCH=master + +STAGING_AREA=$SRC_DIR/CI/kuiper/staging +SYSROOT=$STAGING_AREA/sysroot +SYSROOT_TAR=$STAGING_AREA/sysroot.tar.gz +SYSROOT_DOCKER=$SRC_DIR/CI/kuiper/docker/sysroot.tar.gz +TOOLCHAIN=$STAGING_AREA/cross-pi-gcc +TOOLCHAIN_BIN=$TOOLCHAIN/bin +TOOLCHAIN_HOST="arm-linux-gnueabihf" +TOOLCHAIN_FILE=$SRC_DIR/CI/kuiper/cmake_toolchain.cmake +QT_LOCATION=$SYSROOT/usr/local/qt5.15 + +CMAKE_BIN=$STAGING_AREA/cmake/bin/cmake +QMAKE_BIN=$QT_LOCATION/bin/qmake +JOBS=-j14 + +APP_DIR=$SRC_DIR/CI/kuiper/scopy.AppDir +APP_IMAGE=$SRC_DIR/CI/kuiper/Scopy1-armhf.AppImage +APP_RUN=$SRC_DIR/CI/kuiper/AppRun +APP_DESKTOP=$SRC_DIR/CI/kuiper/scopy.desktop +APP_SQUASHFS=$SRC_DIR/CI/kuiper/scopy.squashfs +RUNTIME_ARMHF=$SRC_DIR/CI/kuiper/runtime-armhf + +CMAKE_OPTS=(\ + -DCMAKE_SYSROOT="$SYSROOT" \ + -DQT_LOCATION="$QT_LOCATION" \ + -DSTAGING_AREA="$STAGING_AREA" \ + -DCMAKE_INSTALL_PREFIX="$SYSROOT" \ + -DCMAKE_TOOLCHAIN_FILE="$TOOLCHAIN_FILE" \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DCMAKE_VERBOSE_MAKEFILE=ON \ + ) + +CMAKE="$CMAKE_BIN ${CMAKE_OPTS[*]}" + +QT_BUILD_LOCATION=$QT_LOCATION # the location where Qt will be installed in the system +QT_SYSTEM_LOCATION=/usr/local/qt5.15 # the Qt location relative to the sysroot folder +CROSS_COMPILER=$STAGING_AREA/cross-pi-gcc + +CROSSCOMPILER_DOWNLOAD_LINK=https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Bullseye/GCC%2010.2.0/Raspberry%20Pi%203A%2B%2C%203B%2B%2C%204/cross-gcc-10.2.0-pi_3%2B.tar.gz +CMAKE_DOWNLOAD_LINK=https://github.com/Kitware/CMake/releases/download/v3.29.0-rc2/cmake-3.29.0-rc2-linux-x86_64.tar.gz +KUIPER_DOWNLOAD_LINK=https://swdownloads.analog.com/cse/kuiper/image_2023-12-13-ADI-Kuiper-full.zip +QT_DOWNLOAD_LINK=http://download.qt.io/archive/qt/5.15/5.15.2/single/qt-everywhere-src-5.15.2.tar.xz +SYSROOT_RELATIVE_LINKS=https://raw.githubusercontent.com/abhiTronix/rpi_rootfs/master/scripts/sysroot-relativelinks.py diff --git a/CI/kuiper/kuiper_build_process.sh b/CI/kuiper/kuiper_build_process.sh new file mode 100755 index 0000000000..27a870f81e --- /dev/null +++ b/CI/kuiper/kuiper_build_process.sh @@ -0,0 +1,357 @@ +#!/bin/bash + +set -ex +git config --global --add safe.directory $HOME/scopy +SRC_DIR=$(git rev-parse --show-toplevel) +source $SRC_DIR/CI/kuiper/kuiper_build_config.sh + +echo -- USING CMAKE COMMAND: +echo $CMAKE +echo -- USING QT: $QT +echo -- USING QMAKE: $QMAKE_BIN + +build_with_cmake() { + BUILD_FOLDER=$PWD/build + rm -rf $BUILD_FOLDER + mkdir -p $BUILD_FOLDER + cd $BUILD_FOLDER + $CMAKE $CURRENT_BUILD_CMAKE_OPTS ../ + make $JOBS + CURRENT_BUILD_CMAKE_OPTS="" +} + +set_config_opts() { + CPP="${TOOLCHAIN_BIN}/${TOOLCHAIN_HOST}-cpp" + CC="${TOOLCHAIN_BIN}/${TOOLCHAIN_HOST}-gcc" + CXX="${TOOLCHAIN_BIN}/${TOOLCHAIN_HOST}-g++" + LD="${TOOLCHAIN_BIN}/${TOOLCHAIN_HOST}-ld" + AS="${TOOLCHAIN_BIN}/${TOOLCHAIN_HOST}-as" + AR="${TOOLCHAIN_BIN}/${TOOLCHAIN_HOST}-ar" + RANLIB="${TOOLCHAIN_BIN}/${TOOLCHAIN_HOST}-ranlib" + + CFLAGS=" -I${SYSROOT}/include -I${SYSROOT}/include/arm-linux-gnueabihf -I${SYSROOT}/usr/include -I${SYSROOT}/usr/include/arm-linux-gnueabihf -I${TOOLCHAIN}/include- -fPIC" + CPPFLAGS="-fexceptions ${CFLAGS}" + LDFLAGS="-Wl,-rpath=XORIGIN -L${TOOLCHAIN}/arm-linux-gnueabihf/lib -L${TOOLCHAIN}/arm-linux-gnueabihf/libc/lib -L${TOOLCHAIN}/arm-linux-gnueabihf/libc/usr/lib -L${SYSROOT}/lib -L${SYSROOT}/usr/lib -L${SYSROOT}/usr/lib/arm-linux-gnueabihf -L${SYSROOT}/usr/lib/arm-linux-gnueabihf" + + CONFIG_OPTS=() + CONFIG_OPTS+=("--prefix=${SYSROOT}") + CONFIG_OPTS+=("--host=${TOOLCHAIN_HOST}") + CONFIG_OPTS+=("--with-sysroot=${SYSROOT}") + CONFIG_OPTS+=("CFLAGS=${CFLAGS}") + CONFIG_OPTS+=("CPPFLAGS=${CPPFLAGS}") + CONFIG_OPTS+=("LDFLAGS=${LDFLAGS}") + CONFIG_OPTS+=("PKG_CONFIG=${SYSROOT}/usr/bin/arm-linux-gnueabihf-pkg-config" ) + CONFIG_OPTS+=("PKG_CONFIG_DIR=") + CONFIG_OPTS+=("PKG_CONFIG_LIBDIR=${SYSROOT}/usr/lib/arm-linux-gnueabihf/pkgconfig:${SYSROOT}/usr/share/pkgconfig:${SYSROOT}/usr/lib/arm-linux-gnueabihf/pkgconfig:${SYSROOT}/usr/local/lib/pkgconfig") + CONFIG_OPTS+=("PKG_CONFIG_SYSROOT=${SYSROOT}") + CONFIG_OPTS+=("PKG_CONFIG_SYSROOT_DIR=${SYSROOT}") + CONFIG_OPTS+=("PKG_CONFIG_PATH=${SYSROOT}/usr/bin/arm-linux-gnueabihf-pkg-config") + CONFIG_OPTS+=("PKG_CONFIG_ALLOW_CROSS=1") + CONFIG_OPTS+=("CPP=${CPP}") + CONFIG_OPTS+=("CC=${CC}") + CONFIG_OPTS+=("CXX=${CXX}") + CONFIG_OPTS+=("LD=${LD}") + CONFIG_OPTS+=("AS=${AS}") + CONFIG_OPTS+=("AR=${AR}") + CONFIG_OPTS+=("RANLIB=${RANLIB}") +} + +install_packages() { + sudo apt install -y build-essential cmake unzip gfortran gcc git bison libtool \ + python3 pip gperf pkg-config gdb-multiarch g++ flex texinfo gawk openssl \ + pigz libncurses-dev autoconf automake tar figlet liborc-0.4-dev* patchelf libc6-dev-armhf-cross squashfs-tools + pip install mako +} + +download_cmake() { + mkdir -p ${STAGING_AREA} + pushd ${STAGING_AREA} + if [ ! -d cmake ];then + wget ${CMAKE_DOWNLOAD_LINK} + # unzip and rename + tar -xvf cmake*.tar.gz && rm cmake*.tar.gz && mv cmake* cmake + else + echo "Cmake already downloaded" + fi + popd +} + +download_crosscompiler(){ + mkdir -p ${STAGING_AREA} + pushd ${STAGING_AREA} + if [ ! -d cross-pi-gcc ];then + wget --progress=dot:giga ${CROSSCOMPILER_DOWNLOAD_LINK} + # unzip and rename + tar -xf cross-gcc-*.tar.gz && rm cross-gcc-*.tar.gz && mv cross-pi-* cross-pi-gcc + else + echo "Crosscompiler already downloaded" + fi + popd +} + +clone() { + echo "#######CLONE#######" + mkdir -p $STAGING_AREA + pushd $STAGING_AREA + [ -d 'libiio' ] || git clone --recursive https://github.com/analogdevicesinc/libiio.git -b $LIBIIO_VERSION libiio + [ -d 'libad9361' ] || git clone --recursive https://github.com/analogdevicesinc/libad9361-iio.git -b $LIBAD9361_BRANCH libad9361 + [ -d 'libm2k' ] || git clone --recursive https://github.com/analogdevicesinc/libm2k.git -b $LIBM2K_BRANCH libm2k + [ -d 'spdlog' ] || git clone --recursive https://github.com/gabime/spdlog.git -b $SPDLOG_BRANCH spdlog + [ -d 'gr-scopy' ] || git clone --recursive https://github.com/analogdevicesinc/gr-scopy.git -b $GRSCOPY_BRANCH gr-scopy + [ -d 'gr-m2k' ] || git clone --recursive https://github.com/analogdevicesinc/gr-m2k.git -b $GRM2K_BRANCH gr-m2k + [ -d 'volk' ] || git clone --recursive https://github.com/gnuradio/volk.git -b $VOLK_BRANCH volk + [ -d 'gnuradio' ] || git clone --recursive https://github.com/gnuradio/gnuradio.git -b $GNURADIO_BRANCH gnuradio + [ -d 'qwt' ] || git clone --recursive https://github.com/cseci/qwt.git -b $QWT_BRANCH qwt + [ -d 'libsigrokdecode' ] || git clone --recursive https://github.com/sigrokproject/libsigrokdecode.git -b $LIBSIGROKDECODE_BRANCH libsigrokdecode + [ -d 'libtinyiiod' ] || git clone --recursive https://github.com/analogdevicesinc/libtinyiiod.git -b $LIBTINYIIOD_BRANCH libtinyiiod + popd +} + +build_libiio() { + echo "### Building libiio - version $LIBIIO_VERSION" + pushd $STAGING_AREA/libiio + CURRENT_BUILD_CMAKE_OPTS="\ + -DWITH_TESTS:BOOL=OFF \ + -DWITH_DOC:BOOL=OFF \ + -DHAVE_DNS_SD:BOOL=OFF\ + -DWITH_MATLAB_BINDINGS:BOOL=OFF \ + -DCSHARP_BINDINGS:BOOL=OFF \ + -DPYTHON_BINDINGS:BOOL=OFF \ + -DWITH_SERIAL_BACKEND:BOOL=ON \ + -DENABLE_IPV6:BOOL=OFF \ + -DINSTALL_UDEV_RULE:BOOL=OFF + " + build_with_cmake + sudo make install + popd +} + +build_libad9361() { + echo "### Building libad9361 - branch $LIBAD9361_BRANCH" + pushd $STAGING_AREA/libad9361 + build_with_cmake + sudo make install + popd +} + +build_spdlog() { + echo "### Building spdlog - branch $SPDLOG_BRANCH" + pushd $STAGING_AREA/spdlog + CURRENT_BUILD_CMAKE_OPTS="-DSPDLOG_BUILD_SHARED=ON" + build_with_cmake + sudo make install + popd +} + +build_libm2k() { + echo "### Building libm2k - branch $LIBM2K_BRANCH" + pushd $STAGING_AREA/libm2k + CURRENT_BUILD_CMAKE_OPTS="\ + -DENABLE_PYTHON=OFF \ + -DENABLE_CSHARP=OFF \ + -DBUILD_EXAMPLES=ON \ + -DENABLE_TOOLS=OFF \ + -DINSTALL_UDEV_RULES=OFF \ + -DENABLE_LOG=OFF + " + build_with_cmake + sudo make install + popd +} + +build_volk() { + echo "### Building volk - branch $VOLK_BRANCH" + pushd $STAGING_AREA/volk + build_with_cmake + sudo make install + popd +} + +build_gnuradio() { + echo "### Building gnuradio - branch $GNURADIO_BRANCH" + pushd $STAGING_AREA/gnuradio + CURRENT_BUILD_CMAKE_OPTS="\ + -DENABLE_DEFAULT=OFF \ + -DENABLE_GNURADIO_RUNTIME=ON \ + -DENABLE_GR_ANALOG=ON \ + -DENABLE_GR_BLOCKS=ON \ + -DENABLE_GR_FFT=ON \ + -DENABLE_GR_FILTER=ON \ + -DENABLE_GR_IIO=ON \ + -DENABLE_POSTINSTALL=OFF + " + build_with_cmake + sudo make install + popd +} + +build_grscopy() { + echo "### Building gr-scopy - branch $GRSCOPY_BRANCH" + pushd $STAGING_AREA/gr-scopy + build_with_cmake + sudo make install + popd +} + +build_grm2k() { + echo "### Building gr-m2k - branch $GRM2K_BRANCH" + pushd $STAGING_AREA/gr-m2k + CURRENT_BUILD_CMAKE_OPTS="\ + -DENABLE_PYTHON=OFF \ + -DDIGITAL=OFF + " + build_with_cmake + sudo make install + popd +} + +build_qwt() { + echo "### Building qwt - branch $QWT_BRANCH" + pushd $STAGING_AREA/qwt + git clean -xdf + sed -i 's|/usr/local/qwt-$$QWT_VERSION-ma|/usr/local|g' qwtconfig.pri + $QMAKE_BIN INCLUDEPATH=$SYSROOT/include LIBS=-L$SYSROOT/lib qwt.pro + make $JOBS + patchelf --force-rpath --set-rpath \$ORIGIN $STAGING_AREA/qwt/lib/libqwt.so + sudo make INSTALL_ROOT=$SYSROOT install + popd +} + +build_libsigrokdecode() { + echo "### Building libsigrokdecode - branch $LIBSIGROKDECODE_BRANCH" + set_config_opts + pushd $STAGING_AREA/libsigrokdecode + git clean -xdf + ./autogen.sh + ./configure "${CONFIG_OPTS[@]}" + make $JOBS + patchelf --force-rpath --set-rpath \$ORIGIN $STAGING_AREA/libsigrokdecode/.libs/libsigrokdecode.so + sudo make install + popd +} + +build_libtinyiiod() { + echo "### Building libtinyiiod - branch $LIBTINYIIOD_BRANCH" + pushd $STAGING_AREA/libtinyiiod + CURRENT_BUILD_CMAKE_OPTS="-DBUILD_EXAMPLES=OFF" + build_with_cmake + sudo make install + popd +} + +build_iio-emu(){ + echo "### Building iio-emu - branch $IIOEMU_BRANCH" + pushd $STAGING_AREA + [ -d 'iio-emu' ] || git clone --recursive https://github.com/analogdevicesinc/iio-emu -b $IIOEMU_BRANCH iio-emu + pushd $STAGING_AREA/iio-emu + build_with_cmake + sudo make install + popd + popd +} + +build_scopy() { + echo "### Building scopy" + pushd $SRC_DIR + CURRENT_BUILD_CMAKE_OPTS="\ + -DCLONE_IIO_EMU=OFF + " + build_with_cmake + popd +} + +build_deps(){ + build_libiio +# build_libad9361 +# build_spdlog +# build_libm2k +# build_volk +# build_gnuradio + build_grscopy + build_grm2k + build_qwt + build_libsigrokdecode + build_libtinyiiod +} + +create_appdir(){ + + BUILD_FOLDER=$SRC_DIR/build + EMU_BUILD_FOLDER=$STAGING_AREA/iio-emu/build + COPY_DEPS=$SRC_DIR/CI/kuiper/copy-deps.sh + + rm -rf $APP_DIR + mkdir $APP_DIR + mkdir -p $APP_DIR/usr/bin + mkdir -p $APP_DIR/usr/lib + mkdir -p $APP_DIR/usr/share/applications + mkdir -p $APP_DIR/usr/share/icons/hicolor/512x512 + + cp $APP_RUN $APP_DIR + cp $APP_DESKTOP $APP_DIR + cp $SRC_DIR/resources/Scopy.png $APP_DIR + cp $SRC_DIR/resources/Scopy.png $APP_DIR/usr/share/icons/hicolor/512x512 + cp $APP_DESKTOP $APP_DIR/usr/share/applications + + cp $EMU_BUILD_FOLDER/iio-emu $APP_DIR/usr/bin + cp $BUILD_FOLDER/scopy $APP_DIR/usr/bin + + $COPY_DEPS $APP_DIR/usr/bin/scopy $APP_DIR/usr/lib + $COPY_DEPS $APP_DIR/usr/bin/iio-emu $APP_DIR/usr/lib + + + cp -r $QT_LOCATION/plugins $APP_DIR/usr + cp -r $SYSROOT/lib/python3.9 $APP_DIR/usr/lib + cp -r $SYSROOT/share/libsigrokdecode/decoders $APP_DIR/usr/lib + + cp $QT_LOCATION/lib/libQt5XcbQpa.so* $APP_DIR/usr/lib + cp $QT_LOCATION/lib/libQt5EglFSDeviceIntegration.so* $APP_DIR/usr/lib + cp $QT_LOCATION/lib/libQt5DBus.so* $APP_DIR/usr/lib + + + cp $SYSROOT/lib/arm-linux-gnueabihf/libstdc++.so* $APP_DIR/usr/lib + cp $SYSROOT/lib/arm-linux-gnueabihf/libc.so* $APP_DIR/usr/lib + cp $SYSROOT/lib/arm-linux-gnueabihf/libdl.so* $APP_DIR/usr/lib + cp $SYSROOT/lib/arm-linux-gnueabihf/libpthread.so* $APP_DIR/usr/lib + cp $SYSROOT/lib/arm-linux-gnueabihf/libGLESv2.so* $APP_DIR/usr/lib + + cp $SYSROOT/usr/lib/arm-linux-gnueabihf/ld-linux-armhf.so* $APP_DIR/usr/lib + cp $SYSROOT/usr/lib/arm-linux-gnueabihf/libarmmem-v7l.so* $APP_DIR/usr/lib + cp $SYSROOT/usr/lib/arm-linux-gnueabihf/libm.so* $APP_DIR/usr/lib + cp $SYSROOT/usr/lib/arm-linux-gnueabihf/libgcc_s.so* $APP_DIR/usr/lib + cp $SYSROOT/usr/lib/arm-linux-gnueabihf/libdl.so* $APP_DIR/usr/lib + cp $SYSROOT/usr/lib/arm-linux-gnueabihf/libmd.so* $APP_DIR/usr/lib + cp $SYSROOT/lib/arm-linux-gnueabihf/libbsd.so* $APP_DIR/usr/lib + cp $SYSROOT/lib/arm-linux-gnueabihf/libXdmcp.so* $APP_DIR/usr/lib + cp $SYSROOT/usr/lib/arm-linux-gnueabihf/libXau.so* $APP_DIR/usr/lib + cp $SYSROOT/usr/lib/arm-linux-gnueabihf/libxcb.so* $APP_DIR/usr/lib +} + + +create_appimage(){ + rm -rf $APP_IMAGE + mksquashfs $APP_DIR $APP_SQUASHFS -root-owned -noappend + cat $RUNTIME_ARMHF >> $APP_IMAGE + cat $APP_SQUASHFS >> $APP_IMAGE + chmod a+x $APP_IMAGE +} + +# move the sysroot from the home of the docker container to the known location +move_sysroot(){ + mkdir -p $STAGING_AREA + [ -d /home/runner/sysroot ] && sudo mv /home/runner/sysroot $SYSROOT +} + +# move and rename the AppImage artifact +move_appimage(){ + mv $APP_IMAGE $SRC_DIR/Scopy-armhf.AppImage +} + +generate_ci_envs() +{ + $SRC_DIR/CI/appveyor/gen_ci_envs.sh > $SRC_DIR/CI/kuiper/gh-actions.envs +} + +for arg in $@; do + $arg +done diff --git a/CI/kuiper/qt_patch.patch b/CI/kuiper/qt_patch.patch new file mode 100644 index 0000000000..ec1e6bf431 --- /dev/null +++ b/CI/kuiper/qt_patch.patch @@ -0,0 +1,126 @@ +--- new/qt-everywhere-src-5.15.2/qtbase/mkspecs/linux-arm-gnueabihf-g++/qmake.conf ++++ qt-everywhere-src-5.15.2/qtbase/mkspecs/linux-arm-gnueabihf-g++/qmake.conf +@@ -0,0 +1,26 @@ ++# ++# qmake configuration for building with arm-linux-gnueabihf-g++ ++# ++ ++MAKEFILE_GENERATOR = UNIX ++CONFIG += incremental ++QMAKE_INCREMENTAL_STYLE = sublib ++ ++include(../common/linux.conf) ++include(../common/gcc-base-unix.conf) ++include(../common/g++-unix.conf) ++ ++QMAKE_LIBS_EGL = -lEGL ++ ++# modifications to g++.conf ++QMAKE_CC = arm-linux-gnueabihf-gcc ++QMAKE_CXX = arm-linux-gnueabihf-g++ ++QMAKE_LINK = arm-linux-gnueabihf-g++ ++QMAKE_LINK_SHLIB = arm-linux-gnueabihf-g++ ++ ++# modifications to linux.conf ++QMAKE_AR = arm-linux-gnueabihf-ar cqs ++QMAKE_OBJCOPY = arm-linux-gnueabihf-objcopy ++QMAKE_NM = arm-linux-gnueabihf-nm -P ++QMAKE_STRIP = arm-linux-gnueabihf-strip ++load(qt_config) +--- new/qt-everywhere-src-5.15.2/qtbase/mkspecs/linux-arm-gnueabihf-g++/qplatformdefs.h ++++ qt-everywhere-src-5.15.2/qtbase/mkspecs/linux-arm-gnueabihf-g++/qplatformdefs.h +@@ -0,0 +1,40 @@ ++/**************************************************************************** ++** ++** Copyright (C) 2016 The Qt Company Ltd. ++** Contact: https://www.qt.io/licensing/ ++** ++** This file is part of the qmake spec of the Qt Toolkit. ++** ++** $QT_BEGIN_LICENSE:LGPL$ ++** Commercial License Usage ++** Licensees holding valid commercial Qt licenses may use this file in ++** accordance with the commercial license agreement provided with the ++** Software or, alternatively, in accordance with the terms contained in ++** a written agreement between you and The Qt Company. For licensing terms ++** and conditions see https://www.qt.io/terms-conditions. For further ++** information use the contact form at https://www.qt.io/contact-us. ++** ++** GNU Lesser General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU Lesser ++** General Public License version 3 as published by the Free Software ++** Foundation and appearing in the file LICENSE.LGPL3 included in the ++** packaging of this file. Please review the following information to ++** ensure the GNU Lesser General Public License version 3 requirements ++** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ++** ++** GNU General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU ++** General Public License version 2.0 or (at your option) the GNU General ++** Public license version 3 or any later version approved by the KDE Free ++** Qt Foundation. The licenses are as published by the Free Software ++** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ++** included in the packaging of this file. Please review the following ++** information to ensure the GNU General Public License requirements will ++** be met: https://www.gnu.org/licenses/gpl-2.0.html and ++** https://www.gnu.org/licenses/gpl-3.0.html. ++** ++** $QT_END_LICENSE$ ++** ++****************************************************************************/ ++ ++#include "../linux-g++/qplatformdefs.h" +--- new/qt-everywhere-src-5.15.2/qtbase/src/3rdparty/angle/include/EGL/eglplatform.h ++++ qt-everywhere-src-5.15.2/qtbase/src/3rdparty/angle/include/EGL/eglplatform.h +@@ -141,6 +141,7 @@ + */ + typedef khronos_int32_t EGLint; + ++typedef uint32_t DISPMANX_ELEMENT_HANDLE_T; + + /* C++ / C typecast macros for special EGL handle values */ + #if defined(__cplusplus) +--- new/qt-everywhere-src-5.15.2/qtbase/src/gui/configure.json ++++ qt-everywhere-src-5.15.2/qtbase/src/gui/configure.json +@@ -862,7 +862,10 @@ + "type": "compile", + "test": { + "include": [ "EGL/egl.h", "bcm_host.h" ], +- "main": "vc_dispmanx_display_open(0);" ++ "main": [ ++ "vc_dispmanx_display_open(0);", ++ "EGL_DISPMANX_WINDOW_T *eglWindow = new EGL_DISPMANX_WINDOW_T;" ++ ] + }, + "use": "egl bcm_host" + }, +--- new/qt-everywhere-src-5.15.2/qtbase/src/plugins/platforms/eglfs/deviceintegration/eglfs_brcm/qeglfsbrcmintegration.cpp ++++ qt-everywhere-src-5.15.2/qtbase/src/plugins/platforms/eglfs/deviceintegration/eglfs_brcm/qeglfsbrcmintegration.cpp +@@ -44,6 +44,12 @@ + + static DISPMANX_DISPLAY_HANDLE_T dispman_display = 0; + ++typedef struct { ++ DISPMANX_ELEMENT_HANDLE_T element; ++ int width; /* This is necessary because dispmanx elements are not queriable. */ ++ int height; ++} EGL_DISPMANX_WINDOW_T; ++ + static EGLNativeWindowType createDispmanxLayer(const QPoint &pos, const QSize &size, int z, DISPMANX_FLAGS_ALPHA_T flags) + { + VC_RECT_T dst_rect; +@@ -76,12 +82,12 @@ + eglWindow->width = size.width(); + eglWindow->height = size.height(); + +- return eglWindow; ++ return (EGLNativeWindowType)eglWindow; + } + + static void destroyDispmanxLayer(EGLNativeWindowType window) + { +- EGL_DISPMANX_WINDOW_T *eglWindow = static_cast(window); ++ EGL_DISPMANX_WINDOW_T *eglWindow = (EGL_DISPMANX_WINDOW_T*)(window); + DISPMANX_UPDATE_HANDLE_T dispman_update = vc_dispmanx_update_start(0); + vc_dispmanx_element_remove(dispman_update, eglWindow->element); + vc_dispmanx_update_submit_sync(dispman_update); diff --git a/CI/kuiper/runtime-armhf b/CI/kuiper/runtime-armhf new file mode 100644 index 0000000000000000000000000000000000000000..d094f36552a6f89e07232a6f7b232e4a2512b7c0 GIT binary patch literal 147212 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Ϋ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 literal 0 HcmV?d00001 diff --git a/CI/kuiper/scopy.desktop b/CI/kuiper/scopy.desktop new file mode 100644 index 0000000000..705923d28c --- /dev/null +++ b/CI/kuiper/scopy.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Version=1.0 +Icon=scopy +Exec=scopy +Terminal=false +Type=Application +Categories=Science +Name=Scopy +GenericName=Oscilloscope +Comment=A software oscilloscope diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000000..28f5a4892d --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,56 @@ +clone_depth: 1 +#init: +# - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) + +image: Visual Studio 2019 + +environment: + BUILD_NO: $(APPVEYOR_BUILD_NUMBER) + BRANCH: $(APPVEYOR_REPO_BRANCH) + REPO: $(APPVEYOR_REPO_NAME) + CI_BUILD: 1 + matrix: + - ARCH: x86_64 + ARCH_BIT: 64 + APPVEYOR_BUILD_WORKER_IMAGE: Ubuntu2004 + PKG_MANAGER_UPDATE_CMD: "sudo apt-get -y update" + BUILD_DEPS_CMD: "/home/appveyor/projects/scopy/CI/appveyor/install_ubuntu_20_deps.sh /home/appveyor/Qt/5.15.2" + BUILD_CMD: "/home/appveyor/projects/scopy/CI/appveyor/build_appveyor_ubuntu.sh /home/appveyor/Qt/5.15.2" + PACKAGE_CMD: "" + DEPLOY_FILE: "" + +# - ARCH: x86_64 +# ARCH_BIT: 64 +# APPVEYOR_BUILD_WORKER_IMAGE: Ubuntu1804 +# BUILD_DEPS_CMD: "/home/appveyor/projects/scopy/CI/appveyor/build_appveyor_flatpak.sh $BRANCH $REPO" +# BUILD_CMD: "" +# PACKAGE_CMD: "" +# DEPLOY_FILE: "/home/appveyor/projects/scopy/Scopy.flatpak" + +install: + # Install Inno Setup + - cmd: choco install InnoSetup + +build_script: + # Update MSYS2 - https://www.msys2.org/docs/ci/#appveyor + - cmd: C:\msys64\usr\bin\bash -lc "pacman --noconfirm -Syuu" # Core update (in case any core packages are outdated) + - cmd: C:\msys64\usr\bin\bash -lc "pacman --noconfirm -Syuu" # Normal update + + # Then run your code + - cmd: set CHERE_INVOKING='yes' # Preserve the current working directory + - cmd: set MSYSTEM='MINGW64' # Start a 64 bit Mingw environment + - cmd: C:\msys64\usr\bin\bash -lc "/c/projects/scopy/CI/appveyor/extract_msys_deps.sh" + - cmd: set PATH=%PATH%;"C:\Program Files (x86)\Inno Setup 6" + - cmd: "%BUILD_DEPS_CMD%" + + - sh: $PKG_MANAGER_UPDATE_CMD + - sh: echo $BUILD_DEPS_CMD + - sh: $BUILD_DEPS_CMD + - sh: $BUILD_CMD + - sh: $PACKAGE_CMD + + - echo "### Push artifacts ... " + - sh: if [[ $DEPLOY_FILE != "" ]]; then appveyor PushArtifact $DEPLOY_FILE; fi + +#on_finish: +# - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) diff --git a/resources/Scopy.png b/resources/Scopy.png new file mode 100644 index 0000000000000000000000000000000000000000..ca5a6fc1f9a9f41cb7e18ca68f800360d4865dab GIT binary patch literal 23663 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 Wt^mal)EyKO2h^0cZWk+=2K*n_uah(Y literal 0 HcmV?d00001 diff --git a/src/tool_launcher.cpp b/src/tool_launcher.cpp index 6a42a1ff5b..bd1873feea 100644 --- a/src/tool_launcher.cpp +++ b/src/tool_launcher.cpp @@ -1825,6 +1825,8 @@ bool adiscope::ToolLauncher::switchContext(const QString& uri) } else { #if defined __APPLE__ bool success = loadDecoders(QCoreApplication::applicationDirPath() + "/decoders"); +#elif defined(__ARM_ARCH_6__) + bool success = loadDecoders(QCoreApplication::applicationDirPath() + "/../lib/decoders"); #else bool success = loadDecoders("decoders"); #endif