cortex-m-rtfm 0.5.3

Real Time For the Masses (RTFM): a concurrency framework for building real time systems
Documentation
name: Build
on:
  push:
    branches:
      - master
      - ghatest
  pull_request:
    branches:
      - master
      - ghatest

env:
  CARGO_TERM_COLOR: always

jobs:
  # Run cargo fmt --check, includes macros/
  style:
    name: Check Style with cargo fmt
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v1

      - name: Install Rust
        uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: stable
          override: true
          components: rustfmt

      - name: cargo fmt --check
        uses: actions-rs/cargo@v1
        with:
          command: fmt
          args: --all -- --check

  # Compilation check
  check:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        target:
          - thumbv7m-none-eabi
          - thumbv6m-none-eabi
          - x86_64-unknown-linux-gnu
        toolchain:
          - stable
          - 1.36.0
          - nightly
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Install Rust ${{ matrix.toolchain }} with target (${{ matrix.target }})
        uses: actions-rs/toolchain@v1
        with:
          toolchain: ${{ matrix.toolchain }}
          target: ${{ matrix.target }}
          override: true

      - name: Disable optimisation profiles
        if: matrix.toolchain == '1.36.0'
        run: sed -i '/^\[profile.*build-override]$/,/^$/{/^#/!{/^$/!d}}' Cargo.toml

      - name: cargo check
        uses: actions-rs/cargo@v1
        with:
          use-cross: false
          command: check
          args: --target=${{ matrix.target }}

  # Verify all examples
  checkexamples:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        target:
          - thumbv7m-none-eabi
          - thumbv6m-none-eabi
        toolchain:
          - stable
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Install Rust ${{ matrix.toolchain }} with target (${{ matrix.target }})
        uses: actions-rs/toolchain@v1
        with:
          toolchain: ${{ matrix.toolchain }}
          target: ${{ matrix.target }}
          override: true
      - uses: actions-rs/cargo@v1
        with:
          use-cross: false
          command: check
          args: --examples --target=${{ matrix.target }} --features __min_r1_43

      - name: cargo check -p homogeneous
        uses: actions-rs/cargo@v1
        with:
          use-cross: false
          command: check
          args: -p homogeneous --examples --target=${{ matrix.target }}

      - name: Install QEMU
        run: |
          mkdir qemu
          curl -L https://github.com/japaric/qemu-bin/raw/master/14.04/qemu-system-arm-2.12.0 > qemu/qemu-system-arm
          chmod +x qemu/qemu-system-arm

      - name: Setup arm-none-eabi-gcc
        uses: fiam/arm-none-eabi-gcc@v1
        with:
          release: '9-2019-q4' # The arm-none-eabi-gcc release to use.

      - name: Run-pass tests
        run: |
          # Add QEMU to the path
          echo $PATH
          PATH=$(pwd)/qemu:$PATH
          arm_example() {
              local COMMAND=$1
              local EXAMPLE=$2
              local BUILD_MODE=$3
              local FEATURES=$4
              local BUILD_NUM=$5

              if [ $BUILD_MODE = "release" ]; then
                  local RELEASE_FLAG="--release"
              else
                  local RELEASE_FLAG=""
              fi

              if [ -n "$FEATURES" ]; then
                  local FEATURES_FLAG="--features $FEATURES"
                  local FEATURES_STR=${FEATURES/,/_}_
              else
                  local FEATURES_FLAG=""
                  local FEATURES_STR=""
              fi
              local CARGO_FLAGS="--example $EXAMPLE --target ${{ matrix.target }} $RELEASE_FLAG $FEATURES_FLAG"

              if [ $COMMAND = "run" ]; then
                  cargo $COMMAND $CARGO_FLAGS | diff -u ci/expected/$EXAMPLE.run -
              else
                  cargo $COMMAND $CARGO_FLAGS
              fi
              arm-none-eabi-objcopy -O ihex target/${{ matrix.target }}/$BUILD_MODE/examples/$EXAMPLE ci/builds/${EXAMPLE}_${FEATURES_STR}${BUILD_MODE}_${BUILD_NUM}.hex
          }

          mkdir -p ci/builds
          exs=(
              idle
              init
              hardware
              preempt
              binds

              resource
              lock
              late
              only-shared-access

              task
              message
              capacity

              types
              not-send
              not-sync
              shared-with-init

              generics
              cfg
              pool
              ramfunc
          )

          for ex in ${exs[@]}; do
              if [ $ex = pool ]; then
                  if [ ${{ matrix.target }} = thumbv6m-none-eabi ]; then
                      continue
                  fi

                  td=$(mktemp -d)

                  cargo run --example $ex --target ${{ matrix.target }} --features __v7 >\
                          $td/pool.run
                  grep 'foo(0x2' $td/pool.run
                  grep 'bar(0x2' $td/pool.run
                  arm-none-eabi-objcopy -O ihex target/${{ matrix.target }}/debug/examples/$ex \
                                          ci/builds/${ex}___v7_debug_1.hex

                  cargo run --example $ex --target ${{ matrix.target }} --features __v7 --release >\
                          $td/pool.run
                  grep 'foo(0x2' $td/pool.run
                  grep 'bar(0x2' $td/pool.run
                  arm-none-eabi-objcopy -O ihex target/${{ matrix.target }}/release/examples/$ex \
                                          ci/builds/${ex}___v7_release_1.hex

                  rm -rf $td

                  continue
              fi

              if [ $ex = types ]; then
                  if [ ${{ matrix.target }} = thumbv6m-none-eabi ]; then
                      continue
                  fi

                  arm_example "run" $ex "debug" "__v7" "1"
                  arm_example "run" $ex "release" "__v7" "1"

                  continue
              fi

              arm_example "run" $ex "debug" "" "1"
              if [ $ex = types ]; then
                  arm_example "run" $ex "release" "" "1"
              else
                  arm_example "build" $ex "release" "" "1"
              fi
          done

          built=()
          cargo clean
          for ex in ${exs[@]}; do
              if [ $ex = types ] || [ $ex = pool ]; then
                  if [ ${{ matrix.target }} = thumbv6m-none-eabi ]; then
                      continue
                  fi

                  arm_example "build" $ex "debug" "__v7" "2"
                  cmp ci/builds/${ex}___v7_debug_1.hex \
                      ci/builds/${ex}___v7_debug_2.hex
                  arm_example "build" $ex "release" "__v7" "2"
                  cmp ci/builds/${ex}___v7_release_1.hex \
                      ci/builds/${ex}___v7_release_2.hex
              else
                  arm_example "build" $ex "debug" "" "2"
                  cmp ci/builds/${ex}_debug_1.hex \
                      ci/builds/${ex}_debug_2.hex
                  arm_example "build" $ex "release" "" "2"
                  cmp ci/builds/${ex}_release_1.hex \
                      ci/builds/${ex}_release_2.hex
              fi

              built+=( $ex )
          done

          ( cd target/${{ matrix.target }}/release/examples/ && size ${built[@]} )


  # Check the correctness of macros/ crate
  checkmacros:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        target:
          - x86_64-unknown-linux-gnu
        toolchain:
          - stable
          - 1.36.0
          - nightly
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Install Rust ${{ matrix.toolchain }} with target (${{ matrix.target }})
        uses: actions-rs/toolchain@v1
        with:
          toolchain: ${{ matrix.toolchain }}
          target: ${{ matrix.target }}
          override: true

      - name: Disable optimisation profiles
        if: matrix.toolchain == '1.36.0'
        run: sed -i '/^\[profile.*build-override]$/,/^$/{/^#/!{/^$/!d}}' Cargo.toml

      - name: cargo check
        uses: actions-rs/cargo@v1
        with:
          use-cross: false
          command: check
          args: --manifest-path macros/Cargo.toml --target=${{ matrix.target }}

  # Run test suite for thumbv7m
  testv7:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Install Rust
        uses: actions-rs/toolchain@v1
        with:
          toolchain: 1.36.0
          target: thumbv7m-none-eabi
          override: true

      - name: Disable optimisation profiles
        run: sed -i '/^\[profile.*build-override]$/,/^$/{/^#/!{/^$/!d}}' Cargo.toml

      - uses: actions-rs/cargo@v1
        with:
          use-cross: false
          command: test
          args: --test single --features __v7

  # Run test suite for thumbv6m
  testv6:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Install Rust
        uses: actions-rs/toolchain@v1
        with:
          toolchain: 1.36.0
          target: thumbv6m-none-eabi
          override: true

      - name: Disable optimisation profiles
        run: sed -i '/^\[profile.*build-override]$/,/^$/{/^#/!{/^$/!d}}' Cargo.toml

      - uses: actions-rs/cargo@v1
        with:
          use-cross: false
          command: test
          args: --test single

  # Verify all multicore examples
  checkmulticore:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        target:
          - x86_64-unknown-linux-gnu
        toolchain:
          - nightly
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Install Rust ${{ matrix.toolchain }} with x86_64-unknown-linux-gnu
        uses: actions-rs/toolchain@v1
        with:
          toolchain: ${{ matrix.toolchain }}
          target: x86_64-unknown-linux-gnu
          override: true
      - name: Install Rust ${{ matrix.toolchain }} with thumbv7m-none-eabi
        uses: actions-rs/toolchain@v1
        with:
          toolchain: ${{ matrix.toolchain }}
          target: thumbv7m-none-eabi
          override: true
      - name: Install Rust ${{ matrix.toolchain }} with thumbv6m-none-eabi
        uses: actions-rs/toolchain@v1
        with:
          toolchain: ${{ matrix.toolchain }}
          target: thumbv6m-none-eabi
          override: true
      - uses: actions-rs/cargo@v1
        with:
          command: install
          args: microamp-tools --version 0.1.0-alpha.3

      - name: Check multi-core examples
        run: |
          cd heterogeneous
          exs=(
              smallest
              x-init-2
              x-init
              x-schedule
              x-spawn
          )
          for ex in ${exs[@]}; do
              cargo-microamp --example=$ex --target thumbv7m-none-eabi,thumbv6m-none-eabi --check
          done