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