use std::{collections::HashMap, fs, path::{Path, PathBuf}, sync::OnceLock};
use cargo_metadata::MetadataCommand;
pub(crate) static FORCE_MAKEPAD: OnceLock<bool> = OnceLock::new();
pub(crate) static IS_MAKEPAD_APP: OnceLock<bool> = OnceLock::new();
pub(crate) fn makepad_package_dir_value(package_format: &str, main_binary_name: &str) -> String {
match package_format {
"app" | "dmg" => format!("."),
"appimage" => format!("lib/{}", main_binary_name),
"deb" | "pacman" => format!("/usr/lib/{}", main_binary_name),
"nsis" => format!("."),
_other => panic!("Unsupported package format: {}", _other),
}
}
pub(crate) fn is_makepad_app() -> bool {
*IS_MAKEPAD_APP.get_or_init(|| {
MetadataCommand::new()
.exec()
.ok()
.map(|cargo_metadata| cargo_metadata
.packages
.iter()
.any(|package| package.name == "makepad-widgets")
)
.unwrap_or(false)
})
}
pub(crate) fn get_makepad_resources_paths(target_dir: &Path) -> HashMap<String, PathBuf> {
let paths_dir = target_dir.to_path_buf();
fs::read_dir(&paths_dir)
.into_iter()
.flatten()
.flatten()
.filter_map(|entry| {
let path = entry.path();
if !path.is_file() {
return None;
}
let filename = path.file_name()?.to_str()?;
let package_name = filename
.strip_prefix("makepad-")?
.strip_suffix(".path")?;
let content = fs::read_to_string(&path).ok()?;
let resources_dir_path = PathBuf::from(content.trim());
let resources_dir_name = format!("makepad_{}", package_name.replace('-', "_"));
Some((resources_dir_name, resources_dir_path))
})
.collect()
}
pub(crate) fn copy_makepad_resources<P>(dist_resources_dir: P, target_dir: &Path) -> std::io::Result<()>
where
P: AsRef<Path>
{
let makepad_resources_paths = get_makepad_resources_paths(target_dir);
if makepad_resources_paths.is_empty() {
return Err(std::io::Error::new(
std::io::ErrorKind::NotFound,
format!("Missing resource paths: no `.path` files found in the Makepad build directory ({})", target_dir.display()),
));
}
println!("Copying Makepad resources...");
for (resources_dir_name, resources_dir_path) in makepad_resources_paths {
let source_path = resources_dir_path.join("resources");
let makepad_widgets_resources_dest = dist_resources_dir.as_ref()
.join(resources_dir_name)
.join("resources");
if source_path.exists() {
println!("--> From: {}\n to: {}", source_path.display(), makepad_widgets_resources_dest.display());
super::copy_recursively(&source_path, &makepad_widgets_resources_dest)?;
}
}
Ok(())
}