diff options
Diffstat (limited to 'src/debputy/deb_packaging_support.py')
-rw-r--r-- | src/debputy/deb_packaging_support.py | 72 |
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}", |