name: Buck build and test
on: [push, pull_request, workflow_dispatch]
jobs:
  get-toolchains-to-install:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          submodules: 'true'
      - uses: facebook/install-dotslash@latest
      - name: get_buck_graph
        run: |
          BUCK_GRAPH=$(./buck2 cquery //fizz/... --output-attribute '^buck.type$|^name$')
          echo "$BUCK_GRAPH" > buck_graph_results.json
        shell: bash
      - name: Check if rust_binary
        id: check_rust
        run: |
          OUTPUT=$(cat buck_graph_results.json)
          if [[ "$OUTPUT" == *"rust_binary"* ]]; then
            echo "uses_rust=true" >> $GITHUB_ENV
          fi
        shell: bash
      - name: Check if cxx_binary
        id: check_cxx
        run: |
          OUTPUT=$(cat buck_graph_results.json)
          if [[ "$OUTPUT" == *"cxx_binary"* ]]; then
            echo "uses_cxx=true" >> $GITHUB_ENV
          fi
        shell: bash
      - name: Check if ocaml_binary
        id: check_ocaml
        run: |
          OUTPUT=$(cat buck_graph_results.json)
          if [[ "$OUTPUT" == *"ocaml_binary"* ]]; then
            echo "uses_ocaml=true" >> $GITHUB_ENV
          fi
        shell: bash
      - name: Check if python_binary
        id: check_python
        run: |
          OUTPUT=$(cat buck_graph_results.json)
          if [[ "$OUTPUT" == *"python_binary"* ]]; then
            echo "uses_python=true" >> $GITHUB_ENV
          fi
        shell: bash
    outputs:
      uses_rust: ${{ env.uses_rust }}
      uses_cxx: ${{ env.uses_cxx }}
      uses_ocaml: ${{env.uses_ocaml}}
      uses_python: ${{env.uses_python}}

  mac-os-buck-build-and-test:
      needs: get-toolchains-to-install
      runs-on: macos-latest
      env:
        PKG_CONFIG_PATH: ${{ github.workspace }}/.github:$PKG_CONFIG_PATH
      steps:
        - uses: actions/checkout@v4
          with:
            submodules: 'true'
        - uses: facebook/install-dotslash@latest
        - name: Install Rust toolchain
          if: needs.get-toolchains-to-install.outputs.uses_rust == 'true'
          uses: dtolnay/rust-toolchain@stable
        - name: Install C++ toolchain
          if: needs.get-toolchains-to-install.outputs.uses_cxx == 'true'
          run: |
            brew install cmake llvm cppcheck python3 conan@1
          shell: bash
        - name: Install OCaml toolchain
          if: needs.get-toolchains-to-install.outputs.uses_ocaml == 'true'
          uses: ocaml/setup-ocaml@v2
          with:
            ocaml-compiler: "5.1"
        - name: Install Python toolchain
          if: needs.get-toolchains-to-install.outputs.uses_python == 'true'
          uses: actions/setup-python@v5
          with:
            python-version: '3.10'
        - name: Install homebrew deps
          run: |
            BUCK_GRAPH=$(./buck2 cquery "attrregexfilter(labels, 'third-party:homebrew:', deps(//fizz/...))" --json --output-attribute=labels)
            HOMEBREW_PACKAGES=$(echo $BUCK_GRAPH | jq '[.[] | .labels] | flatten | unique | map(select(contains("third-party:homebrew:")) | sub("third-party:homebrew:"; "")) | .[] | @text')
            echo $HOMEBREW_PACKAGES | xargs brew install pkg-config
        - name: Checkout libaegis
          uses: actions/checkout@v4
          with:
            repository: jedisct1/libaegis
            path: tools/libaegis
        - name: Setup libaegis
          run: |
            brew install zig
            cd tools/libaegis
            zig build -Drelease
        - name: buck2 build and test
          run: |
            bash oss_buck_build_and_test.sh
  ubuntu-os-buck-build-and-test:
      needs: get-toolchains-to-install
      runs-on: ubuntu-latest
      env:
        PKG_CONFIG_PATH: ${{ github.workspace }}/tools/liboqs/build/src:${{ github.workspace }}/.github
      steps:
        - uses: actions/checkout@v4
          with:
            submodules: 'true'
        - uses: facebook/install-dotslash@latest
        - name: Install Rust toolchain
          if: needs.get-toolchains-to-install.outputs.uses_rust == 'true'
          uses: dtolnay/rust-toolchain@stable
        - name: Install C++ toolchain
          if: needs.get-toolchains-to-install.outputs.uses_cxx == 'true'
          run: |
            sudo apt-get install cmake llvm cppcheck python3-pip
            sudo pip3 install conan==1.*
          shell: bash
        - name: Install OCaml toolchain
          if: needs.get-toolchains-to-install.outputs.uses_ocaml == 'true'
          uses: ocaml/setup-ocaml@v2
          with:
            ocaml-compiler: "5.1"
        - name: Install Python toolchain
          if: needs.get-toolchains-to-install.outputs.uses_python == 'true'
          uses: actions/setup-python@v5
          with:
            python-version: '3.10'
        - name: Install ubuntu deps
          run: |
            BUCK_GRAPH=$(./buck2 cquery "attrregexfilter(labels, 'third-party:ubuntu:', deps(//fizz/...))" --json --output-attribute=labels)
            UBUNTU_PACKAGES=$(echo $BUCK_GRAPH | jq '[.[] | .labels] | flatten | unique | map(select(contains("third-party:ubuntu:")) | sub("third-party:ubuntu:"; "")) | .[] | @text')
            echo $UBUNTU_PACKAGES | xargs sudo apt-get install -y
        - run: |
            sudo apt-get update
            sudo apt install -y libfmt-dev libdouble-conversion-dev
        - name: Checkout liboqs
          uses: actions/checkout@v4
          with:
            repository: open-quantum-safe/liboqs
            path: tools/liboqs
        - name: Setup liboqs
          run: |
            sudo apt install astyle cmake gcc ninja-build libssl-dev python3-pytest python3-pytest-xdist unzip xsltproc doxygen graphviz python3-yaml valgrind
            cd tools/liboqs
            mkdir build && cd build
            cmake -GNinja ..
        - name: buck2 build and test
          run: bash oss_buck_build_and_test.sh
  windows-os-buck-build-and-test:
      needs: get-toolchains-to-install
      runs-on: windows-latest
      steps:
        - uses: actions/checkout@v4
          with:
            submodules: 'true'
        - uses: facebook/install-dotslash@latest
        - name: Install Rust toolchain
          if: needs.get-toolchains-to-install.outputs.uses_rust == 'true'
          uses: dtolnay/rust-toolchain@stable
        - name: Install C++ toolchain
          if: needs.get-toolchains-to-install.outputs.uses_cxx == 'true'
          run: |
            choco install llvm cmake conan cppcheck -y
            if ($LASTEXITCODE -eq 3010) { $LASTEXITCODE = 0 }
          shell: pwsh
        - name: Install OCaml toolchain
          if: needs.get-toolchains-to-install.outputs.uses_ocaml == 'true'
          uses: ocaml/setup-ocaml@v2
          with:
            ocaml-compiler: "4.12.0"
        - name: Install Python toolchain
          if: needs.get-toolchains-to-install.outputs.uses_python == 'true'
          uses: actions/setup-python@v5
          with:
            python-version: '3.10'
        - name: buck2 build and test
          run: bash oss_buck_build_and_test.sh
