dpkg-buildflags Ubuntu vendor module incompatible with Debaain

Bug #2068653 reported by Daria Brashear
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
dpkg (Ubuntu)
New
Undecided
Unassigned

Bug Description

Description: Ubuntu 24.04 LTS
Release: 24.04

dpkg:
  Installed: 1.22.6ubuntu6
  Candidate: 1.22.6ubuntu6
  Version table:
 *** 1.22.6ubuntu6 500
        500 http://us.archive.ubuntu.com/ubuntu noble/main amd64 Packages
        100 /var/lib/dpkg/status

expected: i expect dpkg-buildflags --get CFLAGS to include -ffile-prefix-map=OLD=NEW by default.

observed: if run in a directory with a valid debian/changelog, dpkg-buildflags --get CFLAGS includes both -ffile-prefix-map=OLD=NEW and -fdebug-prefix-map=OLD=NEW. if run with no debian/changelog, it behaves as expected.

analysis:

The Debian vendor module's "reproducible" support, which is what's also documented by the reproducibility project, will include -ffile-prefix-map=OLD=NEW (which is a superset of -fdebug-prefix-map=OLD=NEW) unless you explicitly opt to include -fdebug-prefix-map instead (and then it will not include -ffile-prefix-map).

the code from Vendor/Debian.pm does as follows:
    # Avoid storing the build path in the binaries.
    if ($flags->use_feature('reproducible', 'fixfilepath') or
        $flags->use_feature('reproducible', 'fixdebugpath')) {
        my $build_path = $flags->get_option_value('build-path');
        my $map;

        # -ffile-prefix-map is a superset of -fdebug-prefix-map, prefer it
        # if both are set.
        if ($flags->use_feature('reproducible', 'fixfilepath')) {
            $map = '-ffile-prefix-map=' . $build_path . '=.';
        } else {
            $map = '-fdebug-prefix-map=' . $build_path . '=.';
        }

        $flags->append($_, $map) foreach @compile_flags;
    }

Starting in 1.22.0ubuntu1, the Ubuntu vendor code *almost* unconditionally adds -fdebug-prefix-map=OLD=NEW; it will avoid adding it if it cannot parse version and source from debian/changelog. It will also strip any existing -fdebug-prefix-map=. It will *not* strip -ffile-prefix-map. It's not clear which would take precedence if both were defined differently since -ffile-prefix-map is a superset of -fdebug-prefix-map.

It also means dpkg-buildflags behavior changes depending on whether it can parse a file ./debian/changelog and find version and source in it or not.

That code is here:
        } elsif (-r 'debian/changelog') {
            require Dpkg::Changelog::Debian;
            my $pkgchangelog = Dpkg::Changelog::Debian->new(range => { "count" => 1 });
            $pkgchangelog->load('debian/changelog');
            my $chgentry = @{$pkgchangelog}[0];
            my $pkgver = $chgentry->get_version();
            my $pkgsrc = $chgentry->get_source();

            if ($pkgver ne "" && $pkgsrc ne "") {
                my $debugprefixmap = '-fdebug-prefix-map=' . $build_path . '=/usr/src/' . $pkgsrc . '-' . $pkgver;

                # Strip any existing -fdebug-prefix-map flag.
                $flags->strip($_, $stripflag) foreach @compile_flags;
                $flags->append($_, $debugprefixmap) foreach @compile_flags;
            }
        }

It *should* define -ffile-prefix-map *or* -fdebug-prefix-map based on the same metric Debian uses, and strip all other instances of both.

tags: added: release-oo-incoming
tags: added: release-nn-incoming
removed: release-oo-incoming
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.