}
}
+# Build an environment value for a variable like PATH from a list of paths.
+# References to existing variables are given as references to the variable name.
+# Duplicates are removed.
+#
+# options:
+# - interpolate: INTERPOLATE_ENV/LITERAL_ENV
+# - exists: paths are included only if they exist (default: interpolate == INTERPOLATE_ENV)
+# - filter: function to apply to each path do decide if it must be included
+# - empty: the value to return in the case of empty value
+my %_env_list_value_defaults = (
+ interpolate => INTERPOLATE_ENV,
+ exists => undef,
+ filter => sub { 1 },
+ empty => undef,
+);
+sub _env_list_value(%@) {
+ my $options = shift;
+ die(sprintf "unknown option '$_' at %s line %u\n", (caller)[1..2])
+ for grep { !exists $_env_list_value_defaults{$_} } keys %$options;
+ my %options = (%_env_list_value_defaults, %{ $options });
+ $options{exists} = $options{interpolate} == INTERPOLATE_ENV
+ unless defined $options{exists};
+
+ my %seen;
+
+ my $value = join($Config{path_sep}, map {
+ ref $_ ? ($^O eq 'MSWin32' ? "%${$_}%" : "\$${$_}") : $_
+ } grep {
+ ref $_ || (defined $_
+ && length($_) > 0
+ && !$seen{$_}++
+ && $options{filter}->($_)
+ && (!$options{exists} || -e $_))
+ } map {
+ if (ref $_ eq 'SCALAR' && $options{interpolate} == INTERPOLATE_ENV) {
+ exists $ENV{${$_}} ? (split /\Q$Config{path_sep}/, $ENV{${$_}}) : ()
+ } else {
+ $_
+ }
+ } @_);
+ return length($value) ? $value : $options{empty};
+}
+
sub build_activate_environment_vars_for {
my ($class, $path, $interpolate) = @_;
return (
- PERL_LOCAL_LIB_ROOT => join($Config{path_sep},
- (($ENV{PERL_LOCAL_LIB_ROOT}||()) ?
- ($interpolate == INTERPOLATE_ENV
- ? ($ENV{PERL_LOCAL_LIB_ROOT}||())
- : (($^O ne 'MSWin32') ? '$PERL_LOCAL_LIB_ROOT'
- : '%PERL_LOCAL_LIB_ROOT%' ))
- : ()),
- $path
+ PERL_LOCAL_LIB_ROOT =>
+ _env_list_value(
+ { interpolate => $interpolate, exists => 0, empty => '' },
+ \'PERL_LOCAL_LIB_ROOT',
+ $path,
),
PERL_MB_OPT => "--install_base ${path}",
PERL_MM_OPT => "INSTALL_BASE=${path}",
- PERL5LIB => join($Config{path_sep},
- $class->install_base_arch_path($path),
- $class->install_base_perl_path($path),
- (($ENV{PERL5LIB}||()) ?
- ($interpolate == INTERPOLATE_ENV
- ? ($ENV{PERL5LIB})
- : (($^O ne 'MSWin32') ? '$PERL5LIB' : '%PERL5LIB%' ))
- : ())
- ),
- PATH => join($Config{path_sep},
- $class->install_base_bin_path($path),
- ($interpolate == INTERPOLATE_ENV
- ? ($ENV{PATH}||())
- : (($^O ne 'MSWin32') ? '$PATH' : '%PATH%' ))
- ),
+ PERL5LIB =>
+ _env_list_value(
+ { interpolate => $interpolate, exists => 0, empty => '' },
+ $class->install_base_arch_path($path),
+ $class->install_base_perl_path($path),
+ \'PERL5LIB',
+ ),
+ PATH => _env_list_value(
+ { interpolate => $interpolate, exists => 0, empty => '' },
+ \'PATH',
+ ),
)
}
return ();
}
- my @new_ll_root = grep { $_ ne $path } @active_lls;
- my @new_perl5lib = grep {
- $_ ne $class->install_base_arch_path($path) &&
- $_ ne $class->install_base_perl_path($path)
- } split /\Q$Config{path_sep}/, $ENV{PERL5LIB};
+ my $perl_path = $class->install_base_perl_path($path);
+ my $arch_path = $class->install_base_arch_path($path);
+ my $bin_path = $class->install_base_bin_path($path);
+
my %env = (
- PERL_LOCAL_LIB_ROOT => (@new_ll_root ?
- join($Config{path_sep}, @new_ll_root) : undef
+ PERL_LOCAL_LIB_ROOT => _env_list_value(
+ {
+ exists => 0,
+ },
+ grep { $_ ne $path } @active_lls
),
- PERL5LIB => (@new_perl5lib ?
- join($Config{path_sep}, @new_perl5lib) : undef
+ PERL5LIB => _env_list_value(
+ {
+ exists => 0,
+ filter => sub {
+ $_ ne $perl_path && $_ ne $arch_path
+ },
+ },
+ \'PERL5LIB',
),
- PATH => join($Config{path_sep},
- grep { $_ ne $class->install_base_bin_path($path) }
- split /\Q$Config{path_sep}/, $ENV{PATH}
+ PATH => _env_list_value(
+ {
+ exists => 0,
+ filter => sub { $_ ne $bin_path },
+ },
+ \'PATH',
),
);
my @active_lls = $class->active_paths;
- my @new_perl5lib = split /\Q$Config{path_sep}/, $ENV{PERL5LIB};
- my @new_path = split /\Q$Config{path_sep}/, $ENV{PATH};
-
- for my $path (@active_lls) {
- @new_perl5lib = grep {
- $_ ne $class->install_base_arch_path($path) &&
- $_ ne $class->install_base_perl_path($path)
- } @new_perl5lib;
-
- @new_path = grep {
- $_ ne $class->install_base_bin_path($path)
- } @new_path;
- }
+ my %perl_paths = map { (
+ $class->install_base_perl_path($_) => 1,
+ $class->install_base_arch_path($_) => 1
+ ) } @active_lls;
+ my %bin_paths = map { (
+ $class->install_base_bin_path($_) => 1,
+ ) } @active_lls;
my %env = (
PERL_LOCAL_LIB_ROOT => undef,
PERL_MM_OPT => undef,
PERL_MB_OPT => undef,
- PERL5LIB => (@new_perl5lib ?
- join($Config{path_sep}, @new_perl5lib) : undef
+ PERL5LIB => _env_list_value(
+ {
+ exists => 0,
+ filter => sub {
+ ! scalar grep { exists $perl_paths{$_} } $_[0]
+ },
+ },
+ \'PERL5LIB'
+ ),
+ PATH => _env_list_value(
+ {
+ exists => 0,
+ filter => sub {
+ ! scalar grep { exists $bin_paths{$_} } $_[0]
+ },
+ },
+ \'PATH'
),
- PATH => join($Config{path_sep}, @new_path),
);
return %env;