exp: cross #4
This commit is contained in:
@@ -6,11 +6,18 @@ use crate::context;
|
|||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
|
||||||
|
#[derive(PartialEq)]
|
||||||
|
pub enum BuildMode {
|
||||||
|
Sbuild,
|
||||||
|
Local,
|
||||||
|
}
|
||||||
|
|
||||||
pub fn build_binary_package(
|
pub fn build_binary_package(
|
||||||
arch: Option<&str>,
|
arch: Option<&str>,
|
||||||
series: Option<&str>,
|
series: Option<&str>,
|
||||||
cwd: Option<&Path>,
|
cwd: Option<&Path>,
|
||||||
cross: bool,
|
cross: bool,
|
||||||
|
mode: Option<BuildMode>,
|
||||||
) -> Result<(), Box<dyn Error>> {
|
) -> Result<(), Box<dyn Error>> {
|
||||||
let cwd = cwd.unwrap_or_else(|| Path::new("."));
|
let cwd = cwd.unwrap_or_else(|| Path::new("."));
|
||||||
|
|
||||||
@@ -26,14 +33,29 @@ pub fn build_binary_package(
|
|||||||
let current_arch = crate::get_current_arch();
|
let current_arch = crate::get_current_arch();
|
||||||
let arch = arch.unwrap_or(¤t_arch);
|
let arch = arch.unwrap_or(¤t_arch);
|
||||||
|
|
||||||
|
// Make sure we select a specific mode, either using user-requested
|
||||||
|
// or by using default for user-supplied parameters
|
||||||
|
let mode = if let Some(m) = mode {
|
||||||
|
m
|
||||||
|
} else {
|
||||||
|
// For cross-compilation, we use local with an ephemeral context
|
||||||
|
// created by the cross-compilation handler (see below)
|
||||||
|
if cross {
|
||||||
|
BuildMode::Local
|
||||||
|
} else {
|
||||||
|
// By default, we use sbuild
|
||||||
|
BuildMode::Sbuild
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Specific case: native cross-compilation, we don't allow that
|
// Specific case: native cross-compilation, we don't allow that
|
||||||
// instead this wraps to an automatic unshare chroot
|
// instead this wraps to an automatic unshare chroot
|
||||||
// using an ephemeral context
|
// using an ephemeral context
|
||||||
if cross {
|
if cross && mode == BuildMode::Local {
|
||||||
cross::setup_native_context(series)?;
|
cross::setup_native_context(series)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prepare Environment
|
// Prepare build directory
|
||||||
let ctx = context::current();
|
let ctx = context::current();
|
||||||
let build_root = ctx.create_temp_dir()?;
|
let build_root = ctx.create_temp_dir()?;
|
||||||
|
|
||||||
@@ -45,18 +67,13 @@ pub fn build_binary_package(
|
|||||||
.ok_or("Cannot find parent directory name")?;
|
.ok_or("Cannot find parent directory name")?;
|
||||||
let build_root = format!("{}/{}", build_root, parent_dir_name.to_str().unwrap());
|
let build_root = format!("{}/{}", build_root, parent_dir_name.to_str().unwrap());
|
||||||
|
|
||||||
// Run sbuild
|
// Run the build using target build mode
|
||||||
if cross {
|
match mode {
|
||||||
local::build(&package, &version, arch, series, &build_root, cross)?;
|
BuildMode::Local => local::build(&package, &version, arch, series, &build_root, cross)?,
|
||||||
} else {
|
BuildMode::Sbuild => sbuild::build(&package, &version, arch, series, &build_root, cross)?,
|
||||||
sbuild::build(&package, &version, arch, series, &build_root, cross)?;
|
};
|
||||||
}
|
|
||||||
|
|
||||||
// Retrieve artifacts
|
// Retrieve produced .deb files
|
||||||
// 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))?;
|
let remote_files = ctx.list_files(Path::new(&build_root))?;
|
||||||
for remote_file in remote_files {
|
for remote_file in remote_files {
|
||||||
if remote_file.extension().is_some_and(|ext| ext == "deb") {
|
if remote_file.extension().is_some_and(|ext| ext == "deb") {
|
||||||
@@ -66,7 +83,7 @@ pub fn build_binary_package(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if cross {
|
if cross && mode == BuildMode::Local {
|
||||||
cross::clean_native_context()?;
|
cross::clean_native_context()?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
13
src/main.rs
13
src/main.rs
@@ -55,7 +55,10 @@ fn main() {
|
|||||||
.about("Build the binary package")
|
.about("Build the binary package")
|
||||||
.arg(arg!(-s --series <series> "Target distribution series").required(false))
|
.arg(arg!(-s --series <series> "Target distribution series").required(false))
|
||||||
.arg(arg!(-a --arch <arch> "Target architecture").required(false))
|
.arg(arg!(-a --arch <arch> "Target architecture").required(false))
|
||||||
.arg(arg!(--cross "Cross-compile for target architecture (instead of using qemu-binfmt)").required(false)),
|
.arg(arg!(--cross "Cross-compile for target architecture (instead of qemu-binfmt)")
|
||||||
|
.long_help("Cross-compile for target architecture (instead of using qemu-binfmt)\nNote that most packages cannot be cross-compiled").required(false))
|
||||||
|
.arg(arg!(--mode "Change build mode [sbuild, local]").required(false)
|
||||||
|
.long_help("Change build mode [sbuild, local]\nDefault will chose depending on other parameters, don't provide if unsure")),
|
||||||
)
|
)
|
||||||
.subcommand(
|
.subcommand(
|
||||||
Command::new("context")
|
Command::new("context")
|
||||||
@@ -148,9 +151,15 @@ fn main() {
|
|||||||
let series = sub_matches.get_one::<String>("series").map(|s| s.as_str());
|
let series = sub_matches.get_one::<String>("series").map(|s| s.as_str());
|
||||||
let arch = sub_matches.get_one::<String>("arch").map(|s| s.as_str());
|
let arch = sub_matches.get_one::<String>("arch").map(|s| s.as_str());
|
||||||
let cross = sub_matches.get_one::<bool>("cross").unwrap_or(&false);
|
let cross = sub_matches.get_one::<bool>("cross").unwrap_or(&false);
|
||||||
|
let mode = sub_matches.get_one::<String>("mode").map(|s| s.as_str());
|
||||||
|
let mode = match mode {
|
||||||
|
Some("sbuild") => Some(pkh::deb::BuildMode::Sbuild),
|
||||||
|
Some("local") => Some(pkh::deb::BuildMode::Local),
|
||||||
|
_ => None,
|
||||||
|
};
|
||||||
|
|
||||||
if let Err(e) =
|
if let Err(e) =
|
||||||
pkh::deb::build_binary_package(arch, series, Some(cwd.as_path()), *cross)
|
pkh::deb::build_binary_package(arch, series, Some(cwd.as_path()), *cross, mode)
|
||||||
{
|
{
|
||||||
error!("{}", e);
|
error!("{}", e);
|
||||||
std::process::exit(1);
|
std::process::exit(1);
|
||||||
|
|||||||
Reference in New Issue
Block a user