summaryrefslogtreecommitdiffstats
path: root/src/debputy/deb_packaging_support.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/debputy/deb_packaging_support.py')
-rw-r--r--src/debputy/deb_packaging_support.py72
1 files changed, 53 insertions, 19 deletions
diff --git a/src/debputy/deb_packaging_support.py b/src/debputy/deb_packaging_support.py
index 4cb4e8f..863e394 100644
--- a/src/debputy/deb_packaging_support.py
+++ b/src/debputy/deb_packaging_support.py
@@ -1148,6 +1148,7 @@ def _generate_dbgsym_control_file_if_relevant(
dbgsym_root_dir: str,
dbgsym_ids: str,
multi_arch: Optional[str],
+ dctrl: str,
extra_common_params: Sequence[str],
) -> None:
section = binary_package.archive_section
@@ -1170,13 +1171,18 @@ def _generate_dbgsym_control_file_if_relevant(
extra_params.append(f"-VInstalled-Size={total_size}")
extra_params.extend(extra_common_params)
- package = binary_package.name
+ package = (
+ binary_package.name
+ if dctrl == "debian/control"
+ else f"{binary_package.name}-dbgsym"
+ )
dpkg_cmd = [
"dpkg-gencontrol",
f"-p{package}",
# FIXME: Support d/<pkg>.changelog at some point.
"-ldebian/changelog",
"-T/dev/null",
+ f"-c{dctrl}",
f"-P{dbgsym_root_dir}",
f"-DPackage={package}-dbgsym",
"-DDepends=" + package + " (= ${binary:Version})",
@@ -1339,14 +1345,22 @@ def dpkg_field_list_pkg_dep() -> Sequence[str]:
def _handle_relationship_substvars(
source: SourcePackage,
- dctrl: BinaryPackage,
+ dctrl_file: BinaryPackage,
substvars: FlushableSubstvars,
+ has_dbgsym: bool,
) -> Optional[str]:
relationship_fields = dpkg_field_list_pkg_dep()
relationship_fields_lc = frozenset(x.lower() for x in relationship_fields)
substvar_fields = collections.defaultdict(list)
+ needs_dbgsym_stanza = False
for substvar_name, substvar in substvars.as_substvar.items():
- if substvar.assignment_operator == "$=" or ":" not in substvar_name:
+ if ":" not in substvar_name:
+ continue
+ if substvar.assignment_operator in ("$=", "!="):
+ # Will create incorrect results if there is a dbgsym and we do nothing
+ needs_dbgsym_stanza = True
+
+ if substvar.assignment_operator == "$=":
# Automatically handled; no need for manual merging.
continue
_, field = substvar_name.rsplit(":", 1)
@@ -1354,10 +1368,14 @@ def _handle_relationship_substvars(
if field_lc not in relationship_fields_lc:
continue
substvar_fields[field_lc].append("${" + substvar_name + "}")
- if not substvar_fields:
+
+ if not has_dbgsym:
+ needs_dbgsym_stanza = False
+
+ if not substvar_fields and not needs_dbgsym_stanza:
return None
- replacement_stanza = debian.deb822.Deb822(dctrl.fields)
+ replacement_stanza = debian.deb822.Deb822(dctrl_file.fields)
for field_name in relationship_fields:
field_name_lc = field_name.lower()
@@ -1375,7 +1393,7 @@ def _handle_relationship_substvars(
final_value = f"{existing_value}, {substvars_part}"
replacement_stanza[field_name] = final_value
- tmpdir = generated_content_dir(package=dctrl)
+ tmpdir = generated_content_dir(package=dctrl_file)
with tempfile.NamedTemporaryFile(
mode="wb",
dir=tmpdir,
@@ -1388,6 +1406,17 @@ def _handle_relationship_substvars(
debian.deb822.Deb822(source.fields).dump(fd)
fd.write(b"\n")
replacement_stanza.dump(fd)
+
+ if has_dbgsym:
+ # Minimal stanza to avoid substvars warnings. Most fields are still set
+ # via -D.
+ dbgsym_stanza = Deb822()
+ dbgsym_stanza["Package"] = f"{dctrl_file.name}-dbgsym"
+ dbgsym_stanza["Architecture"] = dctrl_file.fields["Architecture"]
+ dbgsym_stanza["Description"] = f"debug symbols for {dctrl_file.name}"
+ fd.write(b"\n")
+ dbgsym_stanza.dump(fd)
+
return fd.name
@@ -1424,9 +1453,11 @@ def _generate_control_files(
' accordingly in the binary. If this auto-correction is wrong, please add "Multi-Arch: no" to the'
' relevant part of "debian/control" to disable this feature.'
)
- extra_params_specific.append(f"-DMulti-Arch={ma_value}")
+ # We want this to apply to the `-dbgsym` package as well to avoid
+ # lintian `debug-package-for-multi-arch-same-pkg-not-coinstallable`
+ extra_common_params.append(f"-DMulti-Arch={ma_value}")
elif ma_value == "no":
- extra_params_specific.append("-UMulti-Arch")
+ extra_common_params.append("-UMulti-Arch")
dbgsym_root_dir = dhe_dbgsym_root_dir(binary_package)
dbgsym_ids = " ".join(dbgsym_build_ids) if dbgsym_build_ids else ""
@@ -1436,15 +1467,26 @@ def _generate_control_files(
_t64_migration_substvar(binary_package, control_output_dir, substvars)
with substvars.flush() as flushed_substvars:
- if dbgsym_root_fs is not None and any(
+ has_dbgsym = dbgsym_root_fs is not None and any(
f for f in dbgsym_root_fs.all_paths() if f.is_file
- ):
+ )
+ dctrl_file = _handle_relationship_substvars(
+ source_package,
+ binary_package,
+ substvars,
+ has_dbgsym,
+ )
+ if dctrl_file is None:
+ dctrl_file = "debian/control"
+
+ if has_dbgsym:
_generate_dbgsym_control_file_if_relevant(
binary_package,
dbgsym_root_fs,
dbgsym_root_dir,
dbgsym_ids,
ma_value,
+ dctrl_file,
extra_common_params,
)
generate_md5sums_file(
@@ -1454,21 +1496,13 @@ def _generate_control_files(
elif dbgsym_ids:
extra_common_params.append(f"-DBuild-Ids={dbgsym_ids}")
- dctrl = _handle_relationship_substvars(
- source_package,
- binary_package,
- substvars,
- )
- if dctrl is None:
- dctrl = "debian/control"
-
ctrl_file = os.path.join(control_output_dir, "control")
dpkg_cmd = [
"dpkg-gencontrol",
f"-p{package}",
# FIXME: Support d/<pkg>.changelog at some point.
"-ldebian/changelog",
- f"-c{dctrl}",
+ f"-c{dctrl_file}",
f"-T{flushed_substvars}",
f"-O{ctrl_file}",
f"-P{control_output_dir}",