| # Continuous Integration |
| |
| Here you will find snippets to use Meson with various CI such as |
| Travis and AppVeyor. |
| |
| Please [file an issue](https://github.com/mesonbuild/meson/issues/new) |
| if these instructions don't work for you. |
| |
| ## Travis-CI with Docker |
| |
| Travis with Docker gives access to newer non-LTS Ubuntu versions with |
| pre-installed libraries of your choice. |
| |
| This `yml` file is derived from the |
| [configuration used by Meson](https://github.com/mesonbuild/meson/blob/master/.travis.yml) |
| for running its own tests. |
| |
| ```yaml |
| os: |
| - linux |
| - osx |
| |
| language: |
| - cpp |
| |
| services: |
| - docker |
| |
| before_install: |
| - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi |
| - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install python3 ninja; fi |
| - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then pip3 install meson; fi |
| - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then docker pull YOUR/REPO:eoan; fi |
| |
| script: |
| - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then echo FROM YOUR/REPO:eoan > Dockerfile; fi |
| - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then echo ADD . /root >> Dockerfile; fi |
| - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then docker build -t withgit .; fi |
| - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then docker run withgit /bin/sh -c "cd /root && TRAVIS=true CC=$CC CXX=$CXX meson setup builddir && meson test -C builddir"; fi |
| - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then SDKROOT=$(xcodebuild -version -sdk macosx Path) meson setup builddir && meson test -C builddir; fi |
| ``` |
| |
| ## CircleCI for Linux host (with custom Docker images) |
| |
| [CircleCi](https://circleci.com/) can work for spinning all of the |
| Linux images you wish. Here's a sample `yml` file for use with that. |
| |
| ```yaml |
| version: 2.1 |
| |
| executors: |
| # Your dependencies would go in the docker images that represent |
| # the Linux distributions you are supporting |
| meson_ubuntu_builder: |
| docker: |
| - image: your_dockerhub_username/ubuntu-sys |
| |
| meson_debian_builder: |
| docker: |
| - image: your_dockerhub_username/debian-sys |
| |
| meson_fedora_builder: |
| docker: |
| - image: your_dockerhub_username/fedora-sys |
| |
| jobs: |
| meson_ubuntu_build: |
| executor: meson_ubuntu_builder |
| steps: |
| - checkout |
| - run: |
| name: Configure Project |
| command: meson setup builddir --backend ninja |
| - run: |
| name: Compile Project |
| command: meson compile -C builddir |
| - run: |
| name: Run Tests |
| command: meson test -C builddir |
| |
| meson_debian_build: |
| executor: meson_debian_builder |
| steps: |
| - checkout |
| - run: |
| name: Configure Project |
| command: meson setup builddir --backend ninja |
| - run: |
| name: Compile Project |
| command: meson compile -C builddir |
| - run: |
| name: Run Tests |
| command: meson test -C builddir |
| |
| meson_fedora_build: |
| executor: meson_fedora_builder |
| steps: |
| - checkout |
| - run: |
| name: Configure Project |
| command: meson setup builddir --backend ninja |
| - run: |
| name: Compile Project |
| command: meson compile -C builddir |
| - run: |
| name: Run Tests |
| command: meson test -C builddir |
| |
| workflows: |
| version: 2 |
| linux_workflow: |
| jobs: |
| - meson_ubuntu_build |
| - meson_debian_build |
| - meson_fedora_build |
| |
| ``` |
| |
| ## CircleCI for Linux host (without custom Docker images) |
| |
| This CircleCI configuration defines two jobs, `build-linux` and `build-macos`, |
| within a workflow named `build`. The `build-linux` job utilizes a Docker image |
| with Python 3.12.3, while `build-macos` runs on macOS with Xcode 15.3.0. Each |
| job involves checking out the code, installing Meson and Ninja, configuring the |
| project, compiling it, and running tests using Meson. |
| |
| ```yaml |
| version: 2.1 |
| |
| jobs: |
| build-linux: |
| docker: |
| - image: cimg/python:3.12.3 |
| steps: |
| - checkout |
| - run: |
| name: Install Meson and Ninja |
| command: | |
| python -m pip install --user meson ninja |
| - run: |
| name: Configure Project |
| command: | |
| meson setup builddir |
| - run: |
| name: Compile Project |
| command: | |
| meson compile -C builddir |
| - run: |
| name: Run Tests |
| command: | |
| meson test -C builddir |
| |
| build-macos: |
| macos: |
| xcode: 15.3.0 |
| steps: |
| - checkout |
| - run: |
| name: Install Meson and Ninja |
| command: | |
| python -m pip install meson ninja |
| - run: |
| name: Configure Project |
| command: | |
| meson setup builddir |
| - run: |
| name: Compile Project |
| command: | |
| meson compile -C builddir |
| - run: |
| name: Run Tests |
| command: | |
| meson test -C builddir |
| |
| workflows: |
| version: 2.1 |
| build: |
| jobs: |
| - build-linux |
| - build-macos |
| ``` |
| |
| ## AppVeyor for Windows |
| |
| For CI on Windows, [AppVeyor](https://www.appveyor.com/) has a wide |
| selection of [default |
| configurations](https://www.appveyor.com/docs/windows-images-software/). |
| AppVeyor also has |
| [MacOS](https://www.appveyor.com/docs/macos-images-software/) and |
| [Linux](https://www.appveyor.com/docs/linux-images-software/) CI |
| images. This is a sample `appveyor.yml` file for Windows with Visual |
| Studio 2017, 2019, and 2022. |
| |
| ```yaml |
| version: 1.0.{build} |
| image: |
| - Visual Studio 2022 |
| - Visual Studio 2019 |
| - Visual Studio 2017 |
| |
| install: |
| - cmd: python -m pip install meson ninja |
| |
| build_script: |
| - cmd: >- |
| meson setup builddir |
| meson compile -C builddir |
| |
| test_script: |
| - cmd: meson test -C builddir |
| ``` |
| |
| ### Qt |
| |
| For Qt 5, add the following line near the `PYTHON_ROOT` assignment: |
| |
| ```yaml |
| - cmd: if %arch%==x86 (set QT_ROOT=C:\Qt\5.11\%compiler%) else (set QT_ROOT=C:\Qt\5.11\%compiler%_64) |
| ``` |
| |
| And afterwards add `%QT_ROOT%\bin` to the `PATH` variable. |
| |
| You might have to adjust your build matrix as there are, for example, |
| no msvc2017 32-bit builds. Visit the [Build |
| Environment](https://www.appveyor.com/docs/build-environment/) page in |
| the AppVeyor docs for more details. |
| |
| ### Boost |
| |
| The following statement is sufficient for Meson to find Boost: |
| |
| ```yaml |
| - cmd: set BOOST_ROOT=C:\Libraries\boost_1_67_0 |
| ``` |
| |
| ## Travis without Docker |
| |
| Non-Docker Travis-CI builds can use Linux, MacOS or Windows. |
| Set the desired compiler(s) in the build **matrix**. |
| This example is for **Linux** (Ubuntu 18.04) and **C**. |
| |
| ```yaml |
| dist: bionic |
| group: travis_latest |
| |
| os: linux |
| language: python |
| |
| matrix: |
| include: |
| - env: CC=gcc |
| - env: CC=clang |
| |
| install: |
| - pip install meson ninja |
| |
| script: |
| - meson setup builddir |
| - meson compile -C builddir |
| - meson test -C builddir |
| ``` |
| |
| ## GitHub Actions |
| |
| GitHub Actions provides a versatile platform for continuous integration |
| (CI). This example workflow file, `ci_meson.yml`, is tailored for C-based |
| projects utilizing GCC on Linux, macOS, and Windows. Triggered by changes |
| to C code files, it automates building and testing processes using different |
| versions of Meson (1.0.0, 1.1.0, 1.2.0, 1.3.0, 1.4.0) across various operating |
| systems. Each job in the workflow handles checkout, dependency installation, |
| project configuration, test execution, and optional test log uploads upon |
| failure. |
| |
| ```yaml |
| name: CI Meson |
| |
| on: |
| push: |
| paths: |
| - "**.c" |
| - "**.h" |
| pull_request: |
| paths: |
| - "**.c" |
| - "**.h" |
| |
| jobs: |
| build: |
| name: Build and Test on ${{ matrix.os }} with Meson v${{ matrix.meson_version }} |
| runs-on: ${{ matrix.os }} |
| strategy: |
| matrix: |
| os: [ubuntu-latest, macos-latest, windows-latest] |
| meson_version: ["1.2.0", "1.3.0", "1.4.0"] |
| steps: |
| - name: Checkout code |
| uses: actions/checkout@v4 |
| - name: Set up Python |
| uses: actions/setup-python@v5 |
| with: |
| python-version: '3.x' |
| - name: Install dependencies |
| run: python -m pip install meson==${{ matrix.meson_version }} ninja |
| - name: Configure Project |
| run: meson setup builddir/ |
| env: |
| CC: gcc |
| - name: Run Tests |
| run: meson test -C builddir/ -v |
| - name: Upload Test Log |
| uses: actions/upload-artifact@v4 |
| if: failure() |
| with: |
| name: ${{ matrix.os }}_Meson_Testlog |
| path: builddir/meson-logs/testlog.txt |
| |
| ``` |