From bc8940841ef624d6df8ef29cb8cc2c2262e6d6bb Mon Sep 17 00:00:00 2001
From: Fons Rademakers <Fons.Rademakers@cern.ch>
Date: Tue, 18 Apr 2006 10:34:35 +0000
Subject: [PATCH] From Bertrand: port of new xrootd based PROOF infrastructure
 to Windows.

git-svn-id: http://root.cern.ch/svn/root/trunk@14732 27541ba8-7e3a-0410-8455-c3a389f83636
---
 Makefile                       |  3 ++
 config/Makefile.depend         |  2 +-
 netx/Module.mk                 |  4 +++
 proofd/Module.mk               | 65 ++++++++++++++++++++++++++++++++++
 proofd/inc/XrdProofdTrace.h    |  4 +--
 proofd/src/XrdProofConn.cxx    | 19 +++++++++-
 proofd/src/XrdProofPhyConn.cxx | 17 ++++++++-
 proofx/Module.mk               | 12 +++++++
 proofx/inc/LinkDef.h           |  6 ++--
 proofx/src/TXSocket.cxx        | 16 ++++++++-
 win32gdk/src/TGWin32.cxx       |  5 +--
 winnt/src/TWinNTSystem.cxx     | 15 +++++++-
 xrootd/Module.mk               | 59 ++++++++++++++++++++++++++++++
 13 files changed, 216 insertions(+), 11 deletions(-)

diff --git a/Makefile b/Makefile
index 93b9141beeb..be620c26826 100644
--- a/Makefile
+++ b/Makefile
@@ -198,6 +198,9 @@ ifneq ($(ARCH),win32)
 MODULES      += rpdutils rootd proofd
 endif
 ifeq ($(BUILDXRD),yes)
+ifeq ($(ARCH),win32)
+MODULES      += proofd
+endif
 MODULES      += proofx
 endif
 
diff --git a/config/Makefile.depend b/config/Makefile.depend
index e20d6dff64e..591c56ea0f7 100644
--- a/config/Makefile.depend
+++ b/config/Makefile.depend
@@ -52,7 +52,7 @@ PROOFLIBDEP         = $(TREELIB) $(G3DLIB) $(GRAFLIB) $(HISTLIB) \
 PROOFLIBEXTRA       = lib/libTree.lib lib/libGraf3d.lib lib/libGraf.lib \
                       lib/libHist.lib lib/libTreePlayer.lib lib/libThread.lib
 PROOFXLIBDEP        = $(PROOFLIB) $(XPDLIB)
-PROOFXLIBEXTRA      = lib/libProof.lib lib/libXrdProofd
+PROOFXLIBEXTRA      = lib/libProof.lib lib/libXrdProofd.lib
 PROOFGUILIBDEP      = $(PROOFLIB) $(GUILIB)
 PROOFGUILIBEXTRA    = lib/libProof.lib lib/libGui.lib
 PEACLIBDEP          = $(PROOFLIB) $(CLARENSLIB)
diff --git a/netx/Module.mk b/netx/Module.mk
index 3dc45c28219..2f5dc7058d1 100644
--- a/netx/Module.mk
+++ b/netx/Module.mk
@@ -49,8 +49,12 @@ endif
 NETXINCEXTRA := $(XROOTDDIRI:%=-I%)
 
 # Xrootd client libs
+ifeq ($(PLATFORM),win32)
+NETXLIBEXTRA += $(XROOTDDIRL)/libXrdClient.lib
+else
 NETXLIBEXTRA += $(XROOTDDIRL)/libXrdClient.a $(XROOTDDIRL)/libXrdOuc.a \
 		$(XROOTDDIRL)/libXrdNet.a
+endif
 
 ##### local rules #####
 include/%.h:    $(NETXDIRI)/%.h
diff --git a/proofd/Module.mk b/proofd/Module.mk
index a31319ef6c6..cdb66f723b5 100644
--- a/proofd/Module.mk
+++ b/proofd/Module.mk
@@ -11,6 +11,69 @@ PROOFDDIR    := $(MODDIR)
 PROOFDDIRS   := $(PROOFDDIR)/src
 PROOFDDIRI   := $(PROOFDDIR)/inc
 
