name: ci

on:
  pull_request:
    branches: [master]

# Cancel old PR builds when pushing new commits.
concurrency:
  group: build-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: true

jobs:
  common:
    uses: TokTok/ci-tools/.github/workflows/common-ci.yml@master

  mypy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          submodules: recursive
      - name: Set up Python 3.9
        uses: actions/setup-python@v1
        with:
          python-version: 3.9
      - name: Install mypy
        run: pip install mypy
      - name: Run mypy
        run: |
          (find . -name "*.py" -and -not -name "conanfile.py"; grep -lR '^#!.*python') \
              | xargs -n1 -P8 mypy --strict

  doxygen:
    runs-on: ubuntu-latest
    steps:
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1
      - name: Docker Build
        uses: docker/build-push-action@v2
        with:
          file: other/docker/doxygen/Dockerfile

  tokstyle:
    runs-on: ubuntu-latest
    steps:
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1
      - name: Docker Build
        uses: docker/build-push-action@v2
        with:
          file: other/docker/tokstyle/Dockerfile

  misra:
    runs-on: ubuntu-latest
    steps:
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1
      - name: Docker Build
        uses: docker/build-push-action@v2
        with:
          file: other/docker/misra/Dockerfile

  cimplefmt:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          submodules: recursive
      - name: Run cimplefmt
        run: other/docker/cimplefmt/run -u $(find tox* -name "*.[ch]")

  build-nacl:
    runs-on: ubuntu-latest
    steps:
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1
      - name: Docker Build
        uses: docker/build-push-action@v2
        with:
          file: other/docker/autotools/Dockerfile

  build-win32:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          submodules: recursive
      - name: Cross compilation
        run: .github/scripts/cmake-win32 script

  build-win64:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          submodules: recursive
      - name: Cross compilation
        run: .github/scripts/cmake-win64 script

  build-freebsd:
    runs-on: ubuntu-latest
    container: toxchat/freebsd
    steps:
      - uses: actions/checkout@v2
        with:
          submodules: recursive
      - name: Build on FreeBSD
        run: .github/scripts/cmake-freebsd-stage2

  build-macos:
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v2
        with:
          submodules: recursive
      - name: Build and test
        run: .github/scripts/cmake-osx

  coverage-linux:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          submodules: recursive
      - name: Build, test, and upload coverage
        run: .github/scripts/coverage-linux

  build-tcc:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          submodules: recursive
      - name: Install dependencies
        run:
          sudo apt-get install -y --no-install-recommends
            tcc
            libconfig-dev
            libopus-dev
            libsodium-dev
            libvpx-dev
      - name: Build with TCC
        run:
          tcc
            -Dinline=static
            -o send_message_test
            -Wall -Werror
            -bench -g
            auto_tests/auto_test_support.c
            auto_tests/send_message_test.c
            testing/misc_tools.c
            toxav/*.c
            toxcore/*.c
            toxcore/*/*.c
            toxencryptsave/*.c
            third_party/cmp/*.c
            $(pkg-config --cflags --libs libsodium opus vpx)
      - name: Run the test
        run: "./send_message_test | grep 'tox clients connected'"
      - name: Build amalgamation file with TCC
        run:
          other/make_single_file
            auto_tests/auto_test_support.c
            auto_tests/send_message_test.c
            testing/misc_tools.c |
          tcc -
            -o send_message_test
            -Wall -Werror
            -bench -g
            $(pkg-config --cflags --libs libsodium opus vpx)
      - name: Run the test again
        run: "./send_message_test | grep 'tox clients connected'"

  build-compcert:
    runs-on: ubuntu-latest
    container: toxchat/compcert
    steps:
      - uses: actions/checkout@v2
        with:
          submodules: recursive
      - name: Build with CompCert
        run:
          ccomp
            -o send_message_test
            -Wall -Werror
            -Wno-c11-extensions
            -Wno-unknown-pragmas
            -Wno-unused-variable
            -fstruct-passing -fno-unprototyped -g
            auto_tests/auto_test_support.c
            auto_tests/send_message_test.c
            testing/misc_tools.c
            toxav/*.c
            toxcore/*.c
            toxcore/*/*.c
            toxencryptsave/*.c
            third_party/cmp/*.c
            -D__COMPCERT__ -DDISABLE_VLA -Dinline=
            -lpthread $(pkg-config --cflags --libs libsodium opus vpx)
      - name: Run the test
        run: "./send_message_test | grep 'tox clients connected'"

  build-android:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          submodules: recursive
      - run: .github/scripts/cmake-android armeabi-v7a
      - run: .github/scripts/cmake-android arm64-v8a
      - run: .github/scripts/cmake-android x86
      - run: .github/scripts/cmake-android x86_64