serialport 4.9.0

A cross-platform low-level serial port library.
Documentation
name: CI

on:
  pull_request:
    branches:
      - main
  push:
  # Check for new issues from updated dependencies once a week (Friday noon).
  schedule:
    - cron: "0 12 * * 5"
  workflow_dispatch:

jobs:
  # --------------------------------------------------------------------------
  # Formatting

  fmt:
    runs-on: ubuntu-latest
    steps:
        # TODO: Harmonize with build.yaml
      - name: Fmt | checkout
        uses: actions/checkout@v6

      - name: Fmt | install toolchain
        uses: dtolnay/rust-toolchain@stable
        with:
          toolchain: stable
          components: clippy, rustfmt

      - name: Fmt | rust-cache
        uses: Swatinem/rust-cache@v2

      - name: Fmt | check formatting
        run: cargo fmt -- --check

  # --------------------------------------------------------------------------
  # Clippy lints

  clippy:
    runs-on: ubuntu-latest
    env:
      RUSTFLAGS: -Dwarnings
    strategy:
      matrix:
        target:
          - aarch64-apple-darwin
          - arm-linux-androideabi
          - x86_64-pc-windows-msvc
          - x86_64-unknown-freebsd
          - x86_64-unknown-linux-gnu
          - x86_64-unknown-netbsd
      fail-fast: false
    steps:
      # TODO: Harmonize with build.yaml
      - run: |
          sudo sed -i 's/azure.archive.ubuntu.com/archive.ubuntu.com/' /etc/apt/sources.list
          sudo apt-get -qq update
          sudo apt install -qq -y libudev-dev
      - uses: actions/checkout@v6
      - uses: dtolnay/rust-toolchain@stable
        with:
          target: ${{ matrix.target }}
      - uses: swatinem/rust-cache@v2
      - run: cargo clippy --target ${{ matrix.target }}
      - run: cargo clippy --target ${{ matrix.target }} --all-features


  # --------------------------------------------------------------------------
  # Rustdoc

  doc:
    name: documentation
    runs-on: ubuntu-latest
    env:
      RUSTDOCFLAGS: -Dwarnings
    steps:
      - name: documentation | install dependencies
        # TODO: Harmonize with build.yaml
        run: |
          sudo sed -i 's/azure.archive.ubuntu.com/archive.ubuntu.com/' /etc/apt/sources.list
          sudo apt-get -qq update
          sudo apt install -qq -y libudev-dev
      - uses: actions/checkout@v6
      - uses: dtolnay/rust-toolchain@nightly
      - uses: dtolnay/install@cargo-docs-rs
      - run: cargo docs-rs

  # --------------------------------------------------------------------------
  # Link checks

  links:
    runs-on: ubuntu-latest
    steps:
      - name: Links | checkout
        uses: actions/checkout@v6

      - name: Links | check
        id: lychee
        uses: lycheeverse/lychee-action@v2
        with:
          fail: true

  # --------------------------------------------------------------------------
  # MSRV
  #
  # Check at least once per platform.

  msrv-aarch64-apple-darwin:
    uses: ./.github/workflows/build.yaml
    with:
      disable_extra_builds: true
      disable_tests: true
      target: aarch64-apple-darwin
      toolchain: "1.59.0"
      pin-incompatible-msrv-bump-dependencies: true

  msrv-arm-linux-androideabi:
    uses: ./.github/workflows/build.yaml
    with:
      disable_extra_builds: true
      disable_tests: true
      target: arm-linux-androideabi
      toolchain: "1.59.0"
      pin-incompatible-msrv-bump-dependencies: true

  msrv-x86_64-unknown-freebsd:
    uses: ./.github/workflows/build.yaml
    with:
      disable_extra_builds: true
      disable_tests: true
      target: x86_64-unknown-freebsd
      toolchain: "1.59.0"
      pin-incompatible-msrv-bump-dependencies: true

  msrv-x86_64-unknown-linux-gnu:
    uses: ./.github/workflows/build.yaml
    with:
      disable_extra_builds: true
      disable_tests: true
      extra_packages: libudev-dev
      target: x86_64-unknown-linux-gnu
      toolchain: "1.59.0"
      pin-incompatible-msrv-bump-dependencies: true

  msrv-x86_64-unknown-linux-musl:
    uses: ./.github/workflows/build.yaml
    with:
      disable_extra_builds: true
      disable_tests: true
      extra_packages: gcc-aarch64-linux-gnu
      target: aarch64-unknown-linux-musl
      toolchain: "1.59.0"
      pin-incompatible-msrv-bump-dependencies: true

  msrv-x86_64-pc-windows-msvc:
    uses: ./.github/workflows/build.yaml
    with:
      disable_extra_builds: true
      disable_tests: true
      runs_on: windows-2025
      target: x86_64-pc-windows-msvc
      toolchain: "1.59.0"
      pin-incompatible-msrv-bump-dependencies: true

  msrv-x86_64-unknown-netbsd:
    uses: ./.github/workflows/build.yaml
    with:
      disable_extra_builds: true
      disable_tests: true
      target: x86_64-unknown-netbsd
      toolchain: "1.59.0"
      pin-incompatible-msrv-bump-dependencies: true

  # --------------------------------------------------------------------------
  # Semantic Versioning
  #
  # Check at least once per platform as we heavily depend on platform-specific
  # code. The feature groups are used for attempting to cover different
  # backends for a platform (like Linux with and without libudev).

  semver:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        target:
          - aarch64-apple-darwin
          - arm-linux-androideabi
          - x86_64-pc-windows-msvc
          - x86_64-unknown-freebsd
          - x86_64-unknown-linux-gnu
          - x86_64-unknown-netbsd
        feature-group:
          - "only-explicit-features"
          - "all-features"
    steps:
      # TODO: Harmonize with build.yaml
      - run: |
          sudo sed -i 's/azure.archive.ubuntu.com/archive.ubuntu.com/' /etc/apt/sources.list
          sudo apt-get -qq update
          sudo apt-get -qq -y install build-essential curl git pkg-config libudev-dev
      - uses: actions/checkout@v6
      - uses: dtolnay/rust-toolchain@stable
        with:
          target: ${{ matrix.target }}
      - uses: Swatinem/rust-cache@v2
      - uses: obi1kenobi/cargo-semver-checks-action@v2
        with:
          rust-target: ${{ matrix.target }}
          feature-group: ${{ matrix.feature-group }}

  # --------------------------------------------------------------------------
  # cargo-deny

  cargo-deny:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        checks:
          - advisories
          - bans licenses sources

    # Prevent sudden announcement of a new advisory from failing ci:
    continue-on-error: ${{ matrix.checks == 'advisories' }}

    steps:
    - uses: actions/checkout@v6
    - uses: EmbarkStudios/cargo-deny-action@v2
      with:
        command: check ${{ matrix.checks }}

  # --------------------------------------------------------------------------
  # BUILD

  aarch64-apple-darwin:
    uses: ./.github/workflows/build.yaml
    with:
      disable_tests: true
      runs_on: macos-latest
      target: aarch64-apple-darwin

  aarch64-apple-ios:
    uses: ./.github/workflows/build.yaml
    with:
      disable_tests: true
      runs_on: macos-latest
      target: aarch64-apple-ios

  aarch64-unknown-linux-gnu:
    uses: ./.github/workflows/build.yaml
    with:
      disable_extra_builds: true
      disable_tests: true
      extra_packages: libudev-dev gcc-aarch64-linux-gnu libc6-dev-arm64-cross
      target: aarch64-unknown-linux-gnu

  aarch64-unknown-linux-musl:
    uses: ./.github/workflows/build.yaml
    with:
      disable_tests: true
      extra_packages: gcc-aarch64-linux-gnu
      target: aarch64-unknown-linux-musl

  arm-linux-androideabi:
    uses: ./.github/workflows/build.yaml
    with:
      disable_extra_builds: true
      disable_tests: true
      target: arm-linux-androideabi

  armv7-linux-androideabi:
    uses: ./.github/workflows/build.yaml
    with:
      disable_extra_builds: true
      disable_tests: true
      target: armv7-linux-androideabi

  i686-pc-windows-msvc:
    uses: ./.github/workflows/build.yaml
    with:
      runs_on: windows-2025
      target: i686-pc-windows-msvc

  i686-unknown-linux-gnu:
    uses: ./.github/workflows/build.yaml
    with:
      disable_extra_builds: true
      disable_tests: true
      extra_packages: libudev-dev gcc-multilib
      target: i686-unknown-linux-gnu

  i686-unknown-linux-musl:
    uses: ./.github/workflows/build.yaml
    with:
      extra_packages: libudev-dev gcc-multilib
      target: i686-unknown-linux-musl

  x86_64-apple-darwin:
    uses: ./.github/workflows/build.yaml
    with:
      runs_on: macos-latest
      target: x86_64-apple-darwin

  x86_64-pc-windows-gnu:
    uses: ./.github/workflows/build.yaml
    with:
      runs_on: windows-2025
      target: x86_64-pc-windows-gnu

  x86_64-pc-windows-msvc:
    uses: ./.github/workflows/build.yaml
    with:
      runs_on: windows-2025
      target: x86_64-pc-windows-msvc

  x86_64-unknown-freebsd:
    uses: ./.github/workflows/build.yaml
    with:
      disable_extra_builds: true
      disable_tests: true
      target: x86_64-unknown-freebsd

  x86_64-unknown-linux-gnu:
    uses: ./.github/workflows/build.yaml
    with:
      extra_packages: libudev-dev
      target: x86_64-unknown-linux-gnu

  x86_64-unknown-linux-musl:
    uses: ./.github/workflows/build.yaml
    with:
      target: x86_64-unknown-linux-musl

  x86_64-unknown-netbsd:
    uses: ./.github/workflows/build.yaml
    with:
      disable_extra_builds: true
      disable_tests: true
      target: x86_64-unknown-netbsd

  # --------------------------------------------------------------------------
  # NIGHTLY BUILD

  aarch64-apple-darwin-nightly:
    uses: ./.github/workflows/build.yaml
    with:
      continue-on-error: true
      disable_tests: true
      runs_on: macos-latest
      target: aarch64-apple-darwin
      toolchain: nightly

  x86_64-pc-windows-msvc-nightly:
    uses: ./.github/workflows/build.yaml
    with:
      continue-on-error: true
      runs_on: windows-2025
      target: x86_64-pc-windows-msvc
      toolchain: nightly

  x86_64-unknown-linux-gnu-nightly:
    uses: ./.github/workflows/build.yaml
    with:
      continue-on-error: true
      extra_packages: libudev-dev
      target: x86_64-unknown-linux-gnu
      toolchain: nightly