Avoid using Hash::Merge. stow 2.3.0 added external dependencies on Hash::Merge and Clone::Choose, which makes bootstrapping awkward. It's not actually using most of Hash::Merge's features, so replace it with a specialised merge routine. diff -x config.guess -x config.log -x config.status -x config.sub -ru tmp/stow-2.3.0/Build.PL work/stow-2.3.0/Build.PL --- tmp/stow-2.3.0/Build.PL 2019-06-28 23:51:12.000000000 +0100 +++ work/stow-2.3.0/Build.PL 2019-06-29 12:05:59.195616482 +0100 @@ -60,8 +60,6 @@ 'perl' => '5.006', 'Carp' => 0, 'IO::File' => 0, - 'Hash::Merge' => 0, - 'Clone' => 0, }, script_files => [ 'bin/stow', 'bin/chkstow' ], all_from => 'lib/Stow.pm.in', diff -x config.guess -x config.log -x config.status -x config.sub -ru tmp/stow-2.3.0/bin/stow.in work/stow-2.3.0/bin/stow.in --- tmp/stow-2.3.0/bin/stow.in 2019-06-28 23:33:58.000000000 +0100 +++ work/stow-2.3.0/bin/stow.in 2019-06-29 12:25:50.098558041 +0100 @@ -457,16 +457,12 @@ use POSIX qw(getcwd); use Getopt::Long qw(GetOptionsFromArray); +use Scalar::Util qw(reftype); @USE_LIB_PMDIR@ use Stow; use Stow::Util qw(parent error); -# Need to avoid Storable backend, since it can't deal with regexps: -# https://rt.perl.org/Public/Bug/Display.html?id=50608 -use Clone::Choose qw(:Clone); -use Hash::Merge qw(merge); - my $ProgramName = $0; $ProgramName =~ s{.*/}{}; @@ -530,17 +526,27 @@ # Merge .stowrc and command line options. # Preference is given to cli options. - # rc options come first in merged arrays. - # cli options overwrite conflicting rc options. - Hash::Merge::set_behavior('RIGHT_PRECEDENT'); - my $options = merge($rc_options, $cli_options); + my %options = %$rc_options; + foreach my $option (keys %$cli_options) { + my $rc_value = $rc_options->{$option}; + my $cli_value = $cli_options->{$option}; + my $type = reftype($cli_value); + + if (defined $type && $type eq 'ARRAY' && defined $rc_value) { + # rc options come first in merged arrays. + $options{$option} = [@{$rc_value}, @{$cli_value}]; + } else { + # cli options overwrite conflicting rc options. + $options{$option} = $cli_value; + } + } # Run checks on the merged options. - sanitize_path_options($options); + sanitize_path_options(\%options); check_packages($pkgs_to_unstow, $pkgs_to_stow); # Return merged and processed options. - return ($options, $pkgs_to_unstow, $pkgs_to_stow); + return (\%options, $pkgs_to_unstow, $pkgs_to_stow); } #===== SUBROUTINE ===========================================================