From b43d5a18e4e18aaf4f0e6b57c56a25b7df285f7b Mon Sep 17 00:00:00 2001
From: Tinny Ng <tng@apache.org>
Date: Fri, 22 Nov 2002 19:11:01 +0000
Subject: [PATCH] Add autodetection of MSVC++ version, and thus determine
 whether VC6 or VC7 project files should be used.   Patch from Robert Buck.

git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@174398 13f79535-47bb-0310-9956-ffa450edef68
---
 scripts/packageBinaries.pl | 244 ++++++++++++++++++++++++++++++-------
 1 file changed, 202 insertions(+), 42 deletions(-)

diff --git a/scripts/packageBinaries.pl b/scripts/packageBinaries.pl
index 645e1651c..4e5998b86 100644
--- a/scripts/packageBinaries.pl
+++ b/scripts/packageBinaries.pl
@@ -417,6 +417,44 @@ if ($platform =~ m/Windows/  || $platform =~ m/CYGWIN/) {
         unlink("$targetdir.zip");
     }
 
+    #
+    # AUTODETECT VISUAL STUDIO VERSION
+    #
+
+    $msc_response= `cl 2>&1`;
+
+    print "$ENV{PATH}\n";
+
+    chomp($msc_response);
+    print "-----------------------\n";
+    print "Detected: $msc_response\n";
+
+    $msc_response =~ /Version *([0-9.]+)/;
+    $msc_full_version = $1;
+    $msc_response =~ /Version *([0-9]+)\./;
+    $msc_major_version = $1;
+    $msc_response =~ /Version *[0-9]+\.([0-9]+)\./;
+    $msc_minor_version = $1;
+
+    print "-----------------------\n";
+    print "msc_full_version  =$msc_full_version\n";
+    print "msc_major_version =$msc_major_version\n";
+    print "msc_minor_version =$msc_minor_version\n";
+    print "-----------------------\n";
+
+    $DevStudioVer = "6.0"; #default
+    $VCBuildDir = "VC6"; #default
+    if ($msc_major_version eq "12") {
+        print "Configuring environment for Visual Studio 6.0\n";
+        $DevStudioVer = "6.0";
+    } elsif ($msc_major_version eq "13") {
+        print "Configuring environment for Visual Studio .NET\n";
+        $DevStudioVer = "7.0";
+        $VCBuildDir = "VC7"; #default
+    }
+    print "DevStudioVer =$DevStudioVer\n";
+    print "VCBuildDir   =$VCBuildDir\n";
+
     # Make the target directory and its main subdirectories
     psystem ("mkdir $targetdir");
     psystem ("mkdir $targetdir/bin");