+ifeq ($(PLATFORM),win32)
+
+##### XrdProofd plugin ####
+XPDH         := $(wildcard $(MODDIRI)/X*.h)
+XPDS         := $(wildcard $(MODDIRS)/X*.cxx)
+XPDO         := $(XPDS:.cxx=.o)
+XPDO         := $(MODDIRS)/XProofProtUtils.o
+
+
+##### Object files used by libProofx #####
+XPCONNH      := $(MODDIRI)/XrdProofConn.h $(MODDIRI)/XrdProofPhyConn.h \
+                $(MODDIRI)/XProofProtUtils.h
+
+XPCONNS      := $(MODDIRS)/XrdProofConn.cxx $(MODDIRS)/XrdProofPhyConn.cxx \
+                $(MODDIRS)/XProofProtUtils.cxx
+
+XPCONNO      := $(MODDIRS)/XrdProofConn.o $(MODDIRS)/XrdProofPhyConn.o \
+                $(MODDIRS)/XProofProtUtils.o
+
+XPDDEP       := $(XPCONNO:.o=.d)
+
+XPDLIB       := $(LPATH)/libXrdProofd.$(SOEXT)
+
+# Extra include paths and libs
+XPDINCEXTRA    := $(XROOTDDIRI:%=-I%)
+XPDINCEXTRA    += $(PROOFDDIRI:%=-I%)
+
+XPDLIBEXTRA += $(XROOTDDIRL)/libXrdClient.lib
+
+# used in the main Makefile
+PROOFDEXEH   := $(MODDIRI)/proofdp.h
+ALLHDRS      += $(patsubst $(MODDIRI)/%.h,include/%.h,$(PROOFDEXEH))
+ALLLIBS      += $(XPDLIB)
+
+# include all dependency files
+INCLUDEFILES += $(XPDDEP)
+
+##### local rules #####
+include/%.h:    $(PROOFDDIRI)/%.h
+		cp $< $@
+
+$(XPDLIB):      $(XPCONNO) $(XPCONNH) $(XRDPLUGINS) $(ORDER_) $(MAINLIBS)
+		@$(MAKELIB) $(PLATFORM) $(LD) "$(LDFLAGS)" \
+		   "$(SOFLAGS)" libXrdProofd.$(SOEXT) $@ "$(XPDO)" \
+		   "$(XPDLIBEXTRA)"
+
+all-proofd:     $(XPDLIB)
+
+clean-proofd:
+		@rm -f $(XPCONNO)
+
+clean::         clean-proofd
+
+distclean-proofd: clean-proofd
+		@rm -f $(XPDDEP) $(XPDLIB)
+
+distclean::     distclean-proofd
+
+##### extra rules ######
+$(XPCONNO): CXXFLAGS += $(XPDINCEXTRA)
+
+else
+
 ##### proofd #####
 PROOFDEXEH   := $(MODDIRI)/proofdp.h
 PROOFDEXES   := $(MODDIRS)/proofd.cxx
@@ -106,3 +169,5 @@ else
 $(XPDO): CXXFLAGS += $(XPDINCEXTRA)
 endif
 endif
