sub
run_hook {
my
(
$self
,
$hook
,
@params
) =
@_
;
if
(
$hook
eq
'before-source-build'
) {
my
$src
=
shift
@params
;
my
$fields
=
$src
->{fields};
if
(
defined
(
$fields
->{
'Version'
}) and
defined
(
$fields
->{
'Maintainer'
}) and
$fields
->{
'Version'
} =~ /ubuntu/) {
if
(
$fields
->{
'Maintainer'
} !~ /(?:ubuntu|canonical)/i) {
if
(
length
$ENV
{DEBEMAIL} and
$ENV
{DEBEMAIL} =~ /\@(?:ubuntu|canonical)\.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
'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
;
my
$bugs
= find_launchpad_closes(
$fields
->{
'Changes'
} //
''
);
if
(
scalar
(
@$bugs
)) {
$fields
->{
'Launchpad-Bugs-Fixed'
} =
join
(
' '
,
@$bugs
);
}
}
else
{
return
$self
->SUPER::run_hook(
$hook
,
@params
);
}
}
sub
init_build_features {
my
(
$self
,
$use_feature
,
$builtin_feature
) =
@_
;
$self
->SUPER::init_build_features(
$use_feature
,
$builtin_feature
);
my
$arch
= Dpkg::Arch::get_host_arch();
if
(any {
$_
eq
$arch
}
qw(amd64 arm64 ppc64el s390x)
) {
$use_feature
->{optimize}{lto} = 1;
}
}
sub
set_build_features {
my
(
$self
,
$flags
) =
@_
;
$self
->SUPER::set_build_features(
$flags
);
my
$arch
= Dpkg::Arch::get_host_arch();
if
(
$arch
eq
'ppc64el'
&&
$flags
->get_option_value(
'optimize-level'
) != 0) {
$flags
->set_option_value(
'optimize-level'
, 3);
}
$flags
->set_option_value(
'fortify-level'
, 3);
}
sub
add_build_flags {
my
(
$self
,
$flags
) =
@_
;
my
@compile_flags
=
qw(
CFLAGS
CXXFLAGS
OBJCFLAGS
OBJCXXFLAGS
FFLAGS
FCFLAGS
)
;
$self
->SUPER::add_build_flags(
$flags
);
$flags
->prepend(
'LDFLAGS'
,
'-Wl,-Bsymbolic-functions'
);
if
(!
$flags
->use_feature(
'hardening'
,
'stackprotectorstrong'
) &&
!
$flags
->use_feature(
'hardening'
,
'stackprotector'
)) {
my
$flag
=
'-fno-stack-protector'
;
$flags
->append(
$_
,
$flag
)
foreach
@compile_flags
;
}
if
(!
$flags
->use_feature(
'hardening'
,
'stackclash'
)) {
my
$flag
=
'-fno-stack-clash-protection'
;
$flags
->append(
$_
,
$flag
)
foreach
@compile_flags
;
}
if
(!
$flags
->use_feature(
'hardening'
,
'fortify'
)) {
$flags
->append(
'CPPFLAGS'
,
'-D_FORTIFY_SOURCE=0'
);
}
if
(!
$flags
->use_feature(
'hardening'
,
'format'
)) {
my
$flag
=
'-Wno-format -Wno-error=format-security'
;
$flags
->append(
'CFLAGS'
,
$flag
);
$flags
->append(
'CXXFLAGS'
,
$flag
);
$flags
->append(
'OBJCFLAGS'
,
$flag
);
$flags
->append(
'OBJCXXFLAGS'
,
$flag
);
}
if
(!
$flags
->use_feature(
'hardening'
,
'branch'
)) {
my
$cpu
=
$flags
->get_option_value(
'hardening-branch-cpu'
);
my
$flag
;
if
(
$cpu
eq
'arm64'
) {
$flag
=
'-mbranch-protection=none'
;
}
elsif
(
$cpu
eq
'amd64'
) {
$flag
=
'-fno-cf-protection'
;
}
if
(
defined
$flag
) {
$flags
->append(
$_
,
$flag
)
foreach
@compile_flags
;
}
}
return
;
}
sub
find_launchpad_closes {
my
$changes
=
shift
;
my
%closes
;
while
(
$changes
&&
(
$changes
=~ /lp:\s+\
$closes
{
$_
} = 1
foreach
(${^MATCH} =~ /\
}
my
@closes
=
sort
{
$a
<=>
$b
}
keys
%closes
;
return
\
@closes
;
}
1;