name: Build on: pull_request: push: branches: - master - staging - trying env: CARGO_TERM_COLOR: always jobs: # Run cargo fmt --check, includes macros/ style: name: style 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: name: check runs-on: ubuntu-latest strategy: matrix: target: - thumbv7m-none-eabi - thumbv6m-none-eabi - x86_64-unknown-linux-gnu toolchain: - stable - 1.36.0 steps: - name: Checkout uses: actions/checkout@v2 - name: Cache cargo dependencies uses: actions/cache@v2 with: path: | - ~/.cargo/bin/ - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ key: ${{ runner.OS }}-cargo-${{ hashFiles('**/Cargo.lock') }} restore-keys: | ${{ runner.OS }}-cargo-${{ hashFiles('**/Cargo.lock') }} ${{ runner.OS }}-cargo- - name: Cache build output dependencies uses: actions/cache@v2 with: path: target key: ${{ runner.OS }}-build-${{ hashFiles('**/Cargo.lock') }} restore-keys: | ${{ runner.OS }}-build-${{ hashFiles('**/Cargo.lock') }} ${{ runner.OS }}-build- - name: Cache Rust toolchain uses: actions/cache@v2 with: path: /usr/share/rust/ key: ${{ runner.OS }}-rust-${{ env.rustc_hash }} restore-keys: | ${{ runner.OS }}-rust-${{ env.rustc_hash }} - 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: name: checkexamples runs-on: ubuntu-latest strategy: matrix: target: - thumbv7m-none-eabi - thumbv6m-none-eabi toolchain: - stable steps: - name: Checkout uses: actions/checkout@v2 - name: Cache cargo dependencies uses: actions/cache@v2 with: path: | - ~/.cargo/bin/ - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ key: ${{ runner.OS }}-cargo-${{ hashFiles('**/Cargo.lock') }} restore-keys: | ${{ runner.OS }}-cargo-${{ hashFiles('**/Cargo.lock') }} ${{ runner.OS }}-cargo- - name: Cache build output dependencies uses: actions/cache@v2 with: path: target key: ${{ runner.OS }}-build-${{ hashFiles('**/Cargo.lock') }} restore-keys: | ${{ runner.OS }}-build-${{ hashFiles('**/Cargo.lock') }} ${{ runner.OS }}-build- - name: Cache Rust toolchain uses: actions/cache@v2 with: path: /usr/share/rust/ key: ${{ runner.OS }}-rust-${{ env.rustc_hash }} restore-keys: | ${{ runner.OS }}-rust-${{ env.rustc_hash }} - name: Cache QEMU binary id: cache-qemu-binary uses: actions/cache@v2 with: path: qemu key: ${{ runner.OS }}-qemu restore-keys: | ${{ runner.OS }}-qemu - name: Cache arm-none-eabi-gcc id: cache-arm-none-eabi-gcc uses: actions/cache@v2 with: path: arm-none-eabi-gcc key: ${{ runner.OS }}-gcc restore-keys: | ${{ runner.OS }}-gcc - 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 if: steps.cache-qemu-binary.outputs.cache-hit != 'true' run: | mkdir -p qemu curl -C - -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 add QEMU to PATH env: GITHUB_WORKSPACE: ${{ github.workspace }} run: echo "::add-path::${GITHUB_WORKSPACE}/qemu" - name: Setup arm-none-eabi-gcc if: steps.cache-arm-none-eabi-gcc.outputs.cache-hit != 'true' uses: fiam/arm-none-eabi-gcc@v1 with: directory: 'arm-none-eabi-gcc' # Place it locally so it is possible to cache release: '9-2019-q4' # The arm-none-eabi-gcc release to use. - name: Setup add arm-none-eabi-gcc to PATH if: steps.cache-arm-none-eabi-gcc.outputs.cache-hit == 'true' env: GITHUB_WORKSPACE: ${{ github.workspace }} run: echo "::add-path::${GITHUB_WORKSPACE}/arm-none-eabi-gcc/bin" - name: Run-pass tests run: | # Print 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 peripherals-taken ) 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: name: checkmacros runs-on: ubuntu-latest strategy: matrix: target: - x86_64-unknown-linux-gnu toolchain: - stable - 1.36.0 steps: - name: Checkout uses: actions/checkout@v2 - name: Cache cargo dependencies uses: actions/cache@v2 with: path: | - ~/.cargo/bin/ - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ key: ${{ runner.OS }}-cargo-${{ hashFiles('**/Cargo.lock') }} restore-keys: | ${{ runner.OS }}-cargo-${{ hashFiles('**/Cargo.lock') }} ${{ runner.OS }}-cargo- - name: Cache build output dependencies uses: actions/cache@v2 with: path: target key: ${{ runner.OS }}-build-${{ hashFiles('**/Cargo.lock') }} restore-keys: | ${{ runner.OS }}-build-${{ hashFiles('**/Cargo.lock') }} ${{ runner.OS }}-build- - name: Cache Rust toolchain uses: actions/cache@v2 with: path: /usr/share/rust/ key: ${{ runner.OS }}-rust-${{ env.rustc_hash }} restore-keys: | ${{ runner.OS }}-rust-${{ env.rustc_hash }} - 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: name: testv7 runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Cache cargo dependencies uses: actions/cache@v2 with: path: | - ~/.cargo/bin/ - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ key: ${{ runner.OS }}-cargo-${{ hashFiles('**/Cargo.lock') }} restore-keys: | ${{ runner.OS }}-cargo- - name: Cache build output dependencies uses: actions/cache@v2 with: path: target key: ${{ runner.OS }}-build-${{ hashFiles('**/Cargo.lock') }} restore-keys: | ${{ runner.OS }}-build- - name: Cache Rust toolchain uses: actions/cache@v2 with: path: /usr/share/rust/ key: ${{ runner.OS }}-rust-${{ env.rustc_hash }} restore-keys: | ${{ runner.OS }}-rust-${{ env.rustc_hash }} - 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: name: testv6 runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Cache cargo dependencies uses: actions/cache@v2 with: path: | - ~/.cargo/bin/ - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ key: ${{ runner.OS }}-cargo-${{ hashFiles('**/Cargo.lock') }} restore-keys: | ${{ runner.OS }}-cargo- - name: Cache build output dependencies uses: actions/cache@v2 with: path: target key: ${{ runner.OS }}-build-${{ hashFiles('**/Cargo.lock') }} restore-keys: | ${{ runner.OS }}-build- - name: Cache Rust toolchain uses: actions/cache@v2 with: path: /usr/share/rust/ key: ${{ runner.OS }}-rust-${{ env.rustc_hash }} restore-keys: | ${{ runner.OS }}-rust-${{ env.rustc_hash }} - 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: name: 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 # Build documentation, check links docs: name: docs runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Cache cargo dependencies uses: actions/cache@v2 with: path: | - ~/.cargo/bin/ - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ key: ${{ runner.OS }}-cargo-${{ hashFiles('**/Cargo.lock') }} restore-keys: | ${{ runner.OS }}-cargo- - name: Cache build output dependencies uses: actions/cache@v2 with: path: target key: ${{ runner.OS }}-build-${{ hashFiles('**/Cargo.lock') }} restore-keys: | ${{ runner.OS }}-build- - name: Cache Rust toolchain uses: actions/cache@v2 with: path: /usr/share/rust/ key: ${{ runner.OS }}-rust-${{ env.rustc_hash }} restore-keys: | ${{ runner.OS }}-rust-${{ env.rustc_hash }} - name: Cache pip installed linkchecker uses: actions/cache@v2 with: path: ~/.cache/pip key: ${{ runner.os }}-pip restore-keys: | ${{ runner.os }}-pip- - name: Set up Python 3.x uses: actions/setup-python@v2 with: # Semantic version range syntax or exact version of a Python version python-version: '3.x' # Optional - x64 or x86 architecture, defaults to x64 architecture: 'x64' # You can test your matrix by printing the current Python version - name: Display Python version run: python -c "import sys; print(sys.version)" - name: Install dependencies run: pip install git+https://github.com/linkchecker/linkchecker.git - name: Remove cargo-config run: rm -f .cargo/config - name: Build docs run: cargo doc - name: Check links run: | td=$(mktemp -d) cp -r target/doc $td/api linkchecker $td/api/rtic/ linkchecker $td/api/cortex_m_rtic_macros/ # Build the books mdbook: name: mdbook runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Set up Python 3.x uses: actions/setup-python@v2 with: # Semantic version range syntax or exact version of a Python version python-version: '3.x' # Optional - x64 or x86 architecture, defaults to x64 architecture: 'x64' # You can test your matrix by printing the current Python version - name: Display Python version run: python -c "import sys; print(sys.version)" - name: Install dependencies run: pip install git+https://github.com/linkchecker/linkchecker.git - name: mdBook Action uses: peaceiris/actions-mdbook@v1.1.11 with: mdbook-version: '0.3.1' - name: Build book in English run: cd book/en && mdbook build - name: Build book in Russian run: cd book/ru && mdbook build - name: Check links run: | td=$(mktemp -d) mkdir $td/book cp -r book/en/book $td/book/en cp -r book/ru/book $td/book/ru cp LICENSE-* $td/book/en cp LICENSE-* $td/book/ru linkchecker $td/book/en/ linkchecker $td/book/ru/ # Only runs when pushing to master branch deploy: name: deploy runs-on: ubuntu-latest needs: - style - check - checkexamples - checkmacros - testv7 - testv6 - checkmulticore - docs - mdbook # Only run this when pushing to master branch if: github.ref == 'refs/heads/master' steps: - uses: actions/checkout@v2 - name: Set up Python 3.x uses: actions/setup-python@v2 with: # Semantic version range syntax or exact version of a Python version python-version: '3.x' # Optional - x64 or x86 architecture, defaults to x64 architecture: 'x64' # You can test your matrix by printing the current Python version - name: Display Python version run: python -c "import sys; print(sys.version)" - name: mdBook Action uses: peaceiris/actions-mdbook@v1.1.11 with: mdbook-version: '0.3.1' # mdbook-version: 'latest' - name: Remove cargo-config run: rm -f .cargo/config - name: Build docs run: cargo doc - name: Build books run: | langs=( en ru ) latest=0.5 vers=( 0.4.x ) # Create directories td=$(mktemp -d) mkdir -p $td/$latest/book/ cp -r target/doc $td/$latest/api # sed fixes sed 's|URL|rtic/index.html|g' redirect.html > $td/$latest/api/index.html sed 's|URL|0.5|g' redirect.html > $td/index.html sed 's|URL|book/en|g' redirect.html > $td/$latest/index.html # Build books for lang in ${langs[@]}; do ( cd book/$lang && mdbook build ) cp -r book/$lang/book $td/$latest/book/$lang cp LICENSE-* $td/$latest/book/$lang/ done # Build older versions root=$(pwd) for ver in ${vers[@]}; do prefix=${ver%.*} mkdir -p $td/$prefix/book src=$(mktemp -d) curl -L https://github.com/rtic-rs/cortex-m-rtic/archive/v${ver}.tar.gz | tar xz --strip-components 1 -C $src pushd $src rm -f .cargo/config cargo doc || cargo doc --features timer-queue cp -r target/doc $td/$prefix/api sed 's|URL|rtic/index.html|g' $root/redirect.html > $td/$prefix/api/index.html for lang in ${langs[@]}; do ( cd book/$lang && mdbook build ) cp -r book/$lang/book $td/$prefix/book/$lang cp LICENSE-* $td/$prefix/book/$lang/ done sed 's|URL|book/en|g' $root/redirect.html > $td/$prefix/index.html popd rm -rf $src done # Forward CNAME file cp CNAME $td/ mv $td/ bookstodeploy - name: Deploy to GH-pages uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./bookstodeploy # Refs: https://github.com/rust-lang/crater/blob/9ab6f9697c901c4a44025cf0a39b73ad5b37d198/.github/workflows/bors.yml#L125-L149 # # ALL THE PREVIOUS JOBS NEEDS TO BE ADDED TO THE `needs` SECTION OF THIS JOB! ci-success: name: ci if: github.event_name == 'push' && success() needs: - style - check - checkexamples - checkmacros - testv7 - testv6 - checkmulticore - docs - mdbook runs-on: ubuntu-latest steps: - name: Mark the job as a success run: exit 0 ci-failure: name: ci if: github.event_name == 'push' && !success() needs: - style - check - checkexamples - checkmacros - testv7 - testv6 - checkmulticore - docs - mdbook runs-on: ubuntu-latest steps: - name: Mark the job as a failure run: exit 1