Include all the SDK static archives directly

This avoids all sorts of complex linking activity downstream
This commit is contained in:
David Goodlad 2019-04-24 09:26:47 +10:00
parent d639d3b5e4
commit cf8f8ebdb2
2 changed files with 42 additions and 13 deletions

View file

@ -6,9 +6,11 @@ edition = "2018"
links = "sdk" links = "sdk"
[dependencies] [dependencies]
freertos_rs = { git = "https://github.com/hashmismatch/freertos.rs", rev = "a5b296a64d48db97c711673a825f6a0e5b9d9188" }
cty = "0.2" cty = "0.2"
[build-dependencies] [build-dependencies]
cc = { version = "1.0", features = ["parallel"] } cc = { version = "1.0", features = ["parallel"] }
bindgen = "0.49.0" bindgen = "0.49.0"
llvm-tools = "0.1.1" llvm-tools = "0.1.1"
glob = "0.3.0"

View file

@ -1,13 +1,16 @@
extern crate bindgen; extern crate bindgen;
extern crate cc; extern crate cc;
extern crate glob;
extern crate llvm_tools; extern crate llvm_tools;
use glob::glob;
use llvm_tools::LlvmTools;
use std::env; use std::env;
use std::fmt;
use std::fs;
use std::path::PathBuf; use std::path::PathBuf;
use std::process::Command; use std::process::Command;
use llvm_tools::LlvmTools;
const STDLIB_INCLUDE_PATHS: &[&'static str] = &[ const STDLIB_INCLUDE_PATHS: &[&'static str] = &[
"/usr/lib/gcc/arm-none-eabi/5.4.1/include", "/usr/lib/gcc/arm-none-eabi/5.4.1/include",
"/usr/lib/gcc/arm-none-eabi/5.4.1/include-fixed", "/usr/lib/gcc/arm-none-eabi/5.4.1/include-fixed",
@ -239,8 +242,21 @@ const SDK_C_FILES: &[&'static str] = &[
"vendor/sdk/component/common/utilities/xml.c", "vendor/sdk/component/common/utilities/xml.c",
]; ];
const SDK_STATIC_LIBS: &[&'static str] = &[
"platform",
"wlan",
"http",
"dct",
"wps",
"rtlstd",
"websocket",
"xmodem",
"mdns"
];
fn main() { fn main() {
let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
let sdk_staticlib_path = PathBuf::from("vendor/sdk/component/soc/realtek/8195a/misc/bsp/lib/common/GCC").canonicalize().unwrap();
let tools = LlvmTools::new().unwrap(); let tools = LlvmTools::new().unwrap();
let objcopy = match tools.tool("llvm-objcopy") { let objcopy = match tools.tool("llvm-objcopy") {
@ -248,6 +264,23 @@ fn main() {
None => panic!("Couldn't find objcopy"), None => panic!("Couldn't find objcopy"),
}; };
for lib_name in SDK_STATIC_LIBS.iter() {
fs::create_dir_all(out_path.join("static").join(lib_name)).expect("Could not create directory");
Command::new("ar")
.arg("x")
.arg(sdk_staticlib_path.join(format!("lib_{}.a", lib_name)).to_str().unwrap())
.current_dir(out_path.join("static").join(lib_name))
.status().unwrap();
}
let sdk_static_lib_object_paths = glob(out_path.join("static/**/*.o").to_str().unwrap()).unwrap().into_iter().filter_map(|entry| {
match entry {
Ok(path) => Some(path),
Err(_) => None,
}
}).collect::<Vec<_>>();
Command::new(objcopy) Command::new(objcopy)
.args(&["--rename-section", ".data=.loader.data,contents,alloc,load,readonly,data"]) .args(&["--rename-section", ".data=.loader.data,contents,alloc,load,readonly,data"])
.args(&["-I", "binary"]) .args(&["-I", "binary"])
@ -287,23 +320,17 @@ fn main() {
compiler.include(path); compiler.include(path);
} }
for path in sdk_static_lib_object_paths {
compiler.object(path);
}
compiler compiler
.object(out_path.join("ram_1.r.o")) .object(out_path.join("ram_1.r.o"))
.object("vendor/sdk/component/soc/realtek/8195a/misc/bsp/lib/common/GCC/lib_wlan.a")
.files(SDK_C_FILES) .files(SDK_C_FILES)
.file("src/freertos_rs.c") .file("src/freertos_rs.c")
.compile("sdk"); .compile("sdk");
println!("cargo:rustc-link-search=native=vendor/sdk/component/soc/realtek/8195a/misc/bsp/lib/common/GCC/");
println!("cargo:rustc-link-lib=_platform");
println!("cargo:rustc-link-lib=_wlan");
println!("cargo:rustc-link-lib=_http");
println!("cargo:rustc-link-lib=_dct");
println!("cargo:rustc-link-lib=_wps");
println!("cargo:rustc-link-lib=_rtlstd");
println!("cargo:rustc-link-lib=_websocket");
println!("cargo:rustc-link-lib=_xmodem");
println!("cargo:rustc-link-lib=_mdns");
let bindings = bindgen::Builder::default() let bindings = bindgen::Builder::default()
.header("include/wrapper.h") .header("include/wrapper.h")
.whitelist_function("wifi_manager_init") .whitelist_function("wifi_manager_init")