1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
# Copyright © 2020-2022 Guillem Jover <guillem@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/>.
=encoding utf8
=head1 NAME
Dpkg::BuildAPI - handle build API versions
=head1 DESCRIPTION
The Dpkg::BuildAPI module provides functions to fetch the current dpkg
build API level.
B<Note>: This is a private module, its API can change at any time.
=cut
package Dpkg::BuildAPI 0.01;
use v5.36;
our @EXPORT_OK = qw(
get_build_api
reset_build_api
);
use Exporter qw(import);
use Dpkg::Gettext;
use Dpkg::ErrorHandling;
use Dpkg::BuildEnv;
use Dpkg::Version;
use Dpkg::Deps;
use constant {
DEFAULT_BUILD_API => '0',
MAX_BUILD_API => '1',
};
my $build_api;
=head1 FUNCTIONS
=over 4
=item $level = get_build_api([$ctrl])
Get the build API level, from the environment variable B<DPKG_BUILD_API>,
or if not defined and a $ctrl L<Dpkg::Control::Info> object passed as an
argument, from its build dependency fields. If no $ctrl object gets passed
the previous value obtained is returned.
=cut
sub get_build_api {
my $ctrl = shift;
return $build_api if defined $build_api && ! defined $ctrl;
if (Dpkg::BuildEnv::has('DPKG_BUILD_API')) {
$build_api = Dpkg::BuildEnv::get('DPKG_BUILD_API');
} elsif (defined $ctrl) {
my $src = $ctrl->get_source();
my @dep_list = deps_concat(map {
$src->{$_ }
} qw(Build-Depends Build-Depends-Indep Build-Depends-Arch));
my $deps = deps_parse(@dep_list,
build_dep => 1,
reduce_restrictions => 1,
);
if (not defined $deps) {
$build_api = DEFAULT_BUILD_API;
return $build_api;
}
deps_iterate($deps, sub {
my $dep = shift;
return 1 if $dep->{package} ne 'dpkg-build-api';
if (! defined $dep->{relation} || $dep->{relation} ne REL_EQ) {
error(g_('dpkg build API level needs an exact version'));
}
if (defined $build_api and $build_api ne $dep->{version}) {
error(g_('dpkg build API level with conflicting versions: %s vs %s'),
$build_api, $dep->{version});
}
$build_api = $dep->{version};
return 1;
});
}
$build_api //= DEFAULT_BUILD_API;
if ($build_api !~ m/^[0-9]+$/) {
error(g_("invalid dpkg build API level '%s'"), $build_api);
}
if ($build_api > MAX_BUILD_API) {
error(g_("dpkg build API level '%s' greater than max '%s'"),
$build_api, MAX_BUILD_API);
}
return $build_api;
}
=item reset_build_api()
Reset the cached build API level.
=cut
sub reset_build_api {
$build_api = undef;
}
=back
=head1 CHANGES
=head2 Version 0.xx
This is a private module.
=cut
1;
|