---
name: build

on:
  push:
    branches: [master]
  pull_request:
    branches: [master]

  workflow_dispatch:

jobs:
  gcc-debug:
    name: gcc debug
    runs-on: ubuntu-latest
    steps:
      - name: install dependencies
        run: sudo apt-get install gcc pkg-config libjson-c-dev libhugetlbfs-dev
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: '3.x'
      - uses: bsfishy/meson-build@v1.0.3
        name: build
        with:
          action: build
          setup-options: >
            --werror
            --buildtype=debug
            -Dlibnvme:werror=false
          meson-version: 0.61.2
      - uses: bsfishy/meson-build@v1.0.3
        name: test
        with:
          action: test
          meson-version: 0.61.2
      - uses: actions/upload-artifact@v3
        if: failure()
        with:
          name: log files
          path: |
            build/meson-logs/*.txt

  gcc-release:
    name: gcc release
    runs-on: ubuntu-latest
    steps:
      - name: install dependencies
        run: sudo apt-get install gcc pkg-config libjson-c-dev libhugetlbfs-dev
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: '3.x'
      - uses: bsfishy/meson-build@v1.0.3
        name: build
        with:
          action: build
          setup-options: >
            --werror
            --buildtype=release
            -Dlibnvme:werror=false
          meson-version: 0.61.2
      - uses: bsfishy/meson-build@v1.0.3
        name: test
        with:
          action: test
          meson-version: 0.61.2
      - uses: actions/upload-artifact@v3
        if: failure()
        with:
          name: log files
          path: |
            build/meson-logs/*.txt

  clang-release:
    name: clang release
    runs-on: ubuntu-latest
    steps:
      - name: install dependencies
        run: sudo apt-get install clang pkg-config libjson-c-dev libhugetlbfs-dev
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: '3.x'
      - uses: bsfishy/meson-build@v1.0.3
        name: build
        with:
          action: build
          setup-options: >
            --werror
            --buildtype=release
            --cross-file=.github/cross/clang.txt
            -Dlibnvme:werror=false
            -Dopenssl:werror=false
          meson-version: 0.61.2
      - uses: bsfishy/meson-build@v1.0.3
        name: test
        with:
          action: test
          meson-version: 0.61.2
      - uses: actions/upload-artifact@v3
        if: failure()
        with:
          name: log files
          path: |
            build/meson-logs/*.txt

  fallback-shared-libraries:
    name: fallback shared libraries
    runs-on: ubuntu-latest
    steps:
      - name: install dependencies
        run: sudo apt-get install libpam-dev libcap-ng-dev
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: '3.x'
      - uses: BSFishy/meson-build@v1.0.3
        name: build
        with:
          action: build
          setup-options: >
            --werror
            --buildtype=release
            --wrap-mode=forcefallback
            --default-library=shared
            -Dlibnvme:werror=false
            -Dopenssl:werror=false
          meson-version: 0.61.2
      - uses: bsfishy/meson-build@v1.0.3
        name: test
        with:
          action: test
          meson-version: 0.61.2
      - uses: actions/upload-artifact@v3
        if: failure()
        with:
          name: log files
          path: |
            build/meson-logs/*.txt

  fallback-static-libraries:
    name: fallback static libraries
    runs-on: ubuntu-latest
    steps:
      - name: install dependencies
        run: sudo apt-get install libpam-dev libcap-ng-dev
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: '3.x'
      - uses: BSFishy/meson-build@v1.0.3
        name: build
        with:
          action: build
          setup-options: >
            --werror
            --buildtype=release
            --wrap-mode=forcefallback
            --default-library=static
            -Dlibnvme:werror=false
            -Dopenssl:werror=false
          meson-version: 0.61.2
      - uses: bsfishy/meson-build@v1.0.3
        name: test
        with:
          action: test
          meson-version: 0.61.2
      - uses: actions/upload-artifact@v3
        if: failure()
        with:
          name: log files
          path: |
            build/meson-logs/*.txt

  cross-armhf:
    name: cross armhf
    runs-on: ubuntu-latest
    steps:
      - name: set up arm architecture
        run: |
          export release=$(lsb_release -c -s)
          sudo dpkg --add-architecture armhf
          sudo sed -i -e 's/deb http/deb [arch=amd64] http/g' /etc/apt/sources.list
          sudo dd of=/etc/apt/sources.list.d/armhf.list <<EOF
          deb [arch=armhf] http://ports.ubuntu.com/ $release main universe restricted"
          deb [arch=armhf] http://ports.ubuntu.com/ $release-updates main universe restricted"
          EOF
          sudo apt update
      - name: install armhf compiler
        run: sudo apt install gcc-arm-linux-gnueabihf pkg-config qemu-user-static
      - name: install libraries
        run: sudo apt install libjson-c-dev:armhf
      - uses: actions/checkout@v3
      - uses: BSFishy/meson-build@v1.0.3
        name: build
        with:
          action: build
          setup-options: >
            --werror
            --buildtype=release
            --cross-file=.github/cross/ubuntu-armhf.txt
            -Dlibnvme:python=disabled
            -Dopenssl:werror=false
          meson-version: 0.61.2
      - uses: bsfishy/meson-build@v1.0.3
        name: test
        with:
          action: test
          meson-version: 0.61.2
      - uses: actions/upload-artifact@v3
        if: failure()
        with:
          name: log files
          path: |
            build/meson-logs/*.txt

  cross-ppc64le:
    name: cross ppc64le
    runs-on: ubuntu-latest
    steps:
      - name: set up ppc64le architecture
        run: |
          export release=$(lsb_release -c -s)
          sudo dpkg --add-architecture ppc64el
          sudo sed -i -e 's/deb http/deb [arch=amd64] http/g' /etc/apt/sources.list
          sudo dd of=/etc/apt/sources.list.d/ppc64el.list <<EOF
          deb [arch=ppc64el] http://ports.ubuntu.com/ $release main universe restricted"
          deb [arch=ppc64el] http://ports.ubuntu.com/ $release-updates main universe restricted"
          EOF
          sudo apt update
      - name: install powerpc64le compiler
        run: sudo apt install gcc-powerpc64le-linux-gnu pkg-config qemu-user-static
      - name: install libraries
        run: sudo apt install libjson-c-dev:ppc64el
      - uses: actions/checkout@v3
      - uses: BSFishy/meson-build@v1.0.3
        name: build
        with:
          action: build
          setup-options: >
            --werror
            --buildtype=release
            --cross-file=.github/cross/ubuntu-ppc64le.txt
            -Dlibnvme:werror=false
            -Dlibnvme:python=disabled
            -Dopenssl:werror=false
          meson-version: 0.61.2
      - uses: bsfishy/meson-build@v1.0.3
        name: test
        with:
          action: test
          meson-version: 0.61.2
      - uses: actions/upload-artifact@v3
        if: failure()
        with:
          name: log files
          path: |
            build/meson-logs/*.txt

  cross-s390x:
    name: cross s390x
    runs-on: ubuntu-latest
    steps:
      - name: set up s390x architecture
        run: |
          export release=$(lsb_release -c -s)
          sudo dpkg --add-architecture s390x
          sudo sed -i -e 's/deb http/deb [arch=amd64] http/g' /etc/apt/sources.list
          sudo dd of=/etc/apt/sources.list.d/s390x.list <<EOF
          deb [arch=s390x] http://ports.ubuntu.com/ $release main universe restricted"
          deb [arch=s390x] http://ports.ubuntu.com/ $release-updates main universe restricted"
          EOF
          sudo apt update
      - name: install s390x compiler
        run: sudo apt install gcc-s390x-linux-gnu pkg-config qemu-user-static
      - name: install libraries
        run: sudo apt install libjson-c-dev:s390x
      - uses: actions/checkout@v3
      - uses: BSFishy/meson-build@v1.0.3
        name: build
        with:
          action: build
          setup-options: >
            --werror
            --buildtype=release
            --cross-file=.github/cross/ubuntu-s390x.txt
            -Dlibnvme:werror=false
            -Dlibnvme:python=disabled
            -Dopenssl:werror=false
          meson-version: 0.61.2
      - uses: bsfishy/meson-build@v1.0.3
        name: test
        with:
          action: test
          meson-version: 0.61.2
      - uses: actions/upload-artifact@v3
        if: failure()
        with:
          name: log files
          path: |
            build/meson-logs/*.txt

  build-minimal:
    name: muon minimal
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: build muon and samurai build-tool
        run: |
          mkdir build-tools
          cd build-tools
          git clone --depth 1 https://git.sr.ht/~lattis/muon
          cd muon

          export CC=gcc
          export ninja=build/samu

          ./tools/bootstrap_ninja.sh build
          ./bootstrap.sh build

          build/muon setup               \
              -Dlibcurl=disabled         \
              -Dlibarchive=disabled      \
              -Ddocs=disabled            \
              -Dsamurai=disabled         \
              build
          build/samu -C build
          build/muon -C build test
      - name: fetch libnvme
        run: |
          cd subprojects
          git clone https://github.com/linux-nvme/libnvme.git
          libnvme_ref=$(sed -n "s/revision = \([0-9a-z]\+\)/\1/p" libnvme.wrap)
          git -C libnvme checkout $libnvme_ref
      - name: build
        run: |
          export PATH=$(pwd)/build-tools/muon/build:$PATH

          muon setup                     \
              -Dlibnvme:python=disabled  \
              -Dlibnvme:json-c=disabled  \
              -Djson-c=disabled          \
              build
          samu -C build
      - name: test
        run: |
          export PATH=$(pwd)/build-tools/muon/build:$PATH

          muon -C build test