name: GitHub Actions CI

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

jobs:
  posix:
    strategy:
      fail-fast: false
      matrix:
        include:
          - name: "TOOLSET=gcc-4.4 CXXSTD=98,0x Job 0"
            buildtype: "boost"
            packages: "g++-4.4"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "g++"
            sources: ""
            llvm_os: ""
            llvm_ver: ""
            toolset: "gcc-4.4"
            cxxstd: "98,0x"
          - name: "TOOLSET=gcc-4.6 CXXSTD=03,0x Job 1"
            buildtype: "boost"
            packages: "g++-4.6"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "g++"
            sources: ""
            llvm_os: ""
            llvm_ver: ""
            toolset: "gcc-4.6"
            cxxstd: "03,0x"
          - name: "TOOLSET=gcc-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++"
            sources: ""
            llvm_os: ""
            llvm_ver: ""
            toolset: "gcc-4.7"
            cxxstd: "03,11"
          - name: "TOOLSET=gcc-4.8 CXXSTD=03,11,1y Job 3"
            buildtype: "boost"
            packages: "g++-4.8"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "g++"
            sources: ""
            llvm_os: ""
            llvm_ver: ""
            toolset: "gcc-4.8"
            cxxstd: "03,11,1y"
          - name: "TOOLSET=gcc-4.9 CXXSTD=03,11,14 Job 4"
            buildtype: "boost"
            packages: "g++-4.9"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "g++"
            sources: ""
            llvm_os: ""
            llvm_ver: ""
            toolset: "gcc-4.9"
            cxxstd: "03,11,14"
          - name: "TOOLSET=gcc-5 CXXSTD=03,11,14,17 Job 5"
            buildtype: "boost"
            packages: "g++-5"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "g++"
            sources: ""
            llvm_os: ""
            llvm_ver: ""
            toolset: "gcc-5"
            cxxstd: "03,11,14,17"
          - name: "TOOLSET=gcc-6 CXXSTD=03,11,14,17 Job 6"
            buildtype: "boost"
            packages: "g++-6"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "g++"
            sources: ""
            llvm_os: ""
            llvm_ver: ""
            toolset: "gcc-6"
            cxxstd: "03,11,14,17"
          - name: "TOOLSET=gcc-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++"
            sources: ""
            llvm_os: ""
            llvm_ver: ""
            toolset: "gcc-7"
            cxxstd: "03,11,14,17"
          - name: "TOOLSET=gcc-8 CXXSTD=03,11,14,17,2a Job 8"
            buildtype: "boost"
            packages: "g++-8"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "g++"
            sources: ""
            llvm_os: ""
            llvm_ver: ""
            toolset: "gcc-8"
            cxxstd: "03,11,14,17,2a"
          - name: "TOOLSET=clang-3.5 CXXSTD=03,11,14,1z Job 9"
            buildtype: "boost"
            packages: "clang-3.5"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "g++"
            sources: ""
            llvm_os: ""
            llvm_ver: ""
            toolset: "clang-3.5"
            cxxstd: "03,11,14"
          - name: "TOOLSET=clang-3.6 CXXSTD=03,11,14,1z Job 10"
            buildtype: "boost"
            packages: "clang-3.6"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "g++"
            sources: ""
            llvm_os: ""
            llvm_ver: ""
            toolset: "clang-3.6"
            cxxstd: "03,11,14"
          - name: "TOOLSET=clang-3.7 CXXSTD=03,11,14,1z Job 11"
            buildtype: "boost"
            packages: "clang-3.7"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "g++"
            sources: ""
            llvm_os: ""
            llvm_ver: ""
            toolset: "clang-3.7"
            cxxstd: "03,11,14"
          - name: "TOOLSET=clang-3.8 CXXSTD=03,11,14,1z Job 12"
            buildtype: "boost"
            packages: "clang-3.8"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "g++"
            sources: ""
            llvm_os: ""
            llvm_ver: ""
            toolset: "clang-3.8"
            cxxstd: "03,11,14"
          - name: "TOOLSET=clang-3.9 CXXSTD=03,11,14,1z Job 13"
            buildtype: "boost"
            packages: "clang-3.9"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "g++"
            sources: ""
            llvm_os: ""
            llvm_ver: ""
            toolset: "clang-3.9"
            cxxstd: "03,11,14"
          - name: "TOOLSET=clang-4.0 CXXSTD=03,11,14,1z Job 14"
            buildtype: "boost"
            packages: "clang-4.0"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "g++"
            sources: ""
            llvm_os: ""
            llvm_ver: ""
            toolset: "clang-4.0"
            cxxstd: "03,11,14"
          - name: "TOOLSET=clang-5.0 CXXSTD=03,11,14,17,2a Job 15"
            buildtype: "boost"
            packages: "clang-5.0"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "g++"
            sources: ""
            llvm_os: "xenial"
            llvm_ver: "5.0"
            toolset: "clang-5.0"
            cxxstd: "03,11,14,17,2a"
          - name: "TOOLSET=clang-6.0 CXXSTD=03,11,14,17,2a Job 16"
            buildtype: "boost"
            packages: "clang-6.0"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "g++"
            sources: ""
            llvm_os: "xenial"
            llvm_ver: "6.0"
            toolset: "clang-6.0"
            cxxstd: "03,11,14,17,2a"
          - name: "TOOLSET=clang-7 CXXSTD=03,11,14,17,2a Job 17"
            buildtype: "boost"
            packages: "clang-7"
            packages_to_remove: ""
            os: "ubuntu-20.04"
            container: "ubuntu:16.04"
            cxx: "g++"
            sources: ""
            llvm_os: "xenial"
            llvm_ver: "7"
            toolset: "clang-7"
            cxxstd: "03,11,14,17,2a"

    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 }}
          TOOLSET: ${{ matrix.toolset }}
          CXXSTD: ${{ matrix.cxxstd }}
          COMPILER: ${{ matrix.compiler }}
          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" == "boost" ]; then

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

          BOOST_BRANCH=develop && [ "$TRAVIS_BRANCH" == "master" ] && BOOST_BRANCH=master || true
          cd ..
          git clone --depth 1 -b $BOOST_BRANCH https://github.com/boostorg/boost.git boost-root
          cd boost-root
          git submodule init libs/array
          git submodule init libs/assert
          git submodule init libs/bind
          git submodule init libs/concept_check
          git submodule init libs/config
          git submodule init libs/container_hash
          git submodule init libs/conversion
          git submodule init libs/core
          git submodule init libs/detail
          git submodule init libs/function
          git submodule init libs/function_types
          git submodule init libs/functional
          git submodule init libs/integer
          git submodule init libs/iterator
          git submodule init libs/lambda
          git submodule init libs/move
          git submodule init libs/mpl
          git submodule init libs/optional
          git submodule init libs/predef
          git submodule init libs/preprocessor
          git submodule init libs/smart_ptr
          git submodule init libs/static_assert
          git submodule init libs/throw_exception
          git submodule init libs/tuple
          git submodule init libs/type_index
          git submodule init libs/type_traits
          git submodule init libs/typeof
          git submodule init libs/utility
          git submodule init libs/describe
          git submodule init libs/mp11
          git submodule init libs/headers tools/boost_install tools/build
          git submodule update
          rm -rf libs/fusion
          cp -rp $TRAVIS_BUILD_DIR libs/fusion
          ln -s $(pwd)/libs/fusion $TRAVIS_BUILD_DIR
          ./bootstrap.sh
          ./b2 headers

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

          ./b2 -j`(nproc || sysctl -n hw.ncpu) 2> /dev/null` libs/fusion/test toolset=$TOOLSET cxxstd=$CXXSTD

          fi
  osx:
    strategy:
      fail-fast: false
      matrix:
        include:
          - name: "TOOLSET=clang COMPILER=clang++ CXXSTD=03,11,1 Job 18"
            buildtype: "boost"
            packages: ""
            os: "macos-10.15"
            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 }}
          TOOLSET: ${{ matrix.toolset }}
          CXXSTD: ${{ matrix.cxxstd }}
          COMPILER: ${{ matrix.compiler }}
          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 --depth 1 -b $BOOST_BRANCH https://github.com/boostorg/boost.git boost-root
          cd boost-root
          git submodule init libs/array
          git submodule init libs/assert
          git submodule init libs/bind
          git submodule init libs/concept_check
          git submodule init libs/config
          git submodule init libs/container_hash
          git submodule init libs/conversion
          git submodule init libs/core
          git submodule init libs/detail
          git submodule init libs/function
          git submodule init libs/function_types
          git submodule init libs/functional
          git submodule init libs/integer
          git submodule init libs/iterator
          git submodule init libs/lambda
          git submodule init libs/move
          git submodule init libs/mpl
          git submodule init libs/optional
          git submodule init libs/predef
          git submodule init libs/preprocessor
          git submodule init libs/smart_ptr
          git submodule init libs/static_assert
          git submodule init libs/throw_exception
          git submodule init libs/tuple
          git submodule init libs/type_index
          git submodule init libs/type_traits
          git submodule init libs/typeof
          git submodule init libs/utility
          git submodule init libs/describe
          git submodule init libs/mp11
          git submodule init libs/headers tools/boost_install tools/build
          git submodule update
          rm -rf libs/fusion
          cp -rp $TRAVIS_BUILD_DIR libs/fusion
          ln -s $(pwd)/libs/fusion $TRAVIS_BUILD_DIR
          ./bootstrap.sh
          ./b2 headers

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

          ./b2 -j`(nproc || sysctl -n hw.ncpu) 2> /dev/null` libs/fusion/test toolset=$TOOLSET cxxstd=$CXXSTD

          fi
