polylabel 3.3.0

A Rust implementation of the Polylabel algorithm for finding optimum polygon label positions.
on: [push, pull_request]

defaults:
  run:
    shell: bash

env:
  cratename: polylabel
  rustflags: -C rpath

name: Test and Build

jobs:
  test:
    if: github.event_name == 'push' && !contains(github.ref, 'refs/tags/')
    name: Test on ${{ matrix.os }} (${{ matrix.target }})
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        include:
          - build: linux
            os: ubuntu-latest
            rust: stable
            target: x86_64-unknown-linux-gnu
          - build: macos
            os: macos-latest
            rust: stable
            target: x86_64-apple-darwin
            deptarget: 10.12
          - build: windows
            os: windows-latest
            rust: stable
            target: x86_64-pc-windows-msvc
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
        with:
          targets: ${{ matrix.target }}
      - uses: Swatinem/rust-cache@v2
        with:
          key: ${{ matrix.target }}
      - name: Run tests
        env:
          MACOSX_DEPLOYMENT_TARGET: ${{ matrix.deptarget }}
        run: cargo test --target=${{ matrix.target }}

  build:
    if: github.event_name == 'push' && contains(github.ref, 'refs/tags/')
    name: Build and release on ${{ matrix.os }} (${{ matrix.target }})
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        include:
          - build: linux
            os: ubuntu-latest
            rust: stable
            target: x86_64-unknown-linux-gnu
          - build: linux
            os: ubuntu-24.04-arm
            rust: stable
            target: aarch64-unknown-linux-gnu
          - build: macos
            os: macos-latest
            rust: stable
            target: x86_64-apple-darwin
            deptarget: 10.12
          - build: macos
            os: macos-latest
            rust: stable
            target: aarch64-apple-darwin
            deptarget: 11.0
          - build: windows
            os: windows-latest
            rust: stable
            target: x86_64-pc-windows-msvc
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
        with:
          targets: ${{ matrix.target }}
      - uses: Swatinem/rust-cache@v2
        with:
          key: ${{ matrix.target }}
      - name: Build release
        env:
          MACOSX_DEPLOYMENT_TARGET: ${{ matrix.deptarget }}
        run: cargo build --release --target=${{ matrix.target }} --features headers
      - name: Gather Assets
        run: |
          src=$(pwd)
          stage=
          case $RUNNER_OS in
              Linux)
                  stage=$(mktemp -d)
                  ;;
              macOS)
                  stage=$(mktemp -d -t tmp)
                  ;;
              Windows)
                  stage=$(mktemp -d)
                  ;;
          esac
          mkdir zipped
          cp include/header.h $stage
          RELEASE_VERSION=${GITHUB_REF#refs/tags/}
          ASSET_NAME="${{ env.cratename }}-$RELEASE_VERSION-${{ matrix.target }}"
          echo "Release name is $ASSET_NAME"
          echo "STAGE=$stage" >> $GITHUB_ENV
          echo "ASSET_NAME=$ASSET_NAME" >> $GITHUB_ENV
          if [ "$RUNNER_OS" == "Linux" ]; then
            echo "TYPE=tar" >> $GITHUB_ENV
            echo "EXTENSION=tar.gz" >> $GITHUB_ENV
            for lib in target/${{ matrix.target }}/release/*.so; do
                strip -s $lib
            done
            cp target/${{ matrix.target }}/release/*.so $stage/
          fi
          if [ "$RUNNER_OS" == "macOS" ]; then
            echo "TYPE=tar" >> $GITHUB_ENV
            echo "EXTENSION=tar.gz" >> $GITHUB_ENV
            for lib in target/${{ matrix.target }}/release/*.dylib; do
                install_name_tool -id "@rpath/lib${{ env.cratename }}.dylib" $lib
                otool -L $lib
                strip -ur $lib
            done
            cp target/${{ matrix.target }}/release/*.dylib $stage/
          fi
          if [ "$RUNNER_OS" == "Windows" ]; then
            echo "TYPE=tar" >> $GITHUB_ENV
            echo "EXTENSION=tar.gz" >> $GITHUB_ENV
            cp target/${{ matrix.target }}/release/deps/${{ env.cratename }}.dll.lib target/${{ matrix.target }}/release/deps/${{ env.cratename }}.lib
            cp target/${{ matrix.target }}/release/${{ env.cratename }}* $stage/
            cp target/${{ matrix.target }}/release/deps/${{ env.cratename }}* $stage/
            rm $stage/*.pdb
          fi
          ls $stage
          cd $src

      - name: Create archive
        run: |
          pushd ${{ env.STAGE }}
          tar -czf "${{ env.ASSET_NAME }}.${{ env.EXTENSION }}" *
          popd
          cp "${{ env.STAGE }}/${{ env.ASSET_NAME }}.${{ env.EXTENSION }}" zipped/

      - name: Release
        uses: softprops/action-gh-release@v1
        with:
          files: |
            zipped/${{ env.ASSET_NAME }}.${{ env.EXTENSION }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

  release_artifacts:
    if: github.event_name == 'push' && contains(github.ref, 'refs/tags/')
    name: Release to crates.io
    runs-on: ubuntu-latest
    environment: release
    permissions:
      # IMPORTANT: this permission is mandatory for trusted publishing
      id-token: write
      contents: write
    steps:
      - uses: actions/checkout@v4
      - uses: rust-lang/crates-io-auth-action@v1
        id: auth
      - run: cargo publish
        env:
          CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }}