From 0a1616d8b2c48af3a5a422f164095b03ca91bda6 Mon Sep 17 00:00:00 2001 From: Andre Richter Date: Tue, 14 Apr 2020 23:16:35 +0200 Subject: [PATCH] Let cargo track changed files This should enable incremental compilation monitored by cargo. --- .githooks/pre-commit | 2 ++ 01_wait_forever/Makefile | 21 ++++++------- 01_wait_forever/build.rs | 7 +++++ 02_runtime_init/Makefile | 21 ++++++------- 02_runtime_init/build.rs | 7 +++++ 02_runtime_init/kernel8.img | Bin 03_hacky_hello_world/Makefile | 21 ++++++------- 03_hacky_hello_world/build.rs | 7 +++++ 04_zero_overhead_abstraction/Makefile | 21 ++++++------- 04_zero_overhead_abstraction/build.rs | 7 +++++ 05_safe_globals/Makefile | 21 ++++++------- 05_safe_globals/build.rs | 7 +++++ 06_drivers_gpio_uart/Makefile | 21 ++++++------- 06_drivers_gpio_uart/build.rs | 7 +++++ 07_uart_chainloader/Makefile | 21 ++++++------- 07_uart_chainloader/README.md | 10 +++--- 07_uart_chainloader/build.rs | 7 +++++ 08_timestamps/Makefile | 21 ++++++------- 08_timestamps/README.md | 10 +++--- 08_timestamps/build.rs | 7 +++++ 09_hw_debug_JTAG/Makefile | 25 ++++++++------- 09_hw_debug_JTAG/README.md | 12 ++++---- 09_hw_debug_JTAG/build.rs | 7 +++++ 10_privilege_level/Makefile | 25 ++++++++------- 10_privilege_level/build.rs | 7 +++++ 11_virtual_memory/Makefile | 25 ++++++++------- 11_virtual_memory/build.rs | 7 +++++ 12_exceptions_part1_groundwork/Makefile | 25 ++++++++------- 12_exceptions_part1_groundwork/build.rs | 7 +++++ 13_integrated_testing/Makefile | 29 +++++++++--------- 13_integrated_testing/README.md | 27 ++++++++-------- 13_integrated_testing/build.rs | 7 +++++ 14_exceptions_part2_peripheral_IRQs/Makefile | 29 +++++++++--------- 14_exceptions_part2_peripheral_IRQs/README.md | 8 ++--- 14_exceptions_part2_peripheral_IRQs/build.rs | 7 +++++ 14_exceptions_part2_peripheral_IRQs/kernel | Bin 919800 -> 919808 bytes .../kernel8.img | Bin 67648 -> 67648 bytes X1_JTAG_boot/Makefile | 21 ++++++------- X1_JTAG_boot/build.rs | 7 +++++ utils/devtool.rb | 1 + 40 files changed, 308 insertions(+), 214 deletions(-) create mode 100644 01_wait_forever/build.rs create mode 100644 02_runtime_init/build.rs mode change 100755 => 100644 02_runtime_init/kernel8.img create mode 100644 03_hacky_hello_world/build.rs create mode 100644 04_zero_overhead_abstraction/build.rs create mode 100644 05_safe_globals/build.rs create mode 100644 06_drivers_gpio_uart/build.rs create mode 100644 07_uart_chainloader/build.rs create mode 100644 08_timestamps/build.rs create mode 100644 09_hw_debug_JTAG/build.rs create mode 100644 10_privilege_level/build.rs create mode 100644 11_virtual_memory/build.rs create mode 100644 12_exceptions_part1_groundwork/build.rs create mode 100644 13_integrated_testing/build.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/build.rs create mode 100644 X1_JTAG_boot/build.rs diff --git a/.githooks/pre-commit b/.githooks/pre-commit index 9f1da522..64502afd 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -13,6 +13,8 @@ source_files_exts = ['.S', '.rs', '.rb'] staged_files = `git --no-pager diff --name-only --cached --diff-filter=d`.split(/\n/) staged_files.select! do |f| + next if f.include?('build.rs') + f.include?('Makefile') || f.include?('Dockerfile') || source_files_exts.include?(File.extname(f)) diff --git a/01_wait_forever/Makefile b/01_wait_forever/Makefile index ffb3c79d..8abfde11 100644 --- a/01_wait_forever/Makefile +++ b/01_wait_forever/Makefile @@ -24,7 +24,8 @@ else ifeq ($(BSP),rpi4) RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -SOURCES = $(shell find . -name '*.rs' -o -name '*.S' -o -name '*.ld') +# Export for build.rs +export LINKER_FILE RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs @@ -51,14 +52,12 @@ EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) .PHONY: all doc qemu clippy clean readelf objdump nm -all: clean $(OUTPUT) - -$(KERNEL_ELF): $(SOURCES) +all: RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(RUSTC_CMD) - -$(OUTPUT): $(KERNEL_ELF) - cp $< . - $(OBJCOPY_CMD) $< $(OUTPUT) + @if [ ! -f kernel ] || [ $(KERNEL_ELF) -nt kernel ]; then \ + cp $(KERNEL_ELF) .; \ + $(OBJCOPY_CMD) kernel $(OUTPUT); \ + fi doc: $(DOC_CMD) --document-private-items --open @@ -77,11 +76,11 @@ clippy: clean: rm -rf target -readelf: +readelf: all readelf -a $(KERNEL_ELF) -objdump: +objdump: all rust-objdump --arch-name aarch64 -disassemble -no-show-raw-insn -print-imm-hex $(KERNEL_ELF) -nm: +nm: all rust-nm --demangle --print-size $(KERNEL_ELF) | sort diff --git a/01_wait_forever/build.rs b/01_wait_forever/build.rs new file mode 100644 index 00000000..40ee0284 --- /dev/null +++ b/01_wait_forever/build.rs @@ -0,0 +1,7 @@ +use std::env; + +fn main() { + let linker_file = env::var("LINKER_FILE").unwrap(); + + println!("cargo:rerun-if-changed={}", linker_file); +} diff --git a/02_runtime_init/Makefile b/02_runtime_init/Makefile index ffb3c79d..8abfde11 100644 --- a/02_runtime_init/Makefile +++ b/02_runtime_init/Makefile @@ -24,7 +24,8 @@ else ifeq ($(BSP),rpi4) RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -SOURCES = $(shell find . -name '*.rs' -o -name '*.S' -o -name '*.ld') +# Export for build.rs +export LINKER_FILE RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs @@ -51,14 +52,12 @@ EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) .PHONY: all doc qemu clippy clean readelf objdump nm -all: clean $(OUTPUT) - -$(KERNEL_ELF): $(SOURCES) +all: RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(RUSTC_CMD) - -$(OUTPUT): $(KERNEL_ELF) - cp $< . - $(OBJCOPY_CMD) $< $(OUTPUT) + @if [ ! -f kernel ] || [ $(KERNEL_ELF) -nt kernel ]; then \ + cp $(KERNEL_ELF) .; \ + $(OBJCOPY_CMD) kernel $(OUTPUT); \ + fi doc: $(DOC_CMD) --document-private-items --open @@ -77,11 +76,11 @@ clippy: clean: rm -rf target -readelf: +readelf: all readelf -a $(KERNEL_ELF) -objdump: +objdump: all rust-objdump --arch-name aarch64 -disassemble -no-show-raw-insn -print-imm-hex $(KERNEL_ELF) -nm: +nm: all rust-nm --demangle --print-size $(KERNEL_ELF) | sort diff --git a/02_runtime_init/build.rs b/02_runtime_init/build.rs new file mode 100644 index 00000000..40ee0284 --- /dev/null +++ b/02_runtime_init/build.rs @@ -0,0 +1,7 @@ +use std::env; + +fn main() { + let linker_file = env::var("LINKER_FILE").unwrap(); + + println!("cargo:rerun-if-changed={}", linker_file); +} diff --git a/02_runtime_init/kernel8.img b/02_runtime_init/kernel8.img old mode 100755 new mode 100644 diff --git a/03_hacky_hello_world/Makefile b/03_hacky_hello_world/Makefile index dd6aaab5..da24d662 100644 --- a/03_hacky_hello_world/Makefile +++ b/03_hacky_hello_world/Makefile @@ -24,7 +24,8 @@ else ifeq ($(BSP),rpi4) RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -SOURCES = $(shell find . -name '*.rs' -o -name '*.S' -o -name '*.ld') +# Export for build.rs +export LINKER_FILE RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs @@ -51,14 +52,12 @@ EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) .PHONY: all doc qemu clippy clean readelf objdump nm -all: clean $(OUTPUT) - -$(KERNEL_ELF): $(SOURCES) +all: RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(RUSTC_CMD) - -$(OUTPUT): $(KERNEL_ELF) - cp $< . - $(OBJCOPY_CMD) $< $(OUTPUT) + @if [ ! -f kernel ] || [ $(KERNEL_ELF) -nt kernel ]; then \ + cp $(KERNEL_ELF) .; \ + $(OBJCOPY_CMD) kernel $(OUTPUT); \ + fi doc: $(DOC_CMD) --document-private-items --open @@ -77,11 +76,11 @@ clippy: clean: rm -rf target -readelf: +readelf: all readelf -a $(KERNEL_ELF) -objdump: +objdump: all rust-objdump --arch-name aarch64 -disassemble -no-show-raw-insn -print-imm-hex $(KERNEL_ELF) -nm: +nm: all rust-nm --demangle --print-size $(KERNEL_ELF) | sort diff --git a/03_hacky_hello_world/build.rs b/03_hacky_hello_world/build.rs new file mode 100644 index 00000000..40ee0284 --- /dev/null +++ b/03_hacky_hello_world/build.rs @@ -0,0 +1,7 @@ +use std::env; + +fn main() { + let linker_file = env::var("LINKER_FILE").unwrap(); + + println!("cargo:rerun-if-changed={}", linker_file); +} diff --git a/04_zero_overhead_abstraction/Makefile b/04_zero_overhead_abstraction/Makefile index dd6aaab5..da24d662 100644 --- a/04_zero_overhead_abstraction/Makefile +++ b/04_zero_overhead_abstraction/Makefile @@ -24,7 +24,8 @@ else ifeq ($(BSP),rpi4) RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -SOURCES = $(shell find . -name '*.rs' -o -name '*.S' -o -name '*.ld') +# Export for build.rs +export LINKER_FILE RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs @@ -51,14 +52,12 @@ EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) .PHONY: all doc qemu clippy clean readelf objdump nm -all: clean $(OUTPUT) - -$(KERNEL_ELF): $(SOURCES) +all: RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(RUSTC_CMD) - -$(OUTPUT): $(KERNEL_ELF) - cp $< . - $(OBJCOPY_CMD) $< $(OUTPUT) + @if [ ! -f kernel ] || [ $(KERNEL_ELF) -nt kernel ]; then \ + cp $(KERNEL_ELF) .; \ + $(OBJCOPY_CMD) kernel $(OUTPUT); \ + fi doc: $(DOC_CMD) --document-private-items --open @@ -77,11 +76,11 @@ clippy: clean: rm -rf target -readelf: +readelf: all readelf -a $(KERNEL_ELF) -objdump: +objdump: all rust-objdump --arch-name aarch64 -disassemble -no-show-raw-insn -print-imm-hex $(KERNEL_ELF) -nm: +nm: all rust-nm --demangle --print-size $(KERNEL_ELF) | sort diff --git a/04_zero_overhead_abstraction/build.rs b/04_zero_overhead_abstraction/build.rs new file mode 100644 index 00000000..40ee0284 --- /dev/null +++ b/04_zero_overhead_abstraction/build.rs @@ -0,0 +1,7 @@ +use std::env; + +fn main() { + let linker_file = env::var("LINKER_FILE").unwrap(); + + println!("cargo:rerun-if-changed={}", linker_file); +} diff --git a/05_safe_globals/Makefile b/05_safe_globals/Makefile index dd6aaab5..da24d662 100644 --- a/05_safe_globals/Makefile +++ b/05_safe_globals/Makefile @@ -24,7 +24,8 @@ else ifeq ($(BSP),rpi4) RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -SOURCES = $(shell find . -name '*.rs' -o -name '*.S' -o -name '*.ld') +# Export for build.rs +export LINKER_FILE RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs @@ -51,14 +52,12 @@ EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) .PHONY: all doc qemu clippy clean readelf objdump nm -all: clean $(OUTPUT) - -$(KERNEL_ELF): $(SOURCES) +all: RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(RUSTC_CMD) - -$(OUTPUT): $(KERNEL_ELF) - cp $< . - $(OBJCOPY_CMD) $< $(OUTPUT) + @if [ ! -f kernel ] || [ $(KERNEL_ELF) -nt kernel ]; then \ + cp $(KERNEL_ELF) .; \ + $(OBJCOPY_CMD) kernel $(OUTPUT); \ + fi doc: $(DOC_CMD) --document-private-items --open @@ -77,11 +76,11 @@ clippy: clean: rm -rf target -readelf: +readelf: all readelf -a $(KERNEL_ELF) -objdump: +objdump: all rust-objdump --arch-name aarch64 -disassemble -no-show-raw-insn -print-imm-hex $(KERNEL_ELF) -nm: +nm: all rust-nm --demangle --print-size $(KERNEL_ELF) | sort diff --git a/05_safe_globals/build.rs b/05_safe_globals/build.rs new file mode 100644 index 00000000..40ee0284 --- /dev/null +++ b/05_safe_globals/build.rs @@ -0,0 +1,7 @@ +use std::env; + +fn main() { + let linker_file = env::var("LINKER_FILE").unwrap(); + + println!("cargo:rerun-if-changed={}", linker_file); +} diff --git a/06_drivers_gpio_uart/Makefile b/06_drivers_gpio_uart/Makefile index dd6aaab5..da24d662 100644 --- a/06_drivers_gpio_uart/Makefile +++ b/06_drivers_gpio_uart/Makefile @@ -24,7 +24,8 @@ else ifeq ($(BSP),rpi4) RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -SOURCES = $(shell find . -name '*.rs' -o -name '*.S' -o -name '*.ld') +# Export for build.rs +export LINKER_FILE RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs @@ -51,14 +52,12 @@ EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) .PHONY: all doc qemu clippy clean readelf objdump nm -all: clean $(OUTPUT) - -$(KERNEL_ELF): $(SOURCES) +all: RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(RUSTC_CMD) - -$(OUTPUT): $(KERNEL_ELF) - cp $< . - $(OBJCOPY_CMD) $< $(OUTPUT) + @if [ ! -f kernel ] || [ $(KERNEL_ELF) -nt kernel ]; then \ + cp $(KERNEL_ELF) .; \ + $(OBJCOPY_CMD) kernel $(OUTPUT); \ + fi doc: $(DOC_CMD) --document-private-items --open @@ -77,11 +76,11 @@ clippy: clean: rm -rf target -readelf: +readelf: all readelf -a $(KERNEL_ELF) -objdump: +objdump: all rust-objdump --arch-name aarch64 -disassemble -no-show-raw-insn -print-imm-hex $(KERNEL_ELF) -nm: +nm: all rust-nm --demangle --print-size $(KERNEL_ELF) | sort diff --git a/06_drivers_gpio_uart/build.rs b/06_drivers_gpio_uart/build.rs new file mode 100644 index 00000000..40ee0284 --- /dev/null +++ b/06_drivers_gpio_uart/build.rs @@ -0,0 +1,7 @@ +use std::env; + +fn main() { + let linker_file = env::var("LINKER_FILE").unwrap(); + + println!("cargo:rerun-if-changed={}", linker_file); +} diff --git a/07_uart_chainloader/Makefile b/07_uart_chainloader/Makefile index 46d7ae53..f9caa6a1 100644 --- a/07_uart_chainloader/Makefile +++ b/07_uart_chainloader/Makefile @@ -32,7 +32,8 @@ else ifeq ($(BSP),rpi4) CHAINBOOT_DEMO_PAYLOAD = demo_payload_rpi4.img endif -SOURCES = $(shell find . -name '*.rs' -o -name '*.S' -o -name '*.ld') +# Export for build.rs +export LINKER_FILE RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs @@ -69,14 +70,12 @@ EXEC_MINIPUSH = ruby ../utils/minipush.rb .PHONY: all doc qemu qemuasm chainboot clippy clean readelf objdump nm -all: clean $(OUTPUT) - -$(KERNEL_ELF): $(SOURCES) +all: RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(RUSTC_CMD) - -$(OUTPUT): $(KERNEL_ELF) - cp $< . - $(OBJCOPY_CMD) $< $(OUTPUT) + @if [ ! -f kernel ] || [ $(KERNEL_ELF) -nt kernel ]; then \ + cp $(KERNEL_ELF) .; \ + $(OBJCOPY_CMD) kernel $(OUTPUT); \ + fi doc: $(DOC_CMD) --document-private-items --open @@ -101,11 +100,11 @@ clippy: clean: rm -rf target -readelf: +readelf: all readelf -a $(KERNEL_ELF) -objdump: +objdump: all rust-objdump --arch-name aarch64 -disassemble -no-show-raw-insn -print-imm-hex $(KERNEL_ELF) -nm: +nm: all rust-nm --demangle --print-size $(KERNEL_ELF) | sort diff --git a/07_uart_chainloader/README.md b/07_uart_chainloader/README.md index 51544dfa..99be098d 100644 --- a/07_uart_chainloader/README.md +++ b/07_uart_chainloader/README.md @@ -126,8 +126,8 @@ diff -uNr 06_drivers_gpio_uart/Makefile 07_uart_chainloader/Makefile + CHAINBOOT_DEMO_PAYLOAD = demo_payload_rpi4.img endif - SOURCES = $(shell find . -name '*.rs' -o -name '*.S' -o -name '*.ld') -@@ -44,12 +52,22 @@ + # Export for build.rs +@@ -45,12 +53,22 @@ DOCKER_IMAGE = rustembedded/osdev-utils DOCKER_CMD = docker run -it --rm -v $(shell pwd):/work/tutorial -w /work/tutorial @@ -150,9 +150,9 @@ diff -uNr 06_drivers_gpio_uart/Makefile 07_uart_chainloader/Makefile + +.PHONY: all doc qemu qemuasm chainboot clippy clean readelf objdump nm - all: clean $(OUTPUT) - -@@ -64,13 +82,19 @@ + all: + RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(RUSTC_CMD) +@@ -63,13 +81,19 @@ $(DOC_CMD) --document-private-items --open ifeq ($(QEMU_MACHINE_TYPE),) diff --git a/07_uart_chainloader/build.rs b/07_uart_chainloader/build.rs new file mode 100644 index 00000000..40ee0284 --- /dev/null +++ b/07_uart_chainloader/build.rs @@ -0,0 +1,7 @@ +use std::env; + +fn main() { + let linker_file = env::var("LINKER_FILE").unwrap(); + + println!("cargo:rerun-if-changed={}", linker_file); +} diff --git a/08_timestamps/Makefile b/08_timestamps/Makefile index 4b18773a..a765953e 100644 --- a/08_timestamps/Makefile +++ b/08_timestamps/Makefile @@ -30,7 +30,8 @@ else ifeq ($(BSP),rpi4) RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -SOURCES = $(shell find . -name '*.rs' -o -name '*.S' -o -name '*.ld') +# Export for build.rs +export LINKER_FILE RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs @@ -67,14 +68,12 @@ EXEC_MINIPUSH = ruby ../utils/minipush.rb .PHONY: all doc qemu chainboot clippy clean readelf objdump nm -all: clean $(OUTPUT) - -$(KERNEL_ELF): $(SOURCES) +all: RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(RUSTC_CMD) - -$(OUTPUT): $(KERNEL_ELF) - cp $< . - $(OBJCOPY_CMD) $< $(OUTPUT) + @if [ ! -f kernel ] || [ $(KERNEL_ELF) -nt kernel ]; then \ + cp $(KERNEL_ELF) .; \ + $(OBJCOPY_CMD) kernel $(OUTPUT); \ + fi doc: $(DOC_CMD) --document-private-items --open @@ -96,11 +95,11 @@ clippy: clean: rm -rf target -readelf: +readelf: all readelf -a $(KERNEL_ELF) -objdump: +objdump: all rust-objdump --arch-name aarch64 -disassemble -no-show-raw-insn -print-imm-hex $(KERNEL_ELF) -nm: +nm: all rust-nm --demangle --print-size $(KERNEL_ELF) | sort diff --git a/08_timestamps/README.md b/08_timestamps/README.md index bcbb663f..ace4428a 100644 --- a/08_timestamps/README.md +++ b/08_timestamps/README.md @@ -65,17 +65,17 @@ diff -uNr 07_uart_chainloader/Makefile 08_timestamps/Makefile + RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif - SOURCES = $(shell find . -name '*.rs' -o -name '*.S' -o -name '*.ld') -@@ -67,7 +65,7 @@ + # Export for build.rs +@@ -68,7 +66,7 @@ EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) EXEC_MINIPUSH = ruby ../utils/minipush.rb -.PHONY: all doc qemu qemuasm chainboot clippy clean readelf objdump nm +.PHONY: all doc qemu chainboot clippy clean readelf objdump nm - all: clean $(OUTPUT) - -@@ -82,18 +80,15 @@ + all: + RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(RUSTC_CMD) +@@ -81,18 +79,15 @@ $(DOC_CMD) --document-private-items --open ifeq ($(QEMU_MACHINE_TYPE),) diff --git a/08_timestamps/build.rs b/08_timestamps/build.rs new file mode 100644 index 00000000..40ee0284 --- /dev/null +++ b/08_timestamps/build.rs @@ -0,0 +1,7 @@ +use std::env; + +fn main() { + let linker_file = env::var("LINKER_FILE").unwrap(); + + println!("cargo:rerun-if-changed={}", linker_file); +} diff --git a/09_hw_debug_JTAG/Makefile b/09_hw_debug_JTAG/Makefile index 24dd68c2..681f90f9 100644 --- a/09_hw_debug_JTAG/Makefile +++ b/09_hw_debug_JTAG/Makefile @@ -34,7 +34,8 @@ else ifeq ($(BSP),rpi4) RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -SOURCES = $(shell find . -name '*.rs' -o -name '*.S' -o -name '*.ld') +# Export for build.rs +export LINKER_FILE RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs @@ -78,14 +79,12 @@ EXEC_MINIPUSH = ruby ../utils/minipush.rb .PHONY: all doc qemu chainboot jtagboot openocd gdb gdb-opt0 clippy clean readelf objdump nm -all: clean $(OUTPUT) - -$(KERNEL_ELF): $(SOURCES) +all: RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(RUSTC_CMD) - -$(OUTPUT): $(KERNEL_ELF) - cp $< . - $(OBJCOPY_CMD) $< $(OUTPUT) + @if [ ! -f kernel ] || [ $(KERNEL_ELF) -nt kernel ]; then \ + cp $(KERNEL_ELF) .; \ + $(OBJCOPY_CMD) kernel $(OUTPUT); \ + fi doc: $(DOC_CMD) --document-private-items --open @@ -113,10 +112,10 @@ define gen_gdb @$(DOCKER_GDB) gdb-multiarch -q kernel_for_jtag endef -gdb: clean $(SOURCES) +gdb: $(call gen_gdb,-C debuginfo=2) -gdb-opt0: clean $(SOURCES) +gdb-opt0: $(call gen_gdb,-C debuginfo=2 -C opt-level=0) clippy: @@ -125,11 +124,11 @@ clippy: clean: rm -rf target -readelf: +readelf: all readelf -a $(KERNEL_ELF) -objdump: +objdump: all rust-objdump --arch-name aarch64 -disassemble -no-show-raw-insn -print-imm-hex $(KERNEL_ELF) -nm: +nm: all rust-nm --demangle --print-size $(KERNEL_ELF) | sort diff --git a/09_hw_debug_JTAG/README.md b/09_hw_debug_JTAG/README.md index 16d1fe3c..66dedfe3 100644 --- a/09_hw_debug_JTAG/README.md +++ b/09_hw_debug_JTAG/README.md @@ -323,7 +323,7 @@ diff -uNr 08_timestamps/Makefile 09_hw_debug_JTAG/Makefile LINKER_FILE = src/bsp/raspberrypi/link.ld RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -@@ -51,21 +55,28 @@ +@@ -52,21 +56,28 @@ DOCKER_IMAGE = rustembedded/osdev-utils DOCKER_CMD = docker run -it --rm -v $(shell pwd):/work/tutorial -w /work/tutorial DOCKER_ARG_DIR_UTILS = -v $(shell pwd)/../utils:/work/utils @@ -351,9 +351,9 @@ diff -uNr 08_timestamps/Makefile 09_hw_debug_JTAG/Makefile -.PHONY: all doc qemu chainboot clippy clean readelf objdump nm +.PHONY: all doc qemu chainboot jtagboot openocd gdb gdb-opt0 clippy clean readelf objdump nm - all: clean $(OUTPUT) - -@@ -90,6 +101,24 @@ + all: + RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(RUSTC_CMD) +@@ -89,6 +100,24 @@ chainboot: all @$(DOCKER_CHAINBOOT) $(EXEC_MINIPUSH) $(DEV_SERIAL) $(OUTPUT) @@ -369,10 +369,10 @@ diff -uNr 08_timestamps/Makefile 09_hw_debug_JTAG/Makefile + @$(DOCKER_GDB) gdb-multiarch -q kernel_for_jtag +endef + -+gdb: clean $(SOURCES) ++gdb: + $(call gen_gdb,-C debuginfo=2) + -+gdb-opt0: clean $(SOURCES) ++gdb-opt0: + $(call gen_gdb,-C debuginfo=2 -C opt-level=0) + clippy: diff --git a/09_hw_debug_JTAG/build.rs b/09_hw_debug_JTAG/build.rs new file mode 100644 index 00000000..40ee0284 --- /dev/null +++ b/09_hw_debug_JTAG/build.rs @@ -0,0 +1,7 @@ +use std::env; + +fn main() { + let linker_file = env::var("LINKER_FILE").unwrap(); + + println!("cargo:rerun-if-changed={}", linker_file); +} diff --git a/10_privilege_level/Makefile b/10_privilege_level/Makefile index 24dd68c2..681f90f9 100644 --- a/10_privilege_level/Makefile +++ b/10_privilege_level/Makefile @@ -34,7 +34,8 @@ else ifeq ($(BSP),rpi4) RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -SOURCES = $(shell find . -name '*.rs' -o -name '*.S' -o -name '*.ld') +# Export for build.rs +export LINKER_FILE RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs @@ -78,14 +79,12 @@ EXEC_MINIPUSH = ruby ../utils/minipush.rb .PHONY: all doc qemu chainboot jtagboot openocd gdb gdb-opt0 clippy clean readelf objdump nm -all: clean $(OUTPUT) - -$(KERNEL_ELF): $(SOURCES) +all: RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(RUSTC_CMD) - -$(OUTPUT): $(KERNEL_ELF) - cp $< . - $(OBJCOPY_CMD) $< $(OUTPUT) + @if [ ! -f kernel ] || [ $(KERNEL_ELF) -nt kernel ]; then \ + cp $(KERNEL_ELF) .; \ + $(OBJCOPY_CMD) kernel $(OUTPUT); \ + fi doc: $(DOC_CMD) --document-private-items --open @@ -113,10 +112,10 @@ define gen_gdb @$(DOCKER_GDB) gdb-multiarch -q kernel_for_jtag endef -gdb: clean $(SOURCES) +gdb: $(call gen_gdb,-C debuginfo=2) -gdb-opt0: clean $(SOURCES) +gdb-opt0: $(call gen_gdb,-C debuginfo=2 -C opt-level=0) clippy: @@ -125,11 +124,11 @@ clippy: clean: rm -rf target -readelf: +readelf: all readelf -a $(KERNEL_ELF) -objdump: +objdump: all rust-objdump --arch-name aarch64 -disassemble -no-show-raw-insn -print-imm-hex $(KERNEL_ELF) -nm: +nm: all rust-nm --demangle --print-size $(KERNEL_ELF) | sort diff --git a/10_privilege_level/build.rs b/10_privilege_level/build.rs new file mode 100644 index 00000000..40ee0284 --- /dev/null +++ b/10_privilege_level/build.rs @@ -0,0 +1,7 @@ +use std::env; + +fn main() { + let linker_file = env::var("LINKER_FILE").unwrap(); + + println!("cargo:rerun-if-changed={}", linker_file); +} diff --git a/11_virtual_memory/Makefile b/11_virtual_memory/Makefile index 24dd68c2..681f90f9 100644 --- a/11_virtual_memory/Makefile +++ b/11_virtual_memory/Makefile @@ -34,7 +34,8 @@ else ifeq ($(BSP),rpi4) RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -SOURCES = $(shell find . -name '*.rs' -o -name '*.S' -o -name '*.ld') +# Export for build.rs +export LINKER_FILE RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs @@ -78,14 +79,12 @@ EXEC_MINIPUSH = ruby ../utils/minipush.rb .PHONY: all doc qemu chainboot jtagboot openocd gdb gdb-opt0 clippy clean readelf objdump nm -all: clean $(OUTPUT) - -$(KERNEL_ELF): $(SOURCES) +all: RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(RUSTC_CMD) - -$(OUTPUT): $(KERNEL_ELF) - cp $< . - $(OBJCOPY_CMD) $< $(OUTPUT) + @if [ ! -f kernel ] || [ $(KERNEL_ELF) -nt kernel ]; then \ + cp $(KERNEL_ELF) .; \ + $(OBJCOPY_CMD) kernel $(OUTPUT); \ + fi doc: $(DOC_CMD) --document-private-items --open @@ -113,10 +112,10 @@ define gen_gdb @$(DOCKER_GDB) gdb-multiarch -q kernel_for_jtag endef -gdb: clean $(SOURCES) +gdb: $(call gen_gdb,-C debuginfo=2) -gdb-opt0: clean $(SOURCES) +gdb-opt0: $(call gen_gdb,-C debuginfo=2 -C opt-level=0) clippy: @@ -125,11 +124,11 @@ clippy: clean: rm -rf target -readelf: +readelf: all readelf -a $(KERNEL_ELF) -objdump: +objdump: all rust-objdump --arch-name aarch64 -disassemble -no-show-raw-insn -print-imm-hex $(KERNEL_ELF) -nm: +nm: all rust-nm --demangle --print-size $(KERNEL_ELF) | sort diff --git a/11_virtual_memory/build.rs b/11_virtual_memory/build.rs new file mode 100644 index 00000000..40ee0284 --- /dev/null +++ b/11_virtual_memory/build.rs @@ -0,0 +1,7 @@ +use std::env; + +fn main() { + let linker_file = env::var("LINKER_FILE").unwrap(); + + println!("cargo:rerun-if-changed={}", linker_file); +} diff --git a/12_exceptions_part1_groundwork/Makefile b/12_exceptions_part1_groundwork/Makefile index 24dd68c2..681f90f9 100644 --- a/12_exceptions_part1_groundwork/Makefile +++ b/12_exceptions_part1_groundwork/Makefile @@ -34,7 +34,8 @@ else ifeq ($(BSP),rpi4) RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -SOURCES = $(shell find . -name '*.rs' -o -name '*.S' -o -name '*.ld') +# Export for build.rs +export LINKER_FILE RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs @@ -78,14 +79,12 @@ EXEC_MINIPUSH = ruby ../utils/minipush.rb .PHONY: all doc qemu chainboot jtagboot openocd gdb gdb-opt0 clippy clean readelf objdump nm -all: clean $(OUTPUT) - -$(KERNEL_ELF): $(SOURCES) +all: RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(RUSTC_CMD) - -$(OUTPUT): $(KERNEL_ELF) - cp $< . - $(OBJCOPY_CMD) $< $(OUTPUT) + @if [ ! -f kernel ] || [ $(KERNEL_ELF) -nt kernel ]; then \ + cp $(KERNEL_ELF) .; \ + $(OBJCOPY_CMD) kernel $(OUTPUT); \ + fi doc: $(DOC_CMD) --document-private-items --open @@ -113,10 +112,10 @@ define gen_gdb @$(DOCKER_GDB) gdb-multiarch -q kernel_for_jtag endef -gdb: clean $(SOURCES) +gdb: $(call gen_gdb,-C debuginfo=2) -gdb-opt0: clean $(SOURCES) +gdb-opt0: $(call gen_gdb,-C debuginfo=2 -C opt-level=0) clippy: @@ -125,11 +124,11 @@ clippy: clean: rm -rf target -readelf: +readelf: all readelf -a $(KERNEL_ELF) -objdump: +objdump: all rust-objdump --arch-name aarch64 -disassemble -no-show-raw-insn -print-imm-hex $(KERNEL_ELF) -nm: +nm: all rust-nm --demangle --print-size $(KERNEL_ELF) | sort diff --git a/12_exceptions_part1_groundwork/build.rs b/12_exceptions_part1_groundwork/build.rs new file mode 100644 index 00000000..40ee0284 --- /dev/null +++ b/12_exceptions_part1_groundwork/build.rs @@ -0,0 +1,7 @@ +use std::env; + +fn main() { + let linker_file = env::var("LINKER_FILE").unwrap(); + + println!("cargo:rerun-if-changed={}", linker_file); +} diff --git a/13_integrated_testing/Makefile b/13_integrated_testing/Makefile index d2800434..5e25ab07 100644 --- a/13_integrated_testing/Makefile +++ b/13_integrated_testing/Makefile @@ -36,6 +36,9 @@ else ifeq ($(BSP),rpi4) RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif +# Export for build.rs +export LINKER_FILE + # Testing-specific arguments ifdef TEST ifeq ($(TEST),unit) @@ -47,8 +50,6 @@ endif QEMU_MISSING_STRING = "This board is not yet supported for QEMU." -SOURCES = $(shell find . -name '*.rs' -o -name '*.S' -o -name '*.ld') - RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs @@ -94,14 +95,12 @@ EXEC_MINIPUSH = ruby ../utils/minipush.rb .PHONY: all doc qemu chainboot jtagboot openocd gdb gdb-opt0 clippy clean readelf objdump nm test -all: clean $(OUTPUT) - -$(KERNEL_ELF): $(SOURCES) +all: RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(RUSTC_CMD) - -$(OUTPUT): $(KERNEL_ELF) - cp $< . - $(OBJCOPY_CMD) $< $(OUTPUT) + @if [ ! -f kernel ] || [ $(KERNEL_ELF) -nt kernel ]; then \ + cp $(KERNEL_ELF) .; \ + $(OBJCOPY_CMD) kernel $(OUTPUT); \ + fi doc: $(DOC_CMD) --document-private-items --open @@ -122,7 +121,7 @@ define KERNEL_TEST_RUNNER endef export KERNEL_TEST_RUNNER -test: $(SOURCES) +test: @mkdir -p target @echo "$$KERNEL_TEST_RUNNER" > target/kernel_test_runner.sh @chmod +x target/kernel_test_runner.sh @@ -144,10 +143,10 @@ define gen_gdb @$(DOCKER_GDB) gdb-multiarch -q kernel_for_jtag endef -gdb: clean $(SOURCES) +gdb: $(call gen_gdb,-C debuginfo=2) -gdb-opt0: clean $(SOURCES) +gdb-opt0: $(call gen_gdb,-C debuginfo=2 -C opt-level=0) clippy: @@ -156,11 +155,11 @@ clippy: clean: rm -rf target -readelf: +readelf: all readelf -a $(KERNEL_ELF) -objdump: +objdump: all rust-objdump --arch-name aarch64 -disassemble -no-show-raw-insn -print-imm-hex $(KERNEL_ELF) -nm: +nm: all rust-nm --demangle --print-size $(KERNEL_ELF) | sort diff --git a/13_integrated_testing/README.md b/13_integrated_testing/README.md index 5acc833c..4e157a59 100644 --- a/13_integrated_testing/README.md +++ b/13_integrated_testing/README.md @@ -354,7 +354,7 @@ define KERNEL_TEST_RUNNER endef export KERNEL_TEST_RUNNER -test: $(SOURCES) +test: @mkdir -p target @echo "$$KERNEL_TEST_RUNNER" > target/kernel_test_runner.sh @chmod +x target/kernel_test_runner.sh @@ -827,7 +827,7 @@ diff -uNr 12_exceptions_part1_groundwork/Makefile 13_integrated_testing/Makefile OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi3.cfg JTAG_BOOT_IMAGE = ../X1_JTAG_boot/jtag_boot_rpi3.img LINKER_FILE = src/bsp/raspberrypi/link.ld -@@ -28,12 +29,24 @@ +@@ -28,6 +29,7 @@ QEMU_BINARY = qemu-system-aarch64 QEMU_MACHINE_TYPE = QEMU_RELEASE_ARGS = -serial stdio -display none @@ -835,8 +835,9 @@ diff -uNr 12_exceptions_part1_groundwork/Makefile 13_integrated_testing/Makefile OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi4.cfg JTAG_BOOT_IMAGE = ../X1_JTAG_boot/jtag_boot_rpi4.img LINKER_FILE = src/bsp/raspberrypi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 - endif +@@ -37,6 +39,17 @@ + # Export for build.rs + export LINKER_FILE +# Testing-specific arguments +ifdef TEST @@ -849,10 +850,10 @@ diff -uNr 12_exceptions_part1_groundwork/Makefile 13_integrated_testing/Makefile + +QEMU_MISSING_STRING = "This board is not yet supported for QEMU." + - SOURCES = $(shell find . -name '*.rs' -o -name '*.S' -o -name '*.ld') - RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) -@@ -46,6 +59,7 @@ + RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs + +@@ -47,6 +60,7 @@ RUSTC_CMD = cargo rustc $(COMPILER_ARGS) DOC_CMD = cargo doc $(COMPILER_ARGS) CLIPPY_CMD = cargo clippy $(COMPILER_ARGS) @@ -860,7 +861,7 @@ diff -uNr 12_exceptions_part1_groundwork/Makefile 13_integrated_testing/Makefile OBJCOPY_CMD = rust-objcopy \ --strip-all \ -O binary -@@ -53,18 +67,20 @@ +@@ -54,18 +68,20 @@ KERNEL_ELF = target/$(TARGET)/release/kernel DOCKER_IMAGE = rustembedded/osdev-utils @@ -885,16 +886,16 @@ diff -uNr 12_exceptions_part1_groundwork/Makefile 13_integrated_testing/Makefile DOCKER_CHAINBOOT = $(DOCKER_CMD_DEV) $(DOCKER_ARG_DIR_UTILS) $(DOCKER_IMAGE) DOCKER_JTAGBOOT = $(DOCKER_CMD_DEV) $(DOCKER_ARG_DIR_UTILS) $(DOCKER_ARG_DIR_JTAG) $(DOCKER_IMAGE) -@@ -76,7 +92,7 @@ +@@ -77,7 +93,7 @@ EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) EXEC_MINIPUSH = ruby ../utils/minipush.rb -.PHONY: all doc qemu chainboot jtagboot openocd gdb gdb-opt0 clippy clean readelf objdump nm +.PHONY: all doc qemu chainboot jtagboot openocd gdb gdb-opt0 clippy clean readelf objdump nm test - all: clean $(OUTPUT) - -@@ -91,11 +107,26 @@ + all: + RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(RUSTC_CMD) +@@ -90,11 +106,26 @@ $(DOC_CMD) --document-private-items --open ifeq ($(QEMU_MACHINE_TYPE),) @@ -915,7 +916,7 @@ diff -uNr 12_exceptions_part1_groundwork/Makefile 13_integrated_testing/Makefile +endef + +export KERNEL_TEST_RUNNER -+test: $(SOURCES) ++test: + @mkdir -p target + @echo "$$KERNEL_TEST_RUNNER" > target/kernel_test_runner.sh + @chmod +x target/kernel_test_runner.sh diff --git a/13_integrated_testing/build.rs b/13_integrated_testing/build.rs new file mode 100644 index 00000000..40ee0284 --- /dev/null +++ b/13_integrated_testing/build.rs @@ -0,0 +1,7 @@ +use std::env; + +fn main() { + let linker_file = env::var("LINKER_FILE").unwrap(); + + println!("cargo:rerun-if-changed={}", linker_file); +} diff --git a/14_exceptions_part2_peripheral_IRQs/Makefile b/14_exceptions_part2_peripheral_IRQs/Makefile index 49930b0d..7f6d75c7 100644 --- a/14_exceptions_part2_peripheral_IRQs/Makefile +++ b/14_exceptions_part2_peripheral_IRQs/Makefile @@ -36,6 +36,9 @@ else ifeq ($(BSP),rpi4) RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif +# Export for build.rs +export LINKER_FILE + # Testing-specific arguments ifdef TEST ifeq ($(TEST),unit) @@ -47,8 +50,6 @@ endif QEMU_MISSING_STRING = "This board is not yet supported for QEMU." -SOURCES = $(shell find . -name '*.rs' -o -name '*.S' -o -name '*.ld') - RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs @@ -95,14 +96,12 @@ EXEC_MINIPUSH = ruby ../utils/minipush.rb .PHONY: all doc qemu chainboot jtagboot openocd gdb gdb-opt0 clippy clean readelf objdump nm test -all: clean $(OUTPUT) - -$(KERNEL_ELF): $(SOURCES) +all: RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(RUSTC_CMD) - -$(OUTPUT): $(KERNEL_ELF) - cp $< . - $(OBJCOPY_CMD) $< $(OUTPUT) + @if [ ! -f kernel ] || [ $(KERNEL_ELF) -nt kernel ]; then \ + cp $(KERNEL_ELF) .; \ + $(OBJCOPY_CMD) kernel $(OUTPUT); \ + fi doc: $(DOC_CMD) --document-private-items --open @@ -125,7 +124,7 @@ endef export KERNEL_TEST_RUNNER test: FEATURES += --features qemu-quirks -test: $(SOURCES) +test: @mkdir -p target @echo "$$KERNEL_TEST_RUNNER" > target/kernel_test_runner.sh @chmod +x target/kernel_test_runner.sh @@ -147,10 +146,10 @@ define gen_gdb @$(DOCKER_GDB) gdb-multiarch -q kernel_for_jtag endef -gdb: clean $(SOURCES) +gdb: $(call gen_gdb,-C debuginfo=2) -gdb-opt0: clean $(SOURCES) +gdb-opt0: $(call gen_gdb,-C debuginfo=2 -C opt-level=0) clippy: @@ -159,11 +158,11 @@ clippy: clean: rm -rf target -readelf: +readelf: all readelf -a $(KERNEL_ELF) -objdump: +objdump: all rust-objdump --arch-name aarch64 -disassemble -no-show-raw-insn -print-imm-hex $(KERNEL_ELF) -nm: +nm: all rust-nm --demangle --print-size $(KERNEL_ELF) | sort diff --git a/14_exceptions_part2_peripheral_IRQs/README.md b/14_exceptions_part2_peripheral_IRQs/README.md index 58a042f5..11af3c58 100644 --- a/14_exceptions_part2_peripheral_IRQs/README.md +++ b/14_exceptions_part2_peripheral_IRQs/README.md @@ -762,7 +762,7 @@ diff -uNr 13_integrated_testing/Cargo.toml 14_exceptions_part2_peripheral_IRQs/C diff -uNr 13_integrated_testing/Makefile 14_exceptions_part2_peripheral_IRQs/Makefile --- 13_integrated_testing/Makefile +++ 14_exceptions_part2_peripheral_IRQs/Makefile -@@ -52,8 +52,9 @@ +@@ -53,8 +53,9 @@ RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs @@ -773,7 +773,7 @@ diff -uNr 13_integrated_testing/Makefile 14_exceptions_part2_peripheral_IRQs/Mak --release RUSTC_CMD = cargo rustc $(COMPILER_ARGS) -@@ -106,6 +107,7 @@ +@@ -105,6 +106,7 @@ doc: $(DOC_CMD) --document-private-items --open @@ -781,12 +781,12 @@ diff -uNr 13_integrated_testing/Makefile 14_exceptions_part2_peripheral_IRQs/Mak ifeq ($(QEMU_MACHINE_TYPE),) qemu test: @echo $(QEMU_MISSING_STRING) -@@ -122,6 +124,7 @@ +@@ -121,6 +123,7 @@ endef export KERNEL_TEST_RUNNER +test: FEATURES += --features qemu-quirks - test: $(SOURCES) + test: @mkdir -p target @echo "$$KERNEL_TEST_RUNNER" > target/kernel_test_runner.sh diff --git a/14_exceptions_part2_peripheral_IRQs/build.rs b/14_exceptions_part2_peripheral_IRQs/build.rs new file mode 100644 index 00000000..40ee0284 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/build.rs @@ -0,0 +1,7 @@ +use std::env; + +fn main() { + let linker_file = env::var("LINKER_FILE").unwrap(); + + println!("cargo:rerun-if-changed={}", linker_file); +} diff --git a/14_exceptions_part2_peripheral_IRQs/kernel b/14_exceptions_part2_peripheral_IRQs/kernel index de22d5dddbe980596b2da009ea8168084b7d557a..f9e18b2940fd92576159c8f44fbf85dc54cd6059 100755 GIT binary patch delta 14320 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 F{{Y-%N%sH% delta 14220 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 ScSo^yu#fvXjfuf`-u?$%Et4q# delta 1723 zcmb7DT}&KR6h1Svv-7h+DL*Yj>HamqvH@xvs}Lo0n~;^(wr)vnf+oA{va}HUuxq2S zEwG>sCYbDa_MrxoiVv2lk5gJ`Vgz4mYK*N_V>BiR4=#{cVuZT=$$DmI)+Ro=H~D7f z-20vLefQiu^GVBm(vo}?zhZV&)^U*9DM89XfMS@LwnFL(W|$7Y)2=kaNMKQ5R42gg z>@cr77eQHZgW5o`7y>2jwWw)Me_Pc>j#0MTs1P{5AEzP{gbRdmOt8DF-F9V@h}Ws$ zMM8$iXO|h}BR7X%vrqG%iIAE{h8qkmQ%c+i$}n58mUx)$&ic3?u9CNFgmN&-O8`k- z*7L7L$XRrPpy)Q!^^9S0!D?7M@WkR5_zmagPm|slZg2`u~8ApDB|Rl^buM8fQ-FBX#s+V_TO;s+N38T;Y~~D;e@QDZ7{dtwW%v!S$&hJ z-;rM%1F3WvlnsKHrSE#5n!XHb4VBnU&`YdP7gpW0uDA4Y^zPtPG4}92*2&=|{;BOp zsnkOOQl&bbC>}}?LtF4$zH=9;t_;H5+tklTq>w%fbE_?~x|dQ$=~REEv_G-c>gDgy z*Ihhi?QV2#RsOp#ndmb_xJA$nHIho#LK*&Ub+HKifihhcHUmN8E!sC$p0_|9D`H`8cLK(p%Hz+=2JRR^|=#NHub8F;oC_WPTQu z-p2YO%5f6nH{J^j+@1^^EBYi>OV?x|JRP&09|<&^(8wb|S|# zl{`zTn*wBhqdsg}v7L#s)jWR6xHP{sC$P)q8n<MIPxlol0f+FZ+TkZ)EkA+)a51l&Q z9E;~>8iE)LweLS_(m0cL%#0Z`?lxmHgnUdtXKtLq7lZe3u~#gc4jF>Hxk3UDdYgSe znbZGQ;1`o$k{1Z#K)88Np=COH@mBc9g4O+DV-qz`)R!WKtIvkf*VkUKdR4?wcbV$G z2!7dDSMc61MzA`%@8v>U27QLQ@dPL}V>aK5+)*d{PZVq@8O7?8b;E@kT8|o5=#R^d z9*3j(HHQrTeq%m=r4E{L{>~mUV>1oR*arEX9PY=i;2+w^$+s%8VW