diff --git a/01_wait_forever/Makefile b/01_wait_forever/Makefile index 4228b06e..2f701075 100644 --- a/01_wait_forever/Makefile +++ b/01_wait_forever/Makefile @@ -15,10 +15,10 @@ BSP ?= rpi3 ##-------------------------------------------------------------------------------------------------- -## Hardcoded configuration values +## BSP-specific configuration values ##-------------------------------------------------------------------------------------------------- +QEMU_MISSING_STRING = "This board is not yet supported for QEMU." -# BSP-specific arguments. ifeq ($(BSP),rpi3) TARGET = aarch64-unknown-none-softfloat KERNEL_BIN = kernel8.img @@ -28,7 +28,7 @@ ifeq ($(BSP),rpi3) OBJDUMP_BINARY = aarch64-none-elf-objdump NM_BINARY = aarch64-none-elf-nm READELF_BINARY = aarch64-none-elf-readelf - LINKER_FILE = src/bsp/raspberrypi/link.ld + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) TARGET = aarch64-unknown-none-softfloat @@ -39,24 +39,33 @@ else ifeq ($(BSP),rpi4) OBJDUMP_BINARY = aarch64-none-elf-objdump NM_BINARY = aarch64-none-elf-nm READELF_BINARY = aarch64-none-elf-readelf - LINKER_FILE = src/bsp/raspberrypi/link.ld + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -QEMU_MISSING_STRING = "This board is not yet supported for QEMU." - # Export for build.rs. -export LINKER_FILE +export LD_SCRIPT_PATH + -KERNEL_ELF = target/$(TARGET)/release/kernel + +##-------------------------------------------------------------------------------------------------- +## Generic configuration values +##-------------------------------------------------------------------------------------------------- +KERNEL_LINKER_SCRIPT = link.ld +KERNEL_ELF = target/$(TARGET)/release/kernel ##-------------------------------------------------------------------------------------------------- ## Command building blocks ##-------------------------------------------------------------------------------------------------- -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) -RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs +RUSTFLAGS = $(RUSTC_MISC_ARGS) \ + -C link-arg=--library-path=$(LD_SCRIPT_PATH) \ + -C link-arg=--script=$(KERNEL_LINKER_SCRIPT) + +RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) \ + -D warnings \ + -D missing_docs FEATURES = --features bsp_$(BSP) COMPILER_ARGS = --target=$(TARGET) \ diff --git a/01_wait_forever/build.rs b/01_wait_forever/build.rs index 883c5955..f53b9949 100644 --- a/01_wait_forever/build.rs +++ b/01_wait_forever/build.rs @@ -1,8 +1,17 @@ -use std::env; +use std::{env, fs}; fn main() { - let linker_file = env::var("LINKER_FILE").unwrap_or_default(); + let ld_script_path = env::var("LD_SCRIPT_PATH").unwrap_or_default(); - println!("cargo:rerun-if-changed={}", linker_file); - println!("cargo:rerun-if-changed=build.rs"); + let files = fs::read_dir(ld_script_path).unwrap(); + files + .filter_map(Result::ok) + .filter(|d| { + if let Some(e) = d.path().extension() { + e == "ld" + } else { + false + } + }) + .for_each(|f| println!("cargo:rerun-if-changed={}", f.path().display())); } diff --git a/02_runtime_init/Makefile b/02_runtime_init/Makefile index c66931df..1daff4d6 100644 --- a/02_runtime_init/Makefile +++ b/02_runtime_init/Makefile @@ -15,10 +15,10 @@ BSP ?= rpi3 ##-------------------------------------------------------------------------------------------------- -## Hardcoded configuration values +## BSP-specific configuration values ##-------------------------------------------------------------------------------------------------- +QEMU_MISSING_STRING = "This board is not yet supported for QEMU." -# BSP-specific arguments. ifeq ($(BSP),rpi3) TARGET = aarch64-unknown-none-softfloat KERNEL_BIN = kernel8.img @@ -28,7 +28,7 @@ ifeq ($(BSP),rpi3) OBJDUMP_BINARY = aarch64-none-elf-objdump NM_BINARY = aarch64-none-elf-nm READELF_BINARY = aarch64-none-elf-readelf - LINKER_FILE = src/bsp/raspberrypi/link.ld + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) TARGET = aarch64-unknown-none-softfloat @@ -39,24 +39,33 @@ else ifeq ($(BSP),rpi4) OBJDUMP_BINARY = aarch64-none-elf-objdump NM_BINARY = aarch64-none-elf-nm READELF_BINARY = aarch64-none-elf-readelf - LINKER_FILE = src/bsp/raspberrypi/link.ld + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -QEMU_MISSING_STRING = "This board is not yet supported for QEMU." - # Export for build.rs. -export LINKER_FILE +export LD_SCRIPT_PATH + -KERNEL_ELF = target/$(TARGET)/release/kernel + +##-------------------------------------------------------------------------------------------------- +## Generic configuration values +##-------------------------------------------------------------------------------------------------- +KERNEL_LINKER_SCRIPT = link.ld +KERNEL_ELF = target/$(TARGET)/release/kernel ##-------------------------------------------------------------------------------------------------- ## Command building blocks ##-------------------------------------------------------------------------------------------------- -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) -RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs +RUSTFLAGS = $(RUSTC_MISC_ARGS) \ + -C link-arg=--library-path=$(LD_SCRIPT_PATH) \ + -C link-arg=--script=$(KERNEL_LINKER_SCRIPT) + +RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) \ + -D warnings \ + -D missing_docs FEATURES = --features bsp_$(BSP) COMPILER_ARGS = --target=$(TARGET) \ diff --git a/02_runtime_init/README.md b/02_runtime_init/README.md index 221113ef..8b2c8ece 100644 --- a/02_runtime_init/README.md +++ b/02_runtime_init/README.md @@ -52,7 +52,7 @@ diff -uNr 01_wait_forever/Cargo.toml 02_runtime_init/Cargo.toml diff -uNr 01_wait_forever/Makefile 02_runtime_init/Makefile --- 01_wait_forever/Makefile +++ 02_runtime_init/Makefile -@@ -153,6 +153,8 @@ +@@ -162,6 +162,8 @@ $(call colorecho, "\nLaunching objdump") @$(DOCKER_TOOLS) $(OBJDUMP_BINARY) --disassemble --demangle \ --section .text \ diff --git a/02_runtime_init/build.rs b/02_runtime_init/build.rs index 883c5955..f53b9949 100644 --- a/02_runtime_init/build.rs +++ b/02_runtime_init/build.rs @@ -1,8 +1,17 @@ -use std::env; +use std::{env, fs}; fn main() { - let linker_file = env::var("LINKER_FILE").unwrap_or_default(); + let ld_script_path = env::var("LD_SCRIPT_PATH").unwrap_or_default(); - println!("cargo:rerun-if-changed={}", linker_file); - println!("cargo:rerun-if-changed=build.rs"); + let files = fs::read_dir(ld_script_path).unwrap(); + files + .filter_map(Result::ok) + .filter(|d| { + if let Some(e) = d.path().extension() { + e == "ld" + } else { + false + } + }) + .for_each(|f| println!("cargo:rerun-if-changed={}", f.path().display())); } diff --git a/03_hacky_hello_world/Makefile b/03_hacky_hello_world/Makefile index d64f1dcc..dfad06c5 100644 --- a/03_hacky_hello_world/Makefile +++ b/03_hacky_hello_world/Makefile @@ -15,10 +15,10 @@ BSP ?= rpi3 ##-------------------------------------------------------------------------------------------------- -## Hardcoded configuration values +## BSP-specific configuration values ##-------------------------------------------------------------------------------------------------- +QEMU_MISSING_STRING = "This board is not yet supported for QEMU." -# BSP-specific arguments. ifeq ($(BSP),rpi3) TARGET = aarch64-unknown-none-softfloat KERNEL_BIN = kernel8.img @@ -28,7 +28,7 @@ ifeq ($(BSP),rpi3) OBJDUMP_BINARY = aarch64-none-elf-objdump NM_BINARY = aarch64-none-elf-nm READELF_BINARY = aarch64-none-elf-readelf - LINKER_FILE = src/bsp/raspberrypi/link.ld + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) TARGET = aarch64-unknown-none-softfloat @@ -39,24 +39,33 @@ else ifeq ($(BSP),rpi4) OBJDUMP_BINARY = aarch64-none-elf-objdump NM_BINARY = aarch64-none-elf-nm READELF_BINARY = aarch64-none-elf-readelf - LINKER_FILE = src/bsp/raspberrypi/link.ld + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -QEMU_MISSING_STRING = "This board is not yet supported for QEMU." - # Export for build.rs. -export LINKER_FILE +export LD_SCRIPT_PATH + -KERNEL_ELF = target/$(TARGET)/release/kernel + +##-------------------------------------------------------------------------------------------------- +## Generic configuration values +##-------------------------------------------------------------------------------------------------- +KERNEL_LINKER_SCRIPT = link.ld +KERNEL_ELF = target/$(TARGET)/release/kernel ##-------------------------------------------------------------------------------------------------- ## Command building blocks ##-------------------------------------------------------------------------------------------------- -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) -RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs +RUSTFLAGS = $(RUSTC_MISC_ARGS) \ + -C link-arg=--library-path=$(LD_SCRIPT_PATH) \ + -C link-arg=--script=$(KERNEL_LINKER_SCRIPT) + +RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) \ + -D warnings \ + -D missing_docs FEATURES = --features bsp_$(BSP) COMPILER_ARGS = --target=$(TARGET) \ diff --git a/03_hacky_hello_world/README.md b/03_hacky_hello_world/README.md index b0cfee12..2614a4d7 100644 --- a/03_hacky_hello_world/README.md +++ b/03_hacky_hello_world/README.md @@ -70,7 +70,7 @@ diff -uNr 02_runtime_init/Makefile 03_hacky_hello_world/Makefile OBJDUMP_BINARY = aarch64-none-elf-objdump NM_BINARY = aarch64-none-elf-nm READELF_BINARY = aarch64-none-elf-readelf -@@ -71,17 +71,20 @@ +@@ -80,17 +80,20 @@ --strip-all \ -O binary @@ -94,7 +94,7 @@ diff -uNr 02_runtime_init/Makefile 03_hacky_hello_world/Makefile -@@ -169,3 +172,28 @@ +@@ -178,3 +181,28 @@ ##------------------------------------------------------------------------------ check: @RUSTFLAGS="$(RUSTFLAGS)" $(CHECK_CMD) --message-format=json diff --git a/03_hacky_hello_world/build.rs b/03_hacky_hello_world/build.rs index 883c5955..f53b9949 100644 --- a/03_hacky_hello_world/build.rs +++ b/03_hacky_hello_world/build.rs @@ -1,8 +1,17 @@ -use std::env; +use std::{env, fs}; fn main() { - let linker_file = env::var("LINKER_FILE").unwrap_or_default(); + let ld_script_path = env::var("LD_SCRIPT_PATH").unwrap_or_default(); - println!("cargo:rerun-if-changed={}", linker_file); - println!("cargo:rerun-if-changed=build.rs"); + let files = fs::read_dir(ld_script_path).unwrap(); + files + .filter_map(Result::ok) + .filter(|d| { + if let Some(e) = d.path().extension() { + e == "ld" + } else { + false + } + }) + .for_each(|f| println!("cargo:rerun-if-changed={}", f.path().display())); } diff --git a/04_safe_globals/Makefile b/04_safe_globals/Makefile index d64f1dcc..dfad06c5 100644 --- a/04_safe_globals/Makefile +++ b/04_safe_globals/Makefile @@ -15,10 +15,10 @@ BSP ?= rpi3 ##-------------------------------------------------------------------------------------------------- -## Hardcoded configuration values +## BSP-specific configuration values ##-------------------------------------------------------------------------------------------------- +QEMU_MISSING_STRING = "This board is not yet supported for QEMU." -# BSP-specific arguments. ifeq ($(BSP),rpi3) TARGET = aarch64-unknown-none-softfloat KERNEL_BIN = kernel8.img @@ -28,7 +28,7 @@ ifeq ($(BSP),rpi3) OBJDUMP_BINARY = aarch64-none-elf-objdump NM_BINARY = aarch64-none-elf-nm READELF_BINARY = aarch64-none-elf-readelf - LINKER_FILE = src/bsp/raspberrypi/link.ld + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) TARGET = aarch64-unknown-none-softfloat @@ -39,24 +39,33 @@ else ifeq ($(BSP),rpi4) OBJDUMP_BINARY = aarch64-none-elf-objdump NM_BINARY = aarch64-none-elf-nm READELF_BINARY = aarch64-none-elf-readelf - LINKER_FILE = src/bsp/raspberrypi/link.ld + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -QEMU_MISSING_STRING = "This board is not yet supported for QEMU." - # Export for build.rs. -export LINKER_FILE +export LD_SCRIPT_PATH + -KERNEL_ELF = target/$(TARGET)/release/kernel + +##-------------------------------------------------------------------------------------------------- +## Generic configuration values +##-------------------------------------------------------------------------------------------------- +KERNEL_LINKER_SCRIPT = link.ld +KERNEL_ELF = target/$(TARGET)/release/kernel ##-------------------------------------------------------------------------------------------------- ## Command building blocks ##-------------------------------------------------------------------------------------------------- -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) -RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs +RUSTFLAGS = $(RUSTC_MISC_ARGS) \ + -C link-arg=--library-path=$(LD_SCRIPT_PATH) \ + -C link-arg=--script=$(KERNEL_LINKER_SCRIPT) + +RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) \ + -D warnings \ + -D missing_docs FEATURES = --features bsp_$(BSP) COMPILER_ARGS = --target=$(TARGET) \ diff --git a/04_safe_globals/build.rs b/04_safe_globals/build.rs index 883c5955..f53b9949 100644 --- a/04_safe_globals/build.rs +++ b/04_safe_globals/build.rs @@ -1,8 +1,17 @@ -use std::env; +use std::{env, fs}; fn main() { - let linker_file = env::var("LINKER_FILE").unwrap_or_default(); + let ld_script_path = env::var("LD_SCRIPT_PATH").unwrap_or_default(); - println!("cargo:rerun-if-changed={}", linker_file); - println!("cargo:rerun-if-changed=build.rs"); + let files = fs::read_dir(ld_script_path).unwrap(); + files + .filter_map(Result::ok) + .filter(|d| { + if let Some(e) = d.path().extension() { + e == "ld" + } else { + false + } + }) + .for_each(|f| println!("cargo:rerun-if-changed={}", f.path().display())); } diff --git a/05_drivers_gpio_uart/Makefile b/05_drivers_gpio_uart/Makefile index 518a1d5f..78fd8d2f 100644 --- a/05_drivers_gpio_uart/Makefile +++ b/05_drivers_gpio_uart/Makefile @@ -18,10 +18,10 @@ DEV_SERIAL ?= /dev/ttyUSB0 ##-------------------------------------------------------------------------------------------------- -## Hardcoded configuration values +## BSP-specific configuration values ##-------------------------------------------------------------------------------------------------- +QEMU_MISSING_STRING = "This board is not yet supported for QEMU." -# BSP-specific arguments. ifeq ($(BSP),rpi3) TARGET = aarch64-unknown-none-softfloat KERNEL_BIN = kernel8.img @@ -31,7 +31,7 @@ ifeq ($(BSP),rpi3) OBJDUMP_BINARY = aarch64-none-elf-objdump NM_BINARY = aarch64-none-elf-nm READELF_BINARY = aarch64-none-elf-readelf - LINKER_FILE = src/bsp/raspberrypi/link.ld + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) TARGET = aarch64-unknown-none-softfloat @@ -42,24 +42,33 @@ else ifeq ($(BSP),rpi4) OBJDUMP_BINARY = aarch64-none-elf-objdump NM_BINARY = aarch64-none-elf-nm READELF_BINARY = aarch64-none-elf-readelf - LINKER_FILE = src/bsp/raspberrypi/link.ld + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -QEMU_MISSING_STRING = "This board is not yet supported for QEMU." - # Export for build.rs. -export LINKER_FILE +export LD_SCRIPT_PATH + -KERNEL_ELF = target/$(TARGET)/release/kernel + +##-------------------------------------------------------------------------------------------------- +## Generic configuration values +##-------------------------------------------------------------------------------------------------- +KERNEL_LINKER_SCRIPT = link.ld +KERNEL_ELF = target/$(TARGET)/release/kernel ##-------------------------------------------------------------------------------------------------- ## Command building blocks ##-------------------------------------------------------------------------------------------------- -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) -RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs +RUSTFLAGS = $(RUSTC_MISC_ARGS) \ + -C link-arg=--library-path=$(LD_SCRIPT_PATH) \ + -C link-arg=--script=$(KERNEL_LINKER_SCRIPT) + +RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) \ + -D warnings \ + -D missing_docs FEATURES = --features bsp_$(BSP) COMPILER_ARGS = --target=$(TARGET) \ diff --git a/05_drivers_gpio_uart/README.md b/05_drivers_gpio_uart/README.md index d49adf28..76840b67 100644 --- a/05_drivers_gpio_uart/README.md +++ b/05_drivers_gpio_uart/README.md @@ -155,7 +155,7 @@ diff -uNr 04_safe_globals/Makefile 05_drivers_gpio_uart/Makefile ##-------------------------------------------------------------------------------------------------- -@@ -73,6 +76,7 @@ +@@ -82,6 +85,7 @@ EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) EXEC_TEST_DISPATCH = ruby ../common/tests/dispatch.rb @@ -163,7 +163,7 @@ diff -uNr 04_safe_globals/Makefile 05_drivers_gpio_uart/Makefile ##------------------------------------------------------------------------------ ## Dockerization -@@ -80,18 +84,26 @@ +@@ -89,18 +93,26 @@ DOCKER_CMD = docker run -t --rm -v $(shell pwd):/work/tutorial -w /work/tutorial DOCKER_CMD_INTERACT = $(DOCKER_CMD) -i DOCKER_ARG_DIR_COMMON = -v $(shell pwd)/../common:/work/common @@ -191,7 +191,7 @@ diff -uNr 04_safe_globals/Makefile 05_drivers_gpio_uart/Makefile all: $(KERNEL_BIN) -@@ -131,6 +143,12 @@ +@@ -140,6 +152,12 @@ endif ##------------------------------------------------------------------------------ diff --git a/05_drivers_gpio_uart/build.rs b/05_drivers_gpio_uart/build.rs index 883c5955..f53b9949 100644 --- a/05_drivers_gpio_uart/build.rs +++ b/05_drivers_gpio_uart/build.rs @@ -1,8 +1,17 @@ -use std::env; +use std::{env, fs}; fn main() { - let linker_file = env::var("LINKER_FILE").unwrap_or_default(); + let ld_script_path = env::var("LD_SCRIPT_PATH").unwrap_or_default(); - println!("cargo:rerun-if-changed={}", linker_file); - println!("cargo:rerun-if-changed=build.rs"); + let files = fs::read_dir(ld_script_path).unwrap(); + files + .filter_map(Result::ok) + .filter(|d| { + if let Some(e) = d.path().extension() { + e == "ld" + } else { + false + } + }) + .for_each(|f| println!("cargo:rerun-if-changed={}", f.path().display())); } diff --git a/06_uart_chainloader/Makefile b/06_uart_chainloader/Makefile index 9cddeddb..99b464c8 100644 --- a/06_uart_chainloader/Makefile +++ b/06_uart_chainloader/Makefile @@ -18,10 +18,10 @@ DEV_SERIAL ?= /dev/ttyUSB0 ##-------------------------------------------------------------------------------------------------- -## Hardcoded configuration values +## BSP-specific configuration values ##-------------------------------------------------------------------------------------------------- +QEMU_MISSING_STRING = "This board is not yet supported for QEMU." -# BSP-specific arguments. ifeq ($(BSP),rpi3) TARGET = aarch64-unknown-none-softfloat KERNEL_BIN = kernel8.img @@ -31,7 +31,7 @@ ifeq ($(BSP),rpi3) OBJDUMP_BINARY = aarch64-none-elf-objdump NM_BINARY = aarch64-none-elf-nm READELF_BINARY = aarch64-none-elf-readelf - LINKER_FILE = src/bsp/raspberrypi/link.ld + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 CHAINBOOT_DEMO_PAYLOAD = demo_payload_rpi3.img else ifeq ($(BSP),rpi4) @@ -43,25 +43,34 @@ else ifeq ($(BSP),rpi4) OBJDUMP_BINARY = aarch64-none-elf-objdump NM_BINARY = aarch64-none-elf-nm READELF_BINARY = aarch64-none-elf-readelf - LINKER_FILE = src/bsp/raspberrypi/link.ld + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 CHAINBOOT_DEMO_PAYLOAD = demo_payload_rpi4.img endif -QEMU_MISSING_STRING = "This board is not yet supported for QEMU." - # Export for build.rs. -export LINKER_FILE +export LD_SCRIPT_PATH + -KERNEL_ELF = target/$(TARGET)/release/kernel + +##-------------------------------------------------------------------------------------------------- +## Generic configuration values +##-------------------------------------------------------------------------------------------------- +KERNEL_LINKER_SCRIPT = link.ld +KERNEL_ELF = target/$(TARGET)/release/kernel ##-------------------------------------------------------------------------------------------------- ## Command building blocks ##-------------------------------------------------------------------------------------------------- -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) -RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs +RUSTFLAGS = $(RUSTC_MISC_ARGS) \ + -C link-arg=--library-path=$(LD_SCRIPT_PATH) \ + -C link-arg=--script=$(KERNEL_LINKER_SCRIPT) + +RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) \ + -D warnings \ + -D missing_docs FEATURES = --features bsp_$(BSP) COMPILER_ARGS = --target=$(TARGET) \ diff --git a/06_uart_chainloader/README.md b/06_uart_chainloader/README.md index 6f786dd8..81d93d12 100644 --- a/06_uart_chainloader/README.md +++ b/06_uart_chainloader/README.md @@ -139,8 +139,8 @@ diff -uNr 05_drivers_gpio_uart/Makefile 06_uart_chainloader/Makefile --- 05_drivers_gpio_uart/Makefile +++ 06_uart_chainloader/Makefile @@ -23,27 +23,29 @@ + QEMU_MISSING_STRING = "This board is not yet supported for QEMU." - # BSP-specific arguments. ifeq ($(BSP),rpi3) - TARGET = aarch64-unknown-none-softfloat - KERNEL_BIN = kernel8.img @@ -150,8 +150,6 @@ diff -uNr 05_drivers_gpio_uart/Makefile 06_uart_chainloader/Makefile - OBJDUMP_BINARY = aarch64-none-elf-objdump - NM_BINARY = aarch64-none-elf-nm - READELF_BINARY = aarch64-none-elf-readelf -- LINKER_FILE = src/bsp/raspberrypi/link.ld -- RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 + TARGET = aarch64-unknown-none-softfloat + KERNEL_BIN = kernel8.img + QEMU_BINARY = qemu-system-aarch64 @@ -160,7 +158,8 @@ diff -uNr 05_drivers_gpio_uart/Makefile 06_uart_chainloader/Makefile + OBJDUMP_BINARY = aarch64-none-elf-objdump + NM_BINARY = aarch64-none-elf-nm + READELF_BINARY = aarch64-none-elf-readelf -+ LINKER_FILE = src/bsp/raspberrypi/link.ld + LD_SCRIPT_PATH = src/bsp/raspberrypi +- RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 + RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 + CHAINBOOT_DEMO_PAYLOAD = demo_payload_rpi3.img else ifeq ($(BSP),rpi4) @@ -172,8 +171,6 @@ diff -uNr 05_drivers_gpio_uart/Makefile 06_uart_chainloader/Makefile - OBJDUMP_BINARY = aarch64-none-elf-objdump - NM_BINARY = aarch64-none-elf-nm - READELF_BINARY = aarch64-none-elf-readelf -- LINKER_FILE = src/bsp/raspberrypi/link.ld -- RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 + TARGET = aarch64-unknown-none-softfloat + KERNEL_BIN = kernel8.img + QEMU_BINARY = qemu-system-aarch64 @@ -182,13 +179,14 @@ diff -uNr 05_drivers_gpio_uart/Makefile 06_uart_chainloader/Makefile + OBJDUMP_BINARY = aarch64-none-elf-objdump + NM_BINARY = aarch64-none-elf-nm + READELF_BINARY = aarch64-none-elf-readelf -+ LINKER_FILE = src/bsp/raspberrypi/link.ld + LD_SCRIPT_PATH = src/bsp/raspberrypi +- RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 + RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 + CHAINBOOT_DEMO_PAYLOAD = demo_payload_rpi4.img endif - QEMU_MISSING_STRING = "This board is not yet supported for QEMU." -@@ -75,8 +77,8 @@ + # Export for build.rs. +@@ -84,8 +86,8 @@ -O binary EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) @@ -199,7 +197,7 @@ diff -uNr 05_drivers_gpio_uart/Makefile 06_uart_chainloader/Makefile ##------------------------------------------------------------------------------ ## Dockerization -@@ -95,7 +97,7 @@ +@@ -104,7 +106,7 @@ ifeq ($(shell uname -s),Linux) DOCKER_CMD_DEV = $(DOCKER_CMD_INTERACT) $(DOCKER_ARG_DEV) @@ -208,7 +206,7 @@ diff -uNr 05_drivers_gpio_uart/Makefile 06_uart_chainloader/Makefile endif -@@ -103,7 +105,7 @@ +@@ -112,7 +114,7 @@ ##-------------------------------------------------------------------------------------------------- ## Targets ##-------------------------------------------------------------------------------------------------- @@ -217,7 +215,7 @@ diff -uNr 05_drivers_gpio_uart/Makefile 06_uart_chainloader/Makefile all: $(KERNEL_BIN) -@@ -132,7 +134,7 @@ +@@ -141,7 +143,7 @@ ##------------------------------------------------------------------------------ ifeq ($(QEMU_MACHINE_TYPE),) # QEMU is not supported for the board. @@ -226,7 +224,7 @@ diff -uNr 05_drivers_gpio_uart/Makefile 06_uart_chainloader/Makefile $(call colorecho, "\n$(QEMU_MISSING_STRING)") else # QEMU is supported. -@@ -140,13 +142,18 @@ +@@ -149,13 +151,18 @@ qemu: $(KERNEL_BIN) $(call colorecho, "\nLaunching QEMU") @$(DOCKER_QEMU) $(EXEC_QEMU) $(QEMU_RELEASE_ARGS) -kernel $(KERNEL_BIN) @@ -248,7 +246,7 @@ diff -uNr 05_drivers_gpio_uart/Makefile 06_uart_chainloader/Makefile ##------------------------------------------------------------------------------ ## Run clippy -@@ -210,7 +217,8 @@ +@@ -219,7 +226,8 @@ ##------------------------------------------------------------------------------ test_boot: $(KERNEL_BIN) $(call colorecho, "\nBoot test - $(BSP)") diff --git a/06_uart_chainloader/build.rs b/06_uart_chainloader/build.rs index 883c5955..f53b9949 100644 --- a/06_uart_chainloader/build.rs +++ b/06_uart_chainloader/build.rs @@ -1,8 +1,17 @@ -use std::env; +use std::{env, fs}; fn main() { - let linker_file = env::var("LINKER_FILE").unwrap_or_default(); + let ld_script_path = env::var("LD_SCRIPT_PATH").unwrap_or_default(); - println!("cargo:rerun-if-changed={}", linker_file); - println!("cargo:rerun-if-changed=build.rs"); + let files = fs::read_dir(ld_script_path).unwrap(); + files + .filter_map(Result::ok) + .filter(|d| { + if let Some(e) = d.path().extension() { + e == "ld" + } else { + false + } + }) + .for_each(|f| println!("cargo:rerun-if-changed={}", f.path().display())); } diff --git a/07_timestamps/Makefile b/07_timestamps/Makefile index 7a97517f..562ccfa6 100644 --- a/07_timestamps/Makefile +++ b/07_timestamps/Makefile @@ -18,10 +18,10 @@ DEV_SERIAL ?= /dev/ttyUSB0 ##-------------------------------------------------------------------------------------------------- -## Hardcoded configuration values +## BSP-specific configuration values ##-------------------------------------------------------------------------------------------------- +QEMU_MISSING_STRING = "This board is not yet supported for QEMU." -# BSP-specific arguments. ifeq ($(BSP),rpi3) TARGET = aarch64-unknown-none-softfloat KERNEL_BIN = kernel8.img @@ -31,7 +31,7 @@ ifeq ($(BSP),rpi3) OBJDUMP_BINARY = aarch64-none-elf-objdump NM_BINARY = aarch64-none-elf-nm READELF_BINARY = aarch64-none-elf-readelf - LINKER_FILE = src/bsp/raspberrypi/link.ld + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) TARGET = aarch64-unknown-none-softfloat @@ -42,24 +42,33 @@ else ifeq ($(BSP),rpi4) OBJDUMP_BINARY = aarch64-none-elf-objdump NM_BINARY = aarch64-none-elf-nm READELF_BINARY = aarch64-none-elf-readelf - LINKER_FILE = src/bsp/raspberrypi/link.ld + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -QEMU_MISSING_STRING = "This board is not yet supported for QEMU." - # Export for build.rs. -export LINKER_FILE +export LD_SCRIPT_PATH + -KERNEL_ELF = target/$(TARGET)/release/kernel + +##-------------------------------------------------------------------------------------------------- +## Generic configuration values +##-------------------------------------------------------------------------------------------------- +KERNEL_LINKER_SCRIPT = link.ld +KERNEL_ELF = target/$(TARGET)/release/kernel ##-------------------------------------------------------------------------------------------------- ## Command building blocks ##-------------------------------------------------------------------------------------------------- -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) -RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs +RUSTFLAGS = $(RUSTC_MISC_ARGS) \ + -C link-arg=--library-path=$(LD_SCRIPT_PATH) \ + -C link-arg=--script=$(KERNEL_LINKER_SCRIPT) + +RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) \ + -D warnings \ + -D missing_docs FEATURES = --features bsp_$(BSP) COMPILER_ARGS = --target=$(TARGET) \ diff --git a/07_timestamps/README.md b/07_timestamps/README.md index e6796930..f8d67d40 100644 --- a/07_timestamps/README.md +++ b/07_timestamps/README.md @@ -63,8 +63,8 @@ diff -uNr 06_uart_chainloader/Makefile 07_timestamps/Makefile --- 06_uart_chainloader/Makefile +++ 07_timestamps/Makefile @@ -23,29 +23,27 @@ + QEMU_MISSING_STRING = "This board is not yet supported for QEMU." - # BSP-specific arguments. ifeq ($(BSP),rpi3) - TARGET = aarch64-unknown-none-softfloat - KERNEL_BIN = kernel8.img @@ -74,9 +74,6 @@ diff -uNr 06_uart_chainloader/Makefile 07_timestamps/Makefile - OBJDUMP_BINARY = aarch64-none-elf-objdump - NM_BINARY = aarch64-none-elf-nm - READELF_BINARY = aarch64-none-elf-readelf -- LINKER_FILE = src/bsp/raspberrypi/link.ld -- RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 -- CHAINBOOT_DEMO_PAYLOAD = demo_payload_rpi3.img + TARGET = aarch64-unknown-none-softfloat + KERNEL_BIN = kernel8.img + QEMU_BINARY = qemu-system-aarch64 @@ -85,7 +82,9 @@ diff -uNr 06_uart_chainloader/Makefile 07_timestamps/Makefile + OBJDUMP_BINARY = aarch64-none-elf-objdump + NM_BINARY = aarch64-none-elf-nm + READELF_BINARY = aarch64-none-elf-readelf -+ LINKER_FILE = src/bsp/raspberrypi/link.ld + LD_SCRIPT_PATH = src/bsp/raspberrypi +- RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 +- CHAINBOOT_DEMO_PAYLOAD = demo_payload_rpi3.img + RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) - TARGET = aarch64-unknown-none-softfloat @@ -96,9 +95,6 @@ diff -uNr 06_uart_chainloader/Makefile 07_timestamps/Makefile - OBJDUMP_BINARY = aarch64-none-elf-objdump - NM_BINARY = aarch64-none-elf-nm - READELF_BINARY = aarch64-none-elf-readelf -- LINKER_FILE = src/bsp/raspberrypi/link.ld -- RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 -- CHAINBOOT_DEMO_PAYLOAD = demo_payload_rpi4.img + TARGET = aarch64-unknown-none-softfloat + KERNEL_BIN = kernel8.img + QEMU_BINARY = qemu-system-aarch64 @@ -107,12 +103,14 @@ diff -uNr 06_uart_chainloader/Makefile 07_timestamps/Makefile + OBJDUMP_BINARY = aarch64-none-elf-objdump + NM_BINARY = aarch64-none-elf-nm + READELF_BINARY = aarch64-none-elf-readelf -+ LINKER_FILE = src/bsp/raspberrypi/link.ld + LD_SCRIPT_PATH = src/bsp/raspberrypi +- RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 +- CHAINBOOT_DEMO_PAYLOAD = demo_payload_rpi4.img + RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif - QEMU_MISSING_STRING = "This board is not yet supported for QEMU." -@@ -77,7 +75,7 @@ + # Export for build.rs. +@@ -86,7 +84,7 @@ -O binary EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) @@ -121,7 +119,7 @@ diff -uNr 06_uart_chainloader/Makefile 07_timestamps/Makefile EXEC_MINIPUSH = ruby ../common/serial/minipush.rb ##------------------------------------------------------------------------------ -@@ -134,7 +132,7 @@ +@@ -143,7 +141,7 @@ ##------------------------------------------------------------------------------ ifeq ($(QEMU_MACHINE_TYPE),) # QEMU is not supported for the board. @@ -130,7 +128,7 @@ diff -uNr 06_uart_chainloader/Makefile 07_timestamps/Makefile $(call colorecho, "\n$(QEMU_MISSING_STRING)") else # QEMU is supported. -@@ -143,17 +141,13 @@ +@@ -152,17 +150,13 @@ $(call colorecho, "\nLaunching QEMU") @$(DOCKER_QEMU) $(EXEC_QEMU) $(QEMU_RELEASE_ARGS) -kernel $(KERNEL_BIN) @@ -149,7 +147,7 @@ diff -uNr 06_uart_chainloader/Makefile 07_timestamps/Makefile ##------------------------------------------------------------------------------ ## Run clippy -@@ -217,8 +211,7 @@ +@@ -226,8 +220,7 @@ ##------------------------------------------------------------------------------ test_boot: $(KERNEL_BIN) $(call colorecho, "\nBoot test - $(BSP)") diff --git a/07_timestamps/build.rs b/07_timestamps/build.rs index 883c5955..f53b9949 100644 --- a/07_timestamps/build.rs +++ b/07_timestamps/build.rs @@ -1,8 +1,17 @@ -use std::env; +use std::{env, fs}; fn main() { - let linker_file = env::var("LINKER_FILE").unwrap_or_default(); + let ld_script_path = env::var("LD_SCRIPT_PATH").unwrap_or_default(); - println!("cargo:rerun-if-changed={}", linker_file); - println!("cargo:rerun-if-changed=build.rs"); + let files = fs::read_dir(ld_script_path).unwrap(); + files + .filter_map(Result::ok) + .filter(|d| { + if let Some(e) = d.path().extension() { + e == "ld" + } else { + false + } + }) + .for_each(|f| println!("cargo:rerun-if-changed={}", f.path().display())); } diff --git a/08_hw_debug_JTAG/Makefile b/08_hw_debug_JTAG/Makefile index 5b1c2339..1ec96d4a 100644 --- a/08_hw_debug_JTAG/Makefile +++ b/08_hw_debug_JTAG/Makefile @@ -18,10 +18,10 @@ DEV_SERIAL ?= /dev/ttyUSB0 ##-------------------------------------------------------------------------------------------------- -## Hardcoded configuration values +## BSP-specific configuration values ##-------------------------------------------------------------------------------------------------- +QEMU_MISSING_STRING = "This board is not yet supported for QEMU." -# BSP-specific arguments. ifeq ($(BSP),rpi3) TARGET = aarch64-unknown-none-softfloat KERNEL_BIN = kernel8.img @@ -33,7 +33,7 @@ ifeq ($(BSP),rpi3) READELF_BINARY = aarch64-none-elf-readelf 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 + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) TARGET = aarch64-unknown-none-softfloat @@ -46,24 +46,33 @@ else ifeq ($(BSP),rpi4) READELF_BINARY = aarch64-none-elf-readelf 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 + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -QEMU_MISSING_STRING = "This board is not yet supported for QEMU." - # Export for build.rs. -export LINKER_FILE +export LD_SCRIPT_PATH + -KERNEL_ELF = target/$(TARGET)/release/kernel + +##-------------------------------------------------------------------------------------------------- +## Generic configuration values +##-------------------------------------------------------------------------------------------------- +KERNEL_LINKER_SCRIPT = link.ld +KERNEL_ELF = target/$(TARGET)/release/kernel ##-------------------------------------------------------------------------------------------------- ## Command building blocks ##-------------------------------------------------------------------------------------------------- -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) -RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs +RUSTFLAGS = $(RUSTC_MISC_ARGS) \ + -C link-arg=--library-path=$(LD_SCRIPT_PATH) \ + -C link-arg=--script=$(KERNEL_LINKER_SCRIPT) + +RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) \ + -D warnings \ + -D missing_docs FEATURES = --features bsp_$(BSP) COMPILER_ARGS = --target=$(TARGET) \ diff --git a/08_hw_debug_JTAG/README.md b/08_hw_debug_JTAG/README.md index 0742cdf1..ea116a8b 100644 --- a/08_hw_debug_JTAG/README.md +++ b/08_hw_debug_JTAG/README.md @@ -326,7 +326,7 @@ diff -uNr 07_timestamps/Makefile 08_hw_debug_JTAG/Makefile READELF_BINARY = aarch64-none-elf-readelf + 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 + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) @@ -42,6 +44,8 @@ @@ -335,10 +335,10 @@ diff -uNr 07_timestamps/Makefile 08_hw_debug_JTAG/Makefile READELF_BINARY = aarch64-none-elf-readelf + 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 + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -@@ -84,18 +88,25 @@ +@@ -93,18 +97,25 @@ DOCKER_CMD = docker run -t --rm -v $(shell pwd):/work/tutorial -w /work/tutorial DOCKER_CMD_INTERACT = $(DOCKER_CMD) -i DOCKER_ARG_DIR_COMMON = -v $(shell pwd)/../common:/work/common @@ -364,7 +364,7 @@ diff -uNr 07_timestamps/Makefile 08_hw_debug_JTAG/Makefile endif -@@ -194,6 +205,35 @@ +@@ -203,6 +214,35 @@ diff --git a/08_hw_debug_JTAG/build.rs b/08_hw_debug_JTAG/build.rs index 883c5955..f53b9949 100644 --- a/08_hw_debug_JTAG/build.rs +++ b/08_hw_debug_JTAG/build.rs @@ -1,8 +1,17 @@ -use std::env; +use std::{env, fs}; fn main() { - let linker_file = env::var("LINKER_FILE").unwrap_or_default(); + let ld_script_path = env::var("LD_SCRIPT_PATH").unwrap_or_default(); - println!("cargo:rerun-if-changed={}", linker_file); - println!("cargo:rerun-if-changed=build.rs"); + let files = fs::read_dir(ld_script_path).unwrap(); + files + .filter_map(Result::ok) + .filter(|d| { + if let Some(e) = d.path().extension() { + e == "ld" + } else { + false + } + }) + .for_each(|f| println!("cargo:rerun-if-changed={}", f.path().display())); } diff --git a/09_privilege_level/Makefile b/09_privilege_level/Makefile index 5b1c2339..1ec96d4a 100644 --- a/09_privilege_level/Makefile +++ b/09_privilege_level/Makefile @@ -18,10 +18,10 @@ DEV_SERIAL ?= /dev/ttyUSB0 ##-------------------------------------------------------------------------------------------------- -## Hardcoded configuration values +## BSP-specific configuration values ##-------------------------------------------------------------------------------------------------- +QEMU_MISSING_STRING = "This board is not yet supported for QEMU." -# BSP-specific arguments. ifeq ($(BSP),rpi3) TARGET = aarch64-unknown-none-softfloat KERNEL_BIN = kernel8.img @@ -33,7 +33,7 @@ ifeq ($(BSP),rpi3) READELF_BINARY = aarch64-none-elf-readelf 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 + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) TARGET = aarch64-unknown-none-softfloat @@ -46,24 +46,33 @@ else ifeq ($(BSP),rpi4) READELF_BINARY = aarch64-none-elf-readelf 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 + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -QEMU_MISSING_STRING = "This board is not yet supported for QEMU." - # Export for build.rs. -export LINKER_FILE +export LD_SCRIPT_PATH + -KERNEL_ELF = target/$(TARGET)/release/kernel + +##-------------------------------------------------------------------------------------------------- +## Generic configuration values +##-------------------------------------------------------------------------------------------------- +KERNEL_LINKER_SCRIPT = link.ld +KERNEL_ELF = target/$(TARGET)/release/kernel ##-------------------------------------------------------------------------------------------------- ## Command building blocks ##-------------------------------------------------------------------------------------------------- -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) -RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs +RUSTFLAGS = $(RUSTC_MISC_ARGS) \ + -C link-arg=--library-path=$(LD_SCRIPT_PATH) \ + -C link-arg=--script=$(KERNEL_LINKER_SCRIPT) + +RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) \ + -D warnings \ + -D missing_docs FEATURES = --features bsp_$(BSP) COMPILER_ARGS = --target=$(TARGET) \ diff --git a/09_privilege_level/build.rs b/09_privilege_level/build.rs index 883c5955..f53b9949 100644 --- a/09_privilege_level/build.rs +++ b/09_privilege_level/build.rs @@ -1,8 +1,17 @@ -use std::env; +use std::{env, fs}; fn main() { - let linker_file = env::var("LINKER_FILE").unwrap_or_default(); + let ld_script_path = env::var("LD_SCRIPT_PATH").unwrap_or_default(); - println!("cargo:rerun-if-changed={}", linker_file); - println!("cargo:rerun-if-changed=build.rs"); + let files = fs::read_dir(ld_script_path).unwrap(); + files + .filter_map(Result::ok) + .filter(|d| { + if let Some(e) = d.path().extension() { + e == "ld" + } else { + false + } + }) + .for_each(|f| println!("cargo:rerun-if-changed={}", f.path().display())); } diff --git a/10_virtual_mem_part1_identity_mapping/Makefile b/10_virtual_mem_part1_identity_mapping/Makefile index 5b1c2339..1ec96d4a 100644 --- a/10_virtual_mem_part1_identity_mapping/Makefile +++ b/10_virtual_mem_part1_identity_mapping/Makefile @@ -18,10 +18,10 @@ DEV_SERIAL ?= /dev/ttyUSB0 ##-------------------------------------------------------------------------------------------------- -## Hardcoded configuration values +## BSP-specific configuration values ##-------------------------------------------------------------------------------------------------- +QEMU_MISSING_STRING = "This board is not yet supported for QEMU." -# BSP-specific arguments. ifeq ($(BSP),rpi3) TARGET = aarch64-unknown-none-softfloat KERNEL_BIN = kernel8.img @@ -33,7 +33,7 @@ ifeq ($(BSP),rpi3) READELF_BINARY = aarch64-none-elf-readelf 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 + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) TARGET = aarch64-unknown-none-softfloat @@ -46,24 +46,33 @@ else ifeq ($(BSP),rpi4) READELF_BINARY = aarch64-none-elf-readelf 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 + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -QEMU_MISSING_STRING = "This board is not yet supported for QEMU." - # Export for build.rs. -export LINKER_FILE +export LD_SCRIPT_PATH + -KERNEL_ELF = target/$(TARGET)/release/kernel + +##-------------------------------------------------------------------------------------------------- +## Generic configuration values +##-------------------------------------------------------------------------------------------------- +KERNEL_LINKER_SCRIPT = link.ld +KERNEL_ELF = target/$(TARGET)/release/kernel ##-------------------------------------------------------------------------------------------------- ## Command building blocks ##-------------------------------------------------------------------------------------------------- -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) -RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs +RUSTFLAGS = $(RUSTC_MISC_ARGS) \ + -C link-arg=--library-path=$(LD_SCRIPT_PATH) \ + -C link-arg=--script=$(KERNEL_LINKER_SCRIPT) + +RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) \ + -D warnings \ + -D missing_docs FEATURES = --features bsp_$(BSP) COMPILER_ARGS = --target=$(TARGET) \ diff --git a/10_virtual_mem_part1_identity_mapping/build.rs b/10_virtual_mem_part1_identity_mapping/build.rs index 883c5955..f53b9949 100644 --- a/10_virtual_mem_part1_identity_mapping/build.rs +++ b/10_virtual_mem_part1_identity_mapping/build.rs @@ -1,8 +1,17 @@ -use std::env; +use std::{env, fs}; fn main() { - let linker_file = env::var("LINKER_FILE").unwrap_or_default(); + let ld_script_path = env::var("LD_SCRIPT_PATH").unwrap_or_default(); - println!("cargo:rerun-if-changed={}", linker_file); - println!("cargo:rerun-if-changed=build.rs"); + let files = fs::read_dir(ld_script_path).unwrap(); + files + .filter_map(Result::ok) + .filter(|d| { + if let Some(e) = d.path().extension() { + e == "ld" + } else { + false + } + }) + .for_each(|f| println!("cargo:rerun-if-changed={}", f.path().display())); } diff --git a/11_exceptions_part1_groundwork/Makefile b/11_exceptions_part1_groundwork/Makefile index 5b1c2339..1ec96d4a 100644 --- a/11_exceptions_part1_groundwork/Makefile +++ b/11_exceptions_part1_groundwork/Makefile @@ -18,10 +18,10 @@ DEV_SERIAL ?= /dev/ttyUSB0 ##-------------------------------------------------------------------------------------------------- -## Hardcoded configuration values +## BSP-specific configuration values ##-------------------------------------------------------------------------------------------------- +QEMU_MISSING_STRING = "This board is not yet supported for QEMU." -# BSP-specific arguments. ifeq ($(BSP),rpi3) TARGET = aarch64-unknown-none-softfloat KERNEL_BIN = kernel8.img @@ -33,7 +33,7 @@ ifeq ($(BSP),rpi3) READELF_BINARY = aarch64-none-elf-readelf 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 + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) TARGET = aarch64-unknown-none-softfloat @@ -46,24 +46,33 @@ else ifeq ($(BSP),rpi4) READELF_BINARY = aarch64-none-elf-readelf 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 + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -QEMU_MISSING_STRING = "This board is not yet supported for QEMU." - # Export for build.rs. -export LINKER_FILE +export LD_SCRIPT_PATH + -KERNEL_ELF = target/$(TARGET)/release/kernel + +##-------------------------------------------------------------------------------------------------- +## Generic configuration values +##-------------------------------------------------------------------------------------------------- +KERNEL_LINKER_SCRIPT = link.ld +KERNEL_ELF = target/$(TARGET)/release/kernel ##-------------------------------------------------------------------------------------------------- ## Command building blocks ##-------------------------------------------------------------------------------------------------- -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) -RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs +RUSTFLAGS = $(RUSTC_MISC_ARGS) \ + -C link-arg=--library-path=$(LD_SCRIPT_PATH) \ + -C link-arg=--script=$(KERNEL_LINKER_SCRIPT) + +RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) \ + -D warnings \ + -D missing_docs FEATURES = --features bsp_$(BSP) COMPILER_ARGS = --target=$(TARGET) \ diff --git a/11_exceptions_part1_groundwork/build.rs b/11_exceptions_part1_groundwork/build.rs index 883c5955..f53b9949 100644 --- a/11_exceptions_part1_groundwork/build.rs +++ b/11_exceptions_part1_groundwork/build.rs @@ -1,8 +1,17 @@ -use std::env; +use std::{env, fs}; fn main() { - let linker_file = env::var("LINKER_FILE").unwrap_or_default(); + let ld_script_path = env::var("LD_SCRIPT_PATH").unwrap_or_default(); - println!("cargo:rerun-if-changed={}", linker_file); - println!("cargo:rerun-if-changed=build.rs"); + let files = fs::read_dir(ld_script_path).unwrap(); + files + .filter_map(Result::ok) + .filter(|d| { + if let Some(e) = d.path().extension() { + e == "ld" + } else { + false + } + }) + .for_each(|f| println!("cargo:rerun-if-changed={}", f.path().display())); } diff --git a/12_integrated_testing/Makefile b/12_integrated_testing/Makefile index e9ed2d27..a1db677b 100644 --- a/12_integrated_testing/Makefile +++ b/12_integrated_testing/Makefile @@ -25,10 +25,10 @@ endif ##-------------------------------------------------------------------------------------------------- -## Hardcoded configuration values +## BSP-specific configuration values ##-------------------------------------------------------------------------------------------------- +QEMU_MISSING_STRING = "This board is not yet supported for QEMU." -# BSP-specific arguments. ifeq ($(BSP),rpi3) TARGET = aarch64-unknown-none-softfloat KERNEL_BIN = kernel8.img @@ -41,7 +41,7 @@ ifeq ($(BSP),rpi3) READELF_BINARY = aarch64-none-elf-readelf 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 + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) TARGET = aarch64-unknown-none-softfloat @@ -55,24 +55,33 @@ else ifeq ($(BSP),rpi4) READELF_BINARY = aarch64-none-elf-readelf 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 + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -QEMU_MISSING_STRING = "This board is not yet supported for QEMU." - # Export for build.rs. -export LINKER_FILE +export LD_SCRIPT_PATH + -KERNEL_ELF = target/$(TARGET)/release/kernel + +##-------------------------------------------------------------------------------------------------- +## Generic configuration values +##-------------------------------------------------------------------------------------------------- +KERNEL_LINKER_SCRIPT = link.ld +KERNEL_ELF = target/$(TARGET)/release/kernel ##-------------------------------------------------------------------------------------------------- ## Command building blocks ##-------------------------------------------------------------------------------------------------- -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) -RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs +RUSTFLAGS = $(RUSTC_MISC_ARGS) \ + -C link-arg=--library-path=$(LD_SCRIPT_PATH) \ + -C link-arg=--script=$(KERNEL_LINKER_SCRIPT) + +RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) \ + -D warnings \ + -D missing_docs FEATURES = --features bsp_$(BSP) COMPILER_ARGS = --target=$(TARGET) \ diff --git a/12_integrated_testing/README.md b/12_integrated_testing/README.md index 698ad1b0..ce94c219 100644 --- a/12_integrated_testing/README.md +++ b/12_integrated_testing/README.md @@ -1006,7 +1006,7 @@ diff -uNr 11_exceptions_part1_groundwork/Makefile 12_integrated_testing/Makefile OBJDUMP_BINARY = aarch64-none-elf-objdump NM_BINARY = aarch64-none-elf-nm READELF_BINARY = aarch64-none-elf-readelf -@@ -74,6 +83,7 @@ +@@ -83,6 +92,7 @@ DOC_CMD = cargo doc $(COMPILER_ARGS) CLIPPY_CMD = cargo clippy $(COMPILER_ARGS) CHECK_CMD = cargo check $(COMPILER_ARGS) @@ -1014,7 +1014,7 @@ diff -uNr 11_exceptions_part1_groundwork/Makefile 12_integrated_testing/Makefile OBJCOPY_CMD = rust-objcopy \ --strip-all \ -O binary -@@ -237,11 +247,11 @@ +@@ -246,11 +256,11 @@ ##-------------------------------------------------------------------------------------------------- ## Testing targets ##-------------------------------------------------------------------------------------------------- @@ -1028,7 +1028,7 @@ diff -uNr 11_exceptions_part1_groundwork/Makefile 12_integrated_testing/Makefile $(call colorecho, "\n$(QEMU_MISSING_STRING)") else # QEMU is supported. -@@ -253,6 +263,43 @@ +@@ -262,6 +272,43 @@ $(call colorecho, "\nBoot test - $(BSP)") @$(DOCKER_TEST) $(EXEC_TEST_DISPATCH) $(EXEC_QEMU) $(QEMU_RELEASE_ARGS) -kernel $(KERNEL_BIN) diff --git a/12_integrated_testing/build.rs b/12_integrated_testing/build.rs index 883c5955..f53b9949 100644 --- a/12_integrated_testing/build.rs +++ b/12_integrated_testing/build.rs @@ -1,8 +1,17 @@ -use std::env; +use std::{env, fs}; fn main() { - let linker_file = env::var("LINKER_FILE").unwrap_or_default(); + let ld_script_path = env::var("LD_SCRIPT_PATH").unwrap_or_default(); - println!("cargo:rerun-if-changed={}", linker_file); - println!("cargo:rerun-if-changed=build.rs"); + let files = fs::read_dir(ld_script_path).unwrap(); + files + .filter_map(Result::ok) + .filter(|d| { + if let Some(e) = d.path().extension() { + e == "ld" + } else { + false + } + }) + .for_each(|f| println!("cargo:rerun-if-changed={}", f.path().display())); } diff --git a/13_exceptions_part2_peripheral_IRQs/Makefile b/13_exceptions_part2_peripheral_IRQs/Makefile index e9ed2d27..a1db677b 100644 --- a/13_exceptions_part2_peripheral_IRQs/Makefile +++ b/13_exceptions_part2_peripheral_IRQs/Makefile @@ -25,10 +25,10 @@ endif ##-------------------------------------------------------------------------------------------------- -## Hardcoded configuration values +## BSP-specific configuration values ##-------------------------------------------------------------------------------------------------- +QEMU_MISSING_STRING = "This board is not yet supported for QEMU." -# BSP-specific arguments. ifeq ($(BSP),rpi3) TARGET = aarch64-unknown-none-softfloat KERNEL_BIN = kernel8.img @@ -41,7 +41,7 @@ ifeq ($(BSP),rpi3) READELF_BINARY = aarch64-none-elf-readelf 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 + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) TARGET = aarch64-unknown-none-softfloat @@ -55,24 +55,33 @@ else ifeq ($(BSP),rpi4) READELF_BINARY = aarch64-none-elf-readelf 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 + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -QEMU_MISSING_STRING = "This board is not yet supported for QEMU." - # Export for build.rs. -export LINKER_FILE +export LD_SCRIPT_PATH + -KERNEL_ELF = target/$(TARGET)/release/kernel + +##-------------------------------------------------------------------------------------------------- +## Generic configuration values +##-------------------------------------------------------------------------------------------------- +KERNEL_LINKER_SCRIPT = link.ld +KERNEL_ELF = target/$(TARGET)/release/kernel ##-------------------------------------------------------------------------------------------------- ## Command building blocks ##-------------------------------------------------------------------------------------------------- -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) -RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs +RUSTFLAGS = $(RUSTC_MISC_ARGS) \ + -C link-arg=--library-path=$(LD_SCRIPT_PATH) \ + -C link-arg=--script=$(KERNEL_LINKER_SCRIPT) + +RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) \ + -D warnings \ + -D missing_docs FEATURES = --features bsp_$(BSP) COMPILER_ARGS = --target=$(TARGET) \ diff --git a/13_exceptions_part2_peripheral_IRQs/build.rs b/13_exceptions_part2_peripheral_IRQs/build.rs index 883c5955..f53b9949 100644 --- a/13_exceptions_part2_peripheral_IRQs/build.rs +++ b/13_exceptions_part2_peripheral_IRQs/build.rs @@ -1,8 +1,17 @@ -use std::env; +use std::{env, fs}; fn main() { - let linker_file = env::var("LINKER_FILE").unwrap_or_default(); + let ld_script_path = env::var("LD_SCRIPT_PATH").unwrap_or_default(); - println!("cargo:rerun-if-changed={}", linker_file); - println!("cargo:rerun-if-changed=build.rs"); + let files = fs::read_dir(ld_script_path).unwrap(); + files + .filter_map(Result::ok) + .filter(|d| { + if let Some(e) = d.path().extension() { + e == "ld" + } else { + false + } + }) + .for_each(|f| println!("cargo:rerun-if-changed={}", f.path().display())); } diff --git a/14_virtual_mem_part2_mmio_remap/Makefile b/14_virtual_mem_part2_mmio_remap/Makefile index e9ed2d27..a1db677b 100644 --- a/14_virtual_mem_part2_mmio_remap/Makefile +++ b/14_virtual_mem_part2_mmio_remap/Makefile @@ -25,10 +25,10 @@ endif ##-------------------------------------------------------------------------------------------------- -## Hardcoded configuration values +## BSP-specific configuration values ##-------------------------------------------------------------------------------------------------- +QEMU_MISSING_STRING = "This board is not yet supported for QEMU." -# BSP-specific arguments. ifeq ($(BSP),rpi3) TARGET = aarch64-unknown-none-softfloat KERNEL_BIN = kernel8.img @@ -41,7 +41,7 @@ ifeq ($(BSP),rpi3) READELF_BINARY = aarch64-none-elf-readelf 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 + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) TARGET = aarch64-unknown-none-softfloat @@ -55,24 +55,33 @@ else ifeq ($(BSP),rpi4) READELF_BINARY = aarch64-none-elf-readelf 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 + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -QEMU_MISSING_STRING = "This board is not yet supported for QEMU." - # Export for build.rs. -export LINKER_FILE +export LD_SCRIPT_PATH + -KERNEL_ELF = target/$(TARGET)/release/kernel + +##-------------------------------------------------------------------------------------------------- +## Generic configuration values +##-------------------------------------------------------------------------------------------------- +KERNEL_LINKER_SCRIPT = link.ld +KERNEL_ELF = target/$(TARGET)/release/kernel ##-------------------------------------------------------------------------------------------------- ## Command building blocks ##-------------------------------------------------------------------------------------------------- -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) -RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs +RUSTFLAGS = $(RUSTC_MISC_ARGS) \ + -C link-arg=--library-path=$(LD_SCRIPT_PATH) \ + -C link-arg=--script=$(KERNEL_LINKER_SCRIPT) + +RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) \ + -D warnings \ + -D missing_docs FEATURES = --features bsp_$(BSP) COMPILER_ARGS = --target=$(TARGET) \ diff --git a/14_virtual_mem_part2_mmio_remap/build.rs b/14_virtual_mem_part2_mmio_remap/build.rs index 883c5955..f53b9949 100644 --- a/14_virtual_mem_part2_mmio_remap/build.rs +++ b/14_virtual_mem_part2_mmio_remap/build.rs @@ -1,8 +1,17 @@ -use std::env; +use std::{env, fs}; fn main() { - let linker_file = env::var("LINKER_FILE").unwrap_or_default(); + let ld_script_path = env::var("LD_SCRIPT_PATH").unwrap_or_default(); - println!("cargo:rerun-if-changed={}", linker_file); - println!("cargo:rerun-if-changed=build.rs"); + let files = fs::read_dir(ld_script_path).unwrap(); + files + .filter_map(Result::ok) + .filter(|d| { + if let Some(e) = d.path().extension() { + e == "ld" + } else { + false + } + }) + .for_each(|f| println!("cargo:rerun-if-changed={}", f.path().display())); } diff --git a/15_virtual_mem_part3_precomputed_tables/Makefile b/15_virtual_mem_part3_precomputed_tables/Makefile index 513f3dc1..0f077200 100644 --- a/15_virtual_mem_part3_precomputed_tables/Makefile +++ b/15_virtual_mem_part3_precomputed_tables/Makefile @@ -25,10 +25,10 @@ endif ##-------------------------------------------------------------------------------------------------- -## Hardcoded configuration values +## BSP-specific configuration values ##-------------------------------------------------------------------------------------------------- +QEMU_MISSING_STRING = "This board is not yet supported for QEMU." -# BSP-specific arguments. ifeq ($(BSP),rpi3) TARGET = aarch64-unknown-none-softfloat KERNEL_BIN = kernel8.img @@ -41,7 +41,7 @@ ifeq ($(BSP),rpi3) READELF_BINARY = aarch64-none-elf-readelf 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 + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) TARGET = aarch64-unknown-none-softfloat @@ -55,24 +55,33 @@ else ifeq ($(BSP),rpi4) READELF_BINARY = aarch64-none-elf-readelf 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 + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -QEMU_MISSING_STRING = "This board is not yet supported for QEMU." - # Export for build.rs. -export LINKER_FILE +export LD_SCRIPT_PATH + -KERNEL_ELF = target/$(TARGET)/release/kernel + +##-------------------------------------------------------------------------------------------------- +## Generic configuration values +##-------------------------------------------------------------------------------------------------- +KERNEL_LINKER_SCRIPT = link.ld +KERNEL_ELF = target/$(TARGET)/release/kernel ##-------------------------------------------------------------------------------------------------- ## Command building blocks ##-------------------------------------------------------------------------------------------------- -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) -RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs +RUSTFLAGS = $(RUSTC_MISC_ARGS) \ + -C link-arg=--library-path=$(LD_SCRIPT_PATH) \ + -C link-arg=--script=$(KERNEL_LINKER_SCRIPT) + +RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) \ + -D warnings \ + -D missing_docs FEATURES = --features bsp_$(BSP) COMPILER_ARGS = --target=$(TARGET) \ diff --git a/15_virtual_mem_part3_precomputed_tables/README.md b/15_virtual_mem_part3_precomputed_tables/README.md index 77d93f59..04d98dbd 100644 --- a/15_virtual_mem_part3_precomputed_tables/README.md +++ b/15_virtual_mem_part3_precomputed_tables/README.md @@ -788,7 +788,7 @@ diff -uNr 14_virtual_mem_part2_mmio_remap/Cargo.toml 15_virtual_mem_part3_precom diff -uNr 14_virtual_mem_part2_mmio_remap/Makefile 15_virtual_mem_part3_precomputed_tables/Makefile --- 14_virtual_mem_part2_mmio_remap/Makefile +++ 15_virtual_mem_part3_precomputed_tables/Makefile -@@ -89,6 +89,7 @@ +@@ -98,6 +98,7 @@ -O binary EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) @@ -796,7 +796,7 @@ diff -uNr 14_virtual_mem_part2_mmio_remap/Makefile 15_virtual_mem_part3_precompu EXEC_TEST_DISPATCH = ruby ../common/tests/dispatch.rb EXEC_MINIPUSH = ruby ../common/serial/minipush.rb -@@ -134,6 +135,7 @@ +@@ -143,6 +144,7 @@ $(KERNEL_ELF): $(call colorecho, "\nCompiling kernel - $(BSP)") @RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(RUSTC_CMD) @@ -804,7 +804,7 @@ diff -uNr 14_virtual_mem_part2_mmio_remap/Makefile 15_virtual_mem_part3_precompu ##------------------------------------------------------------------------------ ## Build the stripped kernel binary -@@ -272,6 +274,7 @@ +@@ -281,6 +283,7 @@ TEST_ELF=$$(echo $$1 | sed -e 's/.*target/target/g') TEST_BINARY=$$(echo $$1.img | sed -e 's/.*target/target/g') @@ -1138,7 +1138,7 @@ diff -uNr 14_virtual_mem_part2_mmio_remap/src/bsp/raspberrypi/link.ld 15_virtual * Copyright (c) 2018-2022 Andre Richter */ -+INCLUDE src/bsp/raspberrypi/kernel_virt_addr_space_size.ld; ++INCLUDE kernel_virt_addr_space_size.ld; + PAGE_SIZE = 64K; PAGE_MASK = PAGE_SIZE - 1; diff --git a/15_virtual_mem_part3_precomputed_tables/build.rs b/15_virtual_mem_part3_precomputed_tables/build.rs index 883c5955..f53b9949 100644 --- a/15_virtual_mem_part3_precomputed_tables/build.rs +++ b/15_virtual_mem_part3_precomputed_tables/build.rs @@ -1,8 +1,17 @@ -use std::env; +use std::{env, fs}; fn main() { - let linker_file = env::var("LINKER_FILE").unwrap_or_default(); + let ld_script_path = env::var("LD_SCRIPT_PATH").unwrap_or_default(); - println!("cargo:rerun-if-changed={}", linker_file); - println!("cargo:rerun-if-changed=build.rs"); + let files = fs::read_dir(ld_script_path).unwrap(); + files + .filter_map(Result::ok) + .filter(|d| { + if let Some(e) = d.path().extension() { + e == "ld" + } else { + false + } + }) + .for_each(|f| println!("cargo:rerun-if-changed={}", f.path().display())); } diff --git a/15_virtual_mem_part3_precomputed_tables/src/bsp/raspberrypi/link.ld b/15_virtual_mem_part3_precomputed_tables/src/bsp/raspberrypi/link.ld index ae45e27a..717d817e 100644 --- a/15_virtual_mem_part3_precomputed_tables/src/bsp/raspberrypi/link.ld +++ b/15_virtual_mem_part3_precomputed_tables/src/bsp/raspberrypi/link.ld @@ -3,7 +3,7 @@ * Copyright (c) 2018-2022 Andre Richter */ -INCLUDE src/bsp/raspberrypi/kernel_virt_addr_space_size.ld; +INCLUDE kernel_virt_addr_space_size.ld; PAGE_SIZE = 64K; PAGE_MASK = PAGE_SIZE - 1; diff --git a/16_virtual_mem_part4_higher_half_kernel/Makefile b/16_virtual_mem_part4_higher_half_kernel/Makefile index 513f3dc1..0f077200 100644 --- a/16_virtual_mem_part4_higher_half_kernel/Makefile +++ b/16_virtual_mem_part4_higher_half_kernel/Makefile @@ -25,10 +25,10 @@ endif ##-------------------------------------------------------------------------------------------------- -## Hardcoded configuration values +## BSP-specific configuration values ##-------------------------------------------------------------------------------------------------- +QEMU_MISSING_STRING = "This board is not yet supported for QEMU." -# BSP-specific arguments. ifeq ($(BSP),rpi3) TARGET = aarch64-unknown-none-softfloat KERNEL_BIN = kernel8.img @@ -41,7 +41,7 @@ ifeq ($(BSP),rpi3) READELF_BINARY = aarch64-none-elf-readelf 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 + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) TARGET = aarch64-unknown-none-softfloat @@ -55,24 +55,33 @@ else ifeq ($(BSP),rpi4) READELF_BINARY = aarch64-none-elf-readelf 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 + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -QEMU_MISSING_STRING = "This board is not yet supported for QEMU." - # Export for build.rs. -export LINKER_FILE +export LD_SCRIPT_PATH + -KERNEL_ELF = target/$(TARGET)/release/kernel + +##-------------------------------------------------------------------------------------------------- +## Generic configuration values +##-------------------------------------------------------------------------------------------------- +KERNEL_LINKER_SCRIPT = link.ld +KERNEL_ELF = target/$(TARGET)/release/kernel ##-------------------------------------------------------------------------------------------------- ## Command building blocks ##-------------------------------------------------------------------------------------------------- -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) -RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs +RUSTFLAGS = $(RUSTC_MISC_ARGS) \ + -C link-arg=--library-path=$(LD_SCRIPT_PATH) \ + -C link-arg=--script=$(KERNEL_LINKER_SCRIPT) + +RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) \ + -D warnings \ + -D missing_docs FEATURES = --features bsp_$(BSP) COMPILER_ARGS = --target=$(TARGET) \ diff --git a/16_virtual_mem_part4_higher_half_kernel/build.rs b/16_virtual_mem_part4_higher_half_kernel/build.rs index 883c5955..f53b9949 100644 --- a/16_virtual_mem_part4_higher_half_kernel/build.rs +++ b/16_virtual_mem_part4_higher_half_kernel/build.rs @@ -1,8 +1,17 @@ -use std::env; +use std::{env, fs}; fn main() { - let linker_file = env::var("LINKER_FILE").unwrap_or_default(); + let ld_script_path = env::var("LD_SCRIPT_PATH").unwrap_or_default(); - println!("cargo:rerun-if-changed={}", linker_file); - println!("cargo:rerun-if-changed=build.rs"); + let files = fs::read_dir(ld_script_path).unwrap(); + files + .filter_map(Result::ok) + .filter(|d| { + if let Some(e) = d.path().extension() { + e == "ld" + } else { + false + } + }) + .for_each(|f| println!("cargo:rerun-if-changed={}", f.path().display())); } diff --git a/16_virtual_mem_part4_higher_half_kernel/src/bsp/raspberrypi/link.ld b/16_virtual_mem_part4_higher_half_kernel/src/bsp/raspberrypi/link.ld index af64d960..14619829 100644 --- a/16_virtual_mem_part4_higher_half_kernel/src/bsp/raspberrypi/link.ld +++ b/16_virtual_mem_part4_higher_half_kernel/src/bsp/raspberrypi/link.ld @@ -3,7 +3,7 @@ * Copyright (c) 2018-2022 Andre Richter */ -INCLUDE src/bsp/raspberrypi/kernel_virt_addr_space_size.ld; +INCLUDE kernel_virt_addr_space_size.ld; PAGE_SIZE = 64K; PAGE_MASK = PAGE_SIZE - 1; diff --git a/X1_JTAG_boot/Makefile b/X1_JTAG_boot/Makefile index 7a97517f..562ccfa6 100644 --- a/X1_JTAG_boot/Makefile +++ b/X1_JTAG_boot/Makefile @@ -18,10 +18,10 @@ DEV_SERIAL ?= /dev/ttyUSB0 ##-------------------------------------------------------------------------------------------------- -## Hardcoded configuration values +## BSP-specific configuration values ##-------------------------------------------------------------------------------------------------- +QEMU_MISSING_STRING = "This board is not yet supported for QEMU." -# BSP-specific arguments. ifeq ($(BSP),rpi3) TARGET = aarch64-unknown-none-softfloat KERNEL_BIN = kernel8.img @@ -31,7 +31,7 @@ ifeq ($(BSP),rpi3) OBJDUMP_BINARY = aarch64-none-elf-objdump NM_BINARY = aarch64-none-elf-nm READELF_BINARY = aarch64-none-elf-readelf - LINKER_FILE = src/bsp/raspberrypi/link.ld + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) TARGET = aarch64-unknown-none-softfloat @@ -42,24 +42,33 @@ else ifeq ($(BSP),rpi4) OBJDUMP_BINARY = aarch64-none-elf-objdump NM_BINARY = aarch64-none-elf-nm READELF_BINARY = aarch64-none-elf-readelf - LINKER_FILE = src/bsp/raspberrypi/link.ld + LD_SCRIPT_PATH = src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -QEMU_MISSING_STRING = "This board is not yet supported for QEMU." - # Export for build.rs. -export LINKER_FILE +export LD_SCRIPT_PATH + -KERNEL_ELF = target/$(TARGET)/release/kernel + +##-------------------------------------------------------------------------------------------------- +## Generic configuration values +##-------------------------------------------------------------------------------------------------- +KERNEL_LINKER_SCRIPT = link.ld +KERNEL_ELF = target/$(TARGET)/release/kernel ##-------------------------------------------------------------------------------------------------- ## Command building blocks ##-------------------------------------------------------------------------------------------------- -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) -RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs +RUSTFLAGS = $(RUSTC_MISC_ARGS) \ + -C link-arg=--library-path=$(LD_SCRIPT_PATH) \ + -C link-arg=--script=$(KERNEL_LINKER_SCRIPT) + +RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) \ + -D warnings \ + -D missing_docs FEATURES = --features bsp_$(BSP) COMPILER_ARGS = --target=$(TARGET) \ diff --git a/X1_JTAG_boot/build.rs b/X1_JTAG_boot/build.rs index 883c5955..f53b9949 100644 --- a/X1_JTAG_boot/build.rs +++ b/X1_JTAG_boot/build.rs @@ -1,8 +1,17 @@ -use std::env; +use std::{env, fs}; fn main() { - let linker_file = env::var("LINKER_FILE").unwrap_or_default(); + let ld_script_path = env::var("LD_SCRIPT_PATH").unwrap_or_default(); - println!("cargo:rerun-if-changed={}", linker_file); - println!("cargo:rerun-if-changed=build.rs"); + let files = fs::read_dir(ld_script_path).unwrap(); + files + .filter_map(Result::ok) + .filter(|d| { + if let Some(e) = d.path().extension() { + e == "ld" + } else { + false + } + }) + .for_each(|f| println!("cargo:rerun-if-changed={}", f.path().display())); }