name: Build on: [push, pull_request] jobs: build-opensuse: name: Build openSUSE runs-on: ubuntu-latest strategy: fail-fast: false matrix: opensuse_version: [ 'tumbleweed', 'leap:15.4', 'leap:15.5' ] qt_version: [ '5', '6' ] container: image: opensuse/${{matrix.opensuse_version}} steps: - name: Add tagparser repo if: matrix.opensuse_version == 'tumbleweed' run: zypper -n ar -c -f -n 'repo-tagparser' https://download.opensuse.org/repositories/home:/mkittler/openSUSE_Tumbleweed/ repo-tagparser - name: Refresh repositories run: zypper -n --gpg-auto-import-keys ref - name: Upgrade packages if: matrix.opensuse_version == 'tumbleweed' run: zypper -n --gpg-auto-import-keys dup - name: Install gcc if: matrix.opensuse_version == 'tumbleweed' run: zypper -n --gpg-auto-import-keys in gcc gcc-c++ - name: Install gcc10 if: matrix.opensuse_version != 'tumbleweed' run: zypper -n --gpg-auto-import-keys in gcc10 gcc10-c++ - name: Install packages run: > zypper -n --gpg-auto-import-keys in lsb-release rpm-build git tar make cmake gettext-tools rsync glibc-devel libboost_headers-devel boost-devel glib2-devel glib2-tools dbus-1-devel alsa-devel libnotify-devel protobuf-devel sqlite3-devel libpulse-devel gstreamer-devel gstreamer-plugins-base-devel vlc-devel taglib-devel libicu-devel libcdio-devel libgpod-devel libmtp-devel libchromaprint-devel libebur128-devel desktop-file-utils update-desktop-files appstream-glib hicolor-icon-theme - name: Install Qt 5 if: matrix.qt_version == '5' run: > zypper -n --gpg-auto-import-keys in libQt5Core-devel libQt5Gui-devel libQt5Widgets-devel libQt5Concurrent-devel libQt5Network-devel libQt5Sql-devel libQt5DBus-devel libQt5Test-devel libqt5-qtbase-common-devel libQt5Sql5-sqlite libqt5-linguist-devel libqt5-qtx11extras-devel - name: Install Qt 6 if: matrix.qt_version == '6' run: > zypper -n --gpg-auto-import-keys in qt6-core-devel qt6-gui-devel qt6-widgets-devel qt6-concurrent-devel qt6-network-devel qt6-sql-devel qt6-dbus-devel qt6-test-devel qt6-base-common-devel qt6-sql-sqlite qt6-linguist-devel - name: Install tagparser if: matrix.opensuse_version == 'tumbleweed' run: zypper -n --gpg-auto-import-keys in tagparser-devel - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Add safe git directory run: git config --global --add safe.directory ${GITHUB_WORKSPACE} - name: Create Build Environment run: cmake -E make_directory build - name: Configure CMake run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -DBUILD_WERROR=ON -DUSE_TAGLIB=ON -DQT_VERSION_MAJOR=${{matrix.qt_version}} - name: Create source tarball working-directory: build run: ../dist/scripts/maketarball.sh - name: Create RPM build sources directories run: mkdir -p ~/rpmbuild/SOURCES /usr/src/packages/SOURCES - name: Copy source tarball working-directory: build run: cp strawberry-*.tar.xz /usr/src/packages/SOURCES/ - name: Build RPM (Tumbleweed) if: matrix.opensuse_version == 'tumbleweed' working-directory: build run: rpmbuild -ba ../dist/unix/strawberry.spec - name: Build RPM (Leap) if: matrix.opensuse_version != 'tumbleweed' working-directory: build env: CC: gcc-10 CXX: g++-10 run: rpmbuild -ba ../dist/unix/strawberry.spec - name: Set opensuse subdir run: echo "opensuse_subdir=$(echo ${{matrix.opensuse_version}} | sed 's/leap:/lp/g' | sed 's/\.//g')" > $GITHUB_ENV - name: Upload artifacts if: matrix.opensuse_version != 'tumbleweed' uses: actions/upload-artifact@v3 with: name: opensuse-${{env.opensuse_subdir}} path: | /usr/src/packages/SOURCES/*.xz /usr/src/packages/SRPMS/*.rpm /usr/src/packages/RPMS/x86_64/*.rpm - name: SSH key setup if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci' uses: shimataro/ssh-key-action@v2 with: known_hosts: ${{secrets.SSH_KNOWN_HOSTS}} key: ${{ secrets.SSH_KEY }} - name: Create server path if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci' run: ssh -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}} mkdir -p ${{secrets.BUILDS_PATH}}/source ${{secrets.BUILDS_PATH}}/opensuse/${{env.opensuse_subdir}} - name: rsync source if: (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci') && matrix.opensuse_version == 'tumbleweed' && matrix.qt_version == '6' run: rsync -e "ssh -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no" -var /usr/src/packages/SOURCES/*.xz ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}}:${{secrets.BUILDS_PATH}}/source/ - name: rsync rpms if: (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci') && matrix.opensuse_version != 'tumbleweed' run: rsync -e "ssh -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no" -var /usr/src/packages/SRPMS/*.rpm /usr/src/packages/RPMS/x86_64/*.rpm ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}}:${{secrets.BUILDS_PATH}}/opensuse/${{env.opensuse_subdir}}/ build-fedora: name: Build Fedora runs-on: ubuntu-latest strategy: fail-fast: false matrix: fedora_version: [ '37', '38', '39' ] container: image: fedora:${{matrix.fedora_version}} steps: - name: Update repositories run: dnf -y update - name: Fix dnf run: | if [ -f "/usr/bin/dnf5" ] && ! [ -f "/usr/bin/dnf" ]; then ln -s /usr/bin/dnf5 /usr/bin/dnf fi - name: Upgrade packages run: dnf -y upgrade - name: Install dependencies run: > dnf -y install @development-tools redhat-lsb-core which git glibc gcc-c++ rpmdevtools make cmake pkgconfig glib man tar gettext openssh rsync boost-devel dbus-devel protobuf-devel protobuf-compiler sqlite-devel alsa-lib-devel pulseaudio-libs-devel libnotify-devel libicu-devel qt6-qtbase-devel qt6-qtbase-private-devel qt6-qttools-devel gstreamer1-devel gstreamer1-plugins-base-devel taglib-devel libcdio-devel libgpod-devel libmtp-devel libchromaprint-devel libebur128-devel fftw-devel desktop-file-utils libappstream-glib hicolor-icon-theme - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Add safe git directory run: git config --global --add safe.directory ${GITHUB_WORKSPACE} - name: Create Build Environment run: cmake -E make_directory build - name: Configure CMake run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -DBUILD_WERROR=ON - name: Create source tarball working-directory: build run: ../dist/scripts/maketarball.sh - name: Create RPM build sources directories working-directory: build run: mkdir -p ~/rpmbuild/SOURCES /usr/src/packages/SOURCES - name: Copy source tarball working-directory: build run: cp strawberry-*.tar.xz ~/rpmbuild/SOURCES/ - name: Build RPM env: RPM_BUILD_NCPUS: "2" working-directory: build run: rpmbuild -ba ../dist/unix/strawberry.spec - name: Upload artifacts uses: actions/upload-artifact@v3 with: name: fedora-${{matrix.fedora_version}} path: | /github/home/rpmbuild/SRPMS/*.rpm /github/home/rpmbuild/RPMS/x86_64/*.rpm - name: SSH key setup if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci' uses: shimataro/ssh-key-action@v2 with: known_hosts: ${{secrets.SSH_KNOWN_HOSTS}} key: ${{ secrets.SSH_KEY }} - name: Create server path if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci' run: ssh -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}} mkdir -p ${{secrets.BUILDS_PATH}}/fedora/${{matrix.fedora_version}} - name: rsync if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci' run: rsync -e "ssh -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no" -var /github/home/rpmbuild/SRPMS/*.rpm /github/home/rpmbuild/RPMS/x86_64/*.rpm ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}}:${{secrets.BUILDS_PATH}}/fedora/${{matrix.fedora_version}}/ build-openmandriva: name: Build OpenMandriva runs-on: ubuntu-latest strategy: fail-fast: false matrix: openmandriva_version: [ "cooker" ] container: image: openmandriva/${{matrix.openmandriva_version}} steps: - name: Update repositories run: dnf update -y - name: Upgrade packages run: dnf upgrade -y - name: Install dependencies run: > dnf install -y glibc gcc-c++ git gnutar make cmake glib gettext lsb-release rpmdevtools rpm-build rsync glibc-devel boost-devel dbus-devel protobuf-devel protobuf-compiler sqlite-devel libasound-devel pulseaudio-devel lib64GL-devel libgst-plugins-base1.0-devel taglib-devel chromaprint-devel libebur128-devel fftw-devel icu-devel libcdio-devel libgpod-devel libmtp-devel lib64Qt6Core-devel lib64Qt6Concurrent-devel lib64Qt6Network-devel lib64Qt6Sql-devel lib64Qt6DBus-devel lib64Qt6Gui-devel lib64Qt6Widgets-devel lib64Qt6Test-devel qt6-cmake qt6-qtbase-tools qt6-qttools desktop-file-utils appstream appstream-util hicolor-icon-theme - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Add safe git directory run: git config --global --add safe.directory ${GITHUB_WORKSPACE} - name: Create Build Environment run: cmake -E make_directory build - name: Configure CMake run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -DBUILD_WERROR=ON - name: Create source tarball working-directory: build run: ../dist/scripts/maketarball.sh - name: Create RPM build sources directories working-directory: build run: mkdir -p ~/rpmbuild/SOURCES /usr/src/packages/SOURCES - name: Copy source tarball working-directory: build run: cp strawberry-*.tar.xz ~/rpmbuild/SOURCES/ - name: Build RPM env: RPM_BUILD_NCPUS: "2" working-directory: build run: rpmbuild -ba ../dist/unix/strawberry.spec - name: Upload artifacts uses: actions/upload-artifact@v3 with: name: openmandriva-${{matrix.openmandriva_version}} path: | /github/home/rpmbuild/SRPMS/*.rpm /github/home/rpmbuild/RPMS/x86_64/*.rpm - name: SSH key setup if: matrix.openmandriva_version != 'cooker' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci') uses: shimataro/ssh-key-action@v2 with: known_hosts: ${{secrets.SSH_KNOWN_HOSTS}} key: ${{ secrets.SSH_KEY }} - name: Create server path if: matrix.openmandriva_version != 'cooker' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci') run: ssh -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}} mkdir -p ${{secrets.BUILDS_PATH}}/openmandriva/${{matrix.openmandriva_version}} - name: rsync if: matrix.openmandriva_version != 'cooker' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci') run: rsync -e "ssh -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no" -var /github/home/rpmbuild/SRPMS/*.rpm /github/home/rpmbuild/RPMS/x86_64/*.rpm ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}}:${{secrets.BUILDS_PATH}}/openmandriva/${{matrix.openmandriva_version}}/ build-mageia: name: Build Mageia runs-on: ubuntu-latest strategy: fail-fast: false matrix: mageia_version: [ '8' ] container: image: mageia:${{matrix.mageia_version}} steps: - name: Update repositories run: urpmi.update --auto -a - name: Upgrade packages run: urpmi --auto --auto-update - name: Install dependencies run: > urpmi --auto --force urpmi-debuginfo-install git glibc gcc-c++ binutils make cmake man tar rpmdevtools gettext rsync lib64boost-devel lib64protobuf-devel lib64sqlite3-devel lib64alsa2-devel lib64pulseaudio-devel lib64gstreamer1.0-devel lib64gstreamer-plugins-base1.0-devel lib64cdio-devel lib64gpod-devel lib64mtp-devel lib64taglib-devel lib64chromaprint-devel lib64ebur128-devel lib64icu-devel lib64fftw-devel lib64dbus-devel lib64appstream-devel protobuf-compiler desktop-file-utils appstream-util hicolor-icon-theme - name: Install Qt 5 if: matrix.mageia_version == '8' run: urpmi --auto --force urpmi-debuginfo-install lib64qt5core-devel lib64qt5gui-devel lib64qt5widgets-devel lib64qt5network-devel lib64qt5concurrent-devel lib64qt5sql-devel lib64qt5dbus-devel lib64qt5help-devel lib64qt5test-devel lib64qt5x11extras-devel - name: Install Qt 6 if: matrix.mageia_version == 'cauldron' run: urpmi --auto --force urpmi-debuginfo-install lib64qt6core-devel lib64qt6gui-devel lib64qt6widgets-devel lib64qt6network-devel lib64qt6concurrent-devel lib64qt6sql-devel lib64qt6dbus-devel lib64qt6help-devel lib64qt6test-devel - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Add safe git directory run: git config --global --add safe.directory ${GITHUB_WORKSPACE} - name: Create Build Environment run: cmake -E make_directory build - name: Configure CMake run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -DBUILD_WERROR=ON - name: Create source tarball working-directory: build run: ../dist/scripts/maketarball.sh - name: Create RPM build sources directories working-directory: build run: mkdir -p ~/rpmbuild/SOURCES /usr/src/packages/SOURCES - name: Copy source tarball working-directory: build run: cp strawberry-*.tar.xz ~/rpmbuild/SOURCES/ - name: Build RPM env: RPM_BUILD_NCPUS: "2" working-directory: build run: rpmbuild -ba ../dist/unix/strawberry.spec - name: Upload artifacts uses: actions/upload-artifact@v3 with: name: mageia-${{matrix.mageia_version}} path: /github/home/rpmbuild/SRPMS/*.rpm /github/home/rpmbuild/RPMS/x86_64/*.rpm - name: SSH key setup if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci' uses: shimataro/ssh-key-action@v2 with: known_hosts: ${{secrets.SSH_KNOWN_HOSTS}} key: ${{ secrets.SSH_KEY }} - name: Create server path if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci' run: ssh -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}} mkdir -p ${{secrets.BUILDS_PATH}}/mageia/${{matrix.mageia_version}} - name: rsync if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci' run: rsync -e "ssh -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no" -var /github/home/rpmbuild/SRPMS/*.rpm /github/home/rpmbuild/RPMS/x86_64/*.rpm ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}}:${{secrets.BUILDS_PATH}}/mageia/${{matrix.mageia_version}}/ build-debian: name: Build Debian runs-on: ubuntu-latest strategy: fail-fast: false matrix: debian_version: [ 'bullseye', 'bookworm', 'trixie' ] container: image: debian:${{matrix.debian_version}} steps: - name: Update repositories run: apt update -y - name: Install packages env: DEBIAN_FRONTEND: noninteractive run: > apt install -y build-essential dh-make ssh git make cmake gcc g++ pkg-config fakeroot gettext lsb-release rsync dpkg-dev libglib2.0-dev libdbus-1-dev libboost-dev libprotobuf-dev protobuf-compiler libsqlite3-dev libasound2-dev libpulse-dev libtag1-dev libicu-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-alsa gstreamer1.0-pulseaudio libchromaprint-dev libebur128-dev libfftw3-dev libcdio-dev libmtp-dev libgpod-dev - name: Install Qt 5 if: matrix.debian_version == 'bullseye' env: DEBIAN_FRONTEND: noninteractive run: apt install -y qtbase5-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools libqt5x11extras5-dev - name: Install Qt 6 if: matrix.debian_version != 'bullseye' env: DEBIAN_FRONTEND: noninteractive run: apt install -y qt6-base-dev qt6-base-dev-tools qt6-tools-dev qt6-tools-dev-tools qt6-l10n-tools - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Add safe git directory run: git config --global --add safe.directory ${GITHUB_WORKSPACE} - name: Create Build Environment run: cmake -E make_directory build - name: Configure CMake run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -DBUILD_WERROR=ON - name: make deb run: dpkg-buildpackage -b -d -uc -us -nc -j2 - name: Copy deb run: cp ../*.deb . - name: Upload artifacts uses: actions/upload-artifact@v3 with: name: debian-${{matrix.debian_version}} path: "*.deb" - name: SSH key setup if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci' uses: shimataro/ssh-key-action@v2 with: known_hosts: ${{secrets.SSH_KNOWN_HOSTS}} key: ${{ secrets.SSH_KEY }} - name: Create server path if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci' run: ssh -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}} mkdir -p ${{secrets.BUILDS_PATH}}/debian/${{matrix.debian_version}} - name: rsync if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci' run: rsync -e "ssh -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no" -var *.deb ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}}:${{secrets.BUILDS_PATH}}/debian/${{matrix.debian_version}}/ build-ubuntu: name: Build Ubuntu runs-on: ubuntu-latest strategy: fail-fast: false matrix: ubuntu_version: [ 'focal', 'jammy', 'lunar', 'mantic' ] container: image: ubuntu:${{matrix.ubuntu_version}} steps: - name: Update repositories run: apt update -y - name: Install packages env: DEBIAN_FRONTEND: noninteractive run: > apt install -y build-essential dh-make ssh git make cmake pkg-config gcc g++ fakeroot wget curl gettext lsb-release rsync dpkg-dev libglib2.0-dev libboost-dev libdbus-1-dev libprotobuf-dev protobuf-compiler libsqlite3-dev libasound2-dev libpulse-dev libtag1-dev libicu-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev gstreamer1.0-alsa gstreamer1.0-pulseaudio libchromaprint-dev libebur128-dev libfftw3-dev libcdio-dev libmtp-dev libgpod-dev - name: Install Qt 5 if: matrix.ubuntu_version == 'focal' env: DEBIAN_FRONTEND: noninteractive run: apt install -y qtbase5-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools libqt5x11extras5-dev - name: Install Qt 6 if: matrix.ubuntu_version != 'focal' env: DEBIAN_FRONTEND: noninteractive run: apt install -y qt6-base-dev qt6-base-dev-tools qt6-tools-dev qt6-tools-dev-tools qt6-l10n-tools - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Add safe git directory run: git config --global --add safe.directory ${GITHUB_WORKSPACE} - name: Create Build Environment run: cmake -E make_directory build - name: Configure CMake run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -DBUILD_WERROR=ON - name: make deb run: dpkg-buildpackage -b -d -uc -us -nc -j2 - name: Copy deb run: cp ../*.deb ../*.ddeb . - name: Upload artifacts uses: actions/upload-artifact@v3 with: name: ubuntu-${{matrix.ubuntu_version}} path: | *.deb *.ddeb - name: SSH key setup if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci' uses: shimataro/ssh-key-action@v2 with: known_hosts: ${{secrets.SSH_KNOWN_HOSTS}} key: ${{ secrets.SSH_KEY }} - name: Create server path if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci' run: ssh -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}} mkdir -p ${{secrets.BUILDS_PATH}}/ubuntu/${{matrix.ubuntu_version}} - name: rsync if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci' run: rsync -e "ssh -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no" -var *.deb *.ddeb ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}}:${{secrets.BUILDS_PATH}}/ubuntu/${{matrix.ubuntu_version}}/ upload-ubuntu-ppa: name: Upload Ubuntu PPA if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci' runs-on: ubuntu-latest strategy: fail-fast: false matrix: ubuntu_version: [ 'focal', 'jammy', 'lunar', 'mantic' ] container: image: ubuntu:${{matrix.ubuntu_version}} steps: - name: Update repositories run: apt update -y - name: Install packages env: DEBIAN_FRONTEND: noninteractive run: > apt install -y git ssh build-essential dh-make make cmake pkg-config gcc g++ fakeroot gettext lsb-release gpg dput dpkg-dev libglib2.0-dev libboost-dev libdbus-1-dev libprotobuf-dev libsqlite3-dev libasound2-dev libpulse-dev libtag1-dev libicu-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev libchromaprint-dev libebur128-dev libfftw3-dev libcdio-dev libmtp-dev libgpod-dev gstreamer1.0-alsa gstreamer1.0-pulseaudio protobuf-compiler - name: Install Qt 5 if: matrix.ubuntu_version == 'focal' env: DEBIAN_FRONTEND: noninteractive run: apt install -y qtbase5-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools libqt5x11extras5-dev - name: Install Qt 6 if: matrix.ubuntu_version != 'focal' env: DEBIAN_FRONTEND: noninteractive run: apt install -y qt6-base-dev qt6-base-dev-tools qt6-tools-dev qt6-tools-dev-tools qt6-l10n-tools - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Add safe git directory run: git config --global --add safe.directory ${GITHUB_WORKSPACE} - name: Create Build Environment run: cmake -E make_directory build - name: Configure CMake run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -DBUILD_WERROR=ON - name: Delete build directory run: rm -rf build - name: Import Ubuntu PPA GPG private key uses: crazy-max/ghaction-import-gpg@v6 with: gpg_private_key: ${{secrets.UBUNTU_PPA_GPG_PRIVATE_KEY}} - name: dpkg-buildpackage run: dpkg-buildpackage -S -d -k573D197B5EA20EDF - name: Upload Unstable PPA run: dput ppa:jonaski/strawberry-unstable ../*_source.changes - name: Set is release run: echo "is_release=$(grep '^\s*set\s*(\s*INCLUDE_GIT_REVISION\s\+OFF\s*)\s*$' cmake/Version.cmake >/dev/null 2>&1 && echo 1 || echo 0)" >> $GITHUB_ENV - name: Get release version run: echo "release_version=$(git describe --tags --exact-match ${GITHUB_SHA} 2>/dev/null | head -1)" >> $GITHUB_ENV - name: Upload Stable PPA if: env.is_release == '1' && env.release_version != '' run: dput ppa:jonaski/strawberry ../*_source.changes build-macos: name: Build macOS strategy: fail-fast: false matrix: runner: [ 'macos-11', 'macos-arm64' ] buildtype: [ 'release' ] runs-on: ${{ matrix.runner }} steps: - name: Set arch shell: bash run: echo "arch=$(uname -m)" >> $GITHUB_ENV - name: Set buildtype run: echo "buildtype=$(echo ${{matrix.buildtype}} | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV - name: Set cmake buildtype run: echo "cmake_buildtype=$(echo ${{env.buildtype}} | awk '{print toupper(substr($0,0,1))tolower(substr($0,2))}')" >> $GITHUB_ENV - name: Uninstall homebrew if: matrix.runner == 'macos-11' run: | curl -sfLO https://raw.githubusercontent.com/Homebrew/install/master/uninstall.sh chmod +x ./uninstall.sh sudo ./uninstall.sh --force rm -f uninstall.sh - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Download macOS dependencies run: curl -f -O -L https://github.com/strawberrymusicplayer/strawberry-macos-dependencies/releases/latest/download/strawberry-macos-${{env.arch}}-${{env.buildtype}}.tar.xz - name: Extract macOS dependencies run: sudo tar -C / -xf strawberry-macos-${{env.arch}}-${{env.buildtype}}.tar.xz - name: Set prefix path run: echo "prefix_path=/opt/strawberry_macos_${{env.arch}}_${{env.buildtype}}" >> $GITHUB_ENV - name: Update PATH run: echo "${{env.prefix_path}}/bin" >> $GITHUB_PATH - name: Change rpath for lconvert run: sudo install_name_tool -change @rpath/QtCore.framework/Versions/A/QtCore /opt/strawberry_macos_${{env.arch}}_release/lib/QtCore.framework/QtCore /opt/strawberry_macos_${{env.arch}}_release/bin/lconvert - name: Create Build Environment run: cmake -E make_directory build - name: Configure CMake env: MACOSX_DEPLOYMENT_TARGET: 11.0 PKG_CONFIG_PATH: ${{env.prefix_path}}/lib/pkgconfig LDFLAGS: -L${{env.prefix_path}}/lib -Wl,-rpath,${{env.prefix_path}}/lib run: > cmake --log-level="DEBUG" -S . -B build -DCMAKE_BUILD_TYPE="${{env.cmake_buildtype}}" -DBUILD_WITH_QT6=ON -DBUILD_WERROR=OFF -DUSE_BUNDLE=ON -DCMAKE_PREFIX_PATH="${{env.prefix_path}}/lib/cmake" -DENABLE_DBUS=OFF -DPROTOBUF_INCLUDE_DIRS="${{env.prefix_path}}/include" -DICU_ROOT="${{env.prefix_path}}" -DFFTW3_DIR="${{env.prefix_path}}" - name: Build run: cmake --build build --config Release --parallel 4 - name: Install working-directory: build run: make install - name: Manually copy files not handled by macdeployqt working-directory: build run: | mkdir -p strawberry.app/Contents/Frameworks/ cp ${{env.prefix_path}}/lib/libsoup-3.0.0.dylib strawberry.app/Contents/Frameworks/ - name: Deploy env: GIO_EXTRA_MODULES: ${{env.prefix_path}}/lib/gio/modules GST_PLUGIN_SCANNER: ${{env.prefix_path}}/libexec/gstreamer-1.0/gst-plugin-scanner GST_PLUGIN_PATH: ${{env.prefix_path}}/lib/gstreamer-1.0 working-directory: build run: make deploy - name: Deploy check working-directory: build run: make deploycheck - name: Create DMG working-directory: build run: make dmg - name: SSH key setup if: matrix.runner == 'macos-11' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci' || github.ref == 'refs/heads/macos') uses: shimataro/ssh-key-action@v2 with: known_hosts: ${{secrets.SSH_KNOWN_HOSTS}} key: ${{ secrets.SSH_KEY }} - name: Set is release run: echo "is_release=$(grep '^\s*set\s*(\s*INCLUDE_GIT_REVISION\s\+OFF\s*)\s*$' cmake/Version.cmake >/dev/null 2>&1 && echo 1 || echo 0)" >> $GITHUB_ENV - name: Get release version run: echo "release_version=$(git describe --tags --exact-match ${GITHUB_SHA} 2>/dev/null | head -1)" >> $GITHUB_ENV - name: Set Upload path run: | if [ "${{env.is_release}}" = "1" ] && ! [ "${{env.release_version}}" = "" ]; then echo "upload_path=${{secrets.DOWNLOADS_PATH}}/stable_releases/macos" >> $GITHUB_ENV else echo "upload_path=${{secrets.DOWNLOADS_PATH}}/development_releases/macos" >> $GITHUB_ENV fi - name: Create server path if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci' || github.ref == 'refs/heads/macos' run: ssh -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}} mkdir -p ${{env.upload_path}} - name: rsync if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci' || github.ref == 'refs/heads/macos' run: rsync -e "ssh -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no" -var build/*.dmg ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}}:${{env.upload_path}}/ build-macos-homebrew: name: Build macOS Homebrew runs-on: macos-11 steps: - name: Remove installed brew packages run: brew uninstall $(brew list) - name: Update packages run: brew update - name: Upgrade packages run: brew upgrade || true - name: brew tap run: brew tap homebrew/core - name: Install packages run: brew install pkg-config cmake ninja meson bison flex wget create-dmg gettext boost protobuf protobuf-c rsync glib glib-openssl glib-utils glib-networking gdk-pixbuf gobject-introspection orc libffi openssl sqlite fftw libmtp libplist libxml2 libsoup libogg libvorbis flac wavpack opus speex mpg123 lame twolame taglib chromaprint libebur128 libbs2b libcdio libopenmpt faad2 faac fdk-aac musepack game-music-emu qt6 || true - name: Use modified gstreamer plugin formulas run: | wget https://files.strawberrymusicplayer.org/patches/gstreamer.rb wget https://files.strawberrymusicplayer.org/patches/gst-plugins-base.rb wget https://files.strawberrymusicplayer.org/patches/gst-plugins-good.rb wget https://files.strawberrymusicplayer.org/patches/gst-plugins-bad.rb wget https://files.strawberrymusicplayer.org/patches/gst-plugins-ugly.rb wget https://files.strawberrymusicplayer.org/patches/gst-libav.rb mv gstreamer.rb gst-plugins-{base,good,bad,ugly}.rb gst-libav.rb /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/g/ - name: Build and install gstreamer env: HOMEBREW_NO_INSTALL_FROM_API: 1 run: brew reinstall --build-from-source gstreamer - name: Build and install gst-plugins-base env: HOMEBREW_NO_INSTALL_FROM_API: 1 run: brew reinstall --build-from-source gst-plugins-base - name: Build and install gst-plugins-good env: HOMEBREW_NO_INSTALL_FROM_API: 1 run: brew reinstall --build-from-source gst-plugins-good - name: Build and install gst-plugins-bad env: HOMEBREW_NO_INSTALL_FROM_API: 1 run: brew reinstall --build-from-source gst-plugins-bad - name: Build and install gst-plugins-ugly env: HOMEBREW_NO_INSTALL_FROM_API: 1 run: brew reinstall --build-from-source gst-plugins-ugly - name: Build and install gst-libav env: HOMEBREW_NO_INSTALL_FROM_API: 1 run: brew reinstall --build-from-source gst-libav - name: Build libgpod env: PERL_MM_USE_DEFAULT: 1 run: | git clone https://github.com/strawberrymusicplayer/strawberry-libgpod cd strawberry-libgpod mkdir build cd build cmake .. -DCMAKE_BUILD_TYPE=Release make -j 4 sudo make install - name: Replace relative library @loader_path paths - macdeployqt does not understand these. run: | for library in $(find -E /usr/local/Cellar -type f -regex '.*/lib/.*\.framework/Versions/A/Qt(Core|Concurrent|Network|Sql|Widgets|Gui|DBus)' -o -name '*.dylib'); do library_paths=$(otool -L "${library}" | sed -n "s/^\t\(.*\) (compatibility version [0-9]*\.[0-9]*\.[0-9]*, current version [0-9]*\.[0-9]*\.[0-9]*)/\1/p") for library_path in ${library_paths}; do if ! [ "$(echo "${library_path}" | grep "^@loader_path" || true)" = "" ]; then new_library_path=$(echo "${library_path}" | sed -E 's/@loader_path(\/\.\.)+\/opt/\/usr\/local\/opt/g') if ! [ "${new_library_path}" = "" ] && ! [ "${new_library_path}" = "${library_path}" ] && [ -e "${new_library_path}" ]; then sudo install_name_tool -change "${library_path}" "${new_library_path}" "${library}" else echo "${library} points to ${library_path}, could not resolve to absolute path." fi fi done done - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Create Build Environment run: cmake -E make_directory build - name: Configure CMake env: MACOSX_DEPLOYMENT_TARGET: 11.0 PKG_CONFIG_PATH: /usr/local/lib/pkgconfig run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DBUILD_WITH_QT6=ON -DBUILD_WERROR=OFF -DUSE_BUNDLE=ON -DCMAKE_PREFIX_PATH=/usr/local/opt/qt6/lib/cmake -DICU_ROOT=/usr/local/opt/icu4c -DPROTOBUF_INCLUDE_DIRS=/usr/local/include - name: Build run: cmake --build build --config Release --parallel 4 - name: Install working-directory: build run: make install - name: Remove problematic files run: | sudo rm -rf /usr/local/opt/qt6/share/qt/plugins/virtualkeyboard /usr/local/opt/qt6/share/qt/plugins/platforminputcontexts sudo rm -f /usr/local/Cellar/qt/*/share/qt/plugins/imageformats/libqpdf.dylib - name: Manually copy files not handled by macdeployqt working-directory: build run: | mkdir -p strawberry.app/Contents/Frameworks/ cp /usr/local/lib/{libsoup-3.0.0.dylib,libswresample.4.dylib,libswscale.7.dylib,libpostproc.57.dylib} strawberry.app/Contents/Frameworks/ - name: Deploy env: GIO_EXTRA_MODULES: /usr/local/lib/gio/modules GST_PLUGIN_SCANNER: /usr/local/opt/gstreamer/libexec/gstreamer-1.0/gst-plugin-scanner GST_PLUGIN_PATH: /usr/local/lib/gstreamer-1.0 working-directory: build run: make deploy - name: Deploy check working-directory: build run: make deploycheck - name: Create DMG working-directory: build run: make dmg build-macos-macports: name: Build macOS Macports runs-on: macos-11 steps: - name: Install macports run: | macports_version=$(wget -q -O- 'https://github.com/macports/macports-base' | sed -n 's,.*releases/tag/\([^"&;]*\)".*,\1,p' | sed 's/^v//g' | sort -V | tail -1) wget https://github.com/macports/macports-base/releases/download/v${macports_version}/MacPorts-${macports_version}-11-BigSur.pkg sudo installer -pkg ./MacPorts-${macports_version}-11-BigSur.pkg -target / - name: Uninstall homebrew run: | curl -sLO https://raw.githubusercontent.com/Homebrew/install/master/uninstall.sh chmod +x ./uninstall.sh sudo ./uninstall.sh --force - name: Update macports run: sudo /opt/local/bin/port -v selfupdate - name: Install packages run: sudo /opt/local/bin/port -N -p install wget gettext glib2 pkgconfig cmake boost protobuf-cpp sqlite3 chromaprint libebur128 fftw taglib libcdio libmtp - name: Install gstreamer run: sudo /opt/local/bin/port -N -p install gstreamer1 gstreamer1-gst-plugins-base gstreamer1-gst-plugins-good gstreamer1-gst-plugins-bad gstreamer1-gst-plugins-ugly gstreamer1-gst-libav - name: Install gst-plugins-bad run: sudo /opt/local/bin/port -N -p install gstreamer1-gst-plugins-bad +faac - name: Install qt6-qtbase run: sudo /opt/local/bin/port -N -p install qt6-qtbase - name: Install qt6-qttools run: sudo /opt/local/bin/port -N -p install qt6-qttools || true - name: Install qt6-sqlite-plugin run: sudo /opt/local/bin/port -N -p install qt6-sqlite-plugin - name: Install libgpod run: sudo /opt/local/bin/port -N -p install libgpod || true - name: Add /opt/local/bin to PATH run: echo "/opt/local/bin" >> $GITHUB_PATH - name: Install create-dmg shell: bash run: | mkdir -p ~/build cd ~/build git clone https://github.com/create-dmg/create-dmg cd create-dmg sudo make install - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Create Build Environment run: /opt/local/bin/cmake -E make_directory build - name: Configure CMake env: MACOSX_DEPLOYMENT_TARGET: 11.0 PKG_CONFIG_PATH: /opt/local/lib/pkgconfig run: /opt/local/libexec/qt6/bin/qt-cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DBUILD_WITH_QT6=ON -DBUILD_WERROR=OFF -DUSE_BUNDLE=ON -DENABLE_DBUS=OFF - name: Build run: /opt/local/bin/cmake --build build --config Release --parallel 4 - name: Install working-directory: build run: make install - name: Deploy env: GIO_EXTRA_MODULES: /opt/local/lib/gio/modules GST_PLUGIN_SCANNER: /opt/local/libexec/gstreamer-1.0/gst-plugin-scanner GST_PLUGIN_PATH: /opt/local/lib/gstreamer-1.0 working-directory: build run: make deploy - name: Deploy check working-directory: build run: make deploycheck - name: Create DMG working-directory: build run: make dmg build-windows-mingw: name: Build Windows MinGW runs-on: ubuntu-latest strategy: fail-fast: false matrix: arch: [ 'i686', 'x86_64' ] build_type: [ 'debug', 'release' ] container: image: jonaski/strawberry-mxe-${{matrix.arch}}-${{matrix.build_type}} steps: - name: Install rsync run: zypper -n --gpg-auto-import-keys in rsync - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Add safe git directory run: git config --global --add safe.directory ${GITHUB_WORKSPACE} - name: Create Build Environment run: cmake -E make_directory build - name: Link MXE directory run: ln -s /strawberry-mxe ~/mxe-shared - name: Set ENABLE_WIN32_CONSOLE (debug) if: matrix.build_type == 'debug' run: echo "win32_console=ON" >> $GITHUB_ENV - name: Set ENABLE_WIN32_CONSOLE (release) if: matrix.build_type == 'release' run: echo "win32_console=OFF" >> $GITHUB_ENV - name: Run CMake env: PKG_CONFIG_PATH: /strawberry-mxe/usr/${{matrix.arch}}-w64-mingw32.shared/lib/pkgconfig run: > cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE="../cmake/Toolchain-${{matrix.arch}}-w64-mingw32-shared.cmake" -DCMAKE_BUILD_TYPE="${{matrix.build_type}}" -DCMAKE_PREFIX_PATH="/strawberry-mxe/usr/${{matrix.arch}}-w64-mingw32.shared/qt6" -DBUILD_WITH_QT6=ON -DBUILD_WERROR=OFF -DARCH="${{matrix.arch}}" -DENABLE_WIN32_CONSOLE=${{env.win32_console}} -DENABLE_DBUS=OFF -DENABLE_LIBGPOD=OFF -DENABLE_LIBMTP=OFF -DENABLE_AUDIOCD=OFF -DProtobuf_PROTOC_EXECUTABLE="/strawberry-mxe/usr/x86_64-pc-linux-gnu/bin/protoc" - name: Run Make run: cmake --build build --config Release --parallel $(nproc) - name: Create directories working-directory: build run: mkdir -p gio-modules platforms sqldrivers tls imageformats styles gstreamer-plugins nsisplugins - name: Copy GIO modules working-directory: build run: cp /strawberry-mxe/usr/${{matrix.arch}}-w64-mingw32.shared/lib/gio/modules/{libgiognutls.dll,libgioopenssl.dll} ${GITHUB_WORKSPACE}/build/gio-modules/ - name: Copy Qt platform plugins working-directory: build run: cp /strawberry-mxe/usr/${{matrix.arch}}-w64-mingw32.shared/qt6/plugins/platforms/qwindows.dll ${GITHUB_WORKSPACE}/build/platforms/ - name: Copy Qt styles working-directory: build run: cp /strawberry-mxe/usr/${{matrix.arch}}-w64-mingw32.shared/qt6/plugins/styles/qwindowsvistastyle.dll ${GITHUB_WORKSPACE}/build/styles/ - name: Copy Qt TLS plugins working-directory: build run: cp /strawberry-mxe/usr/${{matrix.arch}}-w64-mingw32.shared/qt6/plugins/tls/{qschannelbackend.dll,qopensslbackend.dll} ${GITHUB_WORKSPACE}/build/tls/ - name: Copy Qt SQL drivers working-directory: build run: cp /strawberry-mxe/usr/${{matrix.arch}}-w64-mingw32.shared/qt6/plugins/sqldrivers/qsqlite.dll ${GITHUB_WORKSPACE}/build/sqldrivers/ - name: Copy Qt imageformats working-directory: build run: cp /strawberry-mxe/usr/${{matrix.arch}}-w64-mingw32.shared/qt6/plugins/imageformats/{qgif.dll,qico.dll,qjpeg.dll} ${GITHUB_WORKSPACE}/build/imageformats/ - name: Copy gstreamer plugins working-directory: build run: cp /strawberry-mxe/usr/${{matrix.arch}}-w64-mingw32.shared/bin/gstreamer-1.0/{libgstaes.dll,libgstaiff.dll,libgstapetag.dll,libgstapp.dll,libgstasf.dll,libgstasfmux.dll,libgstaudioconvert.dll,libgstaudiofx.dll,libgstaudiomixer.dll,libgstaudioparsers.dll,libgstaudiorate.dll,libgstaudioresample.dll,libgstaudiotestsrc.dll,libgstautodetect.dll,libgstbs2b.dll,libgstcoreelements.dll,libgstdash.dll,libgstdirectsound.dll,libgstequalizer.dll,libgstfaac.dll,libgstfaad.dll,libgstfdkaac.dll,libgstflac.dll,libgstgio.dll,libgstgme.dll,libgsthls.dll,libgsticydemux.dll,libgstid3demux.dll,libgstid3tag.dll,libgstisomp4.dll,libgstlame.dll,libgstlibav.dll,libgstmpg123.dll,libgstmusepack.dll,libgstogg.dll,libgstopenmpt.dll,libgstopus.dll,libgstopusparse.dll,libgstpbtypes.dll,libgstplayback.dll,libgstreplaygain.dll,libgstrtp.dll,libgstrtsp.dll,libgstsoup.dll,libgstspectrum.dll,libgstspeex.dll,libgsttaglib.dll,libgsttcp.dll,libgsttwolame.dll,libgsttypefindfunctions.dll,libgstudp.dll,libgstvolume.dll,libgstvorbis.dll,libgstwasapi.dll,libgstwavenc.dll,libgstwavpack.dll,libgstwavparse.dll,libgstxingmux.dll} ${GITHUB_WORKSPACE}/build/gstreamer-plugins/ - name: Copy extra binaries working-directory: build run: cp /strawberry-mxe/usr/${{matrix.arch}}-w64-mingw32.shared/bin/{sqlite3.exe,gst-launch-1.0.exe,gst-play-1.0.exe,gst-discoverer-1.0.exe,libsoup-3.0-0.dll,libnghttp2.dll} . - name: Copy extra binaries (debug) if: matrix.build_type == 'debug' working-directory: build run: cp /strawberry-mxe/usr/${{matrix.arch}}-w64-mingw32.shared/bin/{gdb.exe,libreadline8.dll} . - name: Copy dependencies working-directory: build run: > /strawberry-mxe/tools/copydlldeps.sh -c -d . -F . -F ./platforms -F ./styles -F ./imageformats -F ./tls -F ./sqldrivers -F ./gstreamer-plugins -R /strawberry-mxe/usr/${{matrix.arch}}-w64-mingw32.shared - name: Strip binaries if: matrix.build_type == 'release' working-directory: build run: find . -type f \( -iname \*.dll -o -iname \*.exe \) -exec /strawberry-mxe/usr/bin/${{matrix.arch}}-w64-mingw32.shared-strip {} \; - name: Strip gdb.exe if: matrix.build_type == 'debug' working-directory: build run: /strawberry-mxe/usr/bin/${{matrix.arch}}-w64-mingw32.shared-strip gdb.exe - name: Copy nsis files working-directory: build run: cp ${GITHUB_WORKSPACE}/dist/windows/*.nsi ${GITHUB_WORKSPACE}/dist/windows/*.nsh ${GITHUB_WORKSPACE}/dist/windows/*.ico . - name: Copy COPYING license file working-directory: build run: cp ${GITHUB_WORKSPACE}/COPYING . - name: List files working-directory: build run: ls - name: Check that all files are included in nsi shell: bash working-directory: build run: | files_missing= for i in $(ls -1 *.dll *.exe); do nsi_file_entry=$(grep -i "^\s\+File\s\+\"$i\"$" strawberry.nsi || true) if [ "${nsi_file_entry}" = "" ]; then echo "File ${i} is missing File entry." fi nsi_file_delete_entry=$(grep -i "^\s\+Delete\s\+\"\$INSTDIR\\\\$i\"$" strawberry.nsi || true) if [ "${nsi_file_delete_entry}" = "" ] ; then echo "File ${i} is missing Delete entry." fi if [ "${nsi_file_entry}" = "" ] || [ "${nsi_file_delete_entry}" = "" ] ; then if [ "${files_missing}" = "" ]; then files_missing="${i}" else files_missing="${files_missing} $i" fi fi done if ! [ "${files_missing}" = "" ]; then echo "Files missing in nsi: ${files_missing}" exit 1 fi - name: Build Windows installer working-directory: build run: makensis strawberry.nsi - name: Upload artifacts uses: actions/upload-artifact@v3 with: name: windows-mingw path: build/StrawberrySetup*.exe - name: SSH key setup if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci' uses: shimataro/ssh-key-action@v2 with: known_hosts: ${{secrets.SSH_KNOWN_HOSTS}} key: ${{ secrets.SSH_KEY }} - name: Create server path if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci' run: ssh -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}} mkdir -p ${{secrets.BUILDS_PATH}}/windows/mingw - name: rsync if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci' run: rsync -e "ssh -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no" -var build/StrawberrySetup*.exe ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}}:${{secrets.BUILDS_PATH}}/windows/mingw/ build-windows-msvc: name: Build Windows MSVC runs-on: windows-2022 strategy: fail-fast: false matrix: arch: [ 'x86', 'x86_64' ] build_type: [ 'debug', 'release' ] steps: - name: Set prefix path shell: bash run: | echo "prefix_path_backslash=c:\strawberry_msvc_${{matrix.arch}}_${{matrix.build_type}}" >> $GITHUB_ENV echo "prefix_path_forwardslash=c:/strawberry_msvc_${{matrix.arch}}_${{matrix.build_type}}" >> $GITHUB_ENV echo "prefix_path_unix=/c/strawberry_msvc_${{matrix.arch}}_${{matrix.build_type}}" >> $GITHUB_ENV - name: Create downloads directory shell: cmd run: mkdir downloads - name: Download Windows MSVC dependencies shell: cmd working-directory: downloads run: curl -f -O -L https://github.com/strawberrymusicplayer/strawberry-msvc-dependencies/releases/latest/download/strawberry-msvc-${{matrix.arch}}-${{matrix.build_type}}.tar.xz - name: Extract Windows MSVC dependencies shell: bash working-directory: downloads run: tar -C /c -xf /d/a/strawberry/strawberry/downloads/strawberry-msvc-${{matrix.arch}}-${{matrix.build_type}}.tar.xz - name: Update PATH run: echo "${{env.prefix_path_backslash}}\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - name: Copy bin files shell: bash run: cp /c/strawberry/c/bin/{patch.exe,strip.exe,strings.exe,objdump.exe} ${{env.prefix_path_unix}}/bin - name: Uninstall conflicting mingw shell: cmd run: choco uninstall mingw -y -f - name: Delete conflicting files shell: bash run: rm -rf /c/strawberry/c "/c/program files/OpenSSL" "/c/program files/postgresql" - name: Delete conflicting icu shell: bash run: | find "/c/program files (x86)/windows kits/" -name 'icu*.lib' -delete find "/c/program files (x86)/windows kits/" -name 'icu*.h' -delete - name: Download NSIS LockedList plugin shell: cmd working-directory: downloads run: curl -f -O -L https://nsis.sourceforge.io/mediawiki/images/d/d3/LockedList.zip - name: Extract NSIS LockedList plugin shell: cmd working-directory: downloads run: 7z x LockedList.zip - name: Download NSIS Registry plugin shell: cmd working-directory: downloads run: curl -f -O -L https://nsis.sourceforge.io/mediawiki/images/4/47/Registry.zip - name: Extract NSIS Registry plugin shell: cmd working-directory: downloads run: 7z x Registry.zip - name: Download NSIS Inetc plugin shell: cmd working-directory: downloads run: curl -f -O -L https://nsis.sourceforge.io/mediawiki/images/c/c9/Inetc.zip - name: Extract NSIS Inetc plugin shell: cmd working-directory: downloads run: 7z x Inetc.zip - name: Install NSIS plugins shell: cmd working-directory: downloads run: | copy "Plugins\LockedList64.dll" "C:\Program Files (x86)\NSIS\Plugins\" copy "Plugins\x86-unicode\LockedList.dll" "C:\Program Files (x86)\NSIS\Plugins\x86-unicode\" copy "Desktop\Plugin\registry.dll" "C:\Program Files (x86)\NSIS\Plugins\" copy "Desktop\Plugin\registry.dll" "C:\Program Files (x86)\NSIS\Plugins\x86-unicode\" copy "Plugins\x86-unicode\INetC.dll" "C:\Program Files (x86)\NSIS\Plugins\x86-unicode\" - name: Setup MSVC Environment uses: ilammy/msvc-dev-cmd@v1 with: arch: ${{matrix.arch}} sdk: 10.0.20348.0 vsversion: 17 toolset: 14.3 - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Add safe git directory shell: bash run: git config --global --add safe.directory ${GITHUB_WORKSPACE} - name: Create Build Environment shell: cmd run: cmake -E make_directory build - name: Set ENABLE_WIN32_CONSOLE (debug) if: matrix.build_type == 'debug' shell: bash run: echo "win32_console=ON" >> $GITHUB_ENV - name: Set ENABLE_WIN32_CONSOLE (release) if: matrix.build_type == 'release' shell: bash run: echo "win32_console=OFF" >> $GITHUB_ENV - name: Run CMake shell: cmd run: > cmake -S . -B build -G "Ninja" -DCMAKE_BUILD_TYPE="${{matrix.build_type}}" -DCMAKE_PREFIX_PATH="${{env.prefix_path_forwardslash}}/lib/cmake" -DBUILD_WITH_QT6=ON -DBUILD_WERROR=OFF -DARCH="${{matrix.arch}}" -DENABLE_WIN32_CONSOLE=${{env.win32_console}} -DUSE_TAGLIB=ON -DPKG_CONFIG_EXECUTABLE="${{env.prefix_path_forwardslash}}/bin/pkg-config.exe" -DICU_ROOT="${{env.prefix_path_forwardslash}}" - name: Run Make shell: cmd env: CL: "/MP" run: cmake --build build --config ${{matrix.build_type}} --parallel 4 - name: Copy extra binaries shell: cmd working-directory: build run: | copy ${{env.prefix_path_backslash}}\bin\libssl-3*.dll copy ${{env.prefix_path_backslash}}\bin\libcrypto-3*.dll copy ${{env.prefix_path_backslash}}\bin\soup-3.0-0.dll copy ${{env.prefix_path_backslash}}\bin\gst-launch-1.0.exe copy ${{env.prefix_path_backslash}}\bin\gst-play-1.0.exe copy ${{env.prefix_path_backslash}}\bin\gst-discoverer-1.0.exe copy ${{env.prefix_path_backslash}}\bin\sqlite3.exe - name: Create directories shell: cmd working-directory: build run: | mkdir gio-modules mkdir platforms mkdir styles mkdir tls mkdir sqldrivers mkdir imageformats mkdir gstreamer-plugins mkdir nsisplugins - name: Copy GIO modules shell: cmd working-directory: build run: copy ${{env.prefix_path_backslash}}\lib\gio\modules\*.dll .\gio-modules\ - name: Copy Qt platform plugins shell: cmd working-directory: build run: copy ${{env.prefix_path_backslash}}\plugins\platforms\qwindows*.dll .\platforms\ - name: Copy Qt styles shell: cmd working-directory: build run: copy ${{env.prefix_path_backslash}}\plugins\styles\qwindowsvistastyle*.dll .\styles\ - name: Copy Qt TLS plugins shell: cmd working-directory: build run: copy ${{env.prefix_path_backslash}}\plugins\tls\*.dll .\tls\ - name: Copy Qt SQL drivers shell: cmd working-directory: build run: copy ${{env.prefix_path_backslash}}\plugins\sqldrivers\qsqlite*.dll .\sqldrivers\ - name: Copy Qt imageformats plugins shell: cmd working-directory: build run: copy ${{env.prefix_path_backslash}}\plugins\imageformats\*.dll .\imageformats\ - name: Copy gstreamer plugins shell: cmd working-directory: build run: | copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstaes.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstaiff.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstapetag.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstapp.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstasf.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstasfmux.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstaudioconvert.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstaudiofx.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstaudiomixer.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstaudioparsers.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstaudiorate.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstaudioresample.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstaudiotestsrc.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstautodetect.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstbs2b.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstcoreelements.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstdash.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstdirectsound.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstequalizer.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstfaac.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstfaad.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstfdkaac.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstflac.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstgio.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstgme.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gsthls.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gsticydemux.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstid3demux.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstid3tag.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstisomp4.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstlame.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstlibav.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstmpg123.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstmusepack.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstogg.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstopenmpt.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstopus.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstopusparse.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstpbtypes.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstplayback.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstreplaygain.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstrtp.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstrtsp.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstsoup.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstspectrum.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstspeex.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gsttaglib.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gsttcp.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gsttwolame.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gsttypefindfunctions.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstudp.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstvolume.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstvorbis.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstwasapi.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstwasapi2.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstwavenc.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstwavpack.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstwavparse.dll .\gstreamer-plugins\ copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\gstxingmux.dll .\gstreamer-plugins\ - name: Download copydlldeps.sh shell: bash working-directory: build run: curl -f -O -L https://raw.githubusercontent.com/strawberrymusicplayer/strawberry-mxe/master/tools/copydlldeps.sh - name: Copy dependencies shell: bash working-directory: build run: > ./copydlldeps.sh -c -d . -F . -F ./platforms -F ./styles -F ./tls -F ./sqldrivers -F ./imageformats -F ./gio-modules -F ./gstreamer-plugins -R ${{env.prefix_path_unix}}/bin - name: Copy nsis files shell: cmd working-directory: build run: | copy ..\dist\windows\*.nsi . copy ..\dist\windows\*.nsh . copy ..\dist\windows\*.ico . - name: Copy COPYING license file shell: cmd working-directory: build run: copy ..\COPYING . - name: List files shell: cmd working-directory: build run: dir - name: Check that all files are included in nsi shell: bash working-directory: build run: | files_missing= for i in $(ls -1 *.dll *.exe); do nsi_file_entry=$(grep -i "^\s\+File\s\+\"$i\"$" strawberry.nsi || true) if [ "${nsi_file_entry}" = "" ]; then echo "File ${i} is missing File entry." fi nsi_file_delete_entry=$(grep -i "^\s\+Delete\s\+\"\$INSTDIR\\\\$i\"$" strawberry.nsi || true) if [ "${nsi_file_delete_entry}" = "" ] ; then echo "File ${i} is missing Delete entry." fi if [ "${nsi_file_entry}" = "" ] || [ "${nsi_file_delete_entry}" = "" ] ; then if [ "${files_missing}" = "" ]; then files_missing="${i}" else files_missing="${files_missing} $i" fi fi done if ! [ "${files_missing}" = "" ]; then echo "Files missing in nsi: ${files_missing}" exit 1 fi - name: Create nsis installer shell: cmd working-directory: build run: makensis strawberry.nsi - name: Upload artifacts uses: actions/upload-artifact@v3 with: name: windows-msvc path: build/StrawberrySetup*.exe rsync-windows-msvc-builds: name: Rsync Windows MSVC builds runs-on: ubuntu-latest if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci' needs: - build-windows-msvc steps: - name: Download artifacts uses: actions/download-artifact@v3 with: name: windows-msvc path: builds - name: View files run: find builds - name: SSH key setup uses: shimataro/ssh-key-action@v2 with: known_hosts: ${{secrets.SSH_KNOWN_HOSTS}} key: ${{secrets.SSH_KEY}} - name: Create server path shell: bash if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci' run: ssh -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}} mkdir -p ${{secrets.BUILDS_PATH}}/windows/msvc - name: rsync shell: bash if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci' run: rsync -e "ssh -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no" -var builds/StrawberrySetup-*-msvc-*.exe ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}}:${{secrets.BUILDS_PATH}}/windows/msvc/ upload-release: name: Upload release runs-on: ubuntu-latest if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci' needs: - build-opensuse - build-fedora - build-mageia - build-debian - build-ubuntu - build-windows-mingw - build-windows-msvc steps: - name: Install rsync run: sudo apt install -y rsync - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set is release run: echo "is_release=$(grep '^\s*set\s*(\s*INCLUDE_GIT_REVISION\s\+OFF\s*)\s*$' cmake/Version.cmake >/dev/null 2>&1 && echo 1 || echo 0)" >> $GITHUB_ENV - name: Get release version run: echo "release_version=$(git describe --tags --exact-match ${GITHUB_SHA} 2>/dev/null | head -1)" >> $GITHUB_ENV - name: Show release version if: env.release_version != '' run: echo "Release version:" ${{env.release_version}} - name: Show release assets if: env.release_version != '' env: GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} run: hub release show -f "%as" ${{env.release_version}} - name: Download artifacts if: env.release_version != '' uses: actions/download-artifact@v3 with: path: artifacts - name: SSH key setup if: env.release_version != '' uses: shimataro/ssh-key-action@v2 with: known_hosts: ${{secrets.SSH_KNOWN_HOSTS}} key: ${{secrets.SSH_KEY}} - name: Add artifacts to release if: env.is_release == '1' && env.release_version != '' env: GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} run: | echo "Release version: ${{env.release_version}}" filenames=() files=() a_files=() for i in $(find artifacts -type f); do filename=$(basename $i) if [[ ${filenames[@]} =~ ${filename} ]]; then echo "Skipping duplicate file: ${filename}" continue fi filenames+=("${filename}") existing_asset=$(hub release show -f "%as" ${{env.release_version}} | tr -d '[:blank:]' | grep ".*/${filename}\$" 2>/dev/null || true) if [ "${existing_asset}" = "" ]; then echo "Adding file: ${filename}" files+=("$i") a_files+=("-a" "${i}") else echo "Release already has file: ${filename}" fi done if ! [ "${files[@]}" = "" ]; then echo "Uploading files: ${files[@]}" rsync -e "ssh -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no" -var ${files[@]} ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}}:${{secrets.RELEASES_PATH}}/ fi if ! [ "${a_files[@]}" = "" ]; then echo "Adding files to GitHub release: ${files}" hub release edit -m "Strawberry ${{env.release_version}}" ${a_files[@]} "${{env.release_version}}" fi