123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- # Copyright © 2008 Ian Jackson <ijackson@chiark.greenend.org.uk>
- # Copyright © 2008 Canonical, Ltd.
- # written by Colin Watson <cjwatson@ubuntu.com>
- # Copyright © 2008 James Westby <jw+debian@jameswestby.net>
- # Copyright © 2009 Raphaël Hertzog <hertzog@debian.org>
- #
- # This program is free software; you can redistribute it and/or modify
- # it under the terms of the GNU General Public License as published by
- # the Free Software Foundation; either version 2 of the License, or
- # (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # You should have received a copy of the GNU General Public License
- # along with this program. If not, see <https://www.gnu.org/licenses/>.
- package Dpkg::Vendor::Ubuntu;
- use strict;
- use warnings;
- our $VERSION = '0.01';
- use Dpkg::ErrorHandling;
- use Dpkg::Gettext;
- use Dpkg::Path qw(find_command);
- use Dpkg::Control::Types;
- use Dpkg::BuildOptions;
- use Dpkg::Arch qw(debarch_eq get_host_arch);
- use parent qw(Dpkg::Vendor::Debian);
- =encoding utf8
- =head1 NAME
- Dpkg::Vendor::Ubuntu - Ubuntu vendor object
- =head1 DESCRIPTION
- This vendor object customizes the behaviour of dpkg scripts for Ubuntu
- specific behavior and policies.
- =cut
- sub run_hook {
- my ($self, $hook, @params) = @_;
- if ($hook eq 'before-source-build') {
- my $src = shift @params;
- my $fields = $src->{fields};
- # check that Maintainer/XSBC-Original-Maintainer comply to
- # https://wiki.ubuntu.com/DebianMaintainerField
- if (defined($fields->{'Version'}) and defined($fields->{'Maintainer'}) and
- $fields->{'Version'} =~ /ubuntu/) {
- if ($fields->{'Maintainer'} !~ /ubuntu/i) {
- if (length $ENV{DEBEMAIL} and $ENV{DEBEMAIL} =~ /\@ubuntu\.com/) {
- error(g_('Version number suggests Ubuntu changes, but Maintainer: does not have Ubuntu address'));
- } else {
- warning(g_('Version number suggests Ubuntu changes, but Maintainer: does not have Ubuntu address'));
- }
- }
- unless ($fields->{'Original-Maintainer'}) {
- warning(g_('Version number suggests Ubuntu changes, but there is no XSBC-Original-Maintainer field'));
- }
- }
- } elsif ($hook eq 'keyrings') {
- return $self->run_hook('package-keyrings', @params);
- } elsif ($hook eq 'package-keyrings') {
- return ($self->SUPER::run_hook($hook),
- '/usr/share/keyrings/ubuntu-archive-keyring.gpg');
- } elsif ($hook eq 'archive-keyrings') {
- return ($self->SUPER::run_hook($hook),
- '/usr/share/keyrings/ubuntu-archive-keyring.gpg');
- } elsif ($hook eq 'archive-keyrings-historic') {
- return ($self->SUPER::run_hook($hook),
- '/usr/share/keyrings/ubuntu-archive-removed-keys.gpg');
- } elsif ($hook eq 'register-custom-fields') {
- my @field_ops = $self->SUPER::run_hook($hook);
- push @field_ops,
- [ 'register', 'Launchpad-Bugs-Fixed',
- CTRL_FILE_CHANGES | CTRL_CHANGELOG ],
- [ 'insert_after', CTRL_FILE_CHANGES, 'Closes', 'Launchpad-Bugs-Fixed' ],
- [ 'insert_after', CTRL_CHANGELOG, 'Closes', 'Launchpad-Bugs-Fixed' ];
- return @field_ops;
- } elsif ($hook eq 'post-process-changelog-entry') {
- my $fields = shift @params;
- # Add Launchpad-Bugs-Fixed field
- my $bugs = find_launchpad_closes($fields->{'Changes'} // '');
- if (scalar(@$bugs)) {
- $fields->{'Launchpad-Bugs-Fixed'} = join(' ', @$bugs);
- }
- } elsif ($hook eq 'update-buildflags') {
- my $flags = shift @params;
- my $build_opts = Dpkg::BuildOptions->new();
- if (!$build_opts->has('noopt')) {
- if (debarch_eq(get_host_arch(), 'ppc64el')) {
- for my $flag (qw(CFLAGS CXXFLAGS OBJCFLAGS OBJCXXFLAGS GCJFLAGS
- FFLAGS FCFLAGS)) {
- $flags->set($flag, '-g -O3', 'vendor');
- }
- }
- }
- # Per https://wiki.ubuntu.com/DistCompilerFlags
- $flags->set('LDFLAGS', '-Wl,-Bsymbolic-functions', 'vendor');
- # Run the Debian hook to add hardening flags
- $self->SUPER::run_hook($hook, $flags);
- # Allow control of hardening-wrapper via dpkg-buildpackage DEB_BUILD_OPTIONS
- my $hardening;
- if ($build_opts->has('hardening')) {
- $hardening = $build_opts->get('hardening') // 1;
- }
- if ($build_opts->has('nohardening')) {
- $hardening = 0;
- }
- if (defined $hardening) {
- my $flag = 'DEB_BUILD_HARDENING';
- if ($hardening ne '0') {
- if (!find_command('hardened-cc')) {
- syserr(g_("'hardening' flag found but 'hardening-wrapper' not installed"));
- }
- if ($hardening ne '1') {
- my @options = split(/,\s*/, $hardening);
- $hardening = 1;
- my @hardopts = qw(format fortify stackprotector pie relro);
- foreach my $item (@hardopts) {
- my $upitem = uc($item);
- foreach my $option (@options) {
- if ($option =~ /^(no)?$item$/) {
- $flags->set($flag . '_' . $upitem,
- not defined $1 or $1 eq '', 'env');
- }
- }
- }
- }
- }
- if (defined $ENV{$flag}) {
- info(g_('overriding %s in environment: %s'), $flag, $hardening);
- }
- $flags->set($flag, $hardening, 'env');
- }
- } else {
- return $self->SUPER::run_hook($hook, @params);
- }
- }
- =head1 PUBLIC FUNCTIONS
- =over
- =item $bugs = Dpkg::Vendor::Ubuntu::find_launchpad_closes($changes)
- Takes one string as argument and finds "LP: #123456, #654321" statements,
- which are references to bugs on Launchpad. Returns all closed bug
- numbers in an array reference.
- =cut
- sub find_launchpad_closes {
- my $changes = shift;
- my %closes;
- while ($changes &&
- ($changes =~ /lp:\s+\#\d+(?:,\s*\#\d+)*/pig)) {
- $closes{$_} = 1 foreach (${^MATCH} =~ /\#?\s?(\d+)/g);
- }
- my @closes = sort { $a <=> $b } keys %closes;
- return \@closes;
- }
- =back
- =head1 CHANGES
- =head2 Version 0.xx
- This is a semi-private module. Only documented functions are public.
- =cut
- 1;
|