| File: | Dpkg/BuildAPI.pm |
| Coverage: | 91.8% |
| line | stmt | bran | cond | sub | pod | time | code |
|---|---|---|---|---|---|---|---|
| 1 | # Copyright © 2020-2022 Guillem Jover <guillem@debian.org> | ||||||
| 2 | # | ||||||
| 3 | # This program is free software; you can redistribute it and/or modify | ||||||
| 4 | # it under the terms of the GNU General Public License as published by | ||||||
| 5 | # the Free Software Foundation; either version 2 of the License, or | ||||||
| 6 | # (at your option) any later version. | ||||||
| 7 | # | ||||||
| 8 | # This program is distributed in the hope that it will be useful, | ||||||
| 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
| 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
| 11 | # GNU General Public License for more details. | ||||||
| 12 | # | ||||||
| 13 | # You should have received a copy of the GNU General Public License | ||||||
| 14 | # along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
| 15 | |||||||
| 16 | =encoding utf8 | ||||||
| 17 | |||||||
| 18 - 29 | =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 | ||||||
| 30 | |||||||
| 31 | package Dpkg::BuildAPI 0.01; | ||||||
| 32 | |||||||
| 33 | 9 9 9 | 34 7 218 | use strict; | ||||
| 34 | 9 9 9 | 26 19 380 | use warnings; | ||||
| 35 | |||||||
| 36 | our @EXPORT_OK = qw( | ||||||
| 37 | get_build_api | ||||||
| 38 | reset_build_api | ||||||
| 39 | ); | ||||||
| 40 | |||||||
| 41 | 9 9 9 | 20 9 156 | use Exporter qw(import); | ||||
| 42 | |||||||
| 43 | 9 9 9 | 20 53 322 | use Dpkg::Gettext; | ||||
| 44 | 9 9 9 | 17 48 352 | use Dpkg::ErrorHandling; | ||||
| 45 | 9 9 9 | 73 56 115 | use Dpkg::BuildEnv; | ||||
| 46 | 9 9 9 | 5838 17 630 | use Dpkg::Version; | ||||
| 47 | 9 9 9 | 7472 11 430 | use Dpkg::Deps; | ||||
| 48 | |||||||
| 49 | use constant { | ||||||
| 50 | 9 | 2218 | DEFAULT_BUILD_API => '0', | ||||
| 51 | MAX_BUILD_API => '1', | ||||||
| 52 | 9 9 | 33 8 | }; | ||||
| 53 | |||||||
| 54 | my $build_api; | ||||||
| 55 | |||||||
| 56 - 67 | =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 | ||||||
| 68 | |||||||
| 69 | sub get_build_api { | ||||||
| 70 | 33 | 1 | 41 | my $ctrl = shift; | |||
| 71 | |||||||
| 72 | 33 | 87 | return $build_api if defined $build_api && ! defined $ctrl; | ||||
| 73 | |||||||
| 74 | 33 | 75 | if (Dpkg::BuildEnv::has('DPKG_BUILD_API')) { | ||||
| 75 | 6 | 11 | $build_api = Dpkg::BuildEnv::get('DPKG_BUILD_API'); | ||||
| 76 | } elsif (defined $ctrl) { | ||||||
| 77 | 21 | 40 | my $src = $ctrl->get_source(); | ||||
| 78 | my @dep_list = deps_concat(map { | ||||||
| 79 | 21 63 | 22 56 | $src->{$_ } | ||||
| 80 | } qw(Build-Depends Build-Depends-Indep Build-Depends-Arch)); | ||||||
| 81 | |||||||
| 82 | 21 | 37 | my $deps = deps_parse(@dep_list, | ||||
| 83 | build_dep => 1, | ||||||
| 84 | reduce_restrictions => 1, | ||||||
| 85 | ); | ||||||
| 86 | |||||||
| 87 | 21 | 24 | if (not defined $deps) { | ||||
| 88 | 0 | 0 | $build_api = DEFAULT_BUILD_API; | ||||
| 89 | 0 | 0 | return $build_api; | ||||
| 90 | } | ||||||
| 91 | |||||||
| 92 | deps_iterate($deps, sub { | ||||||
| 93 | 21 | 17 | my $dep = shift; | ||||
| 94 | |||||||
| 95 | 21 | 27 | return 1 if $dep->{package} ne 'dpkg-build-api'; | ||||
| 96 | |||||||
| 97 | 21 | 67 | if (! defined $dep->{relation} || $dep->{relation} ne REL_EQ) { | ||||
| 98 | 6 | 10 | error(g_('dpkg build API level needs an exact version')); | ||||
| 99 | } | ||||||
| 100 | |||||||
| 101 | 15 | 87 | if (defined $build_api and $build_api ne $dep->{version}) { | ||||
| 102 | error(g_('dpkg build API level with conflicting versions: %s vs %s'), | ||||||
| 103 | 3 | 92 | $build_api, $dep->{version}); | ||||
| 104 | } | ||||||
| 105 | |||||||
| 106 | 12 | 13 | $build_api = $dep->{version}; | ||||
| 107 | |||||||
| 108 | 12 | 23 | return 1; | ||||
| 109 | 21 | 113 | }); | ||||
| 110 | } | ||||||
| 111 | |||||||
| 112 | 24 | 103 | $build_api //= DEFAULT_BUILD_API; | ||||
| 113 | |||||||
| 114 | 24 | 69 | if ($build_api !~ m/^[0-9]+$/) { | ||||
| 115 | 6 | 11 | error(g_("invalid dpkg build API level '%s'"), $build_api); | ||||
| 116 | } | ||||||
| 117 | |||||||
| 118 | 18 | 40 | if ($build_api > MAX_BUILD_API) { | ||||
| 119 | 6 | 12 | error(g_("dpkg build API level '%s' greater than max '%s'"), | ||||
| 120 | $build_api, MAX_BUILD_API); | ||||||
| 121 | } | ||||||
| 122 | |||||||
| 123 | 12 | 30 | return $build_api; | ||||
| 124 | } | ||||||
| 125 | |||||||
| 126 - 130 | =item reset_build_api() Reset the cached build API level. =cut | ||||||
| 131 | |||||||
| 132 | sub reset_build_api { | ||||||
| 133 | 27 | 1 | 46 | $build_api = undef; | |||
| 134 | } | ||||||
| 135 | |||||||
| 136 | =back | ||||||
| 137 | |||||||
| 138 - 144 | =head1 CHANGES =head2 Version 0.xx This is a private module. =cut | ||||||
| 145 | |||||||
| 146 | 1; | ||||||