diff --git a/.gitignore b/.gitignore index 6dc3db1a..c71d6dbd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ **/*.rs.bk Cargo.lock +bin/*.after +bin/*.before +bin/*.o target/ diff --git a/.travis.yml b/.travis.yml index 7381b734..caa29efb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,13 +3,10 @@ language: rust matrix: include: - env: TARGET=x86_64-unknown-linux-gnu - if: (branch = staging OR branch = trying) OR (type = pull_request AND branch = master) - - - env: TARGET=thumbv6m-none-eabi rust: stable if: (branch = staging OR branch = trying) OR (type = pull_request AND branch = master) - - env: TARGET=thumbv6m-none-eabi CC=clang + - env: TARGET=thumbv6m-none-eabi rust: stable if: (branch = staging OR branch = trying) OR (type = pull_request AND branch = master) @@ -17,26 +14,14 @@ matrix: rust: stable if: (branch = staging OR branch = trying) OR (type = pull_request AND branch = master) - - env: TARGET=thumbv7m-none-eabi CC=clang - rust: stable - if: (branch = staging OR branch = trying) OR (type = pull_request AND branch = master) - - env: TARGET=thumbv7em-none-eabi rust: stable if: (branch = staging OR branch = trying) OR (type = pull_request AND branch = master) - - env: TARGET=thumbv7em-none-eabi CC=clang - rust: stable - if: (branch = staging OR branch = trying) OR (type = pull_request AND branch = master) - - env: TARGET=thumbv7em-none-eabihf rust: stable if: (branch = staging OR branch = trying) OR (type = pull_request AND branch = master) - - env: TARGET=thumbv7em-none-eabihf CC=clang - rust: stable - if: (branch = staging OR branch = trying) OR (type = pull_request AND branch = master) - - env: TARGET=thumbv6m-none-eabi rust: nightly if: (branch = staging OR branch = trying) OR (type = pull_request AND branch = master) diff --git a/Cargo.toml b/Cargo.toml index 988faa71..e8313207 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,9 +9,6 @@ name = "cortex-m-rt" repository = "https://github.com/japaric/cortex-m-rt" version = "0.5.2" -[build-dependencies] -cc = "1.0.10" - [dependencies] r0 = "0.2.1" diff --git a/asm.s b/asm.s index 2937be84..c7133c07 100644 --- a/asm.s +++ b/asm.s @@ -1,3 +1,4 @@ + .section .text.HardFault .global HardFault .thumb_func HardFault: diff --git a/assemble.sh b/assemble.sh new file mode 100755 index 00000000..f9ec7d87 --- /dev/null +++ b/assemble.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +set -euxo pipefail + +# cflags taken from cc 1.0.22 + +crate=cortex-m-rt + +arm-none-eabi-as -march=armv6s-m asm.s -o bin/$crate.o +ar crs bin/thumbv6m-none-eabi.a bin/$crate.o + +arm-none-eabi-as -march=armv7-m asm.s -o bin/$crate.o +ar crs bin/thumbv7m-none-eabi.a bin/$crate.o + +arm-none-eabi-as -march=armv7e-m asm.s -o bin/$crate.o +ar crs bin/thumbv7em-none-eabi.a bin/$crate.o +ar crs bin/thumbv7em-none-eabihf.a bin/$crate.o + +rm bin/$crate.o diff --git a/bin/thumbv6m-none-eabi.a b/bin/thumbv6m-none-eabi.a new file mode 100644 index 00000000..62ac3178 Binary files /dev/null and b/bin/thumbv6m-none-eabi.a differ diff --git a/bin/thumbv7em-none-eabi.a b/bin/thumbv7em-none-eabi.a new file mode 100644 index 00000000..ef9042ff Binary files /dev/null and b/bin/thumbv7em-none-eabi.a differ diff --git a/bin/thumbv7em-none-eabihf.a b/bin/thumbv7em-none-eabihf.a new file mode 100644 index 00000000..ef9042ff Binary files /dev/null and b/bin/thumbv7em-none-eabihf.a differ diff --git a/bin/thumbv7m-none-eabi.a b/bin/thumbv7m-none-eabi.a new file mode 100644 index 00000000..b93dae7e Binary files /dev/null and b/bin/thumbv7m-none-eabi.a differ diff --git a/build.rs b/build.rs index fc53d79f..8166b1b0 100644 --- a/build.rs +++ b/build.rs @@ -1,18 +1,21 @@ -extern crate cc; - use std::env; -use std::fs::File; +use std::fs::{self, File}; use std::io::Write; use std::path::PathBuf; fn main() { let target = env::var("TARGET").unwrap(); + let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap()); has_fpu(&target); let is_armv6m = is_armv6m(&target); if target.starts_with("thumbv") { - cc::Build::new().file("asm.s").compile("asm"); + fs::copy( + format!("bin/{}.a", target), + out_dir.join("libcortex-m-rt.a"), + ).unwrap(); + println!("cargo:rustc-link-lib=static=cortex-m-rt"); } // Put the linker script somewhere the linker can find it diff --git a/check-blobs.sh b/check-blobs.sh new file mode 100755 index 00000000..94fde420 --- /dev/null +++ b/check-blobs.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +# Checks that the blobs are up to date with the committed assembly files + +set -euxo pipefail + +for lib in $(ls bin/*.a); do + filename=$(basename $lib) + arm-none-eabi-objdump -Cd $lib > bin/${filename%.a}.before +done + +./assemble.sh + +for lib in $(ls bin/*.a); do + filename=$(basename $lib) + arm-none-eabi-objdump -Cd $lib > bin/${filename%.a}.after +done + +for cksum in $(ls bin/*.after); do + diff -u $cksum ${cksum%.after}.before +done diff --git a/ci/install.sh b/ci/install.sh index f211207f..e63e8054 100644 --- a/ci/install.sh +++ b/ci/install.sh @@ -3,13 +3,11 @@ set -euxo pipefail main() { if [ $TARGET != x86_64-unknown-linux-gnu ]; then rustup target add $TARGET + fi - if [ ${CC:-gcc} = gcc ]; then - mkdir gcc + mkdir gcc - curl -L https://developer.arm.com/-/media/Files/downloads/gnu-rm/7-2018q2/gcc-arm-none-eabi-7-2018-q2-update-linux.tar.bz2?revision=bc2c96c0-14b5-4bb4-9f18-bceb4050fee7?product=GNU%20Arm%20Embedded%20Toolchain,64-bit,,Linux,7-2018-q2-update | tar --strip-components=1 -C gcc -xj - fi - fi + curl -L https://developer.arm.com/-/media/Files/downloads/gnu-rm/7-2018q2/gcc-arm-none-eabi-7-2018-q2-update-linux.tar.bz2?revision=bc2c96c0-14b5-4bb4-9f18-bceb4050fee7?product=GNU%20Arm%20Embedded%20Toolchain,64-bit,,Linux,7-2018-q2-update | tar --strip-components=1 -C gcc -xj } main diff --git a/ci/script.sh b/ci/script.sh index 2e070bfc..7d1cc677 100644 --- a/ci/script.sh +++ b/ci/script.sh @@ -20,65 +20,63 @@ main() { # linking with GNU LD for ex in "${examples[@]}"; do cargo rustc --target $TARGET --example $ex -- \ - -C link-arg=-nostartfiles \ - -C link-arg=-Wl,-Tlink.x + -C linker=arm-none-eabi-ld \ + -C link-arg=-Tlink.x cargo rustc --target $TARGET --example $ex --release -- \ - -C link-arg=-nostartfiles \ - -C link-arg=-Wl,-Tlink.x + -C linker=arm-none-eabi-ld \ + -C link-arg=-Tlink.x done for ex in "${fail_examples[@]}"; do ! cargo rustc --target $TARGET --example $ex -- \ - -C link-arg=-nostartfiles \ - -C link-arg=-Wl,-Tlink.x + -C linker=arm-none-eabi-ld \ + -C link-arg=-Tlink.x ! cargo rustc --target $TARGET --example $ex --release -- \ - -C link-arg=-nostartfiles \ - -C link-arg=-Wl,-Tlink.x + -C linker=arm-none-eabi-ld \ + -C link-arg=-Tlink.x done cargo rustc --target $TARGET --example device --features device -- \ - -C link-arg=-nostartfiles \ - -C link-arg=-Wl,-Tlink.x + -C linker=arm-none-eabi-ld \ + -C link-arg=-Tlink.x cargo rustc --target $TARGET --example device --features device --release -- \ - -C link-arg=-nostartfiles \ - -C link-arg=-Wl,-Tlink.x + -C linker=arm-none-eabi-ld \ + -C link-arg=-Tlink.x # linking with rustc's LLD for ex in "${examples[@]}"; do cargo rustc --target $TARGET --example $ex -- \ -C linker=rust-lld \ - -Z linker-flavor=ld.lld \ -C link-arg=-Tlink.x cargo rustc --target $TARGET --example $ex --release -- \ -C linker=rust-lld \ - -Z linker-flavor=ld.lld \ -C link-arg=-Tlink.x done for ex in "${fail_examples[@]}"; do ! cargo rustc --target $TARGET --example $ex -- \ -C linker=rust-lld \ - -Z linker-flavor=ld.lld \ -C link-arg=-Tlink.x ! cargo rustc --target $TARGET --example $ex --release -- \ -C linker=rust-lld \ - -Z linker-flavor=ld.lld \ -C link-arg=-Tlink.x done cargo rustc --target $TARGET --example device --features device -- \ -C linker=rust-lld \ - -Z linker-flavor=ld.lld \ -C link-arg=-Tlink.x cargo rustc --target $TARGET --example device --features device --release -- \ -C linker=rust-lld \ - -Z linker-flavor=ld.lld \ -C link-arg=-Tlink.x fi + + if [ $TARGET = x86_64-unknown-linux-gnu ]; then + ./check-blobs.sh + fi } main