Public bug reported:

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.

** Affects: dpkg (Ubuntu)
     Importance: Undecided
         Status: New

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/2068653

Title:
  dpkg-buildflags Ubuntu vendor module incompatible with Debaain

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/dpkg/+bug/2068653/+subscriptions


-- 
ubuntu-bugs mailing list
ubuntu-bugs@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to