Hi all,

attached patch makes scan-build work with Strawberry Perl, ActiveState Perl, cygwin perl and msys perl.
Please review.

updated the patch with proper setup of temporary folder.

--
Anton

Index: tools/scan-build/scan-build
===================================================================
--- tools/scan-build/scan-build	(revision 185134)
+++ tools/scan-build/scan-build	(working copy)
@@ -23,6 +23,15 @@
 use Cwd qw/ getcwd abs_path /;
 use Sys::Hostname;
 
+# portability: convert POSIX cygwin path to MS-DOS style path
+sub portablepath {
+  my $PortablePath = shift @_;
+  $PortablePath =~ s/^\/cygdrive\/(\w)/$1:/o if ($^O =~ /cygwin/);
+  return $PortablePath;
+}
+
+$RealBin = portablepath(Cwd::realpath($RealBin));
+
 my $Verbose = 0;       # Verbose output from this script.
 my $Prog = "scan-build";
 my $BuildName;
@@ -32,9 +41,12 @@
 my $UseColor = (defined $TERM and $TERM =~ 'xterm-.*color' and -t STDOUT
                 and defined $ENV{'SCAN_BUILD_COLOR'});
 
-my $UserName = HtmlEscape(getpwuid($<) || 'unknown');
+# portability: getpwuid is not implemented for Win32 (see Perl language reference, perlport)
+my $UserName = ($^O =~/MSWin32/) ? HtmlEscape(getlogin || 'unknown')
+                                 : HtmlEscape(getpwuid($<) || 'unknown');
 my $HostName = HtmlEscape(hostname() || 'unknown');
-my $CurrentDir = HtmlEscape(getcwd());
+my $CurrentDir = HtmlEscape(portablepath(getcwd()));
+
 my $CurrentDirSuffix = basename($CurrentDir);
 
 my @PluginsToLoad;
@@ -121,8 +133,8 @@
   my $Dir = shift @_;    
   my $TmpMode = 0;
   if (!defined $Dir) {
-    $Dir = $ENV{'TMPDIR'};
-    if (!defined $Dir) { $Dir = "/tmp"; }
+    $Dir = $ENV{'TMPDIR'} || $ENV{'TEMP'} || $ENV{'TMP'} || "/tmp";
+    $Dir = portablepath($Dir);
     $TmpMode = 1;
   }
   
@@ -195,6 +207,7 @@
   else {
     $NewDir = "$Dir/$DateString-$RunNumber";
   }
+print "NewDir = ".$NewDir."\n";
   system 'mkdir','-p',$NewDir;
   return $NewDir;
 }
@@ -369,7 +382,7 @@
       $BugType = $1;
     }
     elsif (/<!-- BUGFILE (.*) -->$/) {
-      $BugFile = abs_path($1);
+      $BugFile = portablepath(abs_path($1));
       UpdatePrefix($BugFile);
     }
     elsif (/<!-- BUGPATHLENGTH (.*) -->$/) {
@@ -410,7 +423,7 @@
 
   my $Dir = shift;
 
-  my $JS = Cwd::realpath("$RealBin/sorttable.js");
+  my $JS = portablepath(Cwd::realpath("$RealBin/sorttable.js"));
   
   DieDiag("Cannot find 'sorttable.js'.\n")
     if (! -r $JS);  
@@ -420,7 +433,7 @@
   DieDiag("Could not copy 'sorttable.js' to '$Dir'.\n")
     if (! -r "$Dir/sorttable.js");
     
-  my $CSS = Cwd::realpath("$RealBin/scanview.css");
+  my $CSS = portablepath(Cwd::realpath("$RealBin/scanview.css"));
   
   DieDiag("Cannot find 'scanview.css'.\n")
     if (! -r $CSS);
@@ -1365,7 +1378,7 @@
     
     # Construct an absolute path.  Uses the current working directory
     # as a base if the original path was not absolute.
-    $HtmlDir = abs_path(shift @ARGV);
+    $HtmlDir = portablepath(abs_path(shift @ARGV));
     
     next;
   }
@@ -1538,9 +1551,9 @@
 
 # Find 'clang'
 if (!defined $AnalyzerDiscoveryMethod) {
-  $Clang = Cwd::realpath("$RealBin/bin/clang");
+  $Clang = portablepath(Cwd::realpath("$RealBin/bin/clang"));
   if (!defined $Clang || ! -x $Clang) {
-    $Clang = Cwd::realpath("$RealBin/clang");
+    $Clang = portablepath(Cwd::realpath("$RealBin/clang"));
   }
   if (!defined $Clang || ! -x $Clang) {
     if (!$RequestDisplayHelp && !$ForceDisplayHelp) {
@@ -1563,7 +1576,7 @@
     }
   }
   else {
-    $Clang = Cwd::realpath($AnalyzerDiscoveryMethod);
+    $Clang = portablepath(Cwd::realpath($AnalyzerDiscoveryMethod));
 	if (!defined $Clang or not -x $Clang) {
    	  DieDiag("Cannot find an executable clang at '$AnalyzerDiscoveryMethod'\n");
 	}
@@ -1599,17 +1612,20 @@
 $HtmlDir = GetHTMLRunDir($HtmlDir);
 
 # Determine the location of ccc-analyzer.
-my $AbsRealBin = Cwd::realpath($RealBin);
+my $AbsRealBin = portablepath(Cwd::realpath($RealBin));
 my $Cmd = "$AbsRealBin/libexec/ccc-analyzer";
 my $CmdCXX = "$AbsRealBin/libexec/c++-analyzer";
 
-if (!defined $Cmd || ! -x $Cmd) {
+# portability: use less strict but portable check -e (file exists) instead of 
+# non-portable -x (file is executable). On some windows ports -x just checks
+# file extension to determine if a file is executable (see Perl language reference, perlport)
+if (!defined $Cmd || ! -e $Cmd) {
   $Cmd = "$AbsRealBin/ccc-analyzer";
-  DieDiag("Executable 'ccc-analyzer' does not exist at '$Cmd'\n") if(! -x $Cmd);
+  DieDiag("'ccc-analyzer' does not exist at '$Cmd'\n") if(! -e $Cmd);
 }
-if (!defined $CmdCXX || ! -x $CmdCXX) {
+if (!defined $CmdCXX || ! -e $CmdCXX) {
   $CmdCXX = "$AbsRealBin/c++-analyzer";
-  DieDiag("Executable 'c++-analyzer' does not exist at '$CmdCXX'\n") if(! -x $CmdCXX);
+  DieDiag("'c++-analyzer' does not exist at '$CmdCXX'\n") if(! -e $CmdCXX);
 }
 
 Diag("Using '$Clang' for static analysis\n");
@@ -1663,7 +1679,7 @@
     if ($ViewResults and -r "$HtmlDir/index.html") {
       Diag "Analysis run complete.\n";
       Diag "Viewing analysis results in '$HtmlDir' using scan-view.\n";
-      my $ScanView = Cwd::realpath("$RealBin/scan-view");
+      my $ScanView = portablepath(Cwd::realpath("$RealBin/scan-view"));
       if (! -x $ScanView) { $ScanView = "scan-view"; }
       exec $ScanView, "$HtmlDir";
     }
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to