Fix Perl coding error in msvc build system
authorPeter Eisentraut <peter_e@gmx.net>
Thu, 19 Feb 2015 01:24:30 +0000 (20:24 -0500)
committerPeter Eisentraut <peter_e@gmx.net>
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 (<P>)
-       {
-               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 (<P>)
-               {
-                       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.";
 }