+
+endif
diff --git a/proofd/inc/XrdProofdTrace.h b/proofd/inc/XrdProofdTrace.h
index d850f0f387f..1828cedfb19 100644
--- a/proofd/inc/XrdProofdTrace.h
+++ b/proofd/inc/XrdProofdTrace.h
@@ -1,4 +1,4 @@
-// @(#)root/proofd:$Name:  $:$Id: proofdp.h,v 1.4 2003/08/29 10:41:28 rdm Exp $
+// @(#)root/proofd:$Name:  $:$Id: XrdProofdTrace.h,v 1.2 2006/03/01 15:46:33 rdm Exp $
 // Author: G. Ganis  June 2005
 
 /*************************************************************************
@@ -38,7 +38,7 @@
 //#define NODEBUG
 #ifndef NODEBUG
 
-#include <iostream.h>
+#include <Riostream.h>
 #include "XrdOuc/XrdOucTrace.hh"
 
 #define PRINT(x) \
diff --git a/proofd/src/XrdProofConn.cxx b/proofd/src/XrdProofConn.cxx
index 37d20085936..7fa9473bc27 100644
--- a/proofd/src/XrdProofConn.cxx
+++ b/proofd/src/XrdProofConn.cxx
@@ -1,4 +1,4 @@
-// @(#)root/proofd:$Name:  $:$Id: XrdProofConn.cxx,v 1.5 2006/03/16 09:08:08 rdm Exp $
+// @(#)root/proofd:$Name:  $:$Id: XrdProofConn.cxx,v 1.6 2006/03/20 21:24:59 rdm Exp $
 // Author: Gerardo Ganis  12/12/2005
 
 /*************************************************************************
@@ -45,10 +45,12 @@
 #endif
 #endif
 
+#ifndef WIN32
 #include <dlfcn.h>
 #if !defined(__APPLE__)
 #include <link.h>
 #endif
+#endif
 
 // Tracing utils
 #include "XrdProofdTrace.h"
@@ -56,9 +58,14 @@ extern XrdOucTrace *XrdProofdTrace;
 static const char *TraceID = " ";
 #define TRACEID TraceID
 
+#ifndef WIN32
 #include <sys/socket.h>
 #include <sys/types.h>
 #include <pwd.h>
+#else
+#include <process.h>
+#include <Winsock2.h>
+#endif
 
 // Security handle
 typedef XrdSecProtocol *(*XrdSecGetProt_t)(const char *, const struct sockaddr &,
@@ -856,10 +863,18 @@ bool XrdProofConn::Login()
    reqhdr.login.pid = getpid();
 
    // Get username from Url
+#ifndef WIN32
    struct passwd *pw = getpwuid(getuid());
    if (fUser.length() <= 0 && pw)
       // Use local username, if not specified
       fUser = pw->pw_name;
+#else
+   char  name[256];
+   DWORD length = sizeof (name);
+   ::GetUserName(name, &length);
+   if (fUser.length() <= 0 && strlen(name) > 1)
+      fUser = name;
+#endif
    if (fUser.length() >= 0)
       strcpy( (char *)reqhdr.login.username, (char *)(fUser.c_str()) );
    else
@@ -931,9 +946,11 @@ bool XrdProofConn::Login()
             putenv(s);
             // netrc file
             XrdOucString netrc = "/.rootnetrc";
+#ifndef WIN32
             if (pw)
                netrc.insert((char *)(pw->pw_dir),0);
             else
+#endif
                netrc = "";
             if (netrc.length() > 0) {
                s = new char [strlen("XrdSecNETRC")+netrc.length()+2];
diff --git a/proofd/src/XrdProofPhyConn.cxx b/proofd/src/XrdProofPhyConn.cxx
index 807bae7da0e..1e33f981663 100644
--- a/proofd/src/XrdProofPhyConn.cxx
+++ b/proofd/src/XrdProofPhyConn.cxx
@@ -1,4 +1,4 @@
-// @(#)root/proofd:$Name:  $:$Id: XrdProofPhyConn.cxx,v 1.3 2006/03/01 15:46:33 rdm Exp $
+// @(#)root/proofd:$Name:  $:$Id: XrdProofPhyConn.cxx,v 1.4 2006/03/16 09:08:08 rdm Exp $
 // Author: Gerardo Ganis  12/12/2005
 
 /*************************************************************************
@@ -28,9 +28,13 @@
 #include "XrdClient/XrdClientMessage.hh"
 #include "XrdSec/XrdSecInterface.hh"
 
+#ifndef WIN32
 #include <sys/socket.h>
 #include <sys/types.h>
 #include <pwd.h>
+#else
+#include <Winsock2.h>
+#endif
 
 // Tracing utils
 #include "XrdProofdTrace.h"
@@ -68,8 +72,15 @@ bool XrdProofPhyConn::Init(const char *url)
 
    if (!fTcp) {
       // Set some variables
+#ifndef WIN32
       struct passwd *pw = getpwuid(getuid());
       fUser = (pw) ? pw->pw_name : "";
+#else
+      char  name[256];
+      DWORD length = sizeof (name);
+      ::GetUserName(name, &length);
+      fUser = name;
+#endif
       fHost = "localhost";
       fPort = -1;
 
@@ -142,7 +153,11 @@ bool XrdProofPhyConn::Init(const char *url)
 
       // And we wait a bit before retrying
       TRACE(REQ,"XrdProofPhyConn::Init: connection attempt failed: sleep " << timeOut << " secs");
+#ifndef WIN32
       sleep(timeOut);
+#else
+      Sleep(timeOut * 1000);
+#endif
 
    } //for connect try
 
diff --git a/proofx/Module.mk b/proofx/Module.mk
index ebb9d1f3ed2..a161b6ec47a 100644
--- a/proofx/Module.mk
+++ b/proofx/Module.mk
@@ -17,8 +17,15 @@ PROOFXDS     := $(MODDIRS)/G__Proofx.cxx
 PROOFXDO     := $(PROOFXDS:.cxx=.o)
 PROOFXDH     := $(PROOFXDS:.cxx=.h)
 
+ifeq ($(PLATFORM),win32)
+PROOFXH      := $(MODDIRI)/TXProofMgr.h $(MODDIRI)/TXSlave.h \
+                $(MODDIRI)/TXSocket.h $(MODDIRI)/TXSocketHandler.h
+PROOFXS      := $(MODDIRS)/TXProofMgr.cxx $(MODDIRS)/TXSlave.cxx \
+                $(MODDIRS)/TXSocket.cxx $(MODDIRS)/TXSocketHandler.cxx
+else
 PROOFXH      := $(filter-out $(MODDIRI)/LinkDef%,$(wildcard $(MODDIRI)/*.h))
 PROOFXS      := $(filter-out $(MODDIRS)/G__%,$(wildcard $(MODDIRS)/*.cxx))
+endif
 PROOFXO      := $(PROOFXS:.cxx=.o)
 
 PROOFXDEP    := $(PROOFXO:.o=.d) $(PROOFXDO:.o=.d)
@@ -51,8 +58,13 @@ PROOFXINCEXTRA += $(XROOTDDIRI:%=-I%)
 PROOFXINCEXTRA += $(PROOFDDIRI:%=-I%)
 
 # Xrootd client libs
+ifeq ($(PLATFORM),win32)
+PROOFXLIBEXTRA := $(XROOTDDIRL)/libXrdClient.lib
+PROOFXLIBEXTRA += $(ROOTSYS)/lib/libThread.lib $(ROOTSYS)/lib/libProof.lib
+else
 PROOFXLIBEXTRA := $(XROOTDDIRL)/libXrdClient.a $(XROOTDDIRL)/libXrdOuc.a \
 		  $(XROOTDDIRL)/libXrdNet.a
+endif
 
 ##### local rules #####
 include/%.h:    $(PROOFXDIRI)/%.h
diff --git a/proofx/inc/LinkDef.h b/proofx/inc/LinkDef.h
index 937264b0dbe..0eac8bb3750 100644
--- a/proofx/inc/LinkDef.h
+++ b/proofx/inc/LinkDef.h
@@ -1,4 +1,4 @@
-/* @(#)root/netx:$Name:  $:$Id: LinkDef.h,v 1.5 2005/10/27 16:36:38 rdm Exp $ */
+/* @(#)root/netx:$Name:  $:$Id: LinkDef.h,v 1.1 2005/12/12 12:54:27 rdm Exp $ */
 
 /*************************************************************************
  * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers.               *
@@ -15,9 +15,11 @@
 #pragma link off all functions;
 
 #pragma link C++ class TXProofMgr;
-#pragma link C++ class TXProofServ;
 #pragma link C++ class TXSlave;
 #pragma link C++ class TXSocket;
+#ifndef WIN32
+#pragma link C++ class TXProofServ;
 #pragma link C++ class TXUnixSocket;
+#endif
 
 #endif
diff --git a/proofx/src/TXSocket.cxx b/proofx/src/TXSocket.cxx
index c00a4dd660d..11d80ea5c9c 100644
--- a/proofx/src/TXSocket.cxx
+++ b/proofx/src/TXSocket.cxx
@@ -1,4 +1,4 @@
-// @(#)root/proofx:$Name:  $:$Id: TXSocket.cxx,v 1.6 2006/04/07 09:26:19 rdm Exp $
+// @(#)root/proofx:$Name:  $:$Id: TXSocket.cxx,v 1.7 2006/04/17 21:04:17 rdm Exp $
 // Author: Gerardo Ganis  12/12/2005
 
 /*************************************************************************
@@ -38,7 +38,11 @@
 #include "XrdClient/XrdClientLogConnection.hh"
 #include "XrdClient/XrdClientMessage.hh"
 
+#ifndef WIN32
 #include <sys/socket.h>
+#else
+#include <Winsock2.h>
+#endif
 
 // ---- Tracing utils ----------------------------------------------------------
 #include "XrdOuc/XrdOucError.hh"
@@ -48,6 +52,11 @@ XrdOucTrace *XrdProofdTrace = 0;
 static XrdOucLogger eLogger;
 static XrdOucError eDest(0, "Proofx");
 
+#ifdef WIN32
+ULong64_t TSocket::fgBytesSent;
+ULong64_t TSocket::fgBytesRecv;
+#endif
+
 //______________________________________________________________________________
 
 //---- error handling ----------------------------------------------------------
@@ -365,8 +374,13 @@ UnsolRespProcResult TXSocket::ProcessUnsolicitedMsg(XrdClientUnsolMsgSender *,
             // Signal it
             if (gDebug > 3)
                Info("ProcessUnsolicitedMsg","%p: sending SIGURG: %d",this,ilev);
+#ifndef WIN32
             if (kill(fPid, SIGURG) != 0) {
                Error("ProcessUnsolicitedMsg","%d: problems sending kSigUrgent", this);
+#else
+            if(!TerminateProcess((HANDLE)fPid, 0)) {
+               Error("ProcessUnsolicitedMsg","%d: problems calling TerminateProcess()", this);
+#endif
                return rc;
             }
          }
diff --git a/win32gdk/src/TGWin32.cxx b/win32gdk/src/TGWin32.cxx
index 53c985f3d7b..916fbd606d0 100644
--- a/win32gdk/src/TGWin32.cxx
+++ b/win32gdk/src/TGWin32.cxx
@@ -1,4 +1,4 @@
-// @(#)root/win32gdk:$Name:  $:$Id: TGWin32.cxx,v 1.108 2006/02/20 12:02:18 brun Exp $
+// @(#)root/win32gdk:$Name:  $:$Id: TGWin32.cxx,v 1.109 2006/03/28 16:35:00 brun Exp $
 // Author: Rene Brun, Olivier Couet, Fons Rademakers, Bertrand Bellenot 27/11/01
 
 /*************************************************************************
@@ -825,7 +825,8 @@ Bool_t TGWin32::IsCmdThread() const
 {
    // returns kTRUE if we are inside cmd/server thread
 
-   return (::GetCurrentThreadId() == TGWin32ProxyBase::fgMainThreadId);
+//   return (::GetCurrentThreadId() == TGWin32ProxyBase::fgMainThreadId);
+   return kTRUE;
 }
 
 //______________________________________________________________________________
diff --git a/winnt/src/TWinNTSystem.cxx b/winnt/src/TWinNTSystem.cxx
index ff6d16a8882..54b187485cf 100644
--- a/winnt/src/TWinNTSystem.cxx
+++ b/winnt/src/TWinNTSystem.cxx
@@ -1,4 +1,4 @@
-// @(#)root/winnt:$Name:  $:$Id: TWinNTSystem.cxx,v 1.133 2006/03/28 23:59:13 rdm Exp $
+// @(#)root/winnt:$Name:  $:$Id: TWinNTSystem.cxx,v 1.134 2006/03/29 10:29:32 brun Exp $
 // Author: Fons Rademakers   15/09/95
 
 /*************************************************************************
@@ -327,6 +327,19 @@ static int WinNTSelect(TFdSet *readready, TFdSet *writeready, Long_t timeout)
    if (retcode == SOCKET_ERROR) {
       int errcode = ::WSAGetLastError();
 
+      // if file descriptor is not a socket, assume it is the pipe used
+      // by TXSocket
+      if (errcode == WSAENOTSOCK) {
+         struct __stat64 buf;
+         int result = _fstat64( readready->GetFd(0), &buf );
+         if ( result == 0 ) {
+            if (buf.st_size > 0)
+               return 1;
+         }
+         SleepEx(1, TRUE);
+         return 0;
+      }
+
       if ( errcode == WSAEINTR) {
          TSystem::ResetErrno();  // errno is not self reseting
          return -2;
diff --git a/xrootd/Module.mk b/xrootd/Module.mk
index 76bae8abd99..ae9c96f2a40 100644
--- a/xrootd/Module.mk
+++ b/xrootd/Module.mk
@@ -16,31 +16,55 @@ XROOTDSRCS := $(MODDIRS)/$(XROOTDVERS).src.tgz
 XROOTDETAG := $(MODDIRS)/headers.d
 
 ##### Xrootd config options #####
+ifeq ($(PLATFORM),win32)
+ifeq (debug,$(findstring debug,$(ROOTBUILD)))
+XRDDBG      = "Win32 Debug"
+else
+XRDDBG      = "Win32 Release"
+endif
+else
 ifeq (debug,$(findstring debug,$(ROOTBUILD)))
 XRDDBG      = "--build=debug"
 else
 XRDDBG      =
 endif
+endif
 ifeq ($(PLATFORM),macosx)
 XRDSOEXT    = so
 else
 XRDSOEXT    = $(SOEXT)
 endif
+ifeq ($(PLATFORM),win32)
+XRDSOEXT    = lib
+endif
 
 ##### Xrootd executables #####
+ifneq ($(PLATFORM),win32)
 XRDEXEC     = xrootd olbd xrdcp xrdpwdadmin xrdgsiproxy
+else
+XRDEXEC     = xrdcp.exe
+endif
 XRDEXECS   := $(patsubst %,bin/%,$(XRDEXEC))
 
 ##### Xrootd plugins #####
+ifeq ($(PLATFORM),win32)
+XRDPLUGINSA:= $(XROOTDDIRL)/libXrdClient.$(XRDSOEXT)
+XRDPLUGINS := $(XRDPLUGINSA)
+else
 XRDPLUGINSA:= $(XROOTDDIRL)/libXrdSec.$(XRDSOEXT)
 XRDPLUGINS := $(LPATH)/libXrdSec.$(XRDSOEXT)
 ifeq ($(ARCH),win32gcc)
 XRDPLUGINS := $(patsubst $(LPATH)/%.$(XRDSOEXT),bin/%.$(XRDSOEXT),$(XRDPLUGINS))
 endif
+endif
 
 # used in the main Makefile
 ALLLIBS    += $(XRDPLUGINS)
+#ifneq ($(PLATFORM),win32)
 ALLEXECS   += $(XRDEXECS)
+#else
+#ALLEXECS   += $(XRDPLUGINS)
+#endif
 
 ##### local rules #####
 $(XROOTDETAG): $(XROOTDSRCS)
@@ -54,7 +78,27 @@ $(XROOTDETAG): $(XROOTDSRCS)
 		   etag=`basename $(XROOTDETAG)` ; \
 		   touch $$etag ; \
 		fi)
+ifeq ($(PLATFORM),win32)
+		@(if [ -d $(XROOTDDIRD)/pthreads-win32 ]; then \
+		    lsplug=`find $(XROOTDDIRD)/pthreads-win32/lib -name "*.dll"` ; \
+		    for i in $$lsplug ; do \
+		       echo "Copying $$i ..." ; \
+	          cp $$i "$(ROOTSYS)/bin" ; \
+		    done ; \
+		    lsplug=`find $(XROOTDDIRD)/pthreads-win32/lib -name "*.lib"` ; \
+		    for i in $$lsplug ; do \
+		       echo "Copying $$i ..." ; \
+	          cp $$i "$(ROOTSYS)/lib" ; \
+		    done ; \
+		    lsplug=`find $(XROOTDDIRD)/pthreads-win32/include -name "*.h"` ; \
+		    for i in $$lsplug ; do \
+		       echo "Copying $$i ..." ; \
+	          cp $$i "$(ROOTSYS)/include" ; \
+		    done ; \
+		  fi)
+endif
 
+ifneq ($(PLATFORM),win32)
 $(XRDPLUGINS): $(XRDPLUGINSA)
 		@(if [ -d $(XROOTDDIRL) ]; then \
 		    lsplug=`find $(XROOTDDIRL) -name "libXrd*.$(XRDSOEXT)"` ; \
@@ -70,6 +114,7 @@ $(XRDPLUGINS): $(XRDPLUGINSA)
 		       fi; \
 		    done ; \
 		  fi)
+endif
 
 $(XRDEXECS): $(XRDPLUGINSA)
 		@(for i in $(XRDEXEC); do \
@@ -84,6 +129,7 @@ $(XRDEXECS): $(XRDPLUGINSA)
 		     fi ; \
 		  done)
 
+ifneq ($(PLATFORM),win32)
 $(XRDPLUGINSA): $(XROOTDETAG)
 		@(cd $(XROOTDDIRS); \
 		RELE=`uname -r`; \
@@ -127,14 +173,27 @@ $(XRDPLUGINSA): $(XROOTDETAG)
 		   echo "*** Error condition reported by Xrootd-configure (rc = $$rc):" \
 			" building only the client ... " ; \
 		fi)
+else
+$(XRDPLUGINSA): $(XROOTDETAG)
+		@(cd $(XROOTDDIRD); \
+		echo "*** Building xrootd..."; \
+		unset MAKEFLAGS; \
+		nmake -f Makefile.msc CFG=$(XRDDBG))
+endif
 
 all-xrootd:   $(XRDPLUGINS) $(XRDEXECS)
 
 clean-xrootd:
+ifneq ($(PLATFORM),win32)
 		-@(if [ -d $(XROOTDDIRD)/config ]; then \
 			cd $(XROOTDDIRD); \
 			$(MAKE) clean; \
 		fi)
+else
+		@(if [ -d $(XROOTDDIRD) ]; then \
+		   rm -rf $(XROOTDDIRD); \
+		fi;)
+endif
 
 clean::         clean-xrootd
 
-- 
GitLab