Fix Perl coding error in msvc build system
authorPeter Eisentraut
Thu, 19 Feb 2015 01:24:30 +0000 (20:24 -0500)
committerPeter Eisentraut
Thu, 19 Feb 2015 01:24:30 +0000 (20:24 -0500)
Code like

    open(P, "cl /? 2>&1 |") || die "cl command not found";

does not actually catch any errors, because the exit status of the
command before the pipe is ignored.  The fix is to look at $?.

This also gave the opportunity to clean up the logic of this code a bit.

src/tools/msvc/Solution.pm
src/tools/msvc/VSObjectFactory.pm

index 39e41f673830b921e263e00aba85aca77347162a..714585f3fedc86aa79d330b095aaef19a896b4bb 100644 (file)
@@ -71,17 +71,9 @@ sub DeterminePlatform
    my $self = shift;
 
    # Examine CL help output to determine if we are in 32 or 64-bit mode.
-   $self->{platform} = 'Win32';
-   open(P, "cl /? 2>&1 |") || die "cl command not found";
-   while (

)

-   {
-       if (/^\/favor:<.+AMD64/)
-       {
-           $self->{platform} = 'x64';
-           last;
-       }
-   }
-   close(P);
+   my $output = `cl /? 2>&1`;
+   $? >> 8 == 0 or die "cl command not found";
+   $self->{platform} = ($output =~ /^\/favor:<.+AMD64/m) ? 'x64' : 'Win32';
    print "Detected hardware platform: $self->{platform}\n";
 }
 
index d255becfe8b9751cd0ebe99b990e0cd6a2b9fe38..b83af4026ebf4166134687d5f8eb77407ea6a81d 100644 (file)
@@ -92,30 +92,16 @@ sub CreateProject
 
 sub DetermineVisualStudioVersion
 {
-   my $nmakeVersion = shift;
-
-   if (!defined($nmakeVersion))
-   {
-
-# Determine version of nmake command, to set proper version of visual studio
-# we use nmake as it has existed for a long time and still exists in current visual studio versions
-       open(P, "nmake /? 2>&1 |")
-         || croak
-"Unable to determine Visual Studio version: The nmake command wasn't found.";
-       while (

)

-       {
-           chomp;
-           if (/(\d+)\.(\d+)\.\d+(\.\d+)?$/)
-           {
-               return _GetVisualStudioVersion($1, $2);
-           }
-       }
-       close(P);
-   }
-   elsif ($nmakeVersion =~ /(\d+)\.(\d+)\.\d+(\.\d+)?$/)
+   # To determine version of Visual Studio we use nmake as it has
+   # existed for a long time and still exists in current Visual
+   # Studio versions.
+   my $output = `nmake /? 2>&1`;
+   $? >> 8 == 0 or croak "Unable to determine Visual Studio version: The nmake command wasn't found.";
+   if ($output =~ /(\d+)\.(\d+)\.\d+(\.\d+)?$/m)
    {
        return _GetVisualStudioVersion($1, $2);
    }
+
    croak
 "Unable to determine Visual Studio version: The nmake version could not be determined.";
 }