File: | dpkg-architecture.pl |
Coverage: | 42.0% |
line | stmt | bran | cond | sub | pod | time | code |
---|---|---|---|---|---|---|---|
1 | #!/usr/bin/perl | ||||||
2 | # | ||||||
3 | # dpkg-architecture | ||||||
4 | # | ||||||
5 | # Copyright © 1999-2001 Marcus Brinkmann <brinkmd@debian.org> | ||||||
6 | # Copyright © 2004-2005 Scott James Remnant <scott@netsplit.com>, | ||||||
7 | # Copyright © 2006-2014 Guillem Jover <guillem@debian.org> | ||||||
8 | # | ||||||
9 | # This program is free software; you can redistribute it and/or modify | ||||||
10 | # it under the terms of the GNU General Public License as published by | ||||||
11 | # the Free Software Foundation; either version 2 of the License, or | ||||||
12 | # (at your option) any later version. | ||||||
13 | # | ||||||
14 | # This program is distributed in the hope that it will be useful, | ||||||
15 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
16 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
17 | # GNU General Public License for more details. | ||||||
18 | # | ||||||
19 | # You should have received a copy of the GNU General Public License | ||||||
20 | # along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
21 | |||||||
22 | 3 3 3 | 5362 1 48 | use strict; | ||||
23 | 3 3 3 | 5 2 61 | use warnings; | ||||
24 | |||||||
25 | 3 3 3 | 357 2 32 | use Dpkg (); | ||||
26 | 3 3 3 | 317 4 93 | use Dpkg::Gettext; | ||||
27 | 3 3 3 | 420 9 99 | use Dpkg::Getopt; | ||||
28 | 3 3 3 | 479 3 112 | use Dpkg::ErrorHandling; | ||||
29 | 3 3 3 | 438 4 751 | use Dpkg::Arch qw(:getters :mappers debarch_eq debarch_is); | ||||
30 | |||||||
31 | 3 | 98850 | textdomain('dpkg-dev'); | ||||
32 | |||||||
33 | sub version { | ||||||
34 | 0 | 0 | printf g_("Debian %s version %s.\n"), $Dpkg::PROGNAME, $Dpkg::PROGVERSION; | ||||
35 | |||||||
36 | 0 | 0 | printf g_(' | ||||
37 | This is free software; see the GNU General Public License version 2 or | ||||||
38 | later for copying conditions. There is NO warranty. | ||||||
39 | '); | ||||||
40 | } | ||||||
41 | |||||||
42 | sub usage { | ||||||
43 | 0 | 0 | printf g_( | ||||
44 | 'Usage: %s [<option>...] [<command>]') | ||||||
45 | . "\n\n" . g_( | ||||||
46 | 'Commands: | ||||||
47 | -l, --list list variables (default). | ||||||
48 | -L, --list-known list valid architectures (matching some criteria). | ||||||
49 | -e, --equal <arch> compare with host Debian architecture. | ||||||
50 | -i, --is <arch-wildcard> match against host Debian architecture. | ||||||
51 | -q, --query <variable> prints only the value of <variable>. | ||||||
52 | -s, --print-set print command to set environment variables. | ||||||
53 | -u, --print-unset print command to unset environment variables. | ||||||
54 | -c, --command <command> set environment and run the command in it. | ||||||
55 | -?, --help show this help message. | ||||||
56 | --version show the version.') | ||||||
57 | . "\n\n" . g_( | ||||||
58 | 'Options: | ||||||
59 | -a, --host-arch <arch> set host Debian architecture. | ||||||
60 | -t, --host-type <type> set host GNU system type. | ||||||
61 | -A, --target-arch <arch> set target Debian architecture. | ||||||
62 | -T, --target-type <type> set target GNU system type. | ||||||
63 | -W, --match-wildcard <arch-wildcard> | ||||||
64 | restrict architecture list matching <arch-wildcard>. | ||||||
65 | -B, --match-bits <arch-bits> | ||||||
66 | restrict architecture list matching <arch-bits>. | ||||||
67 | -E, --match-endian <arch-endian> | ||||||
68 | restrict architecture list matching <arch-endian>. | ||||||
69 | --print-format <format> | ||||||
70 | use <format> for --print-set and --print-unset, | ||||||
71 | allowed values: shell (default), make. | ||||||
72 | -f, --force force flag (override variables set in environment).') | ||||||
73 | . "\n", $Dpkg::PROGNAME; | ||||||
74 | } | ||||||
75 | |||||||
76 | sub check_arch_coherency | ||||||
77 | { | ||||||
78 | 6 | 13 | my ($arch, $gnu_type) = @_; | ||||
79 | |||||||
80 | 6 | 8 | if ($arch ne '' && $gnu_type eq '') { | ||||
81 | 0 | 0 | $gnu_type = debarch_to_gnutriplet($arch); | ||||
82 | 0 | 0 | error(g_('unknown Debian architecture %s, you must specify ' . | ||||
83 | 'GNU system type, too'), $arch) | ||||||
84 | unless defined $gnu_type; | ||||||
85 | } | ||||||
86 | |||||||
87 | 6 | 10 | if ($gnu_type ne '' && $arch eq '') { | ||||
88 | 0 | 0 | $arch = gnutriplet_to_debarch($gnu_type); | ||||
89 | 0 | 0 | error(g_('unknown GNU system type %s, you must specify ' . | ||||
90 | 'Debian architecture, too'), $gnu_type) | ||||||
91 | unless defined $arch; | ||||||
92 | } | ||||||
93 | |||||||
94 | 6 | 5 | if ($gnu_type ne '' && $arch ne '') { | ||||
95 | 0 | 0 | my $dfl_gnu_type = debarch_to_gnutriplet($arch); | ||||
96 | 0 | 0 | error(g_('unknown default GNU system type for Debian architecture %s'), | ||||
97 | $arch) | ||||||
98 | unless defined $dfl_gnu_type; | ||||||
99 | 0 | 0 | warning(g_('default GNU system type %s for Debian arch %s does not ' . | ||||
100 | 'match specified GNU system type %s'), $dfl_gnu_type, | ||||||
101 | $arch, $gnu_type) | ||||||
102 | if $dfl_gnu_type ne $gnu_type; | ||||||
103 | } | ||||||
104 | |||||||
105 | 6 | 14 | return ($arch, $gnu_type); | ||||
106 | } | ||||||
107 | |||||||
108 | use constant { | ||||||
109 | 3 | 1904 | INFO_BUILD_ARCH_NAME => 0b00001, | ||||
110 | INFO_BUILD_ARCH_TUPLE => 0b00010, | ||||||
111 | INFO_BUILD_ARCH_ATTR => 0b00100, | ||||||
112 | INFO_BUILD_MULTIARCH => 0b01000, | ||||||
113 | INFO_BUILD_GNU_TUPLE => 0b10000, | ||||||
114 | |||||||
115 | INFO_HOST_ARCH_NAME => 0b0000100000, | ||||||
116 | INFO_HOST_ARCH_TUPLE => 0b0001000000, | ||||||
117 | INFO_HOST_ARCH_ATTR => 0b0010000000, | ||||||
118 | INFO_HOST_MULTIARCH => 0b0100000000, | ||||||
119 | INFO_HOST_GNU_TUPLE => 0b1000000000, | ||||||
120 | |||||||
121 | INFO_TARGET_ARCH_NAME => 0b000010000000000, | ||||||
122 | INFO_TARGET_ARCH_TUPLE => 0b000100000000000, | ||||||
123 | INFO_TARGET_ARCH_ATTR => 0b001000000000000, | ||||||
124 | INFO_TARGET_MULTIARCH => 0b010000000000000, | ||||||
125 | INFO_TARGET_GNU_TUPLE => 0b100000000000000, | ||||||
126 | 3 3 | 7 2 | }; | ||||
127 | |||||||
128 | 3 | 44 | my %arch_vars = ( | ||||
129 | DEB_BUILD_ARCH => INFO_BUILD_ARCH_NAME, | ||||||
130 | DEB_BUILD_ARCH_ABI => INFO_BUILD_ARCH_NAME | INFO_BUILD_ARCH_TUPLE, | ||||||
131 | DEB_BUILD_ARCH_LIBC => INFO_BUILD_ARCH_NAME | INFO_BUILD_ARCH_TUPLE, | ||||||
132 | DEB_BUILD_ARCH_OS => INFO_BUILD_ARCH_NAME | INFO_BUILD_ARCH_TUPLE, | ||||||
133 | DEB_BUILD_ARCH_CPU => INFO_BUILD_ARCH_NAME | INFO_BUILD_ARCH_TUPLE, | ||||||
134 | DEB_BUILD_ARCH_BITS => INFO_BUILD_ARCH_NAME | INFO_BUILD_ARCH_ATTR, | ||||||
135 | DEB_BUILD_ARCH_ENDIAN => INFO_BUILD_ARCH_NAME | INFO_BUILD_ARCH_ATTR, | ||||||
136 | DEB_BUILD_MULTIARCH => INFO_BUILD_ARCH_NAME | INFO_BUILD_MULTIARCH, | ||||||
137 | DEB_BUILD_GNU_CPU => INFO_BUILD_ARCH_NAME | INFO_BUILD_GNU_TUPLE, | ||||||
138 | DEB_BUILD_GNU_SYSTEM => INFO_BUILD_ARCH_NAME | INFO_BUILD_GNU_TUPLE, | ||||||
139 | DEB_BUILD_GNU_TYPE => INFO_BUILD_ARCH_NAME | INFO_BUILD_GNU_TUPLE, | ||||||
140 | DEB_HOST_ARCH => INFO_HOST_ARCH_NAME, | ||||||
141 | DEB_HOST_ARCH_ABI => INFO_HOST_ARCH_NAME | INFO_HOST_ARCH_TUPLE, | ||||||
142 | DEB_HOST_ARCH_LIBC => INFO_HOST_ARCH_NAME | INFO_HOST_ARCH_TUPLE, | ||||||
143 | DEB_HOST_ARCH_OS => INFO_HOST_ARCH_NAME | INFO_HOST_ARCH_TUPLE, | ||||||
144 | DEB_HOST_ARCH_CPU => INFO_HOST_ARCH_NAME | INFO_HOST_ARCH_TUPLE, | ||||||
145 | DEB_HOST_ARCH_BITS => INFO_HOST_ARCH_NAME | INFO_HOST_ARCH_ATTR, | ||||||
146 | DEB_HOST_ARCH_ENDIAN => INFO_HOST_ARCH_NAME | INFO_HOST_ARCH_ATTR, | ||||||
147 | DEB_HOST_MULTIARCH => INFO_HOST_ARCH_NAME | INFO_HOST_MULTIARCH, | ||||||
148 | DEB_HOST_GNU_CPU => INFO_HOST_ARCH_NAME | INFO_HOST_GNU_TUPLE, | ||||||
149 | DEB_HOST_GNU_SYSTEM => INFO_HOST_ARCH_NAME | INFO_HOST_GNU_TUPLE, | ||||||
150 | DEB_HOST_GNU_TYPE => INFO_HOST_ARCH_NAME | INFO_HOST_GNU_TUPLE, | ||||||
151 | DEB_TARGET_ARCH => INFO_TARGET_ARCH_NAME, | ||||||
152 | DEB_TARGET_ARCH_ABI => INFO_TARGET_ARCH_NAME | INFO_TARGET_ARCH_TUPLE, | ||||||
153 | DEB_TARGET_ARCH_LIBC => INFO_TARGET_ARCH_NAME | INFO_TARGET_ARCH_TUPLE, | ||||||
154 | DEB_TARGET_ARCH_OS => INFO_TARGET_ARCH_NAME | INFO_TARGET_ARCH_TUPLE, | ||||||
155 | DEB_TARGET_ARCH_CPU => INFO_TARGET_ARCH_NAME | INFO_TARGET_ARCH_TUPLE, | ||||||
156 | DEB_TARGET_ARCH_BITS => INFO_TARGET_ARCH_NAME | INFO_TARGET_ARCH_ATTR, | ||||||
157 | DEB_TARGET_ARCH_ENDIAN => INFO_TARGET_ARCH_NAME | INFO_TARGET_ARCH_ATTR, | ||||||
158 | DEB_TARGET_MULTIARCH => INFO_TARGET_ARCH_NAME | INFO_TARGET_MULTIARCH, | ||||||
159 | DEB_TARGET_GNU_CPU => INFO_TARGET_ARCH_NAME | INFO_TARGET_GNU_TUPLE, | ||||||
160 | DEB_TARGET_GNU_SYSTEM => INFO_TARGET_ARCH_NAME | INFO_TARGET_GNU_TUPLE, | ||||||
161 | DEB_TARGET_GNU_TYPE => INFO_TARGET_ARCH_NAME | INFO_TARGET_GNU_TUPLE, | ||||||
162 | ); | ||||||
163 | |||||||
164 | 3 6 | 3 9 | my %known_print_format = map { $_ => 1 } qw(shell make); | ||||
165 | 3 | 13 | my $print_format = 'shell'; | ||||
166 | |||||||
167 | 3 | 27 | my %req_vars = %arch_vars; | ||||
168 | 3 | 5 | my $req_info = 0; | ||||
169 | 3 | 8 | my $req_host_arch = ''; | ||||
170 | 3 | 3 | my $req_host_gnu_type = ''; | ||||
171 | 3 | 2 | my $req_target_arch = ''; | ||||
172 | 3 | 1 | my $req_target_gnu_type = ''; | ||||
173 | 3 | 2 | my $req_eq_arch = ''; | ||||
174 | 3 | 3 | my $req_is_arch = ''; | ||||
175 | 3 | 1 | my $req_match_wildcard = ''; | ||||
176 | 3 | 2 | my $req_match_bits = ''; | ||||
177 | 3 | 1 | my $req_match_endian = ''; | ||||
178 | 3 | 3 | my $req_variable_to_print; | ||||
179 | 3 | 1 | my $action = 'list'; | ||||
180 | 3 | 2 | my $force = 0; | ||||
181 | |||||||
182 | sub action_needs($) { | ||||||
183 | 45 | 33 | my $bits = shift; | ||||
184 | 45 | 155 | return (($req_info & $bits) == $bits); | ||||
185 | } | ||||||
186 | |||||||
187 | 3 | 7 | @ARGV = normalize_options(args => \@ARGV, delim => '-c'); | ||||
188 | |||||||
189 | 3 | 5 | while (@ARGV) { | ||||
190 | 3 | 3 | my $arg = shift; | ||||
191 | |||||||
192 | 3 | 63 | if ($arg eq '-a' or $arg eq '--host-arch') { | ||||
193 | 0 | 0 | $req_host_arch = shift; | ||||
194 | } elsif ($arg eq '-t' or $arg eq '--host-type') { | ||||||
195 | 0 | 0 | $req_host_gnu_type = shift; | ||||
196 | } elsif ($arg eq '-A' or $arg eq '--target-arch') { | ||||||
197 | 0 | 0 | $req_target_arch = shift; | ||||
198 | } elsif ($arg eq '-T' or $arg eq '--target-type') { | ||||||
199 | 0 | 0 | $req_target_gnu_type = shift; | ||||
200 | } elsif ($arg eq '-W' or $arg eq '--match-wildcard') { | ||||||
201 | 0 | 0 | $req_match_wildcard = shift; | ||||
202 | } elsif ($arg eq '-B' or $arg eq '--match-bits') { | ||||||
203 | 0 | 0 | $req_match_bits = shift; | ||||
204 | } elsif ($arg eq '-E' or $arg eq '--match-endian') { | ||||||
205 | 0 | 0 | $req_match_endian = shift; | ||||
206 | } elsif ($arg eq '-e' or $arg eq '--equal') { | ||||||
207 | 0 | 0 | $req_eq_arch = shift; | ||||
208 | 0 | 0 | %req_vars = %arch_vars{DEB_HOST_ARCH}; | ||||
209 | 0 | 0 | $action = 'equal'; | ||||
210 | } elsif ($arg eq '-i' or $arg eq '--is') { | ||||||
211 | 0 | 0 | $req_is_arch = shift; | ||||
212 | 0 | 0 | %req_vars = %arch_vars{DEB_HOST_ARCH}; | ||||
213 | 0 | 0 | $action = 'is'; | ||||
214 | } elsif ($arg eq '-u' or $arg eq '--print-unset') { | ||||||
215 | 0 | 0 | %req_vars = (); | ||||
216 | 0 | 0 | $action = 'print-unset'; | ||||
217 | } elsif ($arg eq '-l' or $arg eq '--list') { | ||||||
218 | 0 | 0 | $action = 'list'; | ||||
219 | } elsif ($arg eq '-s' or $arg eq '--print-set') { | ||||||
220 | 0 | 0 | %req_vars = %arch_vars; | ||||
221 | 0 | 0 | $action = 'print-set'; | ||||
222 | } elsif ($arg eq '--print-format') { | ||||||
223 | 0 | 0 | $print_format = shift; | ||||
224 | error(g_('%s is not a supported print format'), $print_format) | ||||||
225 | 0 | 0 | unless exists $known_print_format{$print_format}; | ||||
226 | } elsif ($arg eq '-f' or $arg eq '--force') { | ||||||
227 | 3 | 4 | $force = 1; | ||||
228 | } elsif ($arg eq '-q' or $arg eq '--query') { | ||||||
229 | 0 | 0 | my $varname = shift; | ||||
230 | error(g_('%s is not a supported variable name'), $varname) | ||||||
231 | 0 | 0 | unless (exists $arch_vars{$varname}); | ||||
232 | 0 | 0 | $req_variable_to_print = "$varname"; | ||||
233 | 0 | 0 | %req_vars = %arch_vars{$varname}; | ||||
234 | 0 | 0 | $action = 'query'; | ||||
235 | } elsif ($arg eq '-c' or $arg eq '--command') { | ||||||
236 | 0 | 0 | $action = 'command'; | ||||
237 | 0 | 0 | last; | ||||
238 | } elsif ($arg eq '-L' or $arg eq '--list-known') { | ||||||
239 | 0 | 0 | %req_vars = (); | ||||
240 | 0 | 0 | $action = 'list-known'; | ||||
241 | } elsif ($arg eq '-?' or $arg eq '--help') { | ||||||
242 | 0 | 0 | usage(); | ||||
243 | 0 | 0 | exit 0; | ||||
244 | } elsif ($arg eq '--version') { | ||||||
245 | 0 | 0 | version(); | ||||
246 | 0 | 0 | exit 0; | ||||
247 | } else { | ||||||
248 | 0 | 0 | usageerr(g_("unknown option '%s'"), $arg); | ||||
249 | } | ||||||
250 | } | ||||||
251 | |||||||
252 | 3 | 3 | my %v; | ||||
253 | |||||||
254 | # Initialize variables from environment and information to gather. | ||||||
255 | 3 | 6 | foreach my $k (keys %req_vars) { | ||||
256 | 99 | 88 | if (length $ENV{$k} && ! $force) { | ||||
257 | 0 | 0 | $v{$k} = $ENV{$k}; | ||||
258 | 0 | 0 | delete $req_vars{$k}; | ||||
259 | } else { | ||||||
260 | 99 | 54 | $req_info |= $req_vars{$k}; | ||||
261 | } | ||||||
262 | } | ||||||
263 | |||||||
264 | # | ||||||
265 | # Set build variables | ||||||
266 | # | ||||||
267 | |||||||
268 | 3 | 6 | $v{DEB_BUILD_ARCH} = get_raw_build_arch() | ||||
269 | if (action_needs(INFO_BUILD_ARCH_NAME)); | ||||||
270 | ($v{DEB_BUILD_ARCH_ABI}, $v{DEB_BUILD_ARCH_LIBC}, | ||||||
271 | $v{DEB_BUILD_ARCH_OS}, $v{DEB_BUILD_ARCH_CPU}) = debarch_to_debtuple($v{DEB_BUILD_ARCH}) | ||||||
272 | 3 | 19 | if (action_needs(INFO_BUILD_ARCH_TUPLE)); | ||||
273 | ($v{DEB_BUILD_ARCH_BITS}, $v{DEB_BUILD_ARCH_ENDIAN}) = debarch_to_abiattrs($v{DEB_BUILD_ARCH}) | ||||||
274 | 3 | 3 | if (action_needs(INFO_BUILD_ARCH_ATTR)); | ||||
275 | |||||||
276 | $v{DEB_BUILD_MULTIARCH} = debarch_to_multiarch($v{DEB_BUILD_ARCH}) | ||||||
277 | 3 | 4 | if (action_needs(INFO_BUILD_MULTIARCH)); | ||||
278 | |||||||
279 | 3 | 6 | if (action_needs(INFO_BUILD_GNU_TUPLE)) { | ||||
280 | 3 | 5 | $v{DEB_BUILD_GNU_TYPE} = debarch_to_gnutriplet($v{DEB_BUILD_ARCH}); | ||||
281 | 3 | 7 | ($v{DEB_BUILD_GNU_CPU}, $v{DEB_BUILD_GNU_SYSTEM}) = split(/-/, $v{DEB_BUILD_GNU_TYPE}, 2); | ||||
282 | } | ||||||
283 | |||||||
284 | # | ||||||
285 | # Set host variables | ||||||
286 | # | ||||||
287 | |||||||
288 | # First perform some sanity checks on the host arguments passed. | ||||||
289 | |||||||
290 | 3 | 8 | ($req_host_arch, $req_host_gnu_type) = check_arch_coherency($req_host_arch, $req_host_gnu_type); | ||||
291 | |||||||
292 | # Proceed to compute the host variables if needed. | ||||||
293 | |||||||
294 | 3 | 3 | $v{DEB_HOST_ARCH} = $req_host_arch || get_raw_host_arch() | ||||
295 | if (action_needs(INFO_HOST_ARCH_NAME)); | ||||||
296 | ($v{DEB_HOST_ARCH_ABI}, $v{DEB_HOST_ARCH_LIBC}, | ||||||
297 | $v{DEB_HOST_ARCH_OS}, $v{DEB_HOST_ARCH_CPU}) = debarch_to_debtuple($v{DEB_HOST_ARCH}) | ||||||
298 | 3 | 17 | if (action_needs(INFO_HOST_ARCH_TUPLE)); | ||||
299 | ($v{DEB_HOST_ARCH_BITS}, $v{DEB_HOST_ARCH_ENDIAN}) = debarch_to_abiattrs($v{DEB_HOST_ARCH}) | ||||||
300 | 3 | 6 | if (action_needs(INFO_HOST_ARCH_ATTR)); | ||||
301 | |||||||
302 | $v{DEB_HOST_MULTIARCH} = debarch_to_multiarch($v{DEB_HOST_ARCH}) | ||||||
303 | 3 | 10 | if (action_needs(INFO_HOST_MULTIARCH)); | ||||
304 | |||||||
305 | 3 | 4 | if (action_needs(INFO_HOST_GNU_TUPLE)) { | ||||
306 | 3 | 4 | if ($req_host_gnu_type eq '') { | ||||
307 | 3 | 36 | $v{DEB_HOST_GNU_TYPE} = debarch_to_gnutriplet($v{DEB_HOST_ARCH}); | ||||
308 | } else { | ||||||
309 | 0 | 0 | $v{DEB_HOST_GNU_TYPE} = $req_host_gnu_type; | ||||
310 | } | ||||||
311 | 3 | 22 | ($v{DEB_HOST_GNU_CPU}, $v{DEB_HOST_GNU_SYSTEM}) = split(/-/, $v{DEB_HOST_GNU_TYPE}, 2); | ||||
312 | |||||||
313 | 3 | 4 | my $host_gnu_type = get_host_gnu_type(); | ||||
314 | |||||||
315 | warning(g_('specified GNU system type %s does not match CC system ' . | ||||||
316 | 'type %s, try setting a correct CC environment variable'), | ||||||
317 | $v{DEB_HOST_GNU_TYPE}, $host_gnu_type) | ||||||
318 | 3 | 10 | if ($host_gnu_type ne '') && ($host_gnu_type ne $v{DEB_HOST_GNU_TYPE}); | ||||
319 | } | ||||||
320 | |||||||
321 | # | ||||||
322 | # Set target variables | ||||||
323 | # | ||||||
324 | |||||||
325 | # First perform some sanity checks on the target arguments passed. | ||||||
326 | |||||||
327 | 3 | 7 | ($req_target_arch, $req_target_gnu_type) = check_arch_coherency($req_target_arch, $req_target_gnu_type); | ||||
328 | |||||||
329 | # Proceed to compute the target variables if needed. | ||||||
330 | |||||||
331 | 3 | 3 | $v{DEB_TARGET_ARCH} = $req_target_arch || $v{DEB_HOST_ARCH} || $req_host_arch || get_raw_host_arch() | ||||
332 | if (action_needs(INFO_TARGET_ARCH_NAME)); | ||||||
333 | ($v{DEB_TARGET_ARCH_ABI}, $v{DEB_TARGET_ARCH_LIBC}, | ||||||
334 | $v{DEB_TARGET_ARCH_OS}, $v{DEB_TARGET_ARCH_CPU}) = debarch_to_debtuple($v{DEB_TARGET_ARCH}) | ||||||
335 | 3 | 30 | if (action_needs(INFO_TARGET_ARCH_TUPLE)); | ||||
336 | ($v{DEB_TARGET_ARCH_BITS}, $v{DEB_TARGET_ARCH_ENDIAN}) = debarch_to_abiattrs($v{DEB_TARGET_ARCH}) | ||||||
337 | 3 | 4 | if (action_needs(INFO_TARGET_ARCH_ATTR)); | ||||
338 | |||||||
339 | $v{DEB_TARGET_MULTIARCH} = debarch_to_multiarch($v{DEB_TARGET_ARCH}) | ||||||
340 | 3 | 2 | if (action_needs(INFO_TARGET_MULTIARCH)); | ||||
341 | |||||||
342 | 3 | 16 | if (action_needs(INFO_TARGET_GNU_TUPLE)) { | ||||
343 | 3 | 3 | if ($req_target_gnu_type eq '') { | ||||
344 | 3 | 4 | $v{DEB_TARGET_GNU_TYPE} = debarch_to_gnutriplet($v{DEB_TARGET_ARCH}); | ||||
345 | } else { | ||||||
346 | 0 | 0 | $v{DEB_TARGET_GNU_TYPE} = $req_target_gnu_type; | ||||
347 | } | ||||||
348 | 3 | 5 | ($v{DEB_TARGET_GNU_CPU}, $v{DEB_TARGET_GNU_SYSTEM}) = split(/-/, $v{DEB_TARGET_GNU_TYPE}, 2); | ||||
349 | } | ||||||
350 | |||||||
351 | |||||||
352 | 3 | 5 | if ($action eq 'list') { | ||||
353 | 3 | 40 | foreach my $k (sort keys %arch_vars) { | ||||
354 | 99 | 71 | print "$k=$v{$k}\n"; | ||||
355 | } | ||||||
356 | } elsif ($action eq 'print-set') { | ||||||
357 | 0 | 0 | if ($print_format eq 'shell') { | ||||
358 | 0 | 0 | foreach my $k (sort keys %arch_vars) { | ||||
359 | 0 | 0 | print "$k=$v{$k}; "; | ||||
360 | } | ||||||
361 | 0 | 0 | print 'export ' . join(' ', sort keys %arch_vars) . "\n"; | ||||
362 | } elsif ($print_format eq 'make') { | ||||||
363 | 0 | 0 | foreach my $k (sort keys %arch_vars) { | ||||
364 | 0 | 0 | print "export $k = $v{$k}\n"; | ||||
365 | } | ||||||
366 | } | ||||||
367 | } elsif ($action eq 'print-unset') { | ||||||
368 | 0 | 0 | if ($print_format eq 'shell') { | ||||
369 | 0 | 0 | print 'unset ' . join(' ', sort keys %arch_vars) . "\n"; | ||||
370 | } elsif ($print_format eq 'make') { | ||||||
371 | 0 | 0 | foreach my $k (sort keys %arch_vars) { | ||||
372 | 0 | 0 | print "undefine $k\n"; | ||||
373 | } | ||||||
374 | } | ||||||
375 | } elsif ($action eq 'equal') { | ||||||
376 | 0 | 0 | exit !debarch_eq($v{DEB_HOST_ARCH}, $req_eq_arch); | ||||
377 | } elsif ($action eq 'is') { | ||||||
378 | 0 | 0 | exit !debarch_is($v{DEB_HOST_ARCH}, $req_is_arch); | ||||
379 | } elsif ($action eq 'command') { | ||||||
380 | 0 | 0 | @ENV{keys %v} = values %v; | ||||
381 | ## no critic (TestingAndDebugging::ProhibitNoWarnings) | ||||||
382 | 3 3 3 | 9 10 2432 | no warnings qw(exec); | ||||
383 | 0 | 0 | exec @ARGV or syserr(g_('unable to execute %s'), "@ARGV"); | ||||
384 | } elsif ($action eq 'query') { | ||||||
385 | 0 | 0 | print "$v{$req_variable_to_print}\n"; | ||||
386 | } elsif ($action eq 'list-known') { | ||||||
387 | 0 | 0 | foreach my $arch (get_valid_arches()) { | ||||
388 | 0 | 0 | my ($bits, $endian) = debarch_to_abiattrs($arch); | ||||
389 | |||||||
390 | 0 | 0 | next if $req_match_endian and $endian ne $req_match_endian; | ||||
391 | 0 | 0 | next if $req_match_bits and $bits ne $req_match_bits; | ||||
392 | 0 | 0 | next if $req_match_wildcard and not debarch_is($arch, $req_match_wildcard); | ||||
393 | |||||||
394 | 0 | 0 | print "$arch\n"; | ||||
395 | } | ||||||
396 | } |