# Copyright © SixtyFPS GmbH <info@slint.dev>
# SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-2.0 OR LicenseRef-Slint-Software-3.0

name: Build slint-viewer or -lsp binary

on:
    workflow_dispatch:
        inputs:
            program:
                type: choice
                description: binary to build
                options:
                    - viewer
                    - lsp
            features:
                type: string
                description: features to enable for build
                # Keep in sync with features in nightly_snapshot.yaml, cpp_package.yaml,api/node/Cargo.toml, and api/python/slint/Cargo.toml
                default: "backend-linuxkms-noseat,backend-winit,renderer-femtovg,renderer-skia,renderer-software"
            codesign:
                type: boolean
                description: Sign binaries on macOS (false for manual builds)
                default: false

    workflow_call:
        inputs:
            program:
                type: string
                description: binary to build
            features:
                type: string
                description: features to enable for build
                # Keep in sync with features in nightly_snapshot.yaml, cpp_package.yaml,api/node/Cargo.toml, and api/python/slint/Cargo.toml
                default: "backend-linuxkms-noseat,backend-winit,renderer-femtovg,renderer-skia,renderer-software"
            codesign:
                type: boolean
                description: Sign binaries on macOS
                default: true
        secrets:
            certificate:
                description: "certificate secret"
                required: false
            certificate_password:
                description: "certificate password"
                required: false
            keychain_password:
                description: "keychain password to use"
                required: false
            developer_id:
                description: "developer id to use"
                required: false

env:
    MACOSX_DEPLOYMENT_TARGET: "11.0"

