diff --git a/.github/workflows/kuiperbuild.yml b/.github/workflows/kuiperbuild.yml new file mode 100644 index 0000000000..2c35a20392 --- /dev/null +++ b/.github/workflows/kuiperbuild.yml @@ -0,0 +1,36 @@ +name: Kuiper Scopy Build + +on: [push, pull_request] + +env: + BUILD_HOST: ubuntu-22.04 + USERNAME: github-actions + +jobs: + + build_scopy_on_ubuntu22: + runs-on: ubuntu-22.04 + container: + image: cristianbindea/scopy2-kuiper:latest + options: --user root + steps: + - uses: actions/checkout@v3 + + - name: Build Scopy + shell: bash + run: | + $GITHUB_WORKSPACE/ci/kuiper/kuiper_build_process.sh move_sysroot build_scopy 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" + + - name: Upload binaries to release + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: ${{ github.workspace }}\Scopy.appimage + asset_name: scopy-linux-armhf-${{ env.commit_sha }} + tag: ${{ github.ref }} + overwrite: true + body: "Scopy armhf" \ No newline at end of file diff --git a/.gitignore b/.gitignore index 7e72fec662..a64be503e1 100644 --- a/.gitignore +++ b/.gitignore @@ -36,6 +36,8 @@ build/* .vscode/* ci/ubuntu/staging ci/macOS/staging +ci/kuiper/staging +ci/kuiper/docker/sysroot windows/* core/include/scopy-core_config.h core/include/scopy-core_export.h diff --git a/ci/kuiper/AppRun b/ci/kuiper/AppRun new file mode 100755 index 0000000000..b73d926f23 --- /dev/null +++ b/ci/kuiper/AppRun @@ -0,0 +1,13 @@ +#!/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 + +echo LD_LIBRARY_PATH: $LD_LIBRARY_PATH +echo PATH: $PATH +ldd $HERE/usr/bin/scopy +exec $HERE/usr/bin/scopy diff --git a/ci/kuiper/AppRun-armhf b/ci/kuiper/AppRun-armhf new file mode 100644 index 0000000000..dc56706aad Binary files /dev/null and b/ci/kuiper/AppRun-armhf differ diff --git a/ci/kuiper/copy-deps.sh b/ci/kuiper/copy-deps.sh new file mode 100755 index 0000000000..80ec77f3b4 --- /dev/null +++ b/ci/kuiper/copy-deps.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +set -x +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="${SYSROOT}/lib:${SYSROOT}/lib/arm-linux-gnueabihf:${SYSROOT}/usr/arm-linux-gnueabihf/lib:${SYSROOT}/usr/local/qt5.15:${SYSROOT}/usr/local/lib:${SRC_DIR}/build" +LIBS_ARRAY=() +run_ldd(){ + 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..139e73bd04 --- /dev/null +++ b/ci/kuiper/create_docker_image.sh @@ -0,0 +1,52 @@ +#!/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 docker ... +} + +create_sysroot(){ + $SRC_DIR/ci/kuiper/create_sysroot.sh \ + install_packages \ + download_kuiper \ + install_qemu \ + extract_sysroot \ + configure_sysroot +} + +build_qt(){ + $SRC_DIR/ci/kuiper/build_qt.sh \ + install_packages \ + download_qt \ + download_crosscompiler \ + build_qt5.15.2 +} + +build_dependencies(){ + $SRC_DIR/ci/kuiper/kuiper_build_process.sh \ + install_packages \ + download_cmake \ + download_crosscompiler \ + clone \ + build_deps +} + +move_sysroot(){ + sudo mv $SYSROOT $SYSROOT_DOCKER +} + +create_image(){ + pushd ${SRC_DIR}/ci/kuiper/docker + sudo docker build --load --tag cristianbindea/scopy2-kuiper . + popd +} + +install_packages +create_sysroot +build_qt +build_dependencies +move_sysroot +create_image diff --git a/ci/kuiper/docker/Dockerfile b/ci/kuiper/docker/Dockerfile new file mode 100644 index 0000000000..8f8ebc3f42 --- /dev/null +++ b/ci/kuiper/docker/Dockerfile @@ -0,0 +1,34 @@ +# docker build -t cristianbindea/scopy-kuiper:latest + + +FROM --platform=linux/amd64 ubuntu:20.04 +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 +ENV SYSROOT_LOCATION=/home/${USER}/sysroot +RUN mkdir -p ${SYSROOT_LOCATION} +COPY sysroot/bin ${SYSROOT_LOCATION}/bin +COPY sysroot/lib ${SYSROOT_LOCATION}/lib +COPY sysroot/usr ${SYSROOT_LOCATION}/usr +COPY scopy2 scopy +WORKDIR /home/${USER}/scopy diff --git a/ci/kuiper/kuiper_build_process.sh b/ci/kuiper/kuiper_build_process.sh index 45ea02c1cb..05de6b7148 100755 --- a/ci/kuiper/kuiper_build_process.sh +++ b/ci/kuiper/kuiper_build_process.sh @@ -428,6 +428,14 @@ create_appimage(){ chmod a+x $APP_IMAGE } +move_appimage(){ + mv $APP_IMAGE $SRC_DIR/ +} + +move_sysroot(){ + mv $HOME/sysroot $SYSROOT +} + for arg in $@; do $arg diff --git a/ci/kuiper/runtime-armhf b/ci/kuiper/runtime-armhf new file mode 100644 index 0000000000..d094f36552 Binary files /dev/null and b/ci/kuiper/runtime-armhf differ 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/common/src/scopyconfig.cpp b/common/src/scopyconfig.cpp index bd058a0c66..321e30313a 100644 --- a/common/src/scopyconfig.cpp +++ b/common/src/scopyconfig.cpp @@ -26,8 +26,9 @@ QString scopy::config::localPluginFolderPath() #if defined __APPLE__ return QCoreApplication::applicationDirPath() + "/plugins/plugins"; #endif - - return SCOPY_PLUGIN_BUILD_PATH; + // TODO: a check for ARM + // Quickfix for testing purposes + return QCoreApplication::applicationDirPath() + "/../share/plugins"; } QString scopy::config::defaultTranslationFolderPath() { return SCOPY_TRANSLATION_INSTALL_PATH; } @@ -38,7 +39,9 @@ QString scopy::config::localTranslationFolderPath() return QCoreApplication::applicationDirPath() + "/translations"; #endif - return SCOPY_TRANSLATION_BUILD_PATH; + // TODO: a check for ARM + // Quickfix for testing purposes + return QCoreApplication::applicationDirPath() + "/../share/translations"; } QString scopy::config::preferencesFolderPath() diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 61a83be183..0bfc9ea582 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -34,7 +34,11 @@ endif() option(WITH_PYTHON "Enable Python" ON) if(${WITH_PYTHON}) set(Python_ADDITIONAL_VERSIONS 3) - find_package(Python3 REQUIRED COMPONENTS Interpreter Development) + if(CMAKE_SYSTEM_PROCESSOR MATCHES arm) + find_package(Python3 REQUIRED COMPONENTS Interpreter) + else() + find_package(Python3 REQUIRED COMPONENTS Interpreter Development) + endif() set(PYTHON_VERSION python${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}) set(PYTHON_VERSION ${PYTHON_VERSION} PARENT_SCOPE) if(NOT Python3_FOUND) diff --git a/core/src/scopymainwindow.cpp b/core/src/scopymainwindow.cpp index 6404832a38..5d31b807c2 100644 --- a/core/src/scopymainwindow.cpp +++ b/core/src/scopymainwindow.cpp @@ -386,7 +386,9 @@ void ScopyMainWindow::loadDecoders() #if defined __APPLE__ QString path = QCoreApplication::applicationDirPath() + "/decoders"; #else - QString path = "decoders"; + // TODO: a check for ARM + // Quickfix for testing purposes + QString path = QCoreApplication::applicationDirPath() + "/../lib/decoders"; #endif bool success = true; diff --git a/gui/res/scopy.png b/gui/res/scopy.png new file mode 100644 index 0000000000..e1fdb0e4e8 Binary files /dev/null and b/gui/res/scopy.png differ