refactor(core/build): rename target to project in xtask
What changed, and why it matters
This commit is a straightforward internal rename from 'target' to 'project' across build configuration files and the Rust xtask build helper. It does not change what the firmware does, how it behaves, or any security logic. It is purely a code-maintenance refactor.
No security action needed. Treat as normal code hygiene.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The patch renames the build-system concept ‘target’ to ‘project’ to avoid confusion with Rust compilation targets. It renames Component enum to Project, target.toml files to project.toml, TargetProfile to ProjectProfile, and updates related strings and comments in xtask Rust sources. No functional logic, feature sets, signing, flashing, or dependency rules are altered. The only non-rename changes are adding toml as a build dependency in core/embed/models/Cargo.toml and updating model.toml to use [project_overrides.bootloader] instead of [targets.bootloader].
Changed components
core/embed/xtask build toolingcore/embed/projects/*/project.toml build configuration filescore/embed/models/T3T1/model.tomlInspect captured patch +388 / −382
diff --git a/core/embed/Cargo.lock b/core/embed/Cargo.lock
index 7882a814..724ca9e7 100644
--- a/core/embed/Cargo.lock
+++ b/core/embed/Cargo.lock
@@ -526,6 +526,7 @@ name = "models"
version = "0.0.0"
dependencies = [
"color-eyre",
+ "toml",
"xbuild",
]
diff --git a/core/embed/io/Cargo.toml b/core/embed/io/Cargo.toml
index 4519fa26..9badccca 100644
--- a/core/embed/io/Cargo.toml
+++ b/core/embed/io/Cargo.toml
@@ -101,7 +101,7 @@ framebuffer = []
# Drivers below that always need framebuffer pull it in implicitly,
# so any project selecting them via the board peripheral chain doesn't have
-# to also advertise `framebuffer` in its target.toml. display_st7789 supports
+# to also advertise `framebuffer` in its project.toml. display_st7789 supports
# both modes — the model.toml decides.
# The emulator's unix driver is selected by display/build.rs (not a feature).
display_ltdc_dsi = ["framebuffer"]
diff --git a/core/embed/models/Cargo.toml b/core/embed/models/Cargo.toml
index d132e0d1..9634e76f 100644
--- a/core/embed/models/Cargo.toml
+++ b/core/embed/models/Cargo.toml
@@ -6,6 +6,7 @@ links = "models"
[build-dependencies]
color-eyre.workspace = true
+toml.workspace = true
xbuild.workspace = true
[dependencies]
diff --git a/core/embed/models/T3T1/model.toml b/core/embed/models/T3T1/model.toml
index 43c57ac7..a85d9066 100644
--- a/core/embed/models/T3T1/model.toml
+++ b/core/embed/models/T3T1/model.toml
@@ -15,5 +15,5 @@ features = [
"layout_delizia",
]
-[targets.bootloader]
+[project_overrides.bootloader]
exclude = ["haptic"]
diff --git a/core/embed/projects/boardloader/project.toml b/core/embed/projects/boardloader/project.toml
new file mode 100644
index 00000000..0dff862d
--- /dev/null
+++ b/core/embed/projects/boardloader/project.toml
@@ -0,0 +1,18 @@
+uses = [
+ "backlight",
+ "boot_ucb",
+ "display",
+ "dma2d",
+ "framebuffer",
+ "hash_processor",
+ "lockable_bootloader",
+ "power_manager",
+ "pvd",
+ "sd_card",
+ "sdram",
+ "secret",
+ "secure_aes",
+ "tamper",
+]
+
+elf_sections = [".vector_table", ".text", ".data", ".rodata", ".capabilities"]
diff --git a/core/embed/projects/boardloader/target.toml b/core/embed/projects/boardloader/target.toml
deleted file mode 100644
index 0dff862d..00000000
--- a/core/embed/projects/boardloader/target.toml
+++ /dev/null
@@ -1,18 +0,0 @@
-uses = [
- "backlight",
- "boot_ucb",
- "display",
- "dma2d",
- "framebuffer",
- "hash_processor",
- "lockable_bootloader",
- "power_manager",
- "pvd",
- "sd_card",
- "sdram",
- "secret",
- "secure_aes",
- "tamper",
-]
-
-elf_sections = [".vector_table", ".text", ".data", ".rodata", ".capabilities"]
diff --git a/core/embed/projects/bootloader/project.toml b/core/embed/projects/bootloader/project.toml
new file mode 100644
index 00000000..cde69adb
--- /dev/null
+++ b/core/embed/projects/bootloader/project.toml
@@ -0,0 +1,40 @@
+uses = [
+ "backlight",
+ "backup_ram",
+ "ble",
+ "boot_ucb",
+ "button",
+ "consumption_mask",
+ "display",
+ "dma2d",
+ "framebuffer",
+ "haptic",
+ "hash_processor",
+ "iwdg",
+ "layout_bolt",
+ "layout_bolt_d001",
+ "layout_bolt_d002",
+ "layout_caesar",
+ "layout_delizia",
+ "layout_eckhart",
+ "lockable_bootloader",
+ "mcu_attestation",
+ "nrf",
+ "nrf_auth",
+ "power_manager",
+ "pvd",
+ "rgb_led",
+ "rtc",
+ "sdram",
+ "secmon_verification",
+ "secret",
+ "secure_aes",
+ "suspend",
+ "tamper",
+ "telemetry",
+ "touch",
+ "touch_wakeup",
+ "ui_empty_lock",
+]
+
+elf_sections = [".header", ".flash", ".data"]
diff --git a/core/embed/projects/bootloader/target.toml b/core/embed/projects/bootloader/target.toml
deleted file mode 100644
index cde69adb..00000000
--- a/core/embed/projects/bootloader/target.toml
+++ /dev/null
@@ -1,40 +0,0 @@
-uses = [
- "backlight",
- "backup_ram",
- "ble",
- "boot_ucb",
- "button",
- "consumption_mask",
- "display",
- "dma2d",
- "framebuffer",
- "haptic",
- "hash_processor",
- "iwdg",
- "layout_bolt",
- "layout_bolt_d001",
- "layout_bolt_d002",
- "layout_caesar",
- "layout_delizia",
- "layout_eckhart",
- "lockable_bootloader",
- "mcu_attestation",
- "nrf",
- "nrf_auth",
- "power_manager",
- "pvd",
- "rgb_led",
- "rtc",
- "sdram",
- "secmon_verification",
- "secret",
- "secure_aes",
- "suspend",
- "tamper",
- "telemetry",
- "touch",
- "touch_wakeup",
- "ui_empty_lock",
-]
-
-elf_sections = [".header", ".flash", ".data"]
diff --git a/core/embed/projects/bootloader_ci/project.toml b/core/embed/projects/bootloader_ci/project.toml
new file mode 100644
index 00000000..15212f59
--- /dev/null
+++ b/core/embed/projects/bootloader_ci/project.toml
@@ -0,0 +1,25 @@
+uses = [
+ "backlight",
+ "backup_ram",
+ "boot_ucb",
+ "button",
+ "consumption_mask",
+ "display",
+ "dma2d",
+ "framebuffer",
+ "haptic",
+ "hash_processor",
+ "iwdg",
+ "lockable_bootloader",
+ "pvd",
+ "rgb_led",
+ "sdram",
+ "secret",
+ "secure_aes",
+ "secmon_verification",
+ "tamper",
+ "telemetry",
+ "touch",
+]
+
+elf_sections = [".header", ".flash", ".data"]
diff --git a/core/embed/projects/bootloader_ci/target.toml b/core/embed/projects/bootloader_ci/target.toml
deleted file mode 100644
index 15212f59..00000000
--- a/core/embed/projects/bootloader_ci/target.toml
+++ /dev/null
@@ -1,25 +0,0 @@
-uses = [
- "backlight",
- "backup_ram",
- "boot_ucb",
- "button",
- "consumption_mask",
- "display",
- "dma2d",
- "framebuffer",
- "haptic",
- "hash_processor",
- "iwdg",
- "lockable_bootloader",
- "pvd",
- "rgb_led",
- "sdram",
- "secret",
- "secure_aes",
- "secmon_verification",
- "tamper",
- "telemetry",
- "touch",
-]
-
-elf_sections = [".header", ".flash", ".data"]
diff --git a/core/embed/projects/firmware/project.toml b/core/embed/projects/firmware/project.toml
new file mode 100644
index 00000000..514ddc47
--- /dev/null
+++ b/core/embed/projects/firmware/project.toml
@@ -0,0 +1,49 @@
+uses = [
+ "backlight",
+ "backup_ram",
+ "ble",
+ "boot_ucb",
+ "button",
+ "consumption_mask",
+ "display",
+ "dma2d",
+ "framebuffer",
+ "haptic",
+ "hash_processor",
+ "iwdg",
+ "layout_bolt",
+ "layout_bolt_d001",
+ "layout_bolt_d002",
+ "layout_caesar",
+ "layout_delizia",
+ "layout_eckhart",
+ "lockable_bootloader",
+ "mcu_attestation",
+ "nrf",
+ "optiga",
+ "power_manager",
+ "rgb_led",
+ "sd_card",
+ "secmon_layout",
+ "secret",
+ "secure_aes",
+ "serial_number",
+ "suspend",
+ "tamper",
+ "telemetry",
+ "thp",
+ "touch",
+ "touch_wakeup",
+ "tropic",
+
+ # Legacy coin support
+ "decred",
+ "eos",
+ "nem",
+]
+
+elf_sections = [".vendorheader", ".header", ".flash", ".data"]
+
+# STM32F4: firmware spans two non-contiguous flash banks (bank2 starts at 0x08100000)
+split_pad_to = "0x08100000"
+split_part2_sections = [".flash2"]
diff --git a/core/embed/projects/firmware/target.toml b/core/embed/projects/firmware/target.toml
deleted file mode 100644
index 514ddc47..00000000
--- a/core/embed/projects/firmware/target.toml
+++ /dev/null
@@ -1,49 +0,0 @@
-uses = [
- "backlight",
- "backup_ram",
- "ble",
- "boot_ucb",
- "button",
- "consumption_mask",
- "display",
- "dma2d",
- "framebuffer",
- "haptic",
- "hash_processor",
- "iwdg",
- "layout_bolt",
- "layout_bolt_d001",
- "layout_bolt_d002",
- "layout_caesar",
- "layout_delizia",
- "layout_eckhart",
- "lockable_bootloader",
- "mcu_attestation",
- "nrf",
- "optiga",
- "power_manager",
- "rgb_led",
- "sd_card",
- "secmon_layout",
- "secret",
- "secure_aes",
- "serial_number",
- "suspend",
- "tamper",
- "telemetry",
- "thp",
- "touch",
- "touch_wakeup",
- "tropic",
-
- # Legacy coin support
- "decred",
- "eos",
- "nem",
-]
-
-elf_sections = [".vendorheader", ".header", ".flash", ".data"]
-
-# STM32F4: firmware spans two non-contiguous flash banks (bank2 starts at 0x08100000)
-split_pad_to = "0x08100000"
-split_part2_sections = [".flash2"]
diff --git a/core/embed/projects/kernel/project.toml b/core/embed/projects/kernel/project.toml
new file mode 100644
index 00000000..8ca32e85
--- /dev/null
+++ b/core/embed/projects/kernel/project.toml
@@ -0,0 +1,38 @@
+uses = [
+ "backlight",
+ "backup_ram",
+ "ble",
+ "boot_ucb",
+ "button",
+ "consumption_mask",
+ "display",
+ "dma2d",
+ "framebuffer",
+ "haptic",
+ "hash_processor",
+ "hw_jpeg_decoder",
+ "lockable_bootloader",
+ "mcu_attestation",
+ "nrf",
+ "nrf_auth",
+ "optiga",
+ "power_manager",
+ "pvd",
+ "rgb_led",
+ "rtc",
+ "sd_card",
+ "sdram",
+ "secmon_layout",
+ "secure_mode",
+ "secret",
+ "secure_aes",
+ "smp",
+ "suspend",
+ "tamper",
+ "telemetry",
+ "touch",
+ "touch_wakeup",
+ "tropic",
+]
+
+elf_sections = [".flash", ".data"]
diff --git a/core/embed/projects/kernel/target.toml b/core/embed/projects/kernel/target.toml
deleted file mode 100644
index 8ca32e85..00000000
--- a/core/embed/projects/kernel/target.toml
+++ /dev/null
@@ -1,38 +0,0 @@
-uses = [
- "backlight",
- "backup_ram",
- "ble",
- "boot_ucb",
- "button",
- "consumption_mask",
- "display",
- "dma2d",
- "framebuffer",
- "haptic",
- "hash_processor",
- "hw_jpeg_decoder",
- "lockable_bootloader",
- "mcu_attestation",
- "nrf",
- "nrf_auth",
- "optiga",
- "power_manager",
- "pvd",
- "rgb_led",
- "rtc",
- "sd_card",
- "sdram",
- "secmon_layout",
- "secure_mode",
- "secret",
- "secure_aes",
- "smp",
- "suspend",
- "tamper",
- "telemetry",
- "touch",
- "touch_wakeup",
- "tropic",
-]
-
-elf_sections = [".flash", ".data"]
diff --git a/core/embed/projects/prodtest/project.toml b/core/embed/projects/prodtest/project.toml
new file mode 100644
index 00000000..9c3277b7
--- /dev/null
+++ b/core/embed/projects/prodtest/project.toml
@@ -0,0 +1,48 @@
+uses = [
+ "backlight",
+ "backup_ram",
+ "ble",
+ "boot_ucb",
+ "button",
+ "consumption_mask",
+ "display",
+ "dma2d",
+ "framebuffer",
+ "haptic",
+ "hash_processor",
+ "hw_revision",
+ "iwdg",
+ "layout_bolt",
+ "layout_bolt_d001",
+ "layout_bolt_d002",
+ "layout_caesar",
+ "layout_delizia",
+ "layout_eckhart",
+ "lockable_bootloader",
+ "mcu_attestation",
+ "nfc",
+ "nrf",
+ "optiga",
+ "power_manager",
+ "pvd",
+ "rgb_led",
+ "rtc",
+ "sbu",
+ "sd_card",
+ "sdram",
+ "secret",
+ "secmon_header",
+ "secure_aes",
+ "smp",
+ "suspend",
+ "tamper",
+ "telemetry",
+ "touch",
+ "touch_wakeup",
+ "tropic",
+]
+
+elf_sections = [".vendorheader", ".header", ".flash", ".data"]
+
+secmon_body_sections = [".secmon_header", ".flash", ".data"]
+secmon_header_sections = [".vendorheader", ".header"]
diff --git a/core/embed/projects/prodtest/target.toml b/core/embed/projects/prodtest/target.toml
deleted file mode 100644
index 9c3277b7..00000000
--- a/core/embed/projects/prodtest/target.toml
+++ /dev/null
@@ -1,48 +0,0 @@
-uses = [
- "backlight",
- "backup_ram",
- "ble",
- "boot_ucb",
- "button",
- "consumption_mask",
- "display",
- "dma2d",
- "framebuffer",
- "haptic",
- "hash_processor",
- "hw_revision",
- "iwdg",
- "layout_bolt",
- "layout_bolt_d001",
- "layout_bolt_d002",
- "layout_caesar",
- "layout_delizia",
- "layout_eckhart",
- "lockable_bootloader",
- "mcu_attestation",
- "nfc",
- "nrf",
- "optiga",
- "power_manager",
- "pvd",
- "rgb_led",
- "rtc",
- "sbu",
- "sd_card",
- "sdram",
- "secret",
- "secmon_header",
- "secure_aes",
- "smp",
- "suspend",
- "tamper",
- "telemetry",
- "touch",
- "touch_wakeup",
- "tropic",
-]
-
-elf_sections = [".vendorheader", ".header", ".flash", ".data"]
-
-secmon_body_sections = [".secmon_header", ".flash", ".data"]
-secmon_header_sections = [".vendorheader", ".header"]
diff --git a/core/embed/projects/secmon/project.toml b/core/embed/projects/secmon/project.toml
new file mode 100644
index 00000000..f40cc2ff
--- /dev/null
+++ b/core/embed/projects/secmon/project.toml
@@ -0,0 +1,18 @@
+uses = [
+ "backup_ram",
+ "boot_ucb",
+ "consumption_mask",
+ "hash_processor",
+ "lockable_bootloader",
+ "mcu_attestation",
+ "nrf_auth",
+ "optiga",
+ "secret",
+ "secure_aes",
+ "suspend",
+ "tamper",
+ "telemetry",
+ "tropic",
+]
+
+elf_sections = [".secmon_header", ".flash", ".data", ".gnu.sgstubs"]
diff --git a/core/embed/projects/secmon/target.toml b/core/embed/projects/secmon/target.toml
deleted file mode 100644
index f40cc2ff..00000000
--- a/core/embed/projects/secmon/target.toml
+++ /dev/null
@@ -1,18 +0,0 @@
-uses = [
- "backup_ram",
- "boot_ucb",
- "consumption_mask",
- "hash_processor",
- "lockable_bootloader",
- "mcu_attestation",
- "nrf_auth",
- "optiga",
- "secret",
- "secure_aes",
- "suspend",
- "tamper",
- "telemetry",
- "tropic",
-]
-
-elf_sections = [".secmon_header", ".flash", ".data", ".gnu.sgstubs"]
diff --git a/core/embed/xtask/src/args.rs b/core/embed/xtask/src/args.rs
index a65b1a05..d153ce38 100644
--- a/core/embed/xtask/src/args.rs
+++ b/core/embed/xtask/src/args.rs
@@ -11,7 +11,7 @@ pub struct ResolvedBuild {
}
#[derive(ValueEnum, Debug, Clone, Copy, PartialEq, Eq)]
-pub enum Component {
+pub enum Project {
Bootloader,
Boardloader,
#[value(name = "bootloader_ci")]
@@ -22,23 +22,23 @@ pub enum Component {
Secmon,
}
-impl Component {
+impl Project {
/// The Rust package name used for cargo commands
pub fn package_name(self, emulator: bool) -> &'static str {
match self {
- Component::Bootloader => "bootloader",
- Component::Boardloader => "boardloader",
- Component::BootloaderCi => "bootloader_ci",
- Component::Firmware => {
+ Project::Bootloader => "bootloader",
+ Project::Boardloader => "boardloader",
+ Project::BootloaderCi => "bootloader_ci",
+ Project::Firmware => {
if emulator {
"unix"
} else {
"firmware"
}
}
- Component::Prodtest => "prodtest",
- Component::Kernel => "kernel",
- Component::Secmon => "secmon",
+ Project::Prodtest => "prodtest",
+ Project::Kernel => "kernel",
+ Project::Secmon => "secmon",
}
}
@@ -46,13 +46,13 @@ impl Component {
/// the `.map` filename generated by the linker.
pub fn binary_name(self) -> &'static str {
match self {
- Component::Bootloader => "bootloader",
- Component::BootloaderCi => "bootloader_ci",
- Component::Boardloader => "boardloader",
- Component::Firmware => "firmware",
- Component::Prodtest => "prodtest",
- Component::Kernel => "kernel",
- Component::Secmon => "secmon",
+ Project::Bootloader => "bootloader",
+ Project::BootloaderCi => "bootloader_ci",
+ Project::Boardloader => "boardloader",
+ Project::Firmware => "firmware",
+ Project::Prodtest => "prodtest",
+ Project::Kernel => "kernel",
+ Project::Secmon => "secmon",
}
}
@@ -70,23 +70,23 @@ impl Component {
/// Get symbol from memory.ld used as start address for flashing
pub fn flash_start_symbol(self) -> Result<&'static str> {
let symbol = match self {
- Component::Boardloader => "BOARDLOADER_START",
- Component::Bootloader | Component::BootloaderCi => "BOOTLOADER_START",
- Component::Firmware | Component::Prodtest => "FIRMWARE_START",
+ Project::Boardloader => "BOARDLOADER_START",
+ Project::Bootloader | Project::BootloaderCi => "BOOTLOADER_START",
+ Project::Firmware | Project::Prodtest => "FIRMWARE_START",
_ => return Err(anyhow!("Flashing {:?} is not supported", self)),
};
Ok(symbol)
}
- /// Returns the next component in the dependency chain,
+ /// Returns the next project in the dependency chain,
/// (e.g. Firmware -> Kernel -> Secmon)
- pub fn dependency(self, model: Model) -> Result<Option<Component>> {
+ pub fn dependency(self, model: Model) -> Result<Option<Project>> {
match self {
- Component::Firmware => Ok(Some(Component::Kernel)),
- Component::Kernel => {
+ Project::Firmware => Ok(Some(Project::Kernel)),
+ Project::Kernel => {
let has_secmon = model.config()?.secmon;
Ok(if has_secmon {
- Some(Component::Secmon)
+ Some(Project::Secmon)
} else {
None
})
@@ -95,16 +95,16 @@ impl Component {
}
}
- /// Returns whether the component can be flashed to a device
+ /// Returns whether the project can be flashed to a device
/// using the `flash` subcommand.
pub fn flashable(self) -> bool {
self.flash_start_symbol().is_ok()
}
- /// Returns whether the component can be uploaded to a device
+ /// Returns whether the project can be uploaded to a device
/// using the `upload` subcommand.
pub fn uploadable(self) -> bool {
- matches!(self, Component::Firmware | Component::Prodtest)
+ matches!(self, Project::Firmware | Project::Prodtest)
}
}
@@ -125,7 +125,7 @@ pub struct Cli {
#[derive(Subcommand, Debug)]
pub enum Cmd {
- /// Build a component with the specified configuration
+ /// Build a project with the specified configuration
Build(BuildArgs),
/// Run clippy command with the specified configuration
Clippy(BuildArgs),
@@ -143,14 +143,14 @@ pub enum Cmd {
FlashErase(FlashEraseArgs),
/// Upload firmware to device
Upload(UploadArgs),
- /// Combine multiple firmware components into a single binary for flashing
+ /// Combine multiple firmware projects into a single binary for flashing
Combine(CombineArgs),
}
#[derive(Args, Debug, Clone)]
-#[command(override_usage = "xtask build <COMPONENT> --model <MODEL> [OPTIONS]")]
+#[command(override_usage = "xtask build <PROJECT> --model <MODEL> [OPTIONS]")]
pub struct BuildArgs {
- pub component: Component,
+ pub project: Project,
/// Build target model
#[arg(long, short = 'm', ignore_case = true)]
@@ -299,7 +299,7 @@ pub struct TestArgs {
#[derive(Args, Debug)]
pub struct FlashArgs {
- pub component: Component,
+ pub project: Project,
/// Target model
#[arg(long, short = 'm', ignore_case = true)]
@@ -328,7 +328,7 @@ pub struct FlashEraseArgs {
#[derive(Args, Debug)]
pub struct UploadArgs {
- pub component: Component,
+ pub project: Project,
/// Build target model
#[arg(long, short = 'm', ignore_case = true)]
@@ -337,7 +337,7 @@ pub struct UploadArgs {
#[derive(Args, Debug)]
pub struct CombineArgs {
- pub component: Component,
+ pub project: Project,
/// Target model
#[arg(long, short = 'm', ignore_case = true)]
diff --git a/core/embed/xtask/src/artifacts.rs b/core/embed/xtask/src/artifacts.rs
index 04c5ebcd..fe4d03b8 100644
--- a/core/embed/xtask/src/artifacts.rs
+++ b/core/embed/xtask/src/artifacts.rs
@@ -71,11 +71,11 @@ pub fn collect_artifacts(args: &BuildArgs, is_dependency: bool) -> Result<()> {
helpers::ensure_directory(&artifact_dir)?;
- let name = args.component.artifact_name(args.emulator);
- let binary_name = args.component.binary_name();
+ let name = args.project.artifact_name(args.emulator);
+ let binary_name = args.project.binary_name();
let profile_dir = helpers::profile_dir(args)?;
let elf = helpers::elf_path(args)?;
- let package = args.component.package_name(args.emulator);
+ let package = args.project.package_name(args.emulator);
let compile_commands = profile_dir.join(format!("{package}.cc.json"));
let elf_ext = if args.emulator { "" } else { ".elf" };
diff --git a/core/embed/xtask/src/cargo.rs b/core/embed/xtask/src/cargo.rs
index 82d1425d..23289a5e 100644
--- a/core/embed/xtask/src/cargo.rs
+++ b/core/embed/xtask/src/cargo.rs
@@ -3,7 +3,7 @@ use owo_colors::OwoColorize;
use std::process;
use crate::{
- args::{BuildArgs, Component, TestArgs},
+ args::{BuildArgs, Project, TestArgs},
artifacts, helpers, memusage, postbuild, prebuild,
};
@@ -91,10 +91,10 @@ pub fn fmt() -> Result<()> {
fn build_impl(args: BuildArgs, is_dependency: bool) -> Result<()> {
if !args.emulator {
// Recursively build dependencies (Firmware -> Kernel -> Secmon)
- if let Some(dependency) = args.component.dependency(args.model)? {
+ if let Some(dependency) = args.project.dependency(args.model)? {
build_impl(
BuildArgs {
- component: dependency,
+ project: dependency,
..args.clone()
},
true,
@@ -103,12 +103,12 @@ fn build_impl(args: BuildArgs, is_dependency: bool) -> Result<()> {
}
// Prebuild steps
- if matches!(args.component, Component::Firmware) {
+ if matches!(args.project, Project::Firmware) {
prebuild::update_templates()?;
prebuild::update_translations()?;
}
- // Build the component
+ // Build the project
run_cargo_subcommand("build", &args)?;
let elf = helpers::elf_path(&args)?;
@@ -120,14 +120,14 @@ fn build_impl(args: BuildArgs, is_dependency: bool) -> Result<()> {
// For hardware targets, we need to convert the ELF file into a raw
// binary before signing it.
- let bin = postbuild::elf_to_bin(&elf, args.component, &model_config, use_dev_keys)?;
+ let bin = postbuild::elf_to_bin(&elf, args.project, &model_config, use_dev_keys)?;
// Sign the binary except for those that don't have headers
- if !matches!(args.component, Component::Boardloader | Component::Kernel) {
- postbuild::sign_binary(&bin, args.component, &model_config, use_dev_keys)?;
+ if !matches!(args.project, Project::Boardloader | Project::Kernel) {
+ postbuild::sign_binary(&bin, args.project, &model_config, use_dev_keys)?;
}
- if args.component == Component::Firmware {
+ if args.project == Project::Firmware {
let firwmare_cc_json = bin.with_extension("cc.json");
let kernel_cc_json = bin.with_file_name("kernel").with_extension("cc.json");
let secmon_cc_json = bin.with_file_name("secmon").with_extension("cc.json");
@@ -139,9 +139,9 @@ fn build_impl(args: BuildArgs, is_dependency: bool) -> Result<()> {
}
// Copy the final binary to the `pub` directory
- if !matches!(args.component, Component::Secmon | Component::Kernel) {
- let version_file = helpers::get_version_file(args.component)?;
- postbuild::publish_artifact(&bin, args.component, args.model, &version_file, None)?;
+ if !matches!(args.project, Project::Secmon | Project::Kernel) {
+ let version_file = helpers::get_version_file(args.project)?;
+ postbuild::publish_artifact(&bin, args.project, args.model, &version_file, None)?;
}
}
@@ -151,7 +151,7 @@ fn build_impl(args: BuildArgs, is_dependency: bool) -> Result<()> {
// Print memory usage
if !args.emulator && !is_dependency {
let mapfile = elf
- .with_file_name(args.component.binary_name())
+ .with_file_name(args.project.binary_name())
.with_extension("map");
memusage::print_memusage(&mapfile)?;
}
@@ -167,8 +167,8 @@ fn run_cargo_subcommand(subcommand: &str, args: &BuildArgs) -> Result<()> {
args.configure_cargo(&mut cmd)
.context(format!("Failed to construct {} command", subcommand))?;
- let component_name = format!("{:?}", args.component).to_lowercase();
- println!("xtask: Running {} on `{}`", subcommand, component_name);
+ let project_name = format!("{:?}", args.project).to_lowercase();
+ println!("xtask: Running {} on `{}`", subcommand, project_name);
println!("{}", command_args_to_string(&cmd).bold().dimmed());
let status = cmd
diff --git a/core/embed/xtask/src/combine.rs b/core/embed/xtask/src/combine.rs
index 6d29b522..4ad06fe5 100644
--- a/core/embed/xtask/src/combine.rs
+++ b/core/embed/xtask/src/combine.rs
@@ -2,21 +2,21 @@ use anyhow::{Context, Result};
use std::fs;
use crate::{
- args::{CombineArgs, Component, Model},
+ args::{CombineArgs, Model, Project},
helpers, postbuild,
};
const COMBINED_PREFIX: &str = "combined-";
-fn load_binary(model: Model, component: Component) -> Result<Vec<u8>> {
- let path = helpers::artifacts_dir(model)?.join(format!("{}.bin", component.binary_name()));
+fn load_binary(model: Model, project: Project) -> Result<Vec<u8>> {
+ let path = helpers::artifacts_dir(model)?.join(format!("{}.bin", project.binary_name()));
println!("Loading `{}`", path.display());
let data = fs::read(&path)
.with_context(|| format!("Failed to read binary file `{}`", path.display()))?;
Ok(data)
}
-/// Combines multiple firmware components into a single binary for flashing.
+/// Combines multiple firmware projects into a single binary for flashing.
pub fn combine(args: CombineArgs) -> Result<()> {
let memory_ld = args.model.model_memory_ld()?;
@@ -28,30 +28,30 @@ pub fn combine(args: CombineArgs) -> Result<()> {
// Create an binary with leading offset zeroes
let mut binary = vec![0u8; offset as usize];
- binary.extend_from_slice(&load_binary(args.model, Component::Boardloader)?);
+ binary.extend_from_slice(&load_binary(args.model, Project::Boardloader)?);
- match args.component {
- Component::Bootloader => {
- binary.extend_from_slice(&load_binary(args.model, Component::Bootloader)?);
+ match args.project {
+ Project::Bootloader => {
+ binary.extend_from_slice(&load_binary(args.model, Project::Bootloader)?);
}
- Component::BootloaderCi => {
- binary.extend_from_slice(&load_binary(args.model, Component::BootloaderCi)?);
+ Project::BootloaderCi => {
+ binary.extend_from_slice(&load_binary(args.model, Project::BootloaderCi)?);
}
- Component::Firmware => {
- binary.extend_from_slice(&load_binary(args.model, Component::Bootloader)?);
- binary.extend_from_slice(&load_binary(args.model, Component::Firmware)?);
+ Project::Firmware => {
+ binary.extend_from_slice(&load_binary(args.model, Project::Bootloader)?);
+ binary.extend_from_slice(&load_binary(args.model, Project::Firmware)?);
}
- Component::Prodtest => {
- binary.extend_from_slice(&load_binary(args.model, Component::Bootloader)?);
- binary.extend_from_slice(&load_binary(args.model, Component::Prodtest)?);
+ Project::Prodtest => {
+ binary.extend_from_slice(&load_binary(args.model, Project::Bootloader)?);
+ binary.extend_from_slice(&load_binary(args.model, Project::Prodtest)?);
}
_ => anyhow::bail!(
"Combining is not supported for `{}`",
- args.component.binary_name()
+ args.project.binary_name()
),
}
@@ -62,7 +62,7 @@ pub fn combine(args: CombineArgs) -> Result<()> {
let output_path = artifact_dir.join(format!(
"{}{}.bin",
COMBINED_PREFIX,
- args.component.binary_name()
+ args.project.binary_name()
));
println!("Writing combined binary to `{}`", output_path.display());
fs::write(&output_path, &binary).with_context(|| {
@@ -73,10 +73,10 @@ pub fn combine(args: CombineArgs) -> Result<()> {
})?;
// Publish the combined binary to the `pub` directory
- let version_file = helpers::get_version_file(args.component)?;
+ let version_file = helpers::get_version_file(args.project)?;
postbuild::publish_artifact(
&output_path,
- args.component,
+ args.project,
args.model,
&version_file,
Some(COMBINED_PREFIX),
diff --git a/core/embed/xtask/src/config.rs b/core/embed/xtask/src/config.rs
index 1f473c30..cd46ffb8 100644
--- a/core/embed/xtask/src/config.rs
+++ b/core/embed/xtask/src/config.rs
@@ -2,7 +2,7 @@ use anyhow::{Context, Result, anyhow, bail};
use serde::Deserialize;
use std::collections::{HashMap, HashSet};
-use crate::args::Component;
+use crate::args::Project;
use crate::helpers::workspace_dir;
#[derive(Deserialize)]
@@ -17,7 +17,7 @@ pub struct ModelConfig {
#[serde(default)]
pub secmon: bool,
#[serde(default)]
- pub targets: HashMap<String, ModelTargetOverride>,
+ pub project_overrides: HashMap<String, ModelProjectOverride>,
/// Signing tool for bootloader/bootloader_ci. Defaults to "headertool".
#[serde(default)]
pub bootloader_header_tool: Option<String>,
@@ -134,7 +134,7 @@ impl BoardConfig {
}
#[derive(Deserialize)]
-pub struct TargetProfile {
+pub struct ProjectProfile {
pub uses: Vec<String>,
pub elf_sections: Vec<String>,
/// Body sections used when the model has secmon and the binary needs a
@@ -151,22 +151,22 @@ pub struct TargetProfile {
pub split_part2_sections: Option<Vec<String>>,
}
-impl TargetProfile {
- pub fn load(component: Component) -> Result<Self> {
- let pkg = component.package_name(false);
+impl ProjectProfile {
+ pub fn load(project: Project) -> Result<Self> {
+ let pkg = project.package_name(false);
let path = workspace_dir()?
.join("projects")
.join(pkg)
- .join("target.toml");
+ .join("project.toml");
let content = std::fs::read_to_string(&path)
- .with_context(|| format!("Failed to read target profile: {}", path.display()))?;
+ .with_context(|| format!("Failed to read project profile: {}", path.display()))?;
toml::from_str(&content)
- .with_context(|| format!("Failed to parse target profile: {}", path.display()))
+ .with_context(|| format!("Failed to parse project profile: {}", path.display()))
}
}
#[derive(Deserialize, Default, Clone)]
-pub struct ModelTargetOverride {
+pub struct ModelProjectOverride {
#[serde(default)]
pub exclude: Vec<String>,
}
@@ -179,27 +179,31 @@ pub struct BoardFeatures {
pub fn resolve_board_features(
model_config: &ModelConfig,
board_id: &str,
- component: Component,
+ project: Project,
emulator: bool,
) -> Result<BoardFeatures> {
let board_config = BoardConfig::load(&model_config.model_id, board_id)?;
- let target_profile = TargetProfile::load(component)?;
- let pkg = component.package_name(false);
- let model_override = model_config.targets.get(pkg).cloned().unwrap_or_default();
-
- let uses: HashSet<&str> = target_profile.uses.iter().map(|s| s.as_str()).collect();
+ let project_profile = ProjectProfile::load(project)?;
+ let pkg = project.package_name(false);
+ let model_override = model_config
+ .project_overrides
+ .get(pkg)
+ .cloned()
+ .unwrap_or_default();
+
+ let uses: HashSet<&str> = project_profile.uses.iter().map(|s| s.as_str()).collect();
let exclude: HashSet<&str> = model_override.exclude.iter().map(|s| s.as_str()).collect();
let mut features = Vec::new();
- // Model-intrinsic features filtered by target profile then model exceptions
+ // Model-intrinsic features filtered by project profile then model exceptions
for f in &model_config.features {
if uses.contains(f.as_str()) && !exclude.contains(f.as_str()) {
features.push(f.clone());
}
}
- // Board peripheral features filtered by target profile then model exceptions
+ // Board peripheral features filtered by project profile then model exceptions
for periph in &board_config.peripherals {
if uses.contains(periph.name.as_str()) && !exclude.contains(periph.name.as_str()) {
features.push(periph.name.clone());
diff --git a/core/embed/xtask/src/feature_resolver.rs b/core/embed/xtask/src/feature_resolver.rs
index 44518b0f..8dd36417 100644
--- a/core/embed/xtask/src/feature_resolver.rs
+++ b/core/embed/xtask/src/feature_resolver.rs
@@ -2,7 +2,7 @@ use anyhow::{Result, bail};
use std::process;
use crate::{
- args::{BuildArgs, Component, ConsoleType, ResolvedBuild},
+ args::{BuildArgs, ConsoleType, Project, ResolvedBuild},
config, helpers,
};
@@ -33,11 +33,11 @@ pub fn resolve_features(args: &BuildArgs) -> Result<ResolvedBuild> {
features.push("asan".into());
}
} else {
- match (args.component, args.dbg_console) {
- (Component::Firmware, Some(_)) => features.push("dbg_console".into()),
- (Component::Secmon, Some(ConsoleType::Vcp)) => (),
- (Component::Boardloader, Some(ConsoleType::Vcp)) => (),
- (Component::Prodtest, Some(ConsoleType::Vcp)) => (),
+ match (args.project, args.dbg_console) {
+ (Project::Firmware, Some(_)) => features.push("dbg_console".into()),
+ (Project::Secmon, Some(ConsoleType::Vcp)) => (),
+ (Project::Boardloader, Some(ConsoleType::Vcp)) => (),
+ (Project::Prodtest, Some(ConsoleType::Vcp)) => (),
(_, Some(ConsoleType::Vcp)) => features.push("dbg_console_vcp".into()),
(_, Some(ConsoleType::Swo)) => features.push("dbg_console_swo".into()),
(_, Some(ConsoleType::SystemView)) => features.push("dbg_console_sysview".into()),
@@ -47,7 +47,7 @@ pub fn resolve_features(args: &BuildArgs) -> Result<ResolvedBuild> {
let pyopt = args.pyopt.unwrap_or(true);
- if args.component == Component::Firmware {
+ if args.project == Project::Firmware {
if pyopt {
features.push("pyopt".into());
} else {
@@ -88,8 +88,8 @@ pub fn resolve_features(args: &BuildArgs) -> Result<ResolvedBuild> {
}
if matches!(
- args.component,
- Component::Secmon | Component::Kernel | Component::Firmware
+ args.project,
+ Project::Secmon | Project::Kernel | Project::Firmware
) {
if !args.btc_only {
features.push("universal_fw".into());
@@ -112,8 +112,8 @@ pub fn resolve_features(args: &BuildArgs) -> Result<ResolvedBuild> {
}
if matches!(
- args.component,
- Component::Firmware | Component::Bootloader | Component::Prodtest
+ args.project,
+ Project::Firmware | Project::Bootloader | Project::Prodtest
) {
if args.perf_overlay {
features.push("ui_performance_overlay".into());
@@ -129,13 +129,13 @@ pub fn resolve_features(args: &BuildArgs) -> Result<ResolvedBuild> {
}
}
- if matches!(args.component, Component::Kernel) {
+ if matches!(args.project, Project::Kernel) {
if args.debug_link.unwrap_or(!pyopt) {
features.push("debuglink".into());
}
}
- if args.component == Component::Firmware && (args.frozen || !args.emulator) {
+ if args.project == Project::Firmware && (args.frozen || !args.emulator) {
features.push("frozen".into());
}
@@ -148,7 +148,7 @@ pub fn resolve_features(args: &BuildArgs) -> Result<ResolvedBuild> {
.clone()
.unwrap_or_else(|| model_config.default_board.clone());
let board_features =
- config::resolve_board_features(&model_config, &board_id, args.component, args.emulator)?;
+ config::resolve_board_features(&model_config, &board_id, args.project, args.emulator)?;
let mut board_feat = board_features.features;
if args.disable_optiga {
board_feat.retain(|f| f != "optiga");
@@ -176,7 +176,7 @@ pub fn configure_cargo(args: &BuildArgs, cmd: &mut process::Command) -> Result<(
let resolved = resolve_features(args)?;
let mut rebuild_std = false;
- cmd.args(["--package", args.component.package_name(args.emulator)]);
+ cmd.args(["--package", args.project.package_name(args.emulator)]);
cmd.args(["--features", &resolved.features.join(",")]);
cmd.args(["--profile", args.profile_name()]);
cmd.env("TREZOR_BOARD_HEADER", &resolved.board_header);
diff --git a/core/embed/xtask/src/flash.rs b/core/embed/xtask/src/flash.rs
index b31dbde1..598c211d 100644
--- a/core/embed/xtask/src/flash.rs
+++ b/core/embed/xtask/src/flash.rs
@@ -9,22 +9,22 @@ use crate::{
helpers,
};
-/// Flashes the specified component to the device using OpenOCD.
+/// Flashes the specified project to the device using OpenOCD.
pub fn flash(args: FlashArgs) -> Result<()> {
ensure!(
- args.component.flashable(),
+ args.project.flashable(),
"Flashing is not supported for `{}`",
- args.component.binary_name()
+ args.project.binary_name()
);
let binary =
- helpers::artifacts_dir(args.model)?.join(format!("{}.bin", args.component.binary_name()));
+ helpers::artifacts_dir(args.model)?.join(format!("{}.bin", args.project.binary_name()));
let binary = binary
.canonicalize()
.with_context(|| format!("Failed to locate `{}` for flashing", binary.display()))?;
- let flash_start = args.component.flash_start_symbol()?;
+ let flash_start = args.project.flash_start_symbol()?;
let memory_ld = args.model.model_memory_ld()?;
let address = helpers::read_symbol(&memory_ld, flash_start)?;
diff --git a/core/embed/xtask/src/helpers.rs b/core/embed/xtask/src/helpers.rs
index 4fe8ab70..23f03954 100644
--- a/core/embed/xtask/src/helpers.rs
+++ b/core/embed/xtask/src/helpers.rs
@@ -5,11 +5,11 @@ use std::{
path::{Path, PathBuf},
};
-use crate::args::{BuildArgs, Component, Model};
+use crate::args::{BuildArgs, Model, Project};
/// Returns the path to the built ELF file for the given build arguments.
pub fn elf_path(args: &BuildArgs) -> Result<PathBuf> {
- let elf_name = args.component.package_name(args.emulator);
+ let elf_name = args.project.package_name(args.emulator);
Ok(profile_dir(args)?.join(elf_name))
}
@@ -178,10 +178,10 @@ fn parse_address(value: &str) -> Result<u32> {
}
}
-pub fn get_version_file(component: Component) -> Result<PathBuf> {
+pub fn get_version_file(project: Project) -> Result<PathBuf> {
Ok(workspace_dir()?
.join("projects")
- .join(component.binary_name())
+ .join(project.binary_name())
.join("version.h"))
}
diff --git a/core/embed/xtask/src/postbuild.rs b/core/embed/xtask/src/postbuild.rs
index 040a4bea..3820ec9e 100644
--- a/core/embed/xtask/src/postbuild.rs
+++ b/core/embed/xtask/src/postbuild.rs
@@ -6,93 +6,93 @@ use std::{
};
use crate::{
- args::Component,
- config::{ModelConfig, TargetProfile},
+ args::Project,
+ config::{ModelConfig, ProjectProfile},
helpers,
model::Model,
};
/// Extracts appropriate sections from the ELF file and creates a raw unsigned binary.
-/// Section lists are read from the component's `target.toml`; model-specific split
+/// Section lists are read from the project's `project.toml`; model-specific split
/// behaviour is controlled by `model_config`.
pub fn elf_to_bin(
source: &Path,
- component: Component,
+ project: Project,
model_config: &ModelConfig,
use_dev_keys: bool,
) -> Result<PathBuf> {
- let target_profile = TargetProfile::load(component)?;
+ let project_profile = ProjectProfile::load(project)?;
- match component {
- Component::Firmware => {
+ match project {
+ Project::Firmware => {
if model_config.is_stm32f4() {
// STM32F4 firmware flash is non-contiguous — two banks separated
// by the storage area must be extracted and concatenated.
// Part1 uses the same elf_sections as the flat (non-split) path.
- let pad_to = target_profile
+ let pad_to = project_profile
.split_pad_to
.as_deref()
- .ok_or_else(|| anyhow::anyhow!("firmware target.toml missing split_pad_to"))?;
+ .ok_or_else(|| anyhow::anyhow!("firmware project.toml missing split_pad_to"))?;
let part2_sections =
- target_profile
+ project_profile
.split_part2_sections
.as_ref()
.ok_or_else(|| {
- anyhow::anyhow!("firmware target.toml missing split_part2_sections")
+ anyhow::anyhow!("firmware project.toml missing split_part2_sections")
})?;
let part1 = objcopy_ex(
source,
"part1",
- &target_profile.elf_sections,
+ &project_profile.elf_sections,
["--pad-to", pad_to],
)?;
let part2 = objcopy_ex(source, "part2", part2_sections, [] as [&str; 0])?;
concat_files(part1.with_extension("ubin"), [part1, part2])
} else {
- objcopy(source, &target_profile.elf_sections)
+ objcopy(source, &project_profile.elf_sections)
}
}
- Component::Prodtest => {
+ Project::Prodtest => {
if model_config.secmon {
// On secmon models prodtest is a secmon-signed body with a plain
// vendor header prepended. The body is signed before concatenation.
let body_sections =
- target_profile
+ project_profile
.secmon_body_sections
.as_ref()
.ok_or_else(|| {
- anyhow::anyhow!("prodtest target.toml missing secmon_body_sections")
+ anyhow::anyhow!("prodtest project.toml missing secmon_body_sections")
})?;
let header_sections =
- target_profile
+ project_profile
.secmon_header_sections
.as_ref()
.ok_or_else(|| {
- anyhow::anyhow!("prodtest target.toml missing secmon_header_sections")
+ anyhow::anyhow!("prodtest project.toml missing secmon_header_sections")
})?;
let body_bin = objcopy_ex(source, "body.bin", body_sections, [] as [&str; 0])?;
- sign_binary(&body_bin, component, model_config, use_dev_keys)?;
+ sign_binary(&body_bin, project, model_config, use_dev_keys)?;
let header_bin =
objcopy_ex(source, "header.bin", header_sections, [] as [&str; 0])?;
concat_files(source.with_extension("bin"), [header_bin, body_bin])
} else {
- objcopy(source, &target_profile.elf_sections)
+ objcopy(source, &project_profile.elf_sections)
}
}
- _ => objcopy(source, &target_profile.elf_sections),
+ _ => objcopy(source, &project_profile.elf_sections),
}
}
pub fn sign_binary(
binary: &Path,
- component: Component,
+ project: Project,
model_config: &ModelConfig,
use_dev_keys: bool,
) -> Result<()> {
- let header_tool = match component {
- Component::Bootloader | Component::BootloaderCi => model_config
+ let header_tool = match project {
+ Project::Bootloader | Project::BootloaderCi => model_config
.bootloader_header_tool
.as_deref()
.unwrap_or("headertool"),
@@ -262,11 +262,11 @@ pub fn merge_compile_commands(inputs: &[&Path], output: &Path) -> Result<()> {
}
/// Copies a built binary to `artifacts/pub`.
-/// The filename includes the component, model, version, git revision,
+/// The filename includes the project, model, version, git revision,
/// and dirty state, for example `bootloader-T3W1-2.1.17-9e4bbc68-dirty.bin`.
pub fn publish_artifact(
binary: &Path,
- component: Component,
+ project: Project,
model: Model,
version_file: &Path,
prefix: Option<&str>,
@@ -279,7 +279,7 @@ pub fn publish_artifact(
let name = format!(
"{}{}-{}-{}-{}{}.bin",
prefix,
- component.binary_name(),
+ project.binary_name(),
model.model_id(),
&helpers::parse_version_file(version_file)?,
&helpers::git_revision()?[..8],
diff --git a/core/embed/xtask/src/upload.rs b/core/embed/xtask/src/upload.rs
index 7b39f3ba..45ec2ef1 100644
--- a/core/embed/xtask/src/upload.rs
+++ b/core/embed/xtask/src/upload.rs
@@ -5,13 +5,13 @@ use crate::{args::UploadArgs, helpers};
pub fn upload(args: UploadArgs) -> Result<()> {
ensure!(
- args.component.uploadable(),
+ args.project.uploadable(),
"trezorctl upload is not supported for `{}`",
- args.component.binary_name()
+ args.project.binary_name()
);
let binary =
- helpers::artifacts_dir(args.model)?.join(format!("{}.bin", args.component.binary_name()));
+ helpers::artifacts_dir(args.model)?.join(format!("{}.bin", args.project.binary_name()));
let binary = binary
.canonicalize()
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.