diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000000..e6abe374ba --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,362 @@ +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: 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 }} + + - 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: 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 + - 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 + - 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 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000000..297bff06ed --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,93 @@ +name: Docs + +on: + push: + branches: + - master + - ghatest + pull_request: + branches: + - master + - ghatest + +env: + CARGO_TERM_COLOR: always + +jobs: + docs: + 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: 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/rtfm/ + linkchecker $td/api/cortex_m_rtfm_macros/ + + 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/ diff --git a/.github/workflows/properties/build.properties.json b/.github/workflows/properties/build.properties.json new file mode 100644 index 0000000000..e447a1ed9a --- /dev/null +++ b/.github/workflows/properties/build.properties.json @@ -0,0 +1,6 @@ +{ + "name": "Build", + "description": "Build and test a Rust project with Cargo.", + "iconName": "rust", + "categories": ["Rust"] +} diff --git a/.github/workflows/properties/docs.properties.json b/.github/workflows/properties/docs.properties.json new file mode 100644 index 0000000000..a9a052c4fd --- /dev/null +++ b/.github/workflows/properties/docs.properties.json @@ -0,0 +1,6 @@ +{ + "name": "Docs", + "description": "Build the books.", + "iconName": "rust", + "categories": ["Rust"] +} diff --git a/.github/workflows/properties/publish.properties.json b/.github/workflows/properties/publish.properties.json new file mode 100644 index 0000000000..fa9b8cda99 --- /dev/null +++ b/.github/workflows/properties/publish.properties.json @@ -0,0 +1,6 @@ +{ + "name": "Publish", + "description": "Publish the books and docs.", + "iconName": "rust", + "categories": ["Rust"] +} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000000..7436bf8849 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,94 @@ +name: Publish + +on: + push: + branches: + - master + +jobs: + deploy: + runs-on: ubuntu-latest + 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|rtfm/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/rtfm-rs/cortex-m-rtfm/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|rtfm/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 + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./bookstodeploy