mod cross; mod local; mod sbuild; use crate::context; use std::error::Error; use std::path::Path; pub fn build_binary_package( arch: Option<&str>, series: Option<&str>, cwd: Option<&Path>, cross: bool, ) -> Result<(), Box> { let cwd = cwd.unwrap_or_else(|| Path::new(".")); // Parse changelog to get package name, version and series let changelog_path = cwd.join("debian/changelog"); let (package, version, package_series) = crate::changelog::parse_changelog_header(&changelog_path)?; let series = if let Some(s) = series { s } else { &package_series }; let current_arch = crate::get_current_arch(); let arch = arch.unwrap_or(¤t_arch); // Specific case: native cross-compilation, we don't allow that // instead this wraps to an automatic unshare chroot // using an ephemeral context if cross { cross::setup_native_context(series)?; } // Prepare Environment let ctx = context::current(); let build_root = ctx.create_temp_dir()?; // Ensure availability of all needed files for the build let parent_dir = cwd.parent().ok_or("Cannot find parent directory")?; ctx.ensure_available(parent_dir, &build_root)?; let parent_dir_name = parent_dir .file_name() .ok_or("Cannot find parent directory name")?; let build_root = format!("{}/{}", build_root, parent_dir_name.to_str().unwrap()); // Run sbuild if cross { local::build(cwd, &package, &version, arch, series, &build_root, cross)?; } else { sbuild::build(cwd, &package, &version, arch, series, &build_root, cross)?; } // Retrieve artifacts // Always retrieve to the directory containing the .dsc file println!("Retrieving artifacts to {}...", parent_dir.display()); // Only retrieve .deb files let remote_files = ctx.list_files(Path::new(&build_root))?; for remote_file in remote_files { if remote_file.extension().is_some_and(|ext| ext == "deb") { let file_name = remote_file.file_name().ok_or("Invalid remote filename")?; let local_dest = parent_dir.join(file_name); ctx.retrieve_path(&remote_file, &local_dest)?; } } Ok(()) }