diff --git a/.github/workflows/release-linux-legacy.yml b/.github/workflows/release-linux-legacy.yml new file mode 100644 --- /dev/null +++ b/.github/workflows/release-linux-legacy.yml @@ -0,0 +1,220 @@ +name: Release (Linux, Legacy) + +on: + workflow_call: + inputs: + survey_key: + required: false + type: string + default: "" + +jobs: + linux: + name: Linux (Legacy) + + runs-on: ubuntu-latest + container: + # manylinux2014 is based on CentOS 7, and already has a lot of things + # installed and preconfigured. It makes it easier to build OpenTTD. + # This distro is based on glibc 2.17, released in 2012. + image: quay.io/pypa/manylinux2014_x86_64 + + steps: + - name: Download source + uses: actions/download-artifact@v3 + with: + name: internal-source + + - name: Unpack source + run: | + tar -xf source.tar.gz --strip-components=1 + + # curl is too old for most of the tools to work properly. For example, + # rust-toolchain doesn't work properly, neither vcpkg caching. + # The easier solution here is to upgrade curl. + - name: Update curl + run: | + yum install -y \ + openssl-devel \ + # EOF + + mkdir /curl + cd /curl + curl -o curl-7.81.0.zip https://curl.se/download/curl-7.81.0.zip + unzip curl-7.81.0.zip + cd curl-7.81.0 + ./configure --with-ssl --with-zlib --prefix=/usr --libdir=/usr/lib64 + make -j $(nproc) + make install + + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + + - name: Enable Rust cache + uses: Swatinem/rust-cache@v2.7.0 + + - name: Setup vcpkg caching + uses: actions/github-script@v6 + with: + script: | + core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); + core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); + core.exportVariable('VCPKG_BINARY_SOURCES', 'clear;x-gha,readwrite') + + - name: Install dependencies + run: | + echo "::group::Install system dependencies" + # perl-IPC-Cmd, wget, and zip are needed to run vcpkg. + # autoconf-archive is needed to build ICU. + yum install -y \ + autoconf-archive \ + perl-IPC-Cmd \ + wget \ + zip \ + # EOF + + # aclocal looks first in /usr/local/share/aclocal, and if that doesn't + # exist only looks in /usr/share/aclocal. We have files in both that + # are important. So copy the latter to the first, and we are good to + # go. + cp /usr/share/aclocal/* /usr/local/share/aclocal/ + echo "::endgroup::" + + # The yum variant of fluidsynth depends on all possible audio drivers, + # like jack, ALSA, pulseaudio, etc. This is not really useful for us, + # as we route the output of fluidsynth back via our sound driver, and + # as such do not use these audio driver outputs at all. + # The vcpkg variant of fluidsynth depends on ALSA. Similar issue here. + # So instead, we compile fluidsynth ourselves, with as few + # dependencies as possible. We do it before anything else is installed, + # to make sure it doesn't pick up on any of the drivers. + echo "::group::Install fluidsynth" + wget https://github.com/FluidSynth/fluidsynth/archive/v2.3.3.tar.gz + tar xf v2.3.3.tar.gz + ( + cd fluidsynth-2.3.3 + mkdir build + cd build + cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/usr + cmake --build . -j $(nproc) + cmake --install . + ) + + # The container we use is old enough, that it doesn't know SHF_COMPRESSED. + # But, breakpad needs this symbol to exist. So we patch it in our system + # libraries. + ( + cd / + patch -p1 < ${GITHUB_WORKSPACE}/os/linux/shf-compressed.patch + ) + echo "::endgroup::" + + echo "::group::Install audio drivers" + # These audio libs are to make sure the SDL version of vcpkg adds + # sound-support; these libraries are not added to the resulting + # binary, but the headers are used to enable them in SDL. + yum install -y \ + alsa-lib-devel \ + jack-audio-connection-kit-devel \ + pulseaudio-libs-devel \ + # EOF + echo "::endgroup::" + + echo "::group::Install video drivers" + # These video libs are to make sure the SDL version of vcpkg adds + # video-support; these libraries are not added to the resulting + # binary, but the headers are used to enable them in SDL. + yum install -y \ + libX11-devel \ + libXcursor-devel \ + libXext-devel \ + libXfixes-devel \ + libXi-devel \ + libxkbcommon-devel \ + libXrandr-devel \ + libXScrnSaver-devel \ + # EOF + echo "::endgroup::" + + # We use vcpkg for our dependencies, to get more up-to-date version. + echo "::group::Install vcpkg and dependencies" + + git clone https://github.com/microsoft/vcpkg /vcpkg + + ( + cd /vcpkg + ./bootstrap-vcpkg.sh -disableMetrics + ) + + # Make Python3 available for other packages. This needs to be done + # first, as otherwise dependencies fail to build because Python3 is + # not available. + ( + cd / + + /vcpkg/vcpkg install python3 + ln -sf /vcpkg/installed/x64-linux/tools/python3/python3.[0-9][0-9] /usr/bin/python3 + ) + echo "::endgroup::" + + echo "::group::Install breakpad dependencies" + cargo install dump_syms + echo "::endgroup::" + + - name: Patch bundle name + run: | + sed -i 's/generic/legacy/g' cmake/InstallAndPackage.cmake + + - name: Install GCC problem matcher + uses: ammaraskar/gcc-problem-matcher@master + + - name: Build + run: | + mkdir -p build + cd build + + echo "::group::CMake" + cmake ${GITHUB_WORKSPACE} \ + -DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.cmake \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DOPTION_SURVEY_KEY=${{ inputs.survey_key }} \ + -DOPTION_PACKAGE_DEPENDENCIES=ON \ + # EOF + echo "::endgroup::" + + echo "::group::Build" + echo "Running on $(nproc) cores" + cmake --build . -j $(nproc) --target openttd + echo "::endgroup::" + + - name: Create breakpad symbols + run: | + cd build + dump_syms ./openttd --inlines --store symbols + + - name: Create bundles + run: | + cd ${GITHUB_WORKSPACE}/build + echo "::group::Run CPack" + cpack + echo "::endgroup::" + + echo "::group::Cleanup" + # Remove the sha256 files CPack generates; we will do this ourself at + # the end of this workflow. + rm -f bundles/*.sha256 + echo "::endgroup::" + + - name: Store bundles + uses: actions/upload-artifact@v3 + with: + name: openttd-linux-legacy + path: build/bundles + retention-days: 5 + + - name: Store symbols + uses: actions/upload-artifact@v3 + with: + name: symbols-linux-legacy + path: build/symbols + retention-days: 5 diff --git a/.github/workflows/release-linux.yml b/.github/workflows/release-linux.yml --- a/.github/workflows/release-linux.yml +++ b/.github/workflows/release-linux.yml @@ -14,9 +14,10 @@ jobs: runs-on: ubuntu-latest container: - # manylinux2014 is based on CentOS 7, but already has a lot of things + # manylinux_2_28 is based on AlmaLinux 8, and already has a lot of things # installed and preconfigured. It makes it easier to build OpenTTD. - image: quay.io/pypa/manylinux2014_x86_64 + # This distro is based on glibc 2.28, released in 2018. + image: quay.io/pypa/manylinux_2_28_x86_64 steps: - name: Download source @@ -28,29 +29,11 @@ jobs: run: | tar -xf source.tar.gz --strip-components=1 - # curl is too old for most of the tools to work properly. For example, - # rust-toolchain doesn't work properly, neither vcpkg caching. - # The easier solution here is to upgrade curl. - - name: Update curl - run: | - yum install -y \ - openssl-devel \ - # EOF - - mkdir /curl - cd /curl - curl -o curl-7.81.0.zip https://curl.se/download/curl-7.81.0.zip - unzip curl-7.81.0.zip - cd curl-7.81.0 - ./configure --with-ssl --with-zlib --prefix=/usr --libdir=/usr/lib64 - make -j $(nproc) - make install - - name: Install Rust toolchain uses: dtolnay/rust-toolchain@stable - name: Enable Rust cache - uses: Swatinem/rust-cache@v2.7.0 + uses: Swatinem/rust-cache@v2 - name: Setup vcpkg caching uses: actions/github-script@v6 @@ -99,22 +82,12 @@ jobs: cmake --install . ) - # The container we use is old enough, that it doesn't know SHF_COMPRESSED. - # But, breakpad needs this symbol to exist. So we patch it in our system - # libraries. - ( - cd / - patch -p1 < ${GITHUB_WORKSPACE}/os/linux/shf-compressed.patch - ) - echo "::endgroup::" - echo "::group::Install audio drivers" # These audio libs are to make sure the SDL version of vcpkg adds # sound-support; these libraries are not added to the resulting # binary, but the headers are used to enable them in SDL. yum install -y \ alsa-lib-devel \ - jack-audio-connection-kit-devel \ pulseaudio-libs-devel \ # EOF echo "::endgroup::" @@ -132,6 +105,11 @@ jobs: libxkbcommon-devel \ libXrandr-devel \ libXScrnSaver-devel \ + mesa-libEGL-devel \ + mesa-libGL-devel \ + mesa-libGLES-devel \ + wayland-devel \ + wayland-protocols-devel \ # EOF echo "::endgroup::" @@ -145,17 +123,6 @@ jobs: ./bootstrap-vcpkg.sh -disableMetrics ) - # Make Python3 available for other packages. This needs to be done - # first, as otherwise dependencies fail to build because Python3 is - # not available. - ( - cd / - - /vcpkg/vcpkg install python3 - ln -sf /vcpkg/installed/x64-linux/tools/python3/python3.[0-9][0-9] /usr/bin/python3 - ) - echo "::endgroup::" - echo "::group::Install breakpad dependencies" cargo install dump_syms echo "::endgroup::" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -31,6 +31,16 @@ jobs: with: version: ${{ needs.source.outputs.version }} + linux-legacy: + name: Linux (Legacy) + needs: source + + uses: ./.github/workflows/release-linux-legacy.yml + secrets: inherit + + with: + survey_key: ${{ needs.source.outputs.survey_key }} + linux: name: Linux (Generic) needs: source @@ -81,6 +91,7 @@ jobs: needs: - source - docs + - linux-legacy - linux - macos - windows @@ -88,7 +99,7 @@ jobs: # As windows-store is condition, we need to check ourselves if we need to run. # The always() makes sure the rest is always evaluated. - if: always() && needs.source.result == 'success' && needs.docs.result == 'success' && needs.linux.result == 'success' && needs.macos.result == 'success' && needs.windows.result == 'success' && (needs.windows-store.result == 'success' || needs.windows-store.result == 'skipped') + if: always() && needs.source.result == 'success' && needs.docs.result == 'success' && needs.linux-legacy.result == 'success' && needs.linux.result == 'success' && needs.macos.result == 'success' && needs.windows.result == 'success' && (needs.windows-store.result == 'success' || needs.windows-store.result == 'skipped') uses: ./.github/workflows/upload-cdn.yml secrets: inherit