Files @ r28361:99a1cc03aea0
Branch filter:

Location: cpp/openttd-patchpack/source/.github/workflows/release-linux.yml

Patric Stout
Change: add vcpkg.json to instruct vcpkg what dependencies we require

This works on all OSes, making it far simpler for any developer
to jump in. Just install vcpkg, run "vcpkg install" in our root,
and you have all the dependencies.
name: Release (Linux)

on:
  workflow_call:
    inputs:
      survey_key:
        required: false
        type: string
        default: ""

jobs:
  linux:
    name: Linux (Generic)

    runs-on: ubuntu-latest
    container:
      # manylinux2014 is based on CentOS 7, but already has a lot of things
      # installed and preconfigured. It makes it easier to build OpenTTD.
      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

    - 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::"

        # 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: 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-generic
        path: build/bundles
        retention-days: 5

    - name: Store symbols
      uses: actions/upload-artifact@v3
      with:
        name: symbols-linux-generic
        path: build/symbols
        retention-days: 5