version: 2.1

orbs:
  win: circleci/windows@1.0.0

executors:
  bionic:
    docker:
      - image: buildpack-deps:bionic

jobs:
  flake8:
    executor: bionic
    steps:
      - checkout
      - run:
          name: install pip
          command: |
            apt-get update -q
            apt-get install -q -y python-pip python3-pip
      - run: python2 -m pip install --upgrade pip
      - run: python3 -m pip install --upgrade pip
      - run: python2 -m pip install flake8==3.7.8
      - run: python3 -m pip install flake8==3.7.8
      - run: python2 -m flake8 --show-source --statistics
      - run: python3 -m flake8 --show-source --statistics
  test-linux:
    executor: bionic
    environment:
      EMSDK_NOTTY: "1"
      # This is needed because the old gcc-7 that is installed on debian/bionic
      # generates warnings about unused variables when doing C++17
      # destructuring:
      # https://github.com/WebAssembly/binaryen/issues/4353
      CXXFLAGS: "-Wno-unused-variable"
      # I don't know why circleci VMs pretent to have 36 cores but its a lie.
      EMSDK_NUM_CORES: "4"
    steps:
      - checkout
      - run:
          name: Install debian packages
          command: apt-get update -q && apt-get install -q -y cmake build-essential openjdk-8-jre-headless ksh zsh
      - run: test/test.sh
      - run: test/test_source_env.sh
      - run:
          name: test.py
          command: |
            source emsdk_env.sh
            test/test.py
  test-mac:
    macos:
      xcode: "12.2.0"
    environment:
      EMSDK_NOTTY: "1"
      # Without this, any `brew installl` command will result in self-update of
      # brew itself which takes more than 4 minutes.
      HOMEBREW_NO_AUTO_UPDATE: "1"
    steps:
      - checkout
      - run:
          name: Install cmake
          command: brew install cmake
      - run: test/test.sh
      - run:
          name: test.py
          command: |
            source emsdk_env.sh
            test/test.py
  test-windows:
    executor:
      name: win/vs2019
      shell: bash.exe
    environment:
      # We need python installed before we can test anytyhing.
      # There seems to be undocument copy of python installed here. Hopefully
      # if this disappears there will be another way of getting a re-installed
      # version.
      PYTHON_BIN: "C:\\Python27amd64"
      PYTHONUNBUFFERED: "1"
      EMSDK_NOTTY: "1"
    steps:
      - checkout
      - run:
          name: Add python to bash path
          command: echo "export PATH=\"$PATH:/c/python27amd64/\"" >> $BASH_ENV
      - run:
          name: Install latest
          shell: cmd.exe
          command: test\test.bat
      - run:
          name: test.py
          command: |
            source emsdk_env.sh
            python test/test.py

      - run:
          name: flagless (process/shell) test
          shell: powershell.exe
          command: |
            test/test_activation.ps1

      - run:
          name: --permanent test
          shell: powershell.exe
          command: |
            $env:PERMANENT_FLAG="--permanent"
            test/test_activation.ps1

      - run:
          name: --system test
          shell: powershell.exe
          command: |
            $env:SYSTEM_FLAG="--system"
            test/test_activation.ps1

      - run:
          name: Process/Shell PATH preservation test
          shell: powershell.exe
          command: |
            test/test_path_preservation.ps1

      - run:
          name: User PATH preservation test
          shell: powershell.exe
          command: |
            $env:PERMANENT_FLAG="--permanent"
            test/test_path_preservation.ps1

      - run:
          name: System PATH preservation test
          shell: powershell.exe
          command: |
            $env:SYSTEM_FLAG="--system"
            test/test_path_preservation.ps1

  build-docker-image:
    executor: bionic
    steps:
      - checkout
      - run:
          name: install docker
          command: apt-get update -q && apt-get install -q -y docker.io
      - setup_remote_docker:
          version: 19.03.13
      # Build and test the tip-of-tree build of EMSDK
      - run:
          name: build
          command: make -C ./docker version=tot build
      - run:
          name: test
          command: make -C ./docker version=tot test

  publish-docker-image:
    executor: bionic
    steps:
      - checkout
      - run:
          name: install docker
          command: apt-get update -q && apt-get install -q -y docker.io
      - setup_remote_docker:
          version: 19.03.13
      - run:
          name: build
          command: make -C ./docker version=${CIRCLE_TAG} build
      - run:
          name: test
          command: make -C ./docker version=${CIRCLE_TAG} test
      - run:
          name: push image
          command: |
            docker login -u "$DOCKER_USER" -p "$DOCKER_PASS"
            make -C ./docker version=${CIRCLE_TAG} alias=latest push

  test-bazel-linux:
    executor: bionic
    steps:
      - checkout
      - run: apt-get install -q -y curl gnupg
      - run: curl -fsSL https://bazel.build/bazel-release.pub.gpg | gpg --dearmor > bazel.gpg
      - run: mv bazel.gpg /etc/apt/trusted.gpg.d/
      - run: echo "deb [arch=amd64] https://storage.googleapis.com/bazel-apt stable jdk1.8" | tee /etc/apt/sources.list.d/bazel.list
      - run:
          name: install pip
          command: |
            apt-get update -q
            apt-get install -q -y python3-pip
      - run: pip3 install absl-py
      - run:
          name: install bazel
          command: |
            apt-get install -q -y bazel
      - run: test/test_bazel.sh

  test-bazel-mac:
    macos:
      xcode: "12.2.0"
    environment:
      EMSDK_NOTTY: "1"
      HOMEBREW_NO_AUTO_UPDATE: "1"
    steps:
      - checkout
      - run: brew install grep
      - run:
          name: install bazelisk
          command: |
            brew install bazelisk
      - run: test/test_bazel_mac.sh

  test-bazel-windows:
    executor:
      name: win/vs2019
      shell: powershell.exe -ExecutionPolicy Bypass
    environment:
      PYTHONUNBUFFERED: "1"
      EMSDK_NOTTY: "1"
    steps:
      - checkout
      - run:
          name: Download Bazelisk
          shell: powershell.exe
          command: |
            $ProgressPreference = "SilentlyContinue"
            Invoke-WebRequest -Uri https://github.com/bazelbuild/bazelisk/releases/download/v1.10.1/bazelisk-windows-amd64.exe -OutFile ( New-Item -Path "temp\bazel\bazel.exe" -Force )
      - run:
          name: Run Tests
          shell: powershell.exe
          command: |
            $env:Path += ";C:\Python27amd64;$pwd\temp\bazel"
            .\test\test_bazel.ps1

workflows:
  flake8:
    jobs:
      - flake8
  test-linux:
    jobs:
      - test-linux
  test-mac:
    jobs:
      - test-mac
  test-windows:
    jobs:
      - test-windows
  build-docker-image:
    jobs:
      - build-docker-image
      - publish-docker-image:
          filters:
            branches:
              ignore: /.*/
            tags:
              only: /.*/
  test-bazel-linux:
    jobs:
      - test-bazel-linux
  test-bazel-mac:
    jobs:
      - test-bazel-mac
  test-bazel-windows:
    jobs:
      - test-bazel-windows
