From b9ccd8977724142598fe00f7ff91890153146f87 Mon Sep 17 00:00:00 2001 From: James Wainwright Date: Tue, 16 Jan 2024 15:05:44 +0000 Subject: [PATCH] Set linker script from build.rs file This has two advantages: 1. It adds a `cargo:rerun-if-changed` command to ensure we rebuild crates if the linker script changes. 2. The path to the linker script does not depend on the directory that Cargo is executed from, so `cargo build` can be done from anywhere. Signed-off-by: James Wainwright --- sw/rust/.cargo/config.toml | 3 --- sw/rust/Cargo.toml | 1 + sw/rust/build.rs | 42 +++++++++++++++++++++++++++++ sw/rust/demo/hello_world/Cargo.toml | 1 + sw/rust/demo/lcd_hal/Cargo.toml | 1 + sw/rust/demo/led/Cargo.toml | 1 + sw/rust/demo/led_hal/Cargo.toml | 1 + sw/rust/demo/pwm_hal/Cargo.toml | 1 + 8 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 sw/rust/build.rs diff --git a/sw/rust/.cargo/config.toml b/sw/rust/.cargo/config.toml index dd461477..60b2a756 100644 --- a/sw/rust/.cargo/config.toml +++ b/sw/rust/.cargo/config.toml @@ -7,9 +7,6 @@ target = "riscv32imc-unknown-none-elf" [target.riscv32imc-unknown-none-elf] runner = "../../util/load_demo_system.sh run" -rustflags = [ - "-C", "link-arg=-T../common/link.ld", -] [unstable] build-std = ["core"] diff --git a/sw/rust/Cargo.toml b/sw/rust/Cargo.toml index 6654239e..ff0fa517 100644 --- a/sw/rust/Cargo.toml +++ b/sw/rust/Cargo.toml @@ -12,6 +12,7 @@ members = [ "demo/lcd_hal", "demo/pwm_hal", ] +resolver = "2" [profile.release] debug = true diff --git a/sw/rust/build.rs b/sw/rust/build.rs new file mode 100644 index 00000000..8d8f5708 --- /dev/null +++ b/sw/rust/build.rs @@ -0,0 +1,42 @@ +// Copyright lowRISC contributors. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 + +//! This Cargo build script locates and uses the `link.ld` linker script. +//! +//! This build script can be used by a crate from its Cargo.toml: +//! +//! ```toml +//! [package] +//! ... +//! build = "../path/to/build.rs" +//! ``` +//! +//! Build scripts are run with their working directory as the root of the +//! crate being built. We must find the path to the Cargo workspace in order +//! to get the correct path to the `link.ld` script. + +use std::path::PathBuf; +use std::process::Command; + +fn main() { + // Ask Cargo for the path of the workspace. + let workspace_path = Command::new(env!("CARGO")) + .arg("locate-project") + .arg("--workspace") + .arg("--message-format=plain") + .output() + .expect("failed to locate project using cargo") + .stdout; + let workspace_path = std::str::from_utf8(&workspace_path).expect("path to workspace not UTF-8"); + let workspace_path = PathBuf::from(workspace_path); + let workspace_path = workspace_path.parent().expect("failed to get parent"); + + // Find the path of the linker script relative to the workspace. + let linker_script_path = workspace_path.join("../common/link.ld"); + let linker_script_path = linker_script_path.display(); + + // Use the linker script and rebuild crates if it changes. + println!("cargo:rerun-if-changed={linker_script_path}"); + println!("cargo:rustc-link-arg=-T{linker_script_path}"); +} diff --git a/sw/rust/demo/hello_world/Cargo.toml b/sw/rust/demo/hello_world/Cargo.toml index a133ade9..d78d41ba 100644 --- a/sw/rust/demo/hello_world/Cargo.toml +++ b/sw/rust/demo/hello_world/Cargo.toml @@ -6,6 +6,7 @@ name = "hello_world" version = "0.1.0" edition = "2021" +build = "../../build.rs" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/sw/rust/demo/lcd_hal/Cargo.toml b/sw/rust/demo/lcd_hal/Cargo.toml index 69bda4a8..a9aa503e 100644 --- a/sw/rust/demo/lcd_hal/Cargo.toml +++ b/sw/rust/demo/lcd_hal/Cargo.toml @@ -6,6 +6,7 @@ name = "lcd_hal" version = "0.1.0" edition = "2021" +build = "../../build.rs" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/sw/rust/demo/led/Cargo.toml b/sw/rust/demo/led/Cargo.toml index 78e5d47d..52256b02 100644 --- a/sw/rust/demo/led/Cargo.toml +++ b/sw/rust/demo/led/Cargo.toml @@ -6,6 +6,7 @@ name = "led" version = "0.1.0" edition = "2021" +build = "../../build.rs" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/sw/rust/demo/led_hal/Cargo.toml b/sw/rust/demo/led_hal/Cargo.toml index 0b3e6e08..69fd9600 100644 --- a/sw/rust/demo/led_hal/Cargo.toml +++ b/sw/rust/demo/led_hal/Cargo.toml @@ -6,6 +6,7 @@ name = "led_hal" version = "0.1.0" edition = "2021" +build = "../../build.rs" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/sw/rust/demo/pwm_hal/Cargo.toml b/sw/rust/demo/pwm_hal/Cargo.toml index 51174356..863529a8 100644 --- a/sw/rust/demo/pwm_hal/Cargo.toml +++ b/sw/rust/demo/pwm_hal/Cargo.toml @@ -6,6 +6,7 @@ name = "pwm_hal" version = "0.1.0" edition = "2021" +build = "../../build.rs" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html