X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=Configure;h=17bc6c2c6747c9ef1994c117a82e512a8cdab36c;hp=eab3c661d279bd434eda85bc6355ed32c5b81ed2;hb=f425f9dcffc4efa13fbdbba34c6883b038409f3f;hpb=8864f0de7b491b4c7f724f58200d843700c82e98 diff --git a/Configure b/Configure index eab3c661d2..17bc6c2c67 100755 --- a/Configure +++ b/Configure @@ -57,6 +57,9 @@ my $usage="Usage: Configure [no- ...] [enable- ...] [-Dxxx] [-lx # library and will be loaded in run-time by the OpenSSL library. # sctp include SCTP support # 386 generate 80386 code +# enable-weak-ssl-ciphers +# Enable weak ciphers that are disabled by default. This currently +# only includes RC4 based ciphers. # no-sse2 disables IA-32 SSE2 code, above option implies no-sse2 # no- build without specified algorithm (rsa, idea, rc5, ...) # - + compiler options are passed through @@ -124,7 +127,7 @@ my $strict_warnings = 0; # which has to be accompanied by explicit -D_THREAD_SAFE and # sometimes -D_REENTRANT. FreeBSD 5.x expands it as -lc_r, which # seems to be sufficient? -my $BSDthreads="-pthread -D_THREAD_SAFE -D_REENTRANT"; +our $BSDthreads="-pthread -D_THREAD_SAFE -D_REENTRANT"; # # API compability name to version number mapping. @@ -208,7 +211,7 @@ $config{cross_compile_prefix}=""; $config{fipslibdir}="/usr/local/ssl/fips-2.0/lib/"; my $nofipscanistercheck=0; $config{baseaddr}="0xFB00000"; -my $threads=0; +my $auto_threads=1; # enable threads automatically? true by default my $default_ranlib; $config{fips}=0; @@ -217,7 +220,7 @@ $config{dirs} = [ "crypto", "ssl", "engines", "apps", "test", "tools" ]; # crypto/ subdirectories to build $config{sdirs} = [ "objects", - "md2", "md4", "md5", "sha", "mdc2", "hmac", "ripemd", "whrlpool", "poly1305", + "md2", "md4", "md5", "sha", "mdc2", "hmac", "ripemd", "whrlpool", "poly1305", "blake2", "des", "aes", "rc2", "rc4", "rc5", "idea", "bf", "cast", "camellia", "seed", "chacha", "modes", "bn", "ec", "rsa", "dsa", "dh", "dso", "engine", "buffer", "bio", "stack", "lhash", "rand", "err", @@ -240,6 +243,7 @@ my @disablables = ( "autoalginit", "autoerrinit", "bf", + "blake2", "camellia", "capieng", "cast", @@ -271,12 +275,13 @@ my @disablables = ( "hmac", "hw(-.+)?", "idea", - "locking", + "makedepend", "md2", "md4", "md5", "mdc2", "md[-_]ghost94", + "multiblock", "nextprotoneg", "ocb", "ocsp", @@ -313,6 +318,7 @@ my @disablables = ( "ui", "unit-test", "whirlpool", + "weak-ssl-ciphers", "zlib", "zlib-dynamic", ); @@ -330,17 +336,21 @@ my @deprecated_disablables = ( our %disabled = ( # "what" => "comment" "ec_nistp_64_gcc_128" => "default", - "egd" => "default", - "md2" => "default", - "rc5" => "default", - "sctp" => "default", - "shared" => "default", - "ssl-trace" => "default", - "static-engine" => "default", - "unit-test" => "default", - "zlib" => "default", - "crypto-mdebug" => "default", - "heartbeats" => "default", + "egd" => "default", + "md2" => "default", + "rc5" => "default", + "sctp" => "default", + "shared" => "default", + "ssl-trace" => "default", + "ssl3" => "default", + "ssl3-method" => "default", + "static-engine" => "default", + "unit-test" => "default", + "weak-ssl-ciphers" => "default", + "zlib" => "default", + "zlib-dynamic" => "default", + "crypto-mdebug" => "default", + "heartbeats" => "default", ); # Note: => pair form used for aesthetics, not to truly make a hash table @@ -387,7 +397,8 @@ my @disable_cascades = ( "dso" => [ "dynamic-engine" ], # Without position independent code, there can be no shared libraries or DSOs - "pic" => [ "shared", "dynamic-engine" ], + "pic" => [ "shared" ], + "shared" => [ "dynamic-engine" ], ); # Avoid protocol support holes. Also disable all versions below N, if version @@ -429,7 +440,6 @@ my $no_sse2=0; my $user_cflags=""; my @user_defines=(); -my $unified = 0; $config{openssl_api_defines}=[]; $config{openssl_algorithm_defines}=[]; $config{openssl_thread_defines}=[]; @@ -440,6 +450,8 @@ my $target=""; $config{options}=""; $config{build_type} = "release"; +my $classic = 0; + my @argvcopy=@ARGV; if (grep /^reconf(igure)?$/, @argvcopy) { @@ -569,6 +581,8 @@ foreach (@argvcopy) { $disabled{$1} = "option"; } + # No longer an automatic choice + $auto_threads = 0 if ($1 eq "threads"); } elsif (/^enable-(.+)$/) { @@ -580,10 +594,15 @@ foreach (@argvcopy) { delete $disabled{"dynamic-engine"}; } + elsif ($1 eq "zlib-dynamic") + { + delete $disabled{"zlib"}; + } my $algo = $1; delete $disabled{$algo}; - $threads = 1 if ($algo eq "threads"); + # No longer an automatic choice + $auto_threads = 0 if ($1 eq "threads"); } elsif (/^--strict-warnings$/) { @@ -616,9 +635,9 @@ foreach (@argvcopy) } elsif (/^[-+]/) { - if (/^--unified$/) + if (/^--classic$/) { - $unified=1; + $classic=1; } elsif (/^--prefix=(.*)$/) { @@ -779,6 +798,8 @@ foreach (sort (keys %disabled)) { } elsif (/^dynamic-engine$/) { } + elsif (/^makedepend$/) + { } elsif (/^zlib-dynamic$/) { } elsif (/^sse2$/) @@ -866,22 +887,29 @@ $target{nm} = $ENV{'NM'} || $target{nm} || "nm"; # For cflags, lflags, plib_lflags, ex_libs and defines, add the debug_ # or release_ attributes. # Do it in such a way that no spurious space is appended (hence the grep). -$config{defines} = $target{defines} || []; -$config{cflags} = $target{cflags} || ""; -$config{ex_libs} = $target{ex_libs} || ""; +$config{defines} = []; +$config{cflags} = ""; +$config{ex_libs} = ""; +$config{shared_ldflag} = ""; # Make sure build_scheme is consistent. $target{build_scheme} = [ $target{build_scheme} ] if ref($target{build_scheme}) ne "ARRAY"; -###### TO BE REMOVED BEFORE FINAL RELEASE +###### TO BE REMOVED WHEN CLASSIC BUILD IS REMOVED ###### -###### If the user has chosen --unified, we give it to them. -###### The same happens if we detect that they try to build out-of-source. -if ($target{build_file} eq "Makefile" - && $target{build_scheme}->[0] eq "unixmake" - && ($unified || $srcdir ne $blddir)) { - $target{build_scheme} = [ "unified", "unix" ]; +###### If the user has chosen --classic, we give it to them. +###### If they try that with an out-of-source config, we complain. +if ($target{build_scheme}->[0] eq "unified" && $classic) { + die "Can't perform a classic build out of source tree\n" + if $srcdir ne $blddir; + + $target{build_scheme} = { unix => [ "unixmake" ], + windows => [ "mk1mf", $target{build_scheme}->[2] ], + VMS => undef } -> {$target{build_scheme}->[1]}; + + die "Classic mode unavailable on this platform\n" + unless defined($target{build_scheme}); } my ($builder, $builder_platform, @builder_opts) = @@ -890,7 +918,7 @@ my ($builder, $builder_platform, @builder_opts) = if ($target =~ /^mingw/ && `$target{cc} --target-help 2>&1` =~ m/-mno-cygwin/m) { $config{cflags} .= " -mno-cygwin"; - $target{shared_ldflag} .= " -mno-cygwin"; + $config{shared_ldflag} .= " -mno-cygwin"; } if ($target =~ /linux.*-mips/ && !$disabled{asm} && $user_cflags !~ /-m(ips|arch=)/) { @@ -914,60 +942,60 @@ if (!$disabled{dso} && $target{dso_scheme} ne "") $target{dso_scheme} =~ tr/[a-z]/[A-Z]/; if ($target{dso_scheme} eq "DLFCN") { - $config{defines} = [ "DSO_DLFCN", "HAVE_DLFCN_H", - @{$config{defines}} ] + unshift @{$config{defines}}, "DSO_DLFCN", "HAVE_DLFCN_H"; } elsif ($target{dso_scheme} eq "DLFCN_NO_H") { - $config{defines} = [ "DSO_DLFCN", @{$config{defines}} ] + unshift @{$config{defines}}, "DSO_DLFCN"; } else { - $config{defines} = [ "DSO_$target{dso_scheme}", - @{$config{defines}} ] + unshift @{$config{defines}}, "DSO_$target{dso_scheme}"; } } -my $thread_cflags = ""; -my @thread_defines; -if ($target{thread_cflag} ne "(unknown)" && !$disabled{threads}) - { - # If we know how to do it, support threads by default. - $threads = 1; - } -if ($target{thread_cflag} eq "(unknown)" && $threads) - { - # If the user asked for "threads", [s]he is also expected to - # provide any system-dependent compiler options that are - # necessary. - if ($no_user_cflags && $no_user_defines) - { - print "You asked for multi-threading support, but didn't\n"; - print "provide any system-specific compiler options\n"; - exit(1); - } - push @thread_defines, "OPENSSL_THREADS"; - } -else - { - $thread_cflags=" $target{thread_cflag}"; - push @thread_defines, @{$target{thread_defines}}, "OPENSSL_THREADS"; - } - $config{ex_libs}="$libs$config{ex_libs}" if ($libs ne ""); if ($disabled{asm}) { - @{$config{defines}} = grep !/^[BL]_ENDIAN$/, @{$config{defines}} - if ($config{fips}); + if ($config{fips}) + { + @{$config{defines}} = grep !/^[BL]_ENDIAN$/, @{$config{defines}}; + @{$target{defines}} = grep !/^[BL]_ENDIAN$/, @{$target{defines}}; + } } -if ($threads) - { - $config{cflags} = "$thread_cflags $config{cflags}" if $thread_cflags; - push @{$config{defines}}, @thread_defines; - push @{$config{openssl_thread_defines}}, @thread_defines; - } +# If threads aren't disabled, check how possible they are +unless ($disabled{threads}) { + if ($auto_threads) { + # Enabled by default, disable it forcibly if unavailable + if ($target{thread_scheme} eq "(unknown)") { + $disabled{threads} = "unavailable"; + } + } else { + # The user chose to enable threads explicitely, let's see + # if there's a chance that's possible + if ($target{thread_scheme} eq "(unknown)") { + # If the user asked for "threads" and we don't have internal + # knowledge how to do it, [s]he is expected to provide any + # system-dependent compiler options that are necessary. We + # can't truly check that the given options are correct, but + # we expect the user to know what [s]He is doing. + if ($no_user_cflags && $no_user_defines) { + die "You asked for multi-threading support, but didn't\n" + ,"provide any system-specific compiler options\n"; + } + } + } +} + +# If threads still aren't disabled, add a C macro to ensure the source +# code knows about it. Any other flag is taken care of by the configs. +unless($disabled{threads}) { + foreach (("defines", "openssl_thread_defines")) { + push @{$config{$_}}, "OPENSSL_THREADS"; + } +} # With "deprecated" disable all deprecated features. if (defined($disabled{"deprecated"})) { @@ -1055,7 +1083,7 @@ unless ($disabled{asm}) { if ($config{processor} eq "386") { $target{wp_asm_src}=$table{DEFAULTS}->{wp_asm_src}; } elsif (!$disabled{"whirlpool"}) { - $config{cflags}.=" -DWHIRLPOOL_ASM"; + push @{$config{defines}}, "WHIRLPOOL_ASM"; } } if ($target{modes_asm_src} =~ /ghash-/) { @@ -1070,21 +1098,32 @@ unless ($disabled{asm}) { } my $ecc = $target{cc}; -if ($^O ne "VMS") { +if ($^O ne "VMS" && !$disabled{makedepend}) { # Is the compiler gcc or clang? $ecc is used below to see if # error-checking can be turned on. my $ccpcc = "$config{cross_compile_prefix}$target{cc}"; - $config{makedepprog} = 'makedepend'; - open(PIPE, "$ccpcc --version 2>&1 | head -2 |"); + open(PIPE, "$ccpcc --version 2>&1 |"); + my $lines = 2; while ( ) { - $config{makedepprog} = $ccpcc if /clang|gcc/; + # Find the version number and save the major. + m|(?:.*)\b(\d+)\.\d+\.\d+\b(?:.*)|; + my $compiler_major = $1; + # We know that GNU C version 3 and up as well as all clang + # versions support dependency generation + $config{makedepprog} = $ccpcc + if (/clang/ || (/gcc/ && $compiler_major > 3)); $ecc = "clang" if /clang/; $ecc = "gcc" if /gcc/; + last if ($config{makedepprog} || !$lines--); } close(PIPE); + + $config{makedepprog} = which('makedepend') unless $config{makedepprog}; + $disabled{makedepend} = "unavailable" unless $config{makedepprog}; } + # Deal with bn_ops ################################################### $config{bn_ll} =0; @@ -1159,6 +1198,28 @@ else { $no_user_defines=1; } # ALL MODIFICATIONS TO %config and %target MUST BE DONE FROM HERE ON +unless ($disabled{engine}) { + $config{afalg}=""; + if ($target =~ m/^linux/) { + my $minver = 4*10000 + 1*100 + 0; + if ($config{cross_compile_prefix} eq "") { + my $verstr = `uname -r`; + my ($ma, $mi1, $mi2) = split("\\.", $verstr); + ($mi2) = $mi2 =~ /(\d+)/; + my $ver = $ma*10000 + $mi1*100 + $mi2; + if ($ver < $minver) { + $disabled{afalg} = "too-old-kernel"; + } else { + push @{$config{engdirs}}, "afalg"; + } + } + } else { + $disabled{afalg} = "not-linux"; + } +} + +push @{$config{openssl_other_defines}}, "OPENSSL_NO_AFALGENG" if ($disabled{afalg}); + # If we use the unified build, collect information from build.info files my %unified_info = (); @@ -1238,6 +1299,7 @@ if ($builder eq "unified") { my @engines = (); my @scripts = (); my @extra = (); + my @overrides = (); my @intermediates = (); my @rawlines = (); @@ -1247,6 +1309,7 @@ if ($builder eq "unified") { my %depends = (); my %renames = (); my %sharednames = (); + my %generate = (); push @{$config{build_infos}}, catfile(abs2rel($sourced, $blddir), $f); my $template = Text::Template->new(TYPE => 'FILE', @@ -1276,7 +1339,13 @@ if ($builder eq "unified") { $l1 =~ s/\\$//; $l1.$l2 }), # Info we're looking for qr/^\s*IF\[((?:\\.|[^\\\]])*)\]\s*$/ - => sub { push @skip, !! $1; }, + => sub { + if (! @skip || $skip[$#skip] > 0) { + push @skip, !! $1; + } else { + push @skip, -1; + } + }, qr/^\s*ELSIF\[((?:\\.|[^\\\]])*)\]\s*$/ => sub { die "ELSIF out of scope" if ! @skip; die "ELSIF following ELSE" if abs($skip[$#skip]) == 2; @@ -1305,6 +1374,9 @@ if ($builder eq "unified") { qr/^\s*EXTRA\s*=\s*(.*)\s*$/ => sub { push @extra, split(/\s+/, $1) if !@skip || $skip[$#skip] > 0 }, + qr/^\s*OVERRIDES\s*=\s*(.*)\s*$/ + => sub { push @overrides, split(/\s+/, $1) + if !@skip || $skip[$#skip] > 0 }, qr/^\s*ORDINALS\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/, => sub { push @{$ordinals{$1}}, split(/\s+/, $2) @@ -1318,6 +1390,9 @@ if ($builder eq "unified") { qr/^\s*DEPEND\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/ => sub { push @{$depends{$1}}, split(/\s+/, $2) if !@skip || $skip[$#skip] > 0 }, + qr/^\s*GENERATE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/ + => sub { push @{$generate{$1}}, $2 + if !@skip || $skip[$#skip] > 0 }, qr/^\s*RENAME\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/ => sub { push @{$renames{$1}}, split(/\s+/, $2) if !@skip || $skip[$#skip] > 0 }, @@ -1400,6 +1475,11 @@ EOF $unified_info{extra}->{$extra} = 1; } + foreach (@overrides) { + my $override = cleanfile($buildd, $_, $blddir); + $unified_info{overrides}->{$override} = 1; + } + push @{$unified_info{rawlines}}, @rawlines; unless ($disabled{shared}) { @@ -1441,9 +1521,9 @@ EOF my %known_ordinals = ( crypto => - cleanfile($sourced, catfile("util", "libeay.num"), $blddir), + cleanfile($sourced, catfile("util", "libcrypto.num"), $blddir), ssl => - cleanfile($sourced, catfile("util", "ssleay.num"), $blddir) + cleanfile($sourced, catfile("util", "libssl.num"), $blddir) ); my $o = $known_ordinals{$_}; die "Ordinals for $ddest defined more than once\n" @@ -1478,6 +1558,20 @@ EOF } } + foreach (keys %generate) { + my $dest = $_; + my $ddest = cleanfile($buildd, $_, $blddir); + if ($unified_info{rename}->{$ddest}) { + $ddest = $unified_info{rename}->{$ddest}; + } + die "more than one generator for $dest: " + ,join(" ", @{$generate{$_}}),"\n" + if scalar @{$generate{$_}} > 1; + my @generator = split /\s+/, $generate{$dest}->[0]; + $generator[0] = cleanfile($sourced, $generator[0], $blddir), + $unified_info{generate}->{$ddest} = [ @generator ]; + } + foreach (keys %depends) { my $dest = $_; my $ddest = cleanfile($buildd, $_, $blddir); @@ -1529,7 +1623,7 @@ EOF ### Make unified_info a bit more efficient # One level structures - foreach (("programs", "libraries", "engines", "scripts", "extra")) { + foreach (("programs", "libraries", "engines", "scripts", "extra", "overrides")) { $unified_info{$_} = [ sort keys %{$unified_info{$_}} ]; } # Two level structures @@ -1669,11 +1763,12 @@ close(OUT); print "IsMK1MF =", ($builder eq "mk1mf" ? "yes" : "no"), "\n"; print "CC =$target{cc}\n"; -print "CFLAG =$config{cflags}\n"; -print "DEFINES =",join(" ", @{$config{defines}}),"\n"; +print "CFLAG =$target{cflags} $config{cflags}\n"; +print "SHARED_CFLAG =$target{shared_cflag}\n"; +print "DEFINES =",join(" ", @{$target{defines}}, @{$config{defines}}),"\n"; print "LFLAG =$target{lflags}\n"; print "PLIB_LFLAG =$target{plib_lflags}\n"; -print "EX_LIBS =$config{ex_libs}\n"; +print "EX_LIBS =$target{ex_libs} $config{ex_libs}\n"; print "APPS_OBJ =$target{apps_obj}\n"; print "CPUID_OBJ =$target{cpuid_obj}\n"; print "UPLINK_OBJ =$target{uplink_obj}\n"; @@ -1693,6 +1788,7 @@ print "MODES_OBJ =$target{modes_obj}\n"; print "PADLOCK_OBJ =$target{padlock_obj}\n"; print "CHACHA_ENC =$target{chacha_obj}\n"; print "POLY1305_OBJ =$target{poly1305_obj}\n"; +print "BLAKE2_OBJ =$target{blake2_obj}\n"; print "PROCESSOR =$config{processor}\n"; print "RANLIB =$target{ranlib}\n"; print "ARFLAGS =$target{arflags}\n"; @@ -1799,11 +1895,11 @@ BEGIN VALUE "FileDescription", "OpenSSL Shared Library\\0" VALUE "FileVersion", "$config{version}\\0" #if defined(CRYPTO) - VALUE "InternalName", "libeay32\\0" - VALUE "OriginalFilename", "libeay32.dll\\0" + VALUE "InternalName", "libcrypto32\\0" + VALUE "OriginalFilename", "libcrypto32.dll\\0" #elif defined(SSL) - VALUE "InternalName", "ssleay32\\0" - VALUE "OriginalFilename", "ssleay32.dll\\0" + VALUE "InternalName", "libssl32\\0" + VALUE "OriginalFilename", "libssl32.dll\\0" #endif VALUE "ProductName", "The OpenSSL Toolkit\\0" VALUE "ProductVersion", "$config{version}\\0" @@ -1833,7 +1929,7 @@ print <<"EOF"; Configured for $target. EOF -print <<"EOF" if (!$disabled{threads} && !$threads); +print <<"EOF" if ($disabled{threads} eq "unavailable"); The library could not be configured for supporting multi-threaded applications as the compiler options required on this system are not known. @@ -1849,39 +1945,6 @@ or position independent code, please let us know (but please first make sure you have tried with a current version of OpenSSL). EOF -###### TO BE REMOVED BEFORE FINAL RELEASE -###### -###### If the user hasn't chosen --unified, try to nudge them. -if ($target{build_file} eq "Makefile" - && $target{build_scheme}->[0] eq "unixmake" - && !$unified) { - - my $plausible_builddir = - abs2rel(rel2abs("../_openssl-build_$target"),rel2abs(".")); - my $plausible_to_sourcedir = - abs2rel(rel2abs("."),rel2abs("../_openssl-build_$target")); - print <<"EOF"; - ----------------------------------------------------------------------- -Please consider configuring with the flag --unified . -It's to test out a new "unified" building system. - -One cool feature is that you can have your build directory elsewhere, -for example: - - make clean # Clean the current configuration away - mkdir $plausible_builddir - cd $plausible_builddir - $plausible_to_sourcedir/config --unified - make - make test - -Please report any problem you have. ----------------------------------------------------------------------- - -EOF -} - exit(0); ###################################################################### @@ -1903,6 +1966,7 @@ sub asm { } } +our $add_called = 0; # Helper function to implement adding values to already existing configuration # values. It handles elements that are ARRAYs, CODEs and scalars sub _add { @@ -1931,6 +1995,8 @@ sub _add { } } (@_); + $add_called = 1; + if ($found_array) { [ @values ]; } else { @@ -1999,6 +2065,8 @@ sub resolve_config { my $target = shift; my @breadcrumbs = @_; +# my $extra_checks = defined($ENV{CONFIGURE_EXTRA_CHECKS}); + if (grep { $_ eq $target } @breadcrumbs) { die "inherit_from loop! target backtrace:\n " ,$target,"\n ",join("\n ", @breadcrumbs),"\n"; @@ -2061,6 +2129,8 @@ sub resolve_config { my $target = shift; my $entry = shift; + $add_called = 0; + while(ref($object) eq "CODE") { $object = $object->(@$inherited); } @@ -2068,6 +2138,7 @@ sub resolve_config { return (); } elsif (ref($object) eq "ARRAY") { + local $add_called; # To make sure recursive calls don't affect it return [ map { process_values($_, $inherited, $target, $entry) } @$object ]; } elsif (ref($object) eq "") { @@ -2079,6 +2150,7 @@ sub resolve_config { } foreach (sort keys %all_keys) { + my $previous = $combined_inheritance{$_}; # Current target doesn't have a value for the current key? # Assign it the default combiner, the rest of this loop body @@ -2093,6 +2165,10 @@ sub resolve_config { unless(defined($table{$target}->{$_})) { delete $table{$target}->{$_}; } +# if ($extra_checks && +# $previous && !($add_called || $previous ~~ $table{$target}->{$_})) { +# warn "$_ got replaced in $target\n"; +# } } # Finally done, return the result. @@ -2167,7 +2243,6 @@ sub print_table_entry "cc", "cflags", "defines", - "thread_cflag", "unistd", "ld", "lflags", @@ -2190,6 +2265,7 @@ sub print_table_entry "cmll_obj", "modes_obj", "padlock_obj", + "thread_scheme", "perlasm_scheme", "dso_scheme", "shared_target", @@ -2284,10 +2360,12 @@ sub which my $path; foreach $path (split /:/, $ENV{PATH}) { - if (-f "$path/$name$target{exe_extension}" and -x _) + my $fullpath = "$path/$name$target{exe_extension}"; + if (-f $fullpath and -x $fullpath) { - return "$path/$name$target{exe_extension}" unless ($name eq "perl" and - system("$path/$name$target{exe_extension} -e " . '\'exit($]<5.0);\'')); + return $fullpath + unless ($name eq "perl" and + system("$fullpath -e " . '\'exit($]<5.0);\'')); } } }