@@ -427,7 +465,11 @@ if ($platform =~ m/Windows/  || $platform =~ m/CYGWIN/) {
     psystem ("mkdir $targetdir/samples");
     psystem ("mkdir $targetdir/samples/Projects");
     psystem ("mkdir $targetdir/samples/Projects/Win32");
+    if ($DevStudioVer eq "6.0") {
     psystem ("mkdir $targetdir/samples/Projects/Win32/VC6");
+    } elsif ($DevStudioVer eq "7.0") {
+        psystem ("mkdir $targetdir/samples/Projects/Win32/VC7");
+    }
     psystem ("mkdir $targetdir/samples/data");
     psystem ("mkdir $targetdir/samples/SAXCount");
     psystem ("mkdir $targetdir/samples/SAX2Count");
@@ -449,7 +491,11 @@ if ($platform =~ m/Windows/  || $platform =~ m/CYGWIN/) {
     # If 'FileOnly' NetAccessor has been specified, then the project files have to be
     # changed.
     if ($opt_n =~ m/fileonly/i) {
-        changeWindowsProjectForFileOnlyNA("$XERCESCROOT/Projects/Win32/VC6/xerces-all/XercesLib/XercesLib.dsp");
+        if ($DevStudioVer eq "6.0") {
+            changeWindowsProjectForFileOnlyNA("$XERCESCROOT/Projects/Win32/VC6/xerces-all/XercesLib/XercesLib.dsp");
+        } elsif ($DevStudioVer eq "7.0") {
+            changeWindowsProjectForFileOnlyNA_VC7("$XERCESCROOT/Projects/Win32/VC7/xerces-all/XercesLib/XercesLib.vcproj");
+        }
     }
 
 
@@ -464,27 +510,38 @@ if ($platform =~ m/Windows/  || $platform =~ m/CYGWIN/) {
         psystem ("del /s /f *.dep *.ncb *.plg *.opt");
 
         # Make the icu dlls
-        pchdir ("$ICUROOT/source/allinone");
         if (!(length($opt_j) > 0)) {   # Optionally suppress ICU build, to speed up overlong builds while debugging.
-	    #For nt we ship both debug and release dlls
-	    if ($platformname eq "Win64")
-	    {
-                psystem("msdev allinone.dsw /MAKE \"all - $platformname Release\" /USEENV /REBUILD /OUT buildlog.txt");
-            }
-            else
-            {
-                psystem("msdev allinone.dsw /MAKE \"all - $platformname Release\" /REBUILD /OUT buildlog.txt");            	
+            #we ship both debug and release dlls
+            if ($DevStudioVer eq "6.0") {
+                pchdir ("$ICUROOT/source/allinone");
+                if ($platformname eq "Win64")
+                {
+                    psystem("msdev allinone.dsw /MAKE \"all - $platformname Release\" /USEENV /REBUILD /OUT buildlog.txt");
+                }
+                else
+                {
+                    psystem("msdev allinone.dsw /MAKE \"all - $platformname Release\" /REBUILD /OUT buildlog.txt");            	
+                }
+                psystem("cat buildlog.txt");
+                if ($platformname eq "Win64")
+                {
+                    psystem("msdev allinone.dsw /MAKE \"all - $platformname Debug\" /USEENV /REBUILD /OUT buildlog.txt");
+                }
+                else
+                {
+                    psystem("msdev allinone.dsw /MAKE \"all - $platformname Debug\" /REBUILD /OUT buildlog.txt");            	
+                }	
+                psystem("cat buildlog.txt");
+            } elsif ($DevStudioVer eq "7.0") {
+                pchdir ("$ICUROOT/as_is/win32");
+                psystem("unzip msvc7.zip");
+
+                psystem("devenv /rebuild Release /out buildlog.txt /project all allinone.sln");
+                psystem("cat buildlog.txt");
+
+                psystem("devenv /rebuild debug /out buildlog.txt /project all allinone.sln");
+                psystem("cat buildlog.txt");
             }
-	    psystem("cat buildlog.txt");
-	    if ($platformname eq "Win64")
-	    {
-                psystem("msdev allinone.dsw /MAKE \"all - $platformname Debug\" /USEENV /REBUILD /OUT buildlog.txt");
-            }
-            else
-            {
-                psystem("msdev allinone.dsw /MAKE \"all - $platformname Debug\" /REBUILD /OUT buildlog.txt");            	
-            }	
-	    psystem("cat buildlog.txt");
         }
 
         $transcoder = 0;
@@ -499,7 +556,11 @@ if ($platform =~ m/Windows/  || $platform =~ m/CYGWIN/) {
             $msgloader = 1;
         }
 
-        change_windows_project_for_ICU("$XERCESCROOT/Projects/Win32/VC6/xerces-all/XercesLib/XercesLib.dsp", $transcoder , $msgloader);
+        if ($DevStudioVer eq "6.0") {
+            change_windows_project_for_ICU("$XERCESCROOT/Projects/Win32/VC6/xerces-all/XercesLib/XercesLib.dsp", $transcoder , $msgloader);
+        } elsif ($DevStudioVer eq "7.0") {
+            change_windows_project_for_ICU_VC7("$XERCESCROOT/Projects/Win32/VC7/xerces-all/XercesLib/XercesLib.vcproj", $transcoder , $msgloader);
+        }
     }
 
 
@@ -509,28 +570,35 @@ if ($platform =~ m/Windows/  || $platform =~ m/CYGWIN/) {
     psystem ("del /s /f *.dep *.ncb *.plg *.opt");
 
     # Make all files in the Xerces-C system including libraries, samples and tests
-    pchdir ("$XERCESCROOT/Projects/Win32/VC6/xerces-all");
-    if ($platformname eq "Win64")
-    {
-        psystem( "msdev xerces-all.dsw /MAKE \"all - $platformname $buildmode\" /USEENV /REBUILD /OUT buildlog.txt");
+    pchdir ("$XERCESCROOT/Projects/Win32/$VCBuildDir/xerces-all");
+    if ($DevStudioVer eq "6.0") {
+        if ($platformname eq "Win64")
+        {
+            psystem( "msdev xerces-all.dsw /MAKE \"all - $platformname $buildmode\" /USEENV /REBUILD /OUT buildlog.txt");
+        }
+        else
+        {
+            psystem( "msdev xerces-all.dsw /MAKE \"all - $platformname $buildmode\" /REBUILD /OUT buildlog.txt");
+        }	
+    } elsif ($DevStudioVer eq "7.0") {
+        psystem( "devenv /rebuild Release /out buildlog.txt /project all xerces-all.sln");
     }
-    else
-    {
-        psystem( "msdev xerces-all.dsw /MAKE \"all - $platformname $buildmode\" /REBUILD /OUT buildlog.txt");
-    }	
-
     system("cat buildlog.txt");
 
     # Build the debug xerces dll.  Both debug and release DLLs
     #   are in the standard binary distribution of Xerces.
     if ($buildmode ne "Debug") {
-        if ($platformname eq "Win64")
-        {
-            psystem("msdev xerces-all.dsw /MAKE \"XercesLib - $platformname Debug\" /USEENV /REBUILD /OUT buildlog.txt");
-        }
-        else
-        {
-            psystem("msdev xerces-all.dsw /MAKE \"XercesLib - $platformname Debug\" /REBUILD /OUT buildlog.txt");        	
+        if ($DevStudioVer eq "6.0") {
+            if ($platformname eq "Win64")
+            {
+                psystem("msdev xerces-all.dsw /MAKE \"XercesLib - $platformname Debug\" /USEENV /REBUILD /OUT buildlog.txt");
+            }
+            else
+            {
+                psystem("msdev xerces-all.dsw /MAKE \"XercesLib - $platformname Debug\" /REBUILD /OUT buildlog.txt");        	
+            }
+        } elsif ($DevStudioVer eq "7.0") {
+            psystem( "devenv /rebuild debug /out buildlog.txt /project XercesLib xerces-all.sln");
         }
         system("cat buildlog.txt");
     }
@@ -544,7 +612,7 @@ if ($platform =~ m/Windows/  || $platform =~ m/CYGWIN/) {
 
     # Decide where you want the build copied from
     pchdir ($targetdir);
-    $BUILDDIR = $XERCESCROOT . "/Build/Win32/VC6/" . $buildmode;
+    $BUILDDIR = $XERCESCROOT . "/Build/Win32/$VCBuildDir/" . $buildmode;
     print "\nBuild is being copied from \'" . $BUILDDIR . "\'";
 
     # Populate the include output directory
@@ -650,7 +718,7 @@ if ($platform =~ m/Windows/  || $platform =~ m/CYGWIN/) {
     }
     psystem("cp -fv $BUILDDIR/xerces-c_*.lib $targetdir/lib");
     if ($buildmode ne "Debug") {
-        $DEBUGBUILDDIR = "$XERCESCROOT/Build/Win32/VC6/Debug";
+        $DEBUGBUILDDIR = "$XERCESCROOT/Build/Win32/$VCBuildDir/Debug";
         psystem("cp -fv $DEBUGBUILDDIR/xerces-c_*D.lib $targetdir/lib");
         psystem("cp -fv $DEBUGBUILDDIR/xerces-c*D.dll $targetdir/bin");
     }
@@ -658,13 +726,13 @@ if ($platform =~ m/Windows/  || $platform =~ m/CYGWIN/) {
 
     # Populate the etc output directory like config.status and the map file
     print ("\n\nCopying misc output to etc ...\n");
-    psystem("cp -fv $XERCESCROOT/Build/Win32/VC6/Release/obj/*.map $targetdir/etc");
+    psystem("cp -fv $XERCESCROOT/Build/Win32/$VCBuildDir/Release/obj/*.map $targetdir/etc");
 
 
     # Populate the samples directory
     print ("\n\nCopying sample files ...\n");
     psystem("cp $XERCESCROOT/version.incl $targetdir");
-    psystem("cp -Rfv $XERCESCROOT/samples/Projects/Win32/VC6/* $targetdir/samples/Projects/Win32/VC6");
+    psystem("cp -Rfv $XERCESCROOT/samples/Projects/Win32/$VCBuildDir/* $targetdir/samples/Projects/Win32/$VCBuildDir");
 
     psystem("cp -Rfv $XERCESCROOT/samples/SAXCount/* $targetdir/samples/SAXCount");
     psystem("rm -f $targetdir/samples/SAXCount/Makefile");
@@ -1367,6 +1435,45 @@ sub change_windows_makefile_for_ICU() {
     unlink ($thefiledotbak);
 }
 
+sub change_windows_project_for_ICU_VC7() {
+    my ($thefile, $transcoder, $msgloader) = @_;
+    print "\nConverting Windows Xerces library project ($thefile) for ICU usage...";
+    my $thefiledotbak = $thefile . ".bak";
+    rename ($thefile, $thefiledotbak);
+
+    open (FIZZLE, $thefiledotbak);
+    open (FIZZLEOUT, ">$thefile");
+    while ($line = <FIZZLE>) {
+        if ($line =~ /Release\|Win32/) {
+            $icuuc = "icuucd";
+            }
+        if ($line =~ /Debug\|Win32/) {
+            $icuuc = "icuuc";
+            }
+        $line =~ s/AdditionalIncludeDirectories=\"([^"]*)/AdditionalIncludeDirectories=\"$ICUROOT\\include;$1/;
+        $line =~ s/AdditionalLibraryDirectories=\"([^"]*)/AdditionalLibraryDirectories=\"$ICUROOT\\lib;$ICUROOT\\source\\data;$1/;
+        $line =~ s/AdditionalDependencies=\"([^"]*)/AdditionalDependencies=\"$icuuc.lib icudata.lib $1/;
+
+        if ($transcoder) {
+            $line =~ s/XML_USE_WIN32_TRANSCODER/XML_USE_ICU_TRANSCODER/g;
+            $line =~ s/Transcoders\\Win32\\Win32TransService.cpp/Transcoders\\ICU\\ICUTransService.cpp/g;
+            $line =~ s/Transcoders\\Win32\\Win32TransService.hpp/Transcoders\\ICU\\ICUTransService.hpp/g;
+        }
+
+        if ($msgloader)
+        {
+            $line =~ s/XML_USE_WIN32_MSGLOADER/XML_USE_ICU_MESSAGELOADER/g;
+            $line =~ s/MsgLoaders\\Win32\\Win32MsgLoader/MsgLoaders\\ICU\\ICUMsgLoader/g;
+            $line =~ s/Win32MsgLoader/ICUMsgLoader/g;
+        }
+
+        print FIZZLEOUT $line;
+    }
+    close (FIZZLEOUT);
+    close (FIZZLE);
+    unlink ($thefiledotbak);
+}
+
 #
 # This subroutine is used to munge the XercesLib project file to remove all
 # traces of WinSock based NetAccessor. Once no NetAccessor is specified, the
@@ -1411,7 +1518,60 @@ sub changeWindowsProjectForFileOnlyNA() {
         # From the remaining lines, remove any references to the #defines and
         # the WinSock library.
         $aline =~ s/\/D \"XML_USE_NETACCESSOR_WINSOCK\" //g;  # "
-        $aline =~ s/wsock32.lib //g;
+        if ($aline =~ /( )+ws2_32.lib( )*\"/) { # end of line
+          $aline =~ s/( )+ws2_32.lib( )*\"/\"/g;
+        } else { # beginning or middle of line
+          $aline =~ s/ws2_32.lib( )*//g;
+        }
+
+        print PROJFILEOUT $aline;
+    }
+    close (PROJFILEOUT);
+    close (PROJFILEIN);
+    unlink ($thefiledotbak);
+}
+
+sub changeWindowsProjectForFileOnlyNA_VC7() {
+    my ($thefile) = @_;
+    print "\nConfiguring Xerces library project ($thefile) for FileOnly NetAccessor...\n";
+    my $thefiledotbak = $thefile . ".bak";
+    rename ($thefile, $thefiledotbak);
+
+    open (PROJFILEIN, $thefiledotbak);
+    open (PROJFILEOUT, ">$thefile");
+
+    while ($aline = <PROJFILEIN>) {
+        # By skipping over lines between the NetAccessors group
+        # we can references to the WinSock based NetAccessor files.
+        if ($aline =~ m/^# Begin Group \"NetAccessors\"/g) {
+            # ...found it. Write out the line as a place holder. Also...
+            print PROJFILEOUT $aline;
+            # ...preserve the next two lines.
+            $aline = <PROJFILEIN>;
+            print PROJFILEOUT $aline;
+            $aline = <PROJFILEIN>;
+            print PROJFILEOUT $aline;
+            # Skip over the lines till you hit the WinSock NetAccessor 'End Group'.
+            while ($aline = <PROJFILEIN>) { # read the next line
+                last if ($aline =~ m/^# End Group/g);
+            }
+            # We need to preserve the 'End Group' line. The last statement of the
+            # enclosing while loop prints it out.
+        }
+
+        # From the remaining lines, remove any references to the #defines and
+        # the WinSock library.
+        if ($aline =~ /\;XML_USE_NETACCESSOR_WINSOCK/) { # end or middle of line
+          $aline =~ s/\;XML_USE_NETACCESSOR_WINSOCK//g;
+        } else { # beginning of line
+          $aline =~ s/\XML_USE_NETACCESSOR_WINSOCK\;*//g;
+        }
+
+        if ($aline =~ /\s+ws2_32\.lib\s*\"/) { # end of line
+          $aline =~ s/\s+ws2_32\.lib\s*\"/\"/g;
+        } else { # beginning or middle of line
+          $aline =~ s/ws2_32\.lib\s*//g;
+        }
 
         print PROJFILEOUT $aline;
     }
-- 
GitLab