#[cfg(not(unix))] applies to the host machine (since that's where the build script is running) rather than the compilation target. Instead, environment variables are available to provide the information relevant to the build target at the build script's runtime.
58 lines
1.9 KiB
Rust
58 lines
1.9 KiB
Rust
use std::env;
|
|
|
|
fn main() {
|
|
println!("cargo::rerun-if-changed=build.rs");
|
|
|
|
if env::var_os("CARGO_CFG_UNIX").is_none() {
|
|
generate_bundled_icons();
|
|
}
|
|
}
|
|
|
|
fn generate_bundled_icons() {
|
|
println!("cargo::rerun-if-changed=cosmic-icons");
|
|
|
|
let manifest_dir = std::path::Path::new(std::env!("CARGO_MANIFEST_DIR"));
|
|
let icon_paths = [
|
|
"cosmic-icons/freedesktop/scalable",
|
|
"cosmic-icons/extra/scalable",
|
|
];
|
|
|
|
let key_value_assignments = icon_paths
|
|
.into_iter()
|
|
.map(|path| manifest_dir.join(path))
|
|
.inspect(|icon_path| assert!(icon_path.exists(), "path = {icon_path:?}"))
|
|
.map(|icon_path| std::fs::read_dir(icon_path).unwrap())
|
|
.flat_map(|dir| {
|
|
dir.flat_map(|entry| entry.unwrap().path().read_dir().unwrap())
|
|
.map(|entry| {
|
|
let entry = entry.unwrap();
|
|
let path = entry.path().canonicalize().unwrap();
|
|
let file_name = path.file_stem().unwrap().to_str().unwrap().to_owned();
|
|
let path = path.into_os_string().into_string().unwrap();
|
|
(file_name, path)
|
|
})
|
|
})
|
|
.fold(
|
|
std::collections::BTreeMap::new(),
|
|
|mut set, (name, path)| {
|
|
set.insert(name, path);
|
|
set
|
|
},
|
|
)
|
|
.into_iter()
|
|
.fold(String::new(), |mut output, (name, path)| {
|
|
output.push_str(&format!(" \"{name}\" => include_bytes!(\"{path}\"),\n"));
|
|
output
|
|
});
|
|
|
|
let code = [
|
|
"static ICONS: phf::Map<&'static str, &'static [u8]> = phf::phf_map!(\n",
|
|
&key_value_assignments,
|
|
");",
|
|
]
|
|
.concat();
|
|
|
|
let out_dir = std::env::var_os("OUT_DIR").unwrap();
|
|
let out_file = std::path::Path::new(&out_dir).join("bundled_icons.rs");
|
|
std::fs::write(&out_file, &code).unwrap();
|
|
}
|