deb: export the dpkg architecture environment for the rules
The rules run outside dpkg-buildpackage, which exports none of the dpkg architecture variables anyway - only sbuild does. Packages using $(DEB_HOST_MULTIARCH) or $(DEB_BUILD_GNU_TYPE) without including /usr/share/dpkg/architecture.mk expanded them empty: micro's rules cd'd into 'obj-' and file configured --libdir=/usr/lib, putting its libraries where dh_install's multiarch glob could not find them. Run 'dpkg-architecture -s' in the build context and export the whole DEB_* set, sbuild-style, for native builds; cross builds already carry the target's set from cross::setup_environment, whose output parser this reuses.
This commit is contained in:
+3
-1
@@ -7,7 +7,9 @@ use std::sync::Arc;
|
||||
/// Parse 'dpkg-architecture' output (KEY=value lines) into a set of
|
||||
/// environment variables. Unexpected lines (e.g. warnings on stderr leaking
|
||||
/// into stdout) are skipped instead of causing a failure.
|
||||
fn parse_dpkg_architecture_output(output: &str, env: &mut HashMap<String, String>) {
|
||||
/// Parse the `VAR=value; ...; export ...` output of `dpkg-architecture -s`
|
||||
/// into `env`.
|
||||
pub fn parse_dpkg_architecture_output(output: &str, env: &mut HashMap<String, String>) {
|
||||
let env_var_regex = regex::Regex::new(r"(?<key>.*)=(?<value>.*)").unwrap();
|
||||
for l in output.lines() {
|
||||
let Some(capture) = env_var_regex.captures(l) else {
|
||||
|
||||
@@ -152,6 +152,25 @@ pub async fn build(
|
||||
log::debug!("Setting up environment for local cross build...");
|
||||
cross::setup_environment(&mut env, arch, ctx.clone())?;
|
||||
cross::ensure_repositories(arch, series, pocket, mirror, ctx.clone())?;
|
||||
} else {
|
||||
// sbuild-style environment for debian/rules: the rules run outside
|
||||
// dpkg-buildpackage, which exports none of the dpkg architecture
|
||||
// variables — packages using $(DEB_HOST_MULTIARCH) and friends
|
||||
// without including /usr/share/dpkg/architecture.mk would expand
|
||||
// them empty. Cross builds already carry the target's set from
|
||||
// cross::setup_environment.
|
||||
let output = ctx
|
||||
.command("dpkg-architecture")
|
||||
.output()
|
||||
.map_err(|e| format!("cannot run dpkg-architecture: {e}. Is 'dpkg-dev' installed?"))?;
|
||||
if !output.status.success() {
|
||||
return Err(
|
||||
format!("'dpkg-architecture' failed with status: {}", output.status).into(),
|
||||
);
|
||||
}
|
||||
let dpkg_architecture = String::from_utf8(output.stdout)
|
||||
.map_err(|e| format!("Invalid UTF-8 in dpkg-architecture output: {e}"))?;
|
||||
cross::parse_dpkg_architecture_output(&dpkg_architecture, &mut env);
|
||||
}
|
||||
|
||||
let mut sources = apt::sources::load(Some(ctx.clone()))?;
|
||||
|
||||
Reference in New Issue
Block a user