diff options
-rw-r--r-- | .github/workflows/build.yml | 379 | ||||
-rw-r--r-- | .github/workflows/docs.yml | 93 | ||||
-rw-r--r-- | .github/workflows/properties/build.properties.json | 6 | ||||
-rw-r--r-- | .github/workflows/properties/docs.properties.json | 6 | ||||
-rw-r--r-- | .github/workflows/properties/publish.properties.json | 6 | ||||
-rw-r--r-- | .github/workflows/publish.yml | 94 | ||||
-rw-r--r-- | .travis.yml | 1 | ||||
-rw-r--r-- | ci/install.sh | 9 | ||||
-rw-r--r-- | ci/script.sh | 6 | ||||
-rw-r--r-- | examples/t-cfg-resources.rs | 2 | ||||
-rw-r--r-- | macros/src/codegen.rs | 3 | ||||
-rw-r--r-- | macros/src/codegen/init.rs | 6 | ||||
-rw-r--r-- | macros/src/codegen/post_init.rs | 7 |
13 files changed, 607 insertions, 11 deletions
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..8468ceb7 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,379 @@ +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 }} + + - 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 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 00000000..297bff06 --- /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 00000000..e447a1ed --- /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 00000000..a9a052c4 --- /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 00000000..fa9b8cda --- /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 00000000..7436bf88 --- /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 diff --git a/.travis.yml b/.travis.yml index 1bb25051..c2651307 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,6 +37,7 @@ before_install: install: - bash ci/install.sh - export PATH="$PATH:$PWD/qemu" + - export PATH="$PATH:$PWD/mdbook-bin" script: - bash ci/script.sh diff --git a/ci/install.sh b/ci/install.sh index 54701224..624efd87 100644 --- a/ci/install.sh +++ b/ci/install.sh @@ -15,7 +15,6 @@ main() { fi rustup target add $TARGET - 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 @@ -23,7 +22,13 @@ main() { pip install linkchecker --user fi - install_crate mdbook 0.3.1 + # Download binary mdbook and add to path + curl -L https://github.com/rust-lang/mdBook/releases/download/v0.3.1/mdbook-v0.3.1-x86_64-unknown-linux-gnu.tar.gz > mdbook.tar.gz + tar -xf mdbook.tar.gz + mkdir -p mdbook-bin + mv mdbook mdbook-bin/ + + #install_crate mdbook 0.3.1 } main diff --git a/ci/script.sh b/ci/script.sh index 7b86e52a..c9a9c050 100644 --- a/ci/script.sh +++ b/ci/script.sh @@ -36,6 +36,12 @@ main() { mkdir -p ci/builds + # Current MSRV cannot handle profiles, remove compilation optimisations + if [[ $TRAVIS_RUST_VERSION == 1.*.* ]]; then + echo "Removing optimisation profiles" + sed -i '/^\[profile.*build-override]$/,/^$/{/^#/!{/^$/!d}}' Cargo.toml + fi + if [ $T = x86_64-unknown-linux-gnu ]; then if [[ $TRAVIS_RUST_VERSION == 1.*.* ]]; then # test on a fixed version (MSRV) to avoid problems with changes in rustc diagnostics diff --git a/examples/t-cfg-resources.rs b/examples/t-cfg-resources.rs index 86b5ea20..63c41245 100644 --- a/examples/t-cfg-resources.rs +++ b/examples/t-cfg-resources.rs @@ -28,7 +28,7 @@ mod example { // The feature needs to be applied everywhere x is defined or used #[cfg(feature = "feature_x")] x: 0, - dummy: () // dummy such that we have at least one late resource + dummy: (), // dummy such that we have at least one late resource } } diff --git a/macros/src/codegen.rs b/macros/src/codegen.rs index 7d0d1220..60074849 100644 --- a/macros/src/codegen.rs +++ b/macros/src/codegen.rs @@ -39,7 +39,8 @@ pub fn app(app: &App, analysis: &Analysis, extra: &Extra) -> TokenStream2 { let (const_app_init, root_init, user_init, call_init) = init::codegen(core, app, analysis, extra); - let (const_app_post_init, post_init_stmts) = post_init::codegen(core, &app, analysis, extra); + let (const_app_post_init, post_init_stmts) = + post_init::codegen(core, &app, analysis, extra); let (const_app_idle, root_idle, user_idle, call_idle) = idle::codegen(core, app, analysis, extra); diff --git a/macros/src/codegen/init.rs b/macros/src/codegen/init.rs index f7e4674e..9e5c4798 100644 --- a/macros/src/codegen/init.rs +++ b/macros/src/codegen/init.rs @@ -47,9 +47,9 @@ pub fn codegen( let cfgs = &app.late_resources[name].cfgs; quote!( - #(#cfgs)* - pub #name: #ty - ) + #(#cfgs)* + pub #name: #ty + ) }) .collect::<Vec<_>>() }) diff --git a/macros/src/codegen/post_init.rs b/macros/src/codegen/post_init.rs index 8578d5ac..b816e072 100644 --- a/macros/src/codegen/post_init.rs +++ b/macros/src/codegen/post_init.rs @@ -16,16 +16,15 @@ pub fn codegen( // initialize late resources if let Some(late_resources) = analysis.late_resources.get(&core) { - for name in late_resources { // if it's live let cfgs = app.late_resources[name].cfgs.clone(); if analysis.locations.get(name).is_some() { // Need to also include the cfgs stmts.push(quote!( - #(#cfgs)* - #name.as_mut_ptr().write(late.#name); - )); + #(#cfgs)* + #name.as_mut_ptr().write(late.#name); + )); } } } |