diff --git a/.github/workflows/Linux_aarch64.yml b/.github/workflows/Linux_aarch64.yml index 8a968c94b..661948e1b 100644 --- a/.github/workflows/Linux_aarch64.yml +++ b/.github/workflows/Linux_aarch64.yml @@ -1,4 +1,4 @@ -name: Linux AArch64 +name: Linux AArch64 (aarch64-linux-gnu) on: push: @@ -36,44 +36,52 @@ jobs: sudo apt-get -y install --allow-downgrades libpcre2-8-0=10.34-7 Packaging/nix/debian-cross-aarch64-prep.sh + - name: Cache CMake build folder + uses: actions/cache@v3 + with: + path: build + key: ${{ github.workflow }}-v1-${{ github.sha }} + restore-keys: ${{ github.workflow }}-v1- + - name: Build working-directory: ${{github.workspace}} shell: bash env: CMAKE_BUILD_TYPE: ${{github.event_name == 'release' && 'Release' || 'RelWithDebInfo'}} # We set DEVILUTIONX_SYSTEM_LIBFMT=OFF because its soversion changes frequently. + # We set DEVILUTIONX_SYSTEM_SIMPLEINI=OFF because we require v4.19+, still missing from many distributions. run: | cmake -S. -Bbuild -DCMAKE_TOOLCHAIN_FILE=../CMake/platforms/aarch64-linux-gnu.toolchain.cmake \ -DCMAKE_BUILD_TYPE=${{env.CMAKE_BUILD_TYPE}} -DCMAKE_INSTALL_PREFIX=/usr -DCPACK=ON \ - -DDEVILUTIONX_SYSTEM_LIBFMT=OFF && \ + -DDEVILUTIONX_SYSTEM_LIBFMT=OFF -DDEVILUTIONX_SYSTEM_SIMPLEINI=OFF && \ cmake --build build -j $(getconf _NPROCESSORS_ONLN) --target package - name: Package - run: Packaging/nix/LinuxReleasePackaging.sh && mv devilutionx.tar.xz devilutionx-aarch64.tar.xz + run: Packaging/nix/LinuxReleasePackaging.sh && mv devilutionx.tar.xz devilutionx-aarch64-linux-gnu.tar.xz # AppImage cross-packaging is not implemented yet. # - name: Package AppImage - # run: Packaging/nix/AppImage.sh && mv devilutionx.appimage devilutionx-aarch64.appimage + # run: Packaging/nix/AppImage.sh && mv devilutionx.appimage devilutionx-aarch64-linux-gnu.appimage - name: Upload Package if: ${{ !env.ACT }} uses: actions/upload-artifact@v3 with: - name: devilutionx-aarch64.tar.xz - path: devilutionx-aarch64.tar.xz + name: devilutionx-aarch64-linux-gnu.tar.xz + path: devilutionx-aarch64-linux-gnu.tar.xz # AppImage cross-packaging is not implemented yet. # - name: Upload AppImage # if: ${{ !env.ACT }} # uses: actions/upload-artifact@v3 # with: - # name: devilutionx-aarch64.appimage - # path: devilutionx-aarch64.appimage + # name: devilutionx-aarch64-linux-gnu.appimage + # path: devilutionx-aarch64-linux-gnu.appimage - name: Update Release if: ${{ github.event_name == 'release' && !env.ACT }} uses: svenstaro/upload-release-action@v2 with: - file: devilutionx-aarch64.* + file: devilutionx-aarch64-linux-gnu.* file_glob: true overwrite: true diff --git a/.github/workflows/Linux_x86.yml b/.github/workflows/Linux_x86.yml index a06e4fde5..664b8246e 100644 --- a/.github/workflows/Linux_x86.yml +++ b/.github/workflows/Linux_x86.yml @@ -1,4 +1,4 @@ -name: Linux x86 +name: Linux x86 (i386-linux-gnu) on: push: @@ -7,9 +7,14 @@ on: paths-ignore: - '*.md' pull_request: - types: [ opened, synchronize ] + types: [opened, synchronize] paths-ignore: - '*.md' + release: + types: [published] + paths-ignore: + - '*.md' + workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -17,7 +22,7 @@ concurrency: jobs: build: - runs-on: ubuntu-22.04 + runs-on: ubuntu-20.04 steps: - name: Checkout uses: actions/checkout@v3 @@ -25,41 +30,59 @@ jobs: fetch-depth: 0 - name: Create Build Environment - run: > - sudo dpkg --add-architecture i386 && - sudo apt-get update -y && - sudo apt-get install -y cmake file g++-multilib git libfmt-dev:i386 libsdl2-dev:i386 libsodium-dev:i386 libpng-dev:i386 libbz2-dev:i386 rpm wget smpq + run: | + # Work around the somewhat broken packages in the GitHub Actions Ubuntu 20.04 image. + # https://github.com/actions/runner-images/issues/4620#issuecomment-981333260 + sudo apt-get -y install --allow-downgrades libpcre2-8-0=10.34-7 + Packaging/nix/debian-cross-i386-prep.sh - name: Cache CMake build folder uses: actions/cache@v3 with: path: build - key: ${{ github.workflow }}-v1-${{ github.sha }} - restore-keys: ${{ github.workflow }}-v1- - - - name: Configure CMake - shell: bash - working-directory: ${{github.workspace}} - run: cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBUILD_TESTING=OFF -DCPACK=ON -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_TOOLCHAIN_FILE=../CMake/platforms/linux_i386.toolchain.cmake + key: ${{ github.workflow }}-v2-${{ github.sha }} + restore-keys: ${{ github.workflow }}-v2- - name: Build working-directory: ${{github.workspace}} shell: bash - run: cmake --build build -j $(nproc) --target package + env: + CMAKE_BUILD_TYPE: ${{github.event_name == 'release' && 'Release' || 'RelWithDebInfo'}} + # We set DEVILUTIONX_SYSTEM_LIBFMT=OFF because its soversion changes frequently. + # We set DEVILUTIONX_SYSTEM_SIMPLEINI=OFF because we require v4.19+, still missing from many distributions, + # and there is no libsimpleini-dev:i386 for Ubuntu 20.04. + run: | + cmake -S. -Bbuild -DCMAKE_TOOLCHAIN_FILE=../CMake/platforms/linux_i386.toolchain.cmake \ + -DCMAKE_BUILD_TYPE=${{env.CMAKE_BUILD_TYPE}} -DCMAKE_INSTALL_PREFIX=/usr -DCPACK=ON \ + -DBUILD_TESTING=OFF -DDEVILUTIONX_SYSTEM_LIBFMT=OFF -DDEVILUTIONX_SYSTEM_SIMPLEINI=OFF && \ + cmake --build build -j $(getconf _NPROCESSORS_ONLN) --target package - name: Package - run: Packaging/nix/LinuxReleasePackaging.sh && Packaging/nix/AppImage.sh + run: Packaging/nix/LinuxReleasePackaging.sh && mv devilutionx.tar.xz devilutionx-i386-linux-gnu.tar.xz - - name: Upload-Package + # AppImage cross-packaging is not implemented yet. + # - name: Package AppImage + # run: Packaging/nix/AppImage.sh && mv devilutionx.appimage devilutionx-i386-linux-gnu.appimage + + - name: Upload Package if: ${{ !env.ACT }} uses: actions/upload-artifact@v3 with: - name: devilutionx_linux_x86.tar.xz - path: devilutionx.tar.xz + name: devilutionx-i386-linux-gnu.tar.xz + path: devilutionx-i386-linux-gnu.tar.xz - - name: Upload-AppImage - if: ${{ !env.ACT }} - uses: actions/upload-artifact@v3 + # AppImage cross-packaging is not implemented yet. + # - name: Upload AppImage + # if: ${{ !env.ACT }} + # uses: actions/upload-artifact@v3 + # with: + # name: devilutionx-i386-linux-gnu.appimage + # path: devilutionx-i386-linux-gnu.appimage + + - name: Update Release + if: ${{ github.event_name == 'release' && !env.ACT }} + uses: svenstaro/upload-release-action@v2 with: - name: devilutionx_linux_x86.appimage - path: devilutionx.appimage + file: devilutionx-i386-linux-gnu.* + file_glob: true + overwrite: true diff --git a/CMake/platforms/i386-linux-gnu-pkg-config b/CMake/platforms/i386-linux-gnu-pkg-config new file mode 120000 index 000000000..e0fb47b9d --- /dev/null +++ b/CMake/platforms/i386-linux-gnu-pkg-config @@ -0,0 +1 @@ +debian-cross-pkg-config.sh \ No newline at end of file diff --git a/CMake/platforms/linux_i386.toolchain.cmake b/CMake/platforms/linux_i386.toolchain.cmake index a5fffc983..f56950aba 100644 --- a/CMake/platforms/linux_i386.toolchain.cmake +++ b/CMake/platforms/linux_i386.toolchain.cmake @@ -1,26 +1,29 @@ -message(STATUS "Using 32-bit toolchain") - -set(CMAKE_CXX_FLAGS -m32 CACHE STRING "") -set(CMAKE_C_FLAGS -m32 CACHE STRING "") - -# Affects pkg-config -set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB32_PATHS TRUE) -# Used by pkg-config on Debian -set(CMAKE_LIBRARY_ARCHITECTURE i386-linux-gnu) -# Silly hack required to get the pkg-config path code to activate -list(APPEND CMAKE_PREFIX_PATH /usr) - -# Find where 32-bit CMake modules are stored -find_path(DIR NAMES cmake PATHS /usr/lib32 /usr/lib/i386-linux-gnu NO_DEFAULT_PATH) - -if(DIR) - message(STATUS "Using 32-bit libraries from ${DIR}") - # Read CMake modules from 32-bit packages - # set(CMAKE_FIND_ROOT_PATH ${DIR}) - # set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) - # set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) - # set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER) -endif() - -# 32-bit NASM -set(CMAKE_ASM_NASM_OBJECT_FORMAT elf) +message(STATUS "Using 32-bit toolchain") + +set(CMAKE_CXX_FLAGS -m32 CACHE STRING "") +set(CMAKE_C_FLAGS -m32 CACHE STRING "") + +# Affects pkg-config +set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB32_PATHS TRUE) +# Used by pkg-config on Debian +set(CMAKE_LIBRARY_ARCHITECTURE i386-linux-gnu) +# Silly hack required to get the pkg-config path code to activate +list(APPEND CMAKE_PREFIX_PATH /usr) + +# Find where 32-bit CMake modules are stored +find_path(DIR NAMES cmake PATHS /usr/lib32 /usr/lib/i386-linux-gnu NO_DEFAULT_PATH) + +if(DIR) + message(STATUS "Using 32-bit libraries from ${DIR}") + # Read CMake modules from 32-bit packages + # set(CMAKE_FIND_ROOT_PATH ${DIR}) + # set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + # set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + # set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER) +endif() + +set(PKG_CONFIG_EXECUTABLE "${CMAKE_CURRENT_LIST_DIR}/i386-linux-gnu-pkg-config" CACHE STRING "Path to pkg-config") + +# 32-bit NASM +set(CMAKE_ASM_NASM_OBJECT_FORMAT elf) +set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE i386) diff --git a/Packaging/nix/debian-cross-i386-prep.sh b/Packaging/nix/debian-cross-i386-prep.sh new file mode 100755 index 000000000..8f87383a6 --- /dev/null +++ b/Packaging/nix/debian-cross-i386-prep.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +set -euo pipefail +set -x + +sudo dpkg --add-architecture i386 +sudo apt-get update +sudo apt-get install --ignore-hold -y \ + cmake g++-multilib git smpq gettext \ + libsdl2-dev:i386 libsdl2-image-dev:i386 libsodium-dev:i386 \ + libpng-dev:i386 libbz2-dev:i386 libfmt-dev:i386