Skip to content
This repository has been archived by the owner on Jan 24, 2022. It is now read-only.

Commit

Permalink
Merge #95
Browse files Browse the repository at this point in the history
95: [RFC] remove build dependency on arm-none-eabi-gcc (binary blob alternative) r=japaric a=japaric

Before this commit we used gcc to assemble external assembly files into object
files that we linked into our Rust program.

This commit drops the dependency on gcc by shipping the already assembled object
files with this crate source code.

---

This is an alternative to RFC #91 that doesn't require a breaking change or
adding a new Cargo feature and can be implemented right now.

See #91 for the rationale of dropping the dependency on gcc.

This approach can be applied to other Cortex-M crates like cortex-m-semihosting
and cortex-m (would subsume RFC rust-embedded/cortex-m#107).

This seems like an overall better approach to me, but before I go opening more
PRs I want to hear your thoughts, @rust-embedded/cortex-m

closes #91

Co-authored-by: Jorge Aparicio <jorge@japaric.io>
  • Loading branch information
bors[bot] and japaric committed Aug 26, 2018
2 parents f126dd8 + dd0c08a commit 0652541
Show file tree
Hide file tree
Showing 13 changed files with 71 additions and 46 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
**/*.rs.bk
Cargo.lock
bin/*.after
bin/*.before
bin/*.o
target/
17 changes: 1 addition & 16 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,40 +3,25 @@ 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)

- env: TARGET=thumbv7m-none-eabi
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)
Expand Down
3 changes: 0 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,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"

Expand Down
1 change: 1 addition & 0 deletions asm.s
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
.section .text.HardFault
.global HardFault
.thumb_func
HardFault:
Expand Down
19 changes: 19 additions & 0 deletions assemble.sh
Original file line number Diff line number Diff line change
@@ -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
Binary file added bin/thumbv6m-none-eabi.a
Binary file not shown.
Binary file added bin/thumbv7em-none-eabi.a
Binary file not shown.
Binary file added bin/thumbv7em-none-eabihf.a
Binary file not shown.
Binary file added bin/thumbv7m-none-eabi.a
Binary file not shown.
11 changes: 7 additions & 4 deletions build.rs
Original file line number Diff line number Diff line change
@@ -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
Expand Down
21 changes: 21 additions & 0 deletions check-blobs.sh
Original file line number Diff line number Diff line change
@@ -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
8 changes: 3 additions & 5 deletions ci/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
34 changes: 16 additions & 18 deletions ci/script.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 0652541

Please sign in to comment.