name: GitHub Actions CI

on:
  pull_request:
  push:
    branches:
      - master
      - develop
      - githubactions*
      - feature/**
      - fix/**
      - pr/**

jobs:
  posix:
    strategy:
      fail-fast: false
      matrix:
        include:
          - name: "TEST_CMAKE=TRUE Job 0"
            buildtype: "96ad197d74-2319b6d45f"
            packages: ""
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "g++"
            sources: ""
            llvm_os: ""
            llvm_ver: ""
            test_cmake: "TRUE"
          - name: "TOOLSET=gcc COMPILER=g++ CXXSTD=03,11 Job 1"
            buildtype: "boost"
            packages: ""
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "g++"
            sources: ""
            llvm_os: ""
            llvm_ver: ""
            toolset: "gcc"
            compiler: "g++"
            cxxstd: "03,11"
          - name: "TOOLSET=gcc COMPILER=g++-4.7 CXXSTD=03,11 Job 2"
            buildtype: "boost"
            packages: "g++-4.7"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "g++-4.7"
            sources: ""
            llvm_os: ""
            llvm_ver: ""
            toolset: "gcc"
            compiler: "g++-4.7"
            cxxstd: "03,11"
          - name: "TOOLSET=gcc COMPILER=g++-4.8 CXXSTD=03,11 Job 3"
            buildtype: "boost"
            packages: "g++-4.8"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "g++-4.8"
            sources: ""
            llvm_os: ""
            llvm_ver: ""
            toolset: "gcc"
            compiler: "g++-4.8"
            cxxstd: "03,11"
          - name: "TOOLSET=gcc COMPILER=g++-4.9 CXXSTD=03,11 Job 4"
            buildtype: "boost"
            packages: "g++-4.9"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "g++-4.9"
            sources: ""
            llvm_os: ""
            llvm_ver: ""
            toolset: "gcc"
            compiler: "g++-4.9"
            cxxstd: "03,11"
          - name: "TOOLSET=gcc COMPILER=g++-5 CXXSTD=03,11,14,1z Job 5"
            buildtype: "boost"
            packages: "g++-5"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "g++-5"
            sources: ""
            llvm_os: ""
            llvm_ver: ""
            toolset: "gcc"
            compiler: "g++-5"
            cxxstd: "03,11,14,1z"
          - name: "TOOLSET=gcc COMPILER=g++-6 CXXSTD=03,11,14,1z Job 6"
            buildtype: "boost"
            packages: "g++-6"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "g++-6"
            sources: ""
            llvm_os: ""
            llvm_ver: ""
            toolset: "gcc"
            compiler: "g++-6"
            cxxstd: "03,11,14,1z"
          - name: "TOOLSET=gcc COMPILER=g++-7 CXXSTD=03,11,14,17 Job 7"
            buildtype: "boost"
            packages: "g++-7"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "g++-7"
            sources: ""
            llvm_os: ""
            llvm_ver: ""
            toolset: "gcc"
            compiler: "g++-7"
            cxxstd: "03,11,14,17"
          - name: "TOOLSET=clang COMPILER=clang++ CXXSTD=03,11 Job 8"
            buildtype: "boost"
            packages: ""
            packages_to_remove: ""
            os: "ubuntu-18.04"
            cxx: "clang++"
            sources: ""
            llvm_os: ""
            llvm_ver: ""
            toolset: "clang"
            compiler: "clang++"
            cxxstd: "03,11"
          - name: "TOOLSET=clang COMPILER=clang++-3.5 CXXSTD=03, Job 9"
            buildtype: "boost"
            packages: "clang-3.5 libstdc++-4.9-dev"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "clang++-3.5"
            sources: ""
            llvm_os: "precise"
            llvm_ver: "3.5"
            toolset: "clang"
            compiler: "clang++-3.5"
            cxxstd: "03,11,14"
          - name: "TOOLSET=clang COMPILER=clang++-3.6 CXXSTD=03, Job 10"
            buildtype: "boost"
            packages: "clang-3.6"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "clang++-3.6"
            sources: ""
            llvm_os: "precise"
            llvm_ver: "3.6"
            toolset: "clang"
            compiler: "clang++-3.6"
            cxxstd: "03,11,14"
          - name: "TOOLSET=clang COMPILER=clang++-3.7 CXXSTD=03, Job 11"
            buildtype: "boost"
            packages: "clang-3.7"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "clang++-3.7"
            sources: ""
            llvm_os: "precise"
            llvm_ver: "3.7"
            toolset: "clang"
            compiler: "clang++-3.7"
            cxxstd: "03,11,14"
          - name: "TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=03, Job 12"
            buildtype: "boost"
            packages: "clang-3.8 libstdc++-4.9-dev"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "clang++-3.8"
            sources: ""
            llvm_os: "precise"
            llvm_ver: "3.8"
            toolset: "clang"
            compiler: "clang++-3.8"
            cxxstd: "03,11,14"
          - name: "TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=03, Job 13"
            buildtype: "boost"
            packages: "clang-3.9 libstdc++-4.9-dev"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "clang++-3.9"
            sources: ""
            llvm_os: "precise"
            llvm_ver: "3.9"
            toolset: "clang"
            compiler: "clang++-3.9"
            cxxstd: "03,11,14"
          - name: "TOOLSET=clang COMPILER=clang++-4.0 CXXSTD=03, Job 14"
            buildtype: "boost"
            packages: "clang-4.0"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "clang++-4.0"
            sources: ""
            llvm_os: "xenial"
            llvm_ver: "4.0"
            toolset: "clang"
            compiler: "clang++-4.0"
            cxxstd: "03,11,14"
          - name: "TOOLSET=clang COMPILER=clang++-5.0 CXXSTD=03, Job 15"
            buildtype: "boost"
            packages: "clang-5.0"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "clang++-5.0"
            sources: ""
            llvm_os: "xenial"
            llvm_ver: "5.0"
            toolset: "clang"
            compiler: "clang++-5.0"
            cxxstd: "03,11,14,1z"

    runs-on: ${{ matrix.os }}
    container: ${{ matrix.container }}

    steps:
      - name: Check if running in container
        if: matrix.container != ''
        run: echo "GHA_CONTAINER=${{ matrix.container }}" >> $GITHUB_ENV
      - name: If running in container, upgrade packages
        if: matrix.container != ''
        run: |
            apt-get -o Acquire::Retries=3 update && DEBIAN_FRONTEND=noninteractive apt-get -y install tzdata && apt-get -o Acquire::Retries=3 install -y sudo software-properties-common wget curl apt-transport-https make apt-file sudo unzip libssl-dev build-essential autotools-dev autoconf automake g++ libc++-helpers python ruby cpio gcc-multilib g++-multilib pkgconf python3 ccache libpython-dev
            sudo apt-add-repository ppa:git-core/ppa
            sudo apt-get -o Acquire::Retries=3 update && apt-get -o Acquire::Retries=3 -y install git
            python_version=$(python3 -c 'import sys; print("{0.major}.{0.minor}".format(sys.version_info))')
            sudo wget https://bootstrap.pypa.io/pip/$python_version/get-pip.py
            sudo python3 get-pip.py
            sudo /usr/local/bin/pip install cmake

      - uses: actions/checkout@v2

      - name: linux
        shell: bash
        env:
          CXX: ${{ matrix.cxx }}
          SOURCES: ${{ matrix.sources }}
          LLVM_OS: ${{ matrix.llvm_os }}
          LLVM_VER: ${{ matrix.llvm_ver }}
          PACKAGES: ${{ matrix.packages }}
          PACKAGES_TO_REMOVE: ${{ matrix.packages_to_remove }}
          JOB_BUILDTYPE: ${{ matrix.buildtype }}
          TEST_CMAKE: ${{ matrix.test_cmake }}
          TOOLSET: ${{ matrix.toolset }}
          COMPILER: ${{ matrix.compiler }}
          CXXSTD: ${{ matrix.cxxstd }}
          TRAVIS_BRANCH: ${{ github.base_ref }}
          TRAVIS_OS_NAME: "linux"
        run: |
          echo '==================================> SETUP'
          echo '==================================> PACKAGES'
          set -e
          if [ -n "$PACKAGES_TO_REMOVE" ]; then sudo apt-get purge -y $PACKAGES_TO_REMOVE; fi
          echo ">>>>> APT: REPO.."
          for i in {1..3}; do sudo -E apt-add-repository -y "ppa:ubuntu-toolchain-r/test" && break || sleep 2; done
          
          if test -n "${LLVM_OS}" ; then
              wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
              if test -n "${LLVM_VER}" ; then
                  sudo -E apt-add-repository "deb http://apt.llvm.org/${LLVM_OS}/ llvm-toolchain-${LLVM_OS}-${LLVM_VER} main"
              else
                  # Snapshot (i.e. trunk) build of clang
                  sudo -E apt-add-repository "deb http://apt.llvm.org/${LLVM_OS}/ llvm-toolchain-${LLVM_OS} main"
              fi
          fi
          echo ">>>>> APT: UPDATE.."
          sudo -E apt-get -o Acquire::Retries=3 update
          if test -n "${SOURCES}" ; then
              echo ">>>>> APT: INSTALL SOURCES.."
              for SOURCE in $SOURCES; do
                  sudo -E apt-add-repository ppa:$SOURCE
              done
          fi
          echo ">>>>> APT: INSTALL ${PACKAGES}.."
          sudo -E DEBIAN_FRONTEND=noninteractive apt-get -o Acquire::Retries=3 -y --no-install-suggests --no-install-recommends install ${PACKAGES}

          echo '==================================> INSTALL AND COMPILE'
          set -e
          export TRAVIS_BUILD_DIR=$(pwd)
          export TRAVIS_BRANCH=${TRAVIS_BRANCH:-$(echo $GITHUB_REF | awk 'BEGIN { FS = "/" } ; { print $3 }')}
          export VCS_COMMIT_ID=$GITHUB_SHA
          export GIT_COMMIT=$GITHUB_SHA
          export REPO_NAME=$(basename $GITHUB_REPOSITORY)
          export USER=$(whoami)
          export CC=${CC:-gcc}
          export PATH=~/.local/bin:/usr/local/bin:$PATH

          if [ "$JOB_BUILDTYPE" == "96ad197d74-2319b6d45f" ]; then

          echo '==================================> INSTALL'

          BOOST_BRANCH=develop && [ "$TRAVIS_BRANCH" == "master" ] && BOOST_BRANCH=master || true
          git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/assert.git ../assert
          git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/config.git ../config
          git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/core.git ../core
          git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/static_assert.git ../static_assert
          git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/throw_exception.git ../throw_exception

          echo '==================================> SCRIPT'

          mkdir __build__ && cd __build__
          cmake ../test/test_cmake
          cmake --build .

          elif [ "$JOB_BUILDTYPE" == "boost" ]; then

          echo '==================================> INSTALL'

          BOOST_BRANCH=develop && [ "$TRAVIS_BRANCH" == "master" ] && BOOST_BRANCH=master || true
          cd ..
          git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
          cd boost-root
          git submodule update --init tools/build
          git submodule update --init libs/config
          git submodule update --init tools/boostdep
          cp -r $TRAVIS_BUILD_DIR/* libs/array
          python tools/boostdep/depinst/depinst.py array
          ./bootstrap.sh
          ./b2 headers

          echo '==================================> SCRIPT'

          echo "using $TOOLSET : : $COMPILER ;" > ~/user-config.jam
          ./b2 -j 3 libs/array/test toolset=$TOOLSET cxxstd=$CXXSTD

          fi
  osx:
    strategy:
      fail-fast: false
      matrix:
        include:
          - name: "TOOLSET=clang COMPILER=clang++ CXXSTD=03,11,1 Job 16"
            buildtype: "boost"
            packages: ""
            os: "macos-11"
            cxx: "clang++"
            sources: ""
            llvm_os: ""
            llvm_ver: ""
            xcode_version: 11.7
            toolset: "clang"
            compiler: "clang++"
            cxxstd: "03,11,14,1z"

    runs-on: ${{ matrix.os }}

    steps:
      - uses: actions/checkout@v2

      - name: Set DEVELOPER_DIR
        if: matrix.xcode_version != ''
        run: echo "DEVELOPER_DIR=/Applications/Xcode_${{ matrix.xcode_version }}.app/Contents/Developer" >> $GITHUB_ENV
      - name: Test DEVELOPER_DIR
        run: echo $DEVELOPER_DIR

      - name: "osx"
        shell: bash
        env:
          CXX: ${{ matrix.cxx }}
          SOURCES: ${{ matrix.sources }}
          LLVM_OS: ${{ matrix.llvm_os }}
          LLVM_VER: ${{ matrix.llvm_ver }}
          PACKAGES: ${{ matrix.packages }}
          JOB_BUILDTYPE: ${{ matrix.buildtype }}
          TEST_CMAKE: ${{ matrix.test_cmake }}
          TOOLSET: ${{ matrix.toolset }}
          COMPILER: ${{ matrix.compiler }}
          CXXSTD: ${{ matrix.cxxstd }}
          TRAVIS_BRANCH: ${{ github.base_ref }}
          TRAVIS_OS_NAME: "osx"
        run: |
          echo '==================================> SETUP'
          set -e
          sudo mv /Library/Developer/CommandLineTools /Library/Developer/CommandLineTools.bck
          echo '==================================> PACKAGES'
          echo '==================================> INSTALL AND COMPILE'
          set -e
          export TRAVIS_BUILD_DIR=$(pwd)
          export TRAVIS_BRANCH=${TRAVIS_BRANCH:-$(echo $GITHUB_REF | awk 'BEGIN { FS = "/" } ; { print $3 }')}
          export VCS_COMMIT_ID=$GITHUB_SHA
          export GIT_COMMIT=$GITHUB_SHA
          export REPO_NAME=$(basename $GITHUB_REPOSITORY)
          export USER=$(whoami)
          export CC=${CC:-gcc}
          export PATH=~/.local/bin:/usr/local/bin:$PATH

          if [ "$JOB_BUILDTYPE" == "boost" ]; then

          echo '==================================> INSTALL'

          BOOST_BRANCH=develop && [ "$TRAVIS_BRANCH" == "master" ] && BOOST_BRANCH=master || true
          cd ..
          git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
          cd boost-root
          git submodule update --init tools/build
          git submodule update --init libs/config
          git submodule update --init tools/boostdep
          cp -r $TRAVIS_BUILD_DIR/* libs/array
          python tools/boostdep/depinst/depinst.py array
          ./bootstrap.sh
          ./b2 headers

          echo '==================================> SCRIPT'

          echo "using $TOOLSET : : $COMPILER ;" > ~/user-config.jam
          ./b2 -j 3 libs/array/test toolset=$TOOLSET cxxstd=$CXXSTD

          fi
