This is an automated email from the git hooks/post-receive script. guillem pushed a commit to branch main in repository dpkg.
View the commit online: https://git.dpkg.org/cgit/dpkg/dpkg.git/commit/?id=0bbcb17bbf1e673783d511ba7b3fdeaaaeaa2dbb commit 0bbcb17bbf1e673783d511ba7b3fdeaaaeaa2dbb (HEAD -> main) Author: Guillem Jover <[email protected]> AuthorDate: Tue Dec 6 03:02:48 2022 +0100 dpkg-architecture: Properly compute required information to gather We are using bits to track the required information to gather. The problem was that we were also using those same bits to discriminate what variables had been seen from the environment and to remove them if so, but those bits were not unique per variable, several were shared among various variables, causing information to not be gathered. Instead track seen variables with a hash, and move the dependencies back into the environment variable definitions. We also use high-precedence operators on the conditional for the next command. This was surfaced when using GNU make >= 4.4, as that respects exported make variables into $(shell) functions, which caused infinite loops due to various of the calls in the test suite not returning anything anymore. Reported-by: Sören Tempel <[email protected]> --- scripts/dpkg-architecture.pl | 107 +++++++++++++++++++------------------------ 1 file changed, 46 insertions(+), 61 deletions(-) diff --git a/scripts/dpkg-architecture.pl b/scripts/dpkg-architecture.pl index b7c458fdd..683eca69b 100755 --- a/scripts/dpkg-architecture.pl +++ b/scripts/dpkg-architecture.pl @@ -106,78 +106,66 @@ sub check_arch_coherency } use constant { - INFO_NONE => 0, - INFO_BUILD_ARCH_NAME => 0b00001, INFO_BUILD_ARCH_TUPLE => 0b00010, INFO_BUILD_ARCH_ATTR => 0b00100, INFO_BUILD_MULTIARCH => 0b01000, INFO_BUILD_GNU_TUPLE => 0b10000, - INFO_BUILD_MASK => 0b11111, INFO_HOST_ARCH_NAME => 0b0000100000, INFO_HOST_ARCH_TUPLE => 0b0001000000, INFO_HOST_ARCH_ATTR => 0b0010000000, INFO_HOST_MULTIARCH => 0b0100000000, INFO_HOST_GNU_TUPLE => 0b1000000000, - INFO_HOST_MASK => 0b1111100000, INFO_TARGET_ARCH_NAME => 0b000010000000000, INFO_TARGET_ARCH_TUPLE => 0b000100000000000, INFO_TARGET_ARCH_ATTR => 0b001000000000000, INFO_TARGET_MULTIARCH => 0b010000000000000, INFO_TARGET_GNU_TUPLE => 0b100000000000000, - INFO_TARGET_MASK => 0b111110000000000, - - INFO_ALL => 0b111111111111111, }; -my %arch_deps = ( - INFO_BUILD_MASK+0 => INFO_BUILD_ARCH_NAME, - INFO_HOST_MASK+0 => INFO_HOST_ARCH_NAME, - INFO_TARGET_MASK+0 => INFO_TARGET_ARCH_NAME, -); - my %arch_vars = ( DEB_BUILD_ARCH => INFO_BUILD_ARCH_NAME, - DEB_BUILD_ARCH_ABI => INFO_BUILD_ARCH_TUPLE, - DEB_BUILD_ARCH_LIBC => INFO_BUILD_ARCH_TUPLE, - DEB_BUILD_ARCH_OS => INFO_BUILD_ARCH_TUPLE, - DEB_BUILD_ARCH_CPU => INFO_BUILD_ARCH_TUPLE, - DEB_BUILD_ARCH_BITS => INFO_BUILD_ARCH_ATTR, - DEB_BUILD_ARCH_ENDIAN => INFO_BUILD_ARCH_ATTR, - DEB_BUILD_MULTIARCH => INFO_BUILD_MULTIARCH, - DEB_BUILD_GNU_CPU => INFO_BUILD_GNU_TUPLE, - DEB_BUILD_GNU_SYSTEM => INFO_BUILD_GNU_TUPLE, - DEB_BUILD_GNU_TYPE => INFO_BUILD_GNU_TUPLE, + DEB_BUILD_ARCH_ABI => INFO_BUILD_ARCH_NAME | INFO_BUILD_ARCH_TUPLE, + DEB_BUILD_ARCH_LIBC => INFO_BUILD_ARCH_NAME | INFO_BUILD_ARCH_TUPLE, + DEB_BUILD_ARCH_OS => INFO_BUILD_ARCH_NAME | INFO_BUILD_ARCH_TUPLE, + DEB_BUILD_ARCH_CPU => INFO_BUILD_ARCH_NAME | INFO_BUILD_ARCH_TUPLE, + DEB_BUILD_ARCH_BITS => INFO_BUILD_ARCH_NAME | INFO_BUILD_ARCH_ATTR, + DEB_BUILD_ARCH_ENDIAN => INFO_BUILD_ARCH_NAME | INFO_BUILD_ARCH_ATTR, + DEB_BUILD_MULTIARCH => INFO_BUILD_ARCH_NAME | INFO_BUILD_MULTIARCH, + DEB_BUILD_GNU_CPU => INFO_BUILD_ARCH_NAME | INFO_BUILD_GNU_TUPLE, + DEB_BUILD_GNU_SYSTEM => INFO_BUILD_ARCH_NAME | INFO_BUILD_GNU_TUPLE, + DEB_BUILD_GNU_TYPE => INFO_BUILD_ARCH_NAME | INFO_BUILD_GNU_TUPLE, DEB_HOST_ARCH => INFO_HOST_ARCH_NAME, - DEB_HOST_ARCH_ABI => INFO_HOST_ARCH_TUPLE, - DEB_HOST_ARCH_LIBC => INFO_HOST_ARCH_TUPLE, - DEB_HOST_ARCH_OS => INFO_HOST_ARCH_TUPLE, - DEB_HOST_ARCH_CPU => INFO_HOST_ARCH_TUPLE, - DEB_HOST_ARCH_BITS => INFO_HOST_ARCH_ATTR, - DEB_HOST_ARCH_ENDIAN => INFO_HOST_ARCH_ATTR, - DEB_HOST_MULTIARCH => INFO_HOST_MULTIARCH, - DEB_HOST_GNU_CPU => INFO_HOST_GNU_TUPLE, - DEB_HOST_GNU_SYSTEM => INFO_HOST_GNU_TUPLE, - DEB_HOST_GNU_TYPE => INFO_HOST_GNU_TUPLE, + DEB_HOST_ARCH_ABI => INFO_HOST_ARCH_NAME | INFO_HOST_ARCH_TUPLE, + DEB_HOST_ARCH_LIBC => INFO_HOST_ARCH_NAME | INFO_HOST_ARCH_TUPLE, + DEB_HOST_ARCH_OS => INFO_HOST_ARCH_NAME | INFO_HOST_ARCH_TUPLE, + DEB_HOST_ARCH_CPU => INFO_HOST_ARCH_NAME | INFO_HOST_ARCH_TUPLE, + DEB_HOST_ARCH_BITS => INFO_HOST_ARCH_NAME | INFO_HOST_ARCH_ATTR, + DEB_HOST_ARCH_ENDIAN => INFO_HOST_ARCH_NAME | INFO_HOST_ARCH_ATTR, + DEB_HOST_MULTIARCH => INFO_HOST_ARCH_NAME | INFO_HOST_MULTIARCH, + DEB_HOST_GNU_CPU => INFO_HOST_ARCH_NAME | INFO_HOST_GNU_TUPLE, + DEB_HOST_GNU_SYSTEM => INFO_HOST_ARCH_NAME | INFO_HOST_GNU_TUPLE, + DEB_HOST_GNU_TYPE => INFO_HOST_ARCH_NAME | INFO_HOST_GNU_TUPLE, DEB_TARGET_ARCH => INFO_TARGET_ARCH_NAME, - DEB_TARGET_ARCH_ABI => INFO_TARGET_ARCH_TUPLE, - DEB_TARGET_ARCH_LIBC => INFO_TARGET_ARCH_TUPLE, - DEB_TARGET_ARCH_OS => INFO_TARGET_ARCH_TUPLE, - DEB_TARGET_ARCH_CPU => INFO_TARGET_ARCH_TUPLE, - DEB_TARGET_ARCH_BITS => INFO_TARGET_ARCH_ATTR, - DEB_TARGET_ARCH_ENDIAN => INFO_TARGET_ARCH_ATTR, - DEB_TARGET_MULTIARCH => INFO_TARGET_MULTIARCH, - DEB_TARGET_GNU_CPU => INFO_TARGET_GNU_TUPLE, - DEB_TARGET_GNU_SYSTEM => INFO_TARGET_GNU_TUPLE, - DEB_TARGET_GNU_TYPE => INFO_TARGET_GNU_TUPLE, + DEB_TARGET_ARCH_ABI => INFO_TARGET_ARCH_NAME | INFO_TARGET_ARCH_TUPLE, + DEB_TARGET_ARCH_LIBC => INFO_TARGET_ARCH_NAME | INFO_TARGET_ARCH_TUPLE, + DEB_TARGET_ARCH_OS => INFO_TARGET_ARCH_NAME | INFO_TARGET_ARCH_TUPLE, + DEB_TARGET_ARCH_CPU => INFO_TARGET_ARCH_NAME | INFO_TARGET_ARCH_TUPLE, + DEB_TARGET_ARCH_BITS => INFO_TARGET_ARCH_NAME | INFO_TARGET_ARCH_ATTR, + DEB_TARGET_ARCH_ENDIAN => INFO_TARGET_ARCH_NAME | INFO_TARGET_ARCH_ATTR, + DEB_TARGET_MULTIARCH => INFO_TARGET_ARCH_NAME | INFO_TARGET_MULTIARCH, + DEB_TARGET_GNU_CPU => INFO_TARGET_ARCH_NAME | INFO_TARGET_GNU_TUPLE, + DEB_TARGET_GNU_SYSTEM => INFO_TARGET_ARCH_NAME | INFO_TARGET_GNU_TUPLE, + DEB_TARGET_GNU_TYPE => INFO_TARGET_ARCH_NAME | INFO_TARGET_GNU_TUPLE, ); my %known_print_format = map { $_ => 1 } qw(shell make); my $print_format = 'shell'; -my $req_info = INFO_ALL; +my %req_vars = %arch_vars; +my $req_info = 0; my $req_host_arch = ''; my $req_host_gnu_type = ''; my $req_target_arch = ''; @@ -217,19 +205,19 @@ while (@ARGV) { $req_match_endian = shift; } elsif ($arg eq '-e' or $arg eq '--equal') { $req_eq_arch = shift; - $req_info = $arch_vars{DEB_HOST_ARCH}; + %req_vars = %arch_vars{DEB_HOST_ARCH}; $action = 'equal'; } elsif ($arg eq '-i' or $arg eq '--is') { $req_is_arch = shift; - $req_info = $arch_vars{DEB_HOST_ARCH}; + %req_vars = %arch_vars{DEB_HOST_ARCH}; $action = 'is'; } elsif ($arg eq '-u' or $arg eq '--print-unset') { - $req_info = INFO_NONE; + %req_vars = (); $action = 'print-unset'; } elsif ($arg eq '-l' or $arg eq '--list') { $action = 'list'; } elsif ($arg eq '-s' or $arg eq '--print-set') { - $req_info = INFO_ALL; + %req_vars = %arch_vars; $action = 'print-set'; } elsif ($arg eq '--print-format') { $print_format = shift; @@ -242,13 +230,13 @@ while (@ARGV) { error(g_('%s is not a supported variable name'), $varname) unless (exists $arch_vars{$varname}); $req_variable_to_print = "$varname"; - $req_info = $arch_vars{$varname}; + %req_vars = %arch_vars{$varname}; $action = 'query'; } elsif ($arg eq '-c' or $arg eq '--command') { $action = 'command'; last; } elsif ($arg eq '-L' or $arg eq '--list-known') { - $req_info = 0; + %req_vars = (); $action = 'list-known'; } elsif ($arg eq '-?' or $arg eq '--help') { usage(); @@ -261,19 +249,16 @@ while (@ARGV) { } } -# Handle variable dependencies -foreach my $k (keys %arch_deps) { - if ($req_info & $k) { - $req_info |= $arch_deps{$k}; - } -} - my %v; -foreach my $k (keys %arch_vars) { - next if not length $ENV{$k} or $force; - $v{$k} = $ENV{$k}; - $req_info &= ~$arch_vars{$k}; +# Initialize variables from environment and information to gather. +foreach my $k (keys %req_vars) { + if (length $ENV{$k} && ! $force) { + $v{$k} = $ENV{$k}; + delete $req_vars{$k}; + } else { + $req_info |= $req_vars{$k}; + } } # -- Dpkg.Org's dpkg

