On Wed, Nov 13, 2002 at 03:32:52PM -0500, Michael G Schwern wrote:
> Unfortunately, this still leaves the sticky problem of trapping STDERR on
> Win9X.  2>&1 doesn't work.  This does:
> 
>     $val = `"$abs" -e "close STDERR; require $ver"; print "VER_OK\n"`
> 
> but that assumes $abs is actually perl and the program runs and exits
> normally. We might have to go with Ed's idea of duping and closing STDERR
> before running the command, which isn't so bad.

Ok, here's what's gone in.  It should solve both the 2>&1 problem on Win9X
and the C:\Program Files\perl\bin\perl problem, at least in find_perl().
This means MM_Win32->find_perl can go away.

Snapshots on makemaker.org.

Index: lib/ExtUtils/MM_Unix.pm
===================================================================
RCS file: /home/cvs/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm,v
retrieving revision 1.82
retrieving revision 1.83
diff -b -u -r1.82 -r1.83
--- lib/ExtUtils/MM_Unix.pm     13 Nov 2002 11:19:48 -0000      1.82
+++ lib/ExtUtils/MM_Unix.pm     13 Nov 2002 22:03:03 -0000      1.83
@@ -1070,13 +1070,26 @@
 @$dirs
 ";
     }
+
+    my $stderr_duped = 0;
+    if( open(STDERR_COPY, '>&STDERR') ) {
+        $stderr_duped = 1;
+    }
+    else {
+        warn <<WARNING;
+find_perl() can't dup STDERR: $!
+You might see some garbage while we search for Perl
+WARNING
+    }
+
     foreach $name (@$names){
        foreach $dir (@$dirs){
            next unless defined $dir; # $self->{PERL_SRC} may be undefined
            my ($abs, $val);
            if (File::Spec->file_name_is_absolute($name)) { # /foo/bar
                $abs = $name;
-           } elsif (File::Spec->canonpath($name) eq 
File::Spec->canonpath(basename($name))) { # foo
+            } elsif (File::Spec->canonpath($name) eq 
+                     File::Spec->canonpath(basename($name))) {  # foo
                $abs = $self->catfile($dir, $name);
            } else { # foo/bar
                $abs = $self->catfile($Curdir, $name);
@@ -1084,12 +1097,18 @@
            print "Checking $abs\n" if ($trace >= 2);
            next unless $self->maybe_command($abs);
            print "Executing $abs\n" if ($trace >= 2);
-           $val = `$abs -e 'require $ver; print "VER_OK\n" ' 2>&1`;
-           if ($val =~ /VER_OK/) {
+
+            # To avoid using the unportable 2>&1 to supress STDERR,
+            # we close it before running the command.
+            close STDERR if $stderr_duped;
+            $val = `"$abs" -e "require $ver; print qq{VER_OK\n}"`;
+            open STDERR, '>&STDERR_COPY' if $stderr_duped;
+
+            if ($val =~ /^VER_OK/) {
                print "Using PERL=$abs\n" if $trace;
                return $abs;
            } elsif ($trace >= 2) {
-               print "Result: `$val'\n";
+                print "Result: '$val'\n";
            }
        }
     }


-- 

Michael G. Schwern   <[EMAIL PROTECTED]>    http://www.pobox.com/~schwern/
Perl Quality Assurance      <[EMAIL PROTECTED]>         Kwalitee Is Job One
One disease, long life.  No disease, short life.

Reply via email to