71 lines
2.2 KiB
Rust
71 lines
2.2 KiB
Rust
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<dyn Error>> {
|
|
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(())
|
|
}
|