- CitrineOS core extracted (CSMS OCPP 2.0.1) - OpenOCPP extracted (firmware OCPP 1.6J/2.0.1) - ShapeShifter library installed (pip install -e) - ShapeShifter specification extracted - EVerest extracted TODO updated with progress
82 lines
2.6 KiB
Rust
82 lines
2.6 KiB
Rust
use std::{
|
|
env,
|
|
fs::File,
|
|
io::{self, BufRead, BufReader},
|
|
path::Path,
|
|
};
|
|
|
|
/// Takes a path to a library like `libframework.so` and returns the name for the linker, aka
|
|
/// `framework`
|
|
fn libname_from_path(p: &Path) -> String {
|
|
let base = p
|
|
.file_stem()
|
|
.and_then(|os_str| os_str.to_str())
|
|
.expect("'p' must be valid UTF-8 and have an extension.")
|
|
.strip_prefix("lib")
|
|
.expect("'p' should start with `lib`");
|
|
|
|
// foo.so.1.2.3 -> foo
|
|
base.split('.').next().unwrap_or(base).to_string()
|
|
}
|
|
|
|
fn print_link_options(p: &Path) {
|
|
println!(
|
|
"cargo:rustc-link-search=native={}",
|
|
p.parent().unwrap().to_string_lossy()
|
|
);
|
|
println!("cargo:rustc-link-lib={}", libname_from_path(p));
|
|
}
|
|
|
|
/// Registers the libraries specified in the `EVEREST_RS_LINK_DEPENDENCIES` environment variable.
|
|
/// Expected to be a path to a text file that contains one object file path per line.
|
|
fn register_everest_link_deps(link_deps_path: &str) -> io::Result<()> {
|
|
let link_deps = File::open(link_deps_path).map_err(|e| {
|
|
io::Error::new(
|
|
e.kind(),
|
|
format!("Could not open EVEREST_RS_LINK_DEPENDENCIES file '{link_deps_path}': {e}"),
|
|
)
|
|
})?;
|
|
|
|
let mut found_any = false;
|
|
for line in BufReader::new(link_deps).lines() {
|
|
let line = line?;
|
|
let path = Path::new(&line);
|
|
if !path.is_file() {
|
|
return Err(io::Error::new(io::ErrorKind::NotFound, format!(
|
|
"Cannot find library path '{line}' specified in EVEREST_RS_LINK_DEPENDENCIES ({link_deps_path}).",
|
|
)));
|
|
}
|
|
|
|
print_link_options(path);
|
|
found_any = true;
|
|
}
|
|
|
|
if found_any {
|
|
Ok(())
|
|
} else {
|
|
Err(io::Error::new(
|
|
io::ErrorKind::NotFound,
|
|
format!("No library paths found in EVEREST_RS_LINK_DEPENDENCIES ({link_deps_path})."),
|
|
))
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
// See https://doc.rust-lang.org/cargo/reference/features.html#build-scripts
|
|
// for details.
|
|
if env::var("CARGO_FEATURE_BUILD_BAZEL").is_ok() {
|
|
println!("Skipping due to bazel");
|
|
return;
|
|
}
|
|
|
|
let Ok(link_deps_path) = env::var("EVEREST_RS_LINK_DEPENDENCIES") else {
|
|
panic!("EVEREST_RS_LINK_DEPENDENCIES environment variable is not set. This variable should point to the build/everestrs-link-dependencies.txt file generated by CMake.");
|
|
};
|
|
|
|
register_everest_link_deps(&link_deps_path)
|
|
.expect("Failed to register libraries specified in EVEREST_RS_LINK_DEPENDENCIES");
|
|
|
|
println!("cargo:rustc-link-lib=boost_log");
|
|
println!("cargo:rustc-link-lib=boost_log_setup");
|
|
}
|