jobs:
    build_windows:
        strategy:
            matrix:
                arch: [x86_64-pc-windows-msvc, aarch64-pc-windows-msvc]
                include:
                  - arch: x86_64-pc-windows-msvc
                    runner: windows-2022
                    package_suffix: x86_64
                  - arch: aarch64-pc-windows-msvc
                    runner: windows-11-arm
                    package_suffix: arm64

        runs-on: ${{ matrix.runner}}
        steps:
            - uses: actions/checkout@v6
            - uses: ./.github/actions/setup-rust
              with:
                  target: ${{ matrix.arch }}
            - uses: baptiste0928/cargo-install@v3
              with:
                  crate: cargo-about
                  version: "=0.6.6"
            - name: Build
              run: cargo build --verbose --no-default-features --features ${{ github.event.inputs.features || inputs.features }} --release -p slint-${{ github.event.inputs.program || inputs.program }}
            - name: Create artifact directory
              run: |
                  mkdir pkg
                  cd pkg
                  mkdir slint-${{ github.event.inputs.program || inputs.program }}
                  cd slint-${{ github.event.inputs.program || inputs.program }}
                  cp ..\..\target/release/slint-${{ github.event.inputs.program || inputs.program }}.exe ./
                  cd ..
                  cd ..
                  cd tools\${{ github.event.inputs.program || inputs.program }}
                  bash -x ../../scripts/prepare_binary_package.sh ..\..\pkg\slint-${{ github.event.inputs.program || inputs.program }}
            - name: Create archive
              shell: powershell
              run: |
                  cd pkg
                  Compress-Archive -Path slint-${{ github.event.inputs.program || inputs.program }}\* -Destination ..\slint-${{ github.event.inputs.program || inputs.program }}-windows-${{ matrix.package_suffix }}.zip
            - name: Upload artifact
              uses: actions/upload-artifact@v7
              with:
                  name: slint-${{ github.event.inputs.program || inputs.program }}-windows-${{ matrix.package_suffix }}
                  path: |
                      slint-${{ github.event.inputs.program || inputs.program }}-windows-${{ matrix.package_suffix }}.zip

    build_linux:
        runs-on: ubuntu-22.04
        steps:
            - uses: actions/checkout@v6
            - uses: ./.github/actions/install-linux-dependencies
              with:
                  old-ubuntu: true
            - uses: ./.github/actions/setup-rust
              with:
                  target: x86_64-unknown-linux-gnu
            - uses: baptiste0928/cargo-install@v3
              with:
                  crate: cargo-about
                  version: "=0.6.6"
            - name: Build
              run: cargo build --verbose --no-default-features --features ${{ github.event.inputs.features || inputs.features }} --release -p slint-${{ github.event.inputs.program || inputs.program }}
            - name: Create artifact directory
              run: |
                  mkdir -p slint-${{ github.event.inputs.program || inputs.program }}
                  cp target/release/slint-${{ github.event.inputs.program || inputs.program }} slint-${{ github.event.inputs.program || inputs.program }}/
                  cd tools/${{ github.event.inputs.program || inputs.program }}
                  ../../scripts/prepare_binary_package.sh ../../slint-${{ github.event.inputs.program || inputs.program }}
            - name: Tar artifacts to preserve permissions
              run: tar czvf slint-${{ github.event.inputs.program || inputs.program }}-linux.tar.gz slint-${{ github.event.inputs.program || inputs.program }}
            - name: Upload artifact
              uses: actions/upload-artifact@v7
              with:
                  name: slint-${{ github.event.inputs.program || inputs.program }}-linux
                  path: slint-${{ github.event.inputs.program || inputs.program }}-linux.tar.gz

    build_linux_arm:
      runs-on: ubuntu-22.04
      strategy:
        matrix:
            target:
                - armv7-unknown-linux-gnueabihf
                - aarch64-unknown-linux-gnu
      steps:
          - uses: actions/checkout@v6
          - uses: ./.github/actions/setup-rust
            with:
                target: x86_64-unknown-linux-gnu
          - uses: baptiste0928/cargo-install@v3
            with:
                crate: cross
          - uses: baptiste0928/cargo-install@v3
            with:
                crate: cargo-about
                version: "=0.6.6"
          - name: Build
            run: cross build --target=${{ matrix.target }} --no-default-features --features ${{ github.event.inputs.features || inputs.features }} --release -p slint-${{ github.event.inputs.program || inputs.program }}
          - name: Create artifact directory
            run: |
                mkdir -p slint-${{ github.event.inputs.program || inputs.program }}-${{ matrix.target }}
                cp target//${{ matrix.target }}/release/slint-${{ github.event.inputs.program || inputs.program }} slint-${{ github.event.inputs.program || inputs.program }}-${{ matrix.target }}/
                cd tools/${{ github.event.inputs.program || inputs.program }}
                ../../scripts/prepare_binary_package.sh ../../slint-${{ github.event.inputs.program || inputs.program }}-${{ matrix.target }}
          - name: Tar artifacts to preserve permissions
            run: tar czvf slint-${{ github.event.inputs.program || inputs.program }}-${{ matrix.target }}.tar.gz slint-${{ github.event.inputs.program || inputs.program }}-${{ matrix.target }}
          - name: Upload artifact
            uses: actions/upload-artifact@v7
            with:
                name: slint-${{ github.event.inputs.program || inputs.program }}-${{ matrix.target }}
                path: slint-${{ github.event.inputs.program || inputs.program }}-${{ matrix.target }}.tar.gz

    build_macos:
        runs-on: macos-26
        steps:
            - uses: actions/checkout@v6
            - uses: ./.github/actions/setup-rust
              with:
                  target: x86_64-apple-darwin
            - uses: ./.github/actions/setup-rust
              with:
                  target: aarch64-apple-darwin
            - uses: baptiste0928/cargo-install@v3
              with:
                  crate: cargo-about
                  version: "=0.6.6"
            - name: Build x86-64
              run: cargo build --verbose --target x86_64-apple-darwin --no-default-features --features ${{ github.event.inputs.features || inputs.features }} --release -p slint-${{ github.event.inputs.program || inputs.program }}
            - name: Build aarch64
              run: cargo build --verbose --target aarch64-apple-darwin --no-default-features --features ${{ github.event.inputs.features || inputs.features }} --release -p slint-${{ github.event.inputs.program || inputs.program }}
            - name: Create artifact directory
              run: |
                  mkdir -p slint-${{ github.event.inputs.program || inputs.program }}
                  cd slint-${{ github.event.inputs.program || inputs.program }}
                  lipo -create -output ./slint-${{ github.event.inputs.program || inputs.program }} ../target/aarch64-apple-darwin/release/slint-${{ github.event.inputs.program || inputs.program }} ../target/x86_64-apple-darwin/release/slint-${{ github.event.inputs.program || inputs.program }}
                  install_name_tool -add_rpath @executable_path/. ./slint-${{ github.event.inputs.program || inputs.program }}
                  cd ..
                  cd tools/${{ github.event.inputs.program || inputs.program }}
                  ../../scripts/prepare_binary_package.sh ../../slint-${{ github.event.inputs.program || inputs.program }}
            - uses: ./.github/actions/codesign
              if: ${{ github.event.inputs.codesign == 'true' }}
              with:
                  binary: slint-${{ github.event.inputs.program || inputs.program }}/slint-${{ github.event.inputs.program || inputs.program }}
                  certificate: ${{ github.event.inputs.certificate }}
                  certificate_password: ${{ github.event.inputs.certificate_password }}
                  keychain_password: ${{ github.event.inputs.keychain_password }}
                  developer_id: ${{ github.event.inputs.developer_id }}
            - name: Tar artifacts to preserve permissions
              run: tar czvf slint-${{ github.event.inputs.program || inputs.program }}-macos.tar.gz slint-${{ github.event.inputs.program || inputs.program }}
            - name: Upload artifact
              uses: actions/upload-artifact@v7
              with:
                  name: slint-${{ github.event.inputs.program || inputs.program }}-macos
                  path: slint-${{ github.event.inputs.program || inputs.program }}-macos.tar.gz
