use std::env;
use std::fs;
use std::path::PathBuf;
fn main() {
let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());
let target = env::var("TARGET").unwrap();
println!("cargo:rerun-if-changed=build.rs");
if target.starts_with("thumbv") {
let memory_x = if target == "thumbv6m-none-eabi" {
r#"
MEMORY {
BOOT2 : ORIGIN = 0x10000000, LENGTH = 0x100
FLASH : ORIGIN = 0x10000100, LENGTH = 2048K - 0x100
RAM : ORIGIN = 0x20000000, LENGTH = 256K
}
EXTERN(BOOT2_FIRMWARE)
SECTIONS {
.boot2 ORIGIN(BOOT2) :
{
KEEP(*(.boot2));
} > BOOT2
} INSERT BEFORE .text;
"#
} else if target == "thumbv7em-none-eabihf" {
r#"
MEMORY
{
FLASH : ORIGIN = 0x00000000, LENGTH = 512K
RAM : ORIGIN = 0x20000000, LENGTH = 128K
}
"#
} else if target == "thumbv8m.main-none-eabihf" {
r#"
MEMORY {
FLASH : ORIGIN = 0x10000000, LENGTH = 2048K
RAM : ORIGIN = 0x20000000, LENGTH = 512K
SRAM8 : ORIGIN = 0x20080000, LENGTH = 4K
SRAM9 : ORIGIN = 0x20081000, LENGTH = 4K
}
SECTIONS {
/* Boot ROM info - must be in first 4KB where boot ROM can find it */
.start_block : ALIGN(4)
{
__start_block_addr = .;
KEEP(*(.start_block));
KEEP(*(.boot_info));
} > FLASH
} INSERT AFTER .vector_table;
/* Move .text to start after the boot info */
_stext = ADDR(.start_block) + SIZEOF(.start_block);
SECTIONS {
/* Picotool Binary Info entries */
.bi_entries : ALIGN(4)
{
__bi_entries_start = .;
KEEP(*(.bi_entries));
. = ALIGN(4);
__bi_entries_end = .;
} > FLASH
} INSERT AFTER .text;
SECTIONS {
/* Boot ROM extra info at end */
.end_block : ALIGN(4)
{
__end_block_addr = .;
KEEP(*(.end_block));
__flash_binary_end = .;
} > FLASH
} INSERT AFTER .uninit;
PROVIDE(start_to_end = __end_block_addr - __start_block_addr);
PROVIDE(end_to_start = __start_block_addr - __end_block_addr);
"#
} else {
return; };
fs::write(out_dir.join("memory.x"), memory_x).unwrap();
println!("cargo:rustc-link-search={}", out_dir.display());
}
}