# This workflow will build a golang project
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-go

name: LLGo

on:
  push:
    branches: ["**"]
  pull_request:
    branches: ["**"]

jobs:
  download-model:
    runs-on: ubuntu-latest
    steps:
      - name: Download model file
        run: |
          mkdir -p ./_demo/llama2-c
          wget -P ./_demo/llama2-c https://huggingface.co/karpathy/tinyllamas/resolve/main/stories15M.bin

      - name: Upload model as artifact
        uses: actions/upload-artifact@v4
        with:
          name: llama2-model
          path: ./_demo/llama2-c/stories15M.bin
          retention-days: 1

  llgo:
    needs: download-model
    continue-on-error: true
    strategy:
      matrix:
        os:
          - macos-latest
          - ubuntu-24.04
        llvm: [19]
        go: ["1.21.13", "1.22.12", "1.23.6", "1.24.2"]
    runs-on: ${{matrix.os}}
    steps:
      - uses: actions/checkout@v4
      - name: Install dependencies
        uses: ./.github/actions/setup-deps
        with:
          llvm-version: ${{matrix.llvm}}
      - name: Download model artifact
        uses: actions/download-artifact@v4
        with:
          name: llama2-model
          path: ./_demo/llama2-c/
      - name: Install further optional dependencies for demos
        run: |
          py_deps=(
            numpy # for github.com/goplus/lib/py/numpy
            torch # for github.com/goplus/lib/py/torch
          )
          pip3.12 install --break-system-packages "${py_deps[@]}"

      - name: Set up Go for build
        uses: ./.github/actions/setup-go
        with:
          go-version: "1.24.2"

      - name: Install
        run: |
          go install ./...
          echo "LLGO_ROOT=$GITHUB_WORKSPACE" >> $GITHUB_ENV

      - name: Set up Go for testing
        uses: actions/setup-go@v5
        with:
          go-version: ${{matrix.go}}

      - name: _xtool build tests
        run: |
          cd _xtool
          llgo build -v ./...

      - name: Test demos
        run: |
          # TODO(lijie): force python3-embed to be linked with python-3.12-embed
          # Currently, python3-embed is python-3.13-embed, doesn't work with pytorch
          # Will remove this after pytorch is fixed.
          pcdir=$HOME/pc
          mkdir -p $pcdir
          libdir=$(pkg-config --variable=libdir python-3.12-embed)
          echo "libdir: $libdir"
          ln -s $libdir/pkgconfig/python-3.12-embed.pc $pcdir/python3-embed.pc
          export PKG_CONFIG_PATH=$pcdir
          bash .github/workflows/test_demo.sh

      - name: Show test result
        run: cat result.md

      - name: LLDB tests
        if: ${{startsWith(matrix.os, 'macos')}}
        run: |
          echo "Test lldb with llgo plugin on ${{matrix.os}} with LLVM ${{matrix.llvm}}"
          bash _lldb/runtest.sh -v

  test:
    continue-on-error: true
    strategy:
      matrix:
        os:
          - macos-latest
          - ubuntu-24.04
        llvm: [19]
        go: ["1.24.2"]
    runs-on: ${{matrix.os}}
    steps:
      - uses: actions/checkout@v4
      - name: Install dependencies
        uses: ./.github/actions/setup-deps
        with:
          llvm-version: ${{matrix.llvm}}
      - name: Install further optional dependencies for demos
        run: |
          py_deps=(
            numpy # for github.com/goplus/lib/py/numpy
            torch # for github.com/goplus/lib/py/torch
          )
          pip3.12 install --break-system-packages "${py_deps[@]}"

      - name: Set up Go for build
        uses: ./.github/actions/setup-go
        with:
          go-version: "1.24.2"

      - name: Install
        run: |
          go install ./...
          echo "LLGO_ROOT=$GITHUB_WORKSPACE" >> $GITHUB_ENV

      - name: Set up Go for testing
        uses: actions/setup-go@v5
        with:
          go-version: ${{matrix.go}}

      - name: run llgo test
        run: |
          llgo test ./...

  hello:
    continue-on-error: true
    strategy:
      matrix:
        os: [ubuntu-24.04, macos-latest]
        llvm: [19]
        go: ["1.21.13", "1.22.12", "1.23.6", "1.24.2"]
    runs-on: ${{matrix.os}}
    steps:
      - uses: actions/checkout@v4
      - name: Install dependencies
        uses: ./.github/actions/setup-deps
        with:
          llvm-version: ${{matrix.llvm}}

      - name: Set up Go 1.23 for building llgo
        uses: ./.github/actions/setup-go
        with:
          go-version: "1.24.2"

      - name: Install llgo
        run: |
          go install ./...
          echo "LLGO_ROOT=$GITHUB_WORKSPACE" >> $GITHUB_ENV

      - name: Set up Go for testing
        uses: ./.github/actions/setup-go
        with:
          go-version: ${{matrix.go}}

      - name: Test Hello World with go.mod 1.21
        if: startsWith(matrix.go, '1.21') || startsWith(matrix.go, '1.22') || startsWith(matrix.go, '1.23') || startsWith(matrix.go, '1.24')
        uses: ./.github/actions/test-helloworld
        with:
          go-version: ${{matrix.go}}
          mod-version: "1.21"

      - name: Test Hello World with go.mod 1.22
        if: startsWith(matrix.go, '1.22') || startsWith(matrix.go, '1.23') || startsWith(matrix.go, '1.24')
        uses: ./.github/actions/test-helloworld
        with:
          go-version: ${{matrix.go}}
          mod-version: "1.22"

      - name: Test Hello World with go.mod 1.23
        if: startsWith(matrix.go, '1.23') || startsWith(matrix.go, '1.24')
        uses: ./.github/actions/test-helloworld
        with:
          go-version: ${{matrix.go}}
          mod-version: "1.23"

      - name: Test Hello World with go.mod 1.24
        if: startsWith(matrix.go, '1.24')
        uses: ./.github/actions/test-helloworld
        with:
          go-version: ${{matrix.go}}
          mod-version: "1.24"

  cross-compile:
    continue-on-error: true
    strategy:
      matrix:
        os: [macos-latest]
        llvm: [19]
    runs-on: ${{matrix.os}}
    steps:
      - uses: actions/checkout@v4
      - name: Install dependencies
        uses: ./.github/actions/setup-deps
        with:
          llvm-version: ${{matrix.llvm}}

      - name: Set up Go for building llgo
        uses: ./.github/actions/setup-go
        with:
          go-version: "1.24.2"

      - name: Install wamr
        run: |
          git clone https://github.com/bytecodealliance/wasm-micro-runtime.git
          mkdir wasm-micro-runtime/product-mini/platforms/darwin/build
          cd wasm-micro-runtime/product-mini/platforms/darwin/build
          cmake -D WAMR_BUILD_EXCE_HANDLING=1 -D WAMR_BUILD_FAST_INTERP=0 -DWAMR_BUILD_SHARED_MEMORY=1 -DWAMR_BUILD_LIB_WASI_THREADS=1 -DWAMR_BUILD_LIB_PTHREAD=1 -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_DEBUG_INTERP=1 ..
          make -j8
          echo "$PWD" >> $GITHUB_PATH

      - name: Install llgo
        run: |
          go install ./...
          echo "LLGO_ROOT=$GITHUB_WORKSPACE" >> $GITHUB_ENV

      - name: Test Cross Compilation (wasm)
        shell: bash
        working-directory: _demo
        run: |
          echo "Testing cross-compilation wasm with Go 1.24.2"

          # Compile for wasm architecture
          GOOS=wasip1 GOARCH=wasm llgo build -o hello -tags=nogc -v ./helloc

          # Check file type
          file hello.wasm

          # Run the wasm binary using llgo_wasm
          iwasm --stack-size=819200000 --heap-size=800000000 hello.wasm
