applied somewhat modified version of suggested patch
[p5sagit/p5-mst-13.2.git] / win32 / makefile.mk
index 20ff03f..5b518c2 100644 (file)
@@ -18,7 +18,7 @@
 ##
 
 #
-# Set these to wherever you want "nmake install" to put your
+# Set these to wherever you want "dmake install" to put your
 # newly built perl.
 #
 INST_DRV       *= c:
@@ -33,7 +33,7 @@ INST_TOP      *= $(INST_DRV)\perl
 # versioned installation can be obtained by setting INST_TOP above to a
 # path that includes an arbitrary version string.
 #
-INST_VER       *= \5.00557
+INST_VER       *= \5.00563
 
 #
 # Comment this out if you DON'T want your perl installation to have
@@ -70,6 +70,21 @@ INST_ARCH    *= \$(ARCHNAME)
 #USE_OBJECT    *= define
 
 #
+# XXX WARNING! This option currently undergoing changes.  May be broken.
+#
+# Beginnings of interpreter cloning/threads: still rather rough, fails
+# tests.  This should be enabled to get the fork() emulation.  Do not
+# enable unless you know what you're doing!
+#
+USE_ITHREADS   *= define
+
+#
+# uncomment to enable the implicit "host" layer for all system calls
+# made by perl.  This is needed and auto-enabled by USE_OBJECT above.
+#
+USE_IMP_SYS    *= define
+
+#
 # uncomment exactly one of the following
 # 
 # Visual C++ 2.x
@@ -84,6 +99,11 @@ CCTYPE               *= BORLAND
 #CCTYPE                *= GCC
 
 #
+# uncomment this if you are compiling under Windows 95/98 and command.com
+# (not needed if you're running under 4DOS/NT 6.01 or later)
+#IS_WIN95      *= define
+
+#
 # uncomment next line if you want debug version of perl (big,slow)
 # If not enabled, we automatically try to use maximum optimization
 # with all compilers that are known to have a working optimizer.
@@ -91,9 +111,10 @@ CCTYPE              *= BORLAND
 #CFG           *= Debug
 
 #
-# uncomment to enable use of PerlCRT.DLL when using the Visual C compiler.
-# Highly recommended.  It has patches that fix known bugs in MSVCRT.DLL.
-# This currently requires VC 5.0 with Service Pack 3 or later.
+# uncomment to enable use of PerlCRT.DLL when using the Visual C compiler
+# or GCC/Mingw32. Highly recommended. It has patches that fix known bugs in 
+# MSVCRT.DLL. This currently requires VC 5.0 with Service Pack 3 or later
+# or GCC/Mingw32.
 # Get it from CPAN at http://www.perl.com/CPAN/authors/id/D/DO/DOUGL/
 # and follow the directions in the package to install.
 #
@@ -156,6 +177,14 @@ CCLIBDIR   *= $(CCHOME)\lib
 #BUILDOPT      += -DPERL_POLLUTE
 
 #
+# enable this to disable the File::Glob implementation of CORE::glob
+#
+#BUILDOPT      += -DPERL_EXTERNAL_GLOB
+
+# Enabling this runs a cloned toplevel interpreter (fails tests)
+#BUILDOPT      += -DTOP_CLONE
+
+#
 # specify semicolon-separated list of extra directories that modules will
 # look for libraries (spaces in path names need not be quoted)
 #
@@ -190,18 +219,33 @@ CRYPT_FLAG        = -DHAVE_DES_FCRYPT
 PERL_MALLOC    != undef
 USE_THREADS    != undef
 USE_MULTI      != undef
+USE_IMP_SYS    != define
 .ENDIF
 
 PERL_MALLOC    *= undef
 
 USE_THREADS    *= undef
+
+.IF "$(USE_THREADS)" == "define"
+USE_ITHREADS   != undef
+.ENDIF
+
 USE_MULTI      *= undef
 USE_OBJECT     *= undef
+USE_ITHREADS   *= undef
+USE_IMP_SYS    *= undef
 
 .IF "$(USE_MULTI)$(USE_THREADS)$(USE_OBJECT)" != "undefundefundef"
 BUILDOPT       += -DPERL_IMPLICIT_CONTEXT
 .ENDIF
 
+.IF "$(USE_ITHREADS)" != "undef"
+BUILDOPT       += -DUSE_ITHREADS
+.ENDIF
+
+.IF "$(USE_IMP_SYS)" != "undef"
+BUILDOPT       += -DPERL_IMPLICIT_SYS
+.ENDIF
 
 .IMPORT .IGNORE : PROCESSOR_ARCHITECTURE
 
@@ -229,8 +273,22 @@ DELAYLOAD  *= -DELAYLOAD:wsock32.dll delayimp.lib
 CFG            *= Optimize
 .ENDIF
 
+ARCHDIR                = ..\lib\$(ARCHNAME)
 COREDIR                = ..\lib\CORE
 AUTODIR                = ..\lib\auto
+LIBDIR         = ..\lib
+EXTDIR         = ..\ext
+PODDIR         = ..\pod
+EXTUTILSDIR    = $(LIBDIR)\ExtUtils
+
+#
+INST_SCRIPT    = $(INST_TOP)$(INST_VER)\bin
+INST_BIN       = $(INST_SCRIPT)$(INST_ARCH)
+INST_LIB       = $(INST_TOP)$(INST_VER)\lib
+INST_ARCHLIB   = $(INST_LIB)$(INST_ARCH)
+INST_COREDIR   = $(INST_ARCHLIB)\CORE
+INST_POD       = $(INST_LIB)\pod
+INST_HTML      = $(INST_POD)\html
 
 #
 # Programs to compile, build .lib files and link
@@ -269,7 +327,7 @@ LINK_DBG    =
 
 CFLAGS         = -w -g0 -tWM -tWD $(INCLUDES) $(DEFINES) $(LOCDEFS) \
                $(PCHFLAGS) $(OPTIMIZE)
-LINK_FLAGS     = $(LINK_DBG) -L"$(CCLIBDIR)"
+LINK_FLAGS     = $(LINK_DBG) -L"$(INST_COREDIR)" -L"$(CCLIBDIR)"
 OBJOUT_FLAG    = -o
 EXEOUT_FLAG    = -e
 LIBOUT_FLAG    = 
@@ -287,19 +345,34 @@ a = .a
 #
 # Options
 #
-RUNTIME                =
+
+# GCC headers need to know that we're using MSVCRT (or a clone thereof)
+RUNTIME                = -D__MSVCRT__
 INCLUDES       = -I$(COREDIR) -I.\include -I. -I..
 DEFINES                = -DWIN32 $(CRYPT_FLAG)
 LOCDEFS                = -DPERLDLL -DPERL_CORE
 SUBSYS         = console
 CXX_FLAG       = -xc++
 
-LIBC           = -lcrtdll
-LIBFILES       = $(CRYPT_LIB) -ladvapi32 -luser32 -lnetapi32 -lwsock32 \
-               -lmingw32 -lgcc -lmoldname $(LIBC) -lkernel32
+.IF "$(USE_PERLCRT)" == ""
+LIBCDLL        = msvcrt.dll
+CRTIMPLIBS     = $(OLDNAMES_A)
+.ELSE
+LIBCDLL        = PerlCRT.dll
+CRTIMPLIBS     = $(PERLCRT_A) $(OLDNAMES_A)
+.ENDIF
+
+LIBC           = -l$(LIBCDLL:s/.dll//)
+GCCLIBS                = -lmingw32 -lgcc
+
+# same libs as MSVC, but no -luuid32 or -lodbccp32 yet
+LIBFILES       =  $(GCCLIBS) $(CRYPT_LIB) $(LIBC) -loldnames -lkernel32 \
+               -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 \
+               -lole32 -loleaut32 -lnetapi32 -lwsock32 -lmpr -lwinmm \
+               -lversion -lodbc32
 
 .IF  "$(CFG)" == "Debug"
-OPTIMIZE       = -g -O2 $(RUNTIME) -DDEBUGGING
+OPTIMIZE       = -g $(RUNTIME) -DDEBUGGING
 LINK_DBG       = -g
 .ELSE
 OPTIMIZE       = -g -O2 $(RUNTIME)
@@ -307,15 +380,18 @@ LINK_DBG  =
 .ENDIF
 
 CFLAGS         = $(INCLUDES) $(DEFINES) $(LOCDEFS) $(OPTIMIZE)
-LINK_FLAGS     = $(LINK_DBG) -L"$(CCLIBDIR)"
+LINK_FLAGS     = $(LINK_DBG) -L"$(INST_COREDIR)" -L"$(CCLIBDIR)"
 OBJOUT_FLAG    = -o
 EXEOUT_FLAG    = -o
 LIBOUT_FLAG    = 
 
+# tack COREDIR on for perl build
+PRIV_LINK_FLAGS = -L"$(COREDIR)"
+
 .ELSE
 
-CC             = cl.exe
-LINK32         = link.exe
+CC             = cl
+LINK32         = link
 LIB32          = $(LINK32) -lib
 
 #
@@ -371,15 +447,17 @@ LINK_DBG  = -release
 LIBBASEFILES   = $(DELAYLOAD) $(CRYPT_LIB) \
                oldnames.lib kernel32.lib user32.lib gdi32.lib \
                winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib \
-               oleaut32.lib netapi32.lib uuid.lib wsock32.lib mpr.lib winmm.lib \
-               version.lib odbc32.lib odbccp32.lib
+               oleaut32.lib netapi32.lib uuid.lib wsock32.lib mpr.lib \
+               winmm.lib version.lib odbc32.lib odbccp32.lib
 
 # we add LIBC here, since we may be using PerlCRT.dll
 LIBFILES       = $(LIBBASEFILES) $(LIBC)
 
 CFLAGS         = -nologo -Gf -W3 $(INCLUDES) $(DEFINES) $(LOCDEFS) \
                $(PCHFLAGS) $(OPTIMIZE)
-LINK_FLAGS     = -nologo -nodefaultlib $(LINK_DBG) -machine:$(PROCESSOR_ARCHITECTURE)
+LINK_FLAGS     = -nologo -nodefaultlib $(LINK_DBG) \
+               -libpath:"$(INST_COREDIR)" \
+               -machine:$(PROCESSOR_ARCHITECTURE)
 OBJOUT_FLAG    = -Fo
 EXEOUT_FLAG    = -Fe
 LIBOUT_FLAG    = /out:
@@ -391,8 +469,19 @@ OPTIMIZE   += $(CXX_FLAG)
 BUILDOPT       += -DPERL_OBJECT
 .ENDIF
 
+CRTIMPLIBS     *= __not_needed
+PERLCRT_A      *= $(COREDIR)\libPerlCRT.a
+PERLCRT_DEF    *= PerlCRT.def
+OLDNAMES_A     *= $(COREDIR)\liboldnames.a
+OLDNAMES_DEF   *= oldnames.def
+
 CFLAGS_O       = $(CFLAGS) $(BUILDOPT)
 
+# used to allow local linking flags that are not propogated into Config.pm
+#   -- BKS, 11-15-1999
+PRIV_LINK_FLAGS        *=
+BLINK_FLAGS    = $(PRIV_LINK_FLAGS) $(LINK_FLAGS)
+
 #################### do not edit below this line #######################
 ############# NO USER-SERVICEABLE PARTS BEYOND THIS POINT ##############
 
@@ -416,32 +505,22 @@ LKPOST            = )
 
 $(o).dll:
 .IF "$(CCTYPE)" == "BORLAND"
-       $(LINK32) -Tpd -ap $(LINK_FLAGS) c0d32$(o) $<,$@,,$(LIBFILES),$(*B).def
+       $(LINK32) -Tpd -ap $(BLINK_FLAGS) c0d32$(o) $<,$@,,$(LIBFILES),$(*B).def
        $(IMPLIB) $(*B).lib $@
 .ELIF "$(CCTYPE)" == "GCC"
-       $(LINK32) -o $@ $(LINK_FLAGS) $< $(LIBFILES)
+       $(LINK32) -o $@ $(BLINK_FLAGS) $< $(LIBFILES)
        $(IMPLIB) -def $(*B).def $(*B).a $@
 .ELSE
        $(LINK32) -dll -subsystem:windows -implib:$(*B).lib -def:$(*B).def \
-           -out:$@ $(LINK_FLAGS) $(LIBFILES) $< $(LIBPERL)  
+           -out:$@ $(BLINK_FLAGS) $(LIBFILES) $< $(LIBPERL)  
 .ENDIF
 
 #
-INST_BIN       = $(INST_TOP)$(INST_VER)\bin$(INST_ARCH)
-INST_SCRIPT    = $(INST_TOP)$(INST_VER)\bin
-INST_LIB       = $(INST_TOP)$(INST_VER)\lib
-INST_POD       = $(INST_LIB)\pod
-INST_HTML      = $(INST_POD)\html
-LIBDIR         = ..\lib
-EXTDIR         = ..\ext
-PODDIR         = ..\pod
-EXTUTILSDIR    = $(LIBDIR)\extutils
-
-#
 # various targets
 MINIPERL       = ..\miniperl.exe
 MINIDIR                = .\mini
 PERLEXE                = ..\perl.exe
+WPERLEXE       = ..\wperl.exe
 GLOBEXE                = ..\perlglob.exe
 CONFIGPM       = ..\lib\Config.pm
 MINIMOD                = ..\lib\ExtUtils\Miniperl.pm
@@ -453,12 +532,12 @@ GLOBBAT           = bin\perlglob.bat
 UTILS          =                       \
                ..\utils\h2ph           \
                ..\utils\splain         \
+               ..\utils\dprofpp        \
                ..\utils\perlbug        \
                ..\utils\pl2pm          \
                ..\utils\c2ph           \
                ..\utils\h2xs           \
                ..\utils\perldoc        \
-               ..\utils\pstruct        \
                ..\utils\perlcc         \
                ..\pod\checkpods        \
                ..\pod\pod2html         \
@@ -501,8 +580,8 @@ PERL95EXE   = ..\perl95.exe
 .ENDIF
 
 .IF "$(USE_OBJECT)" == "define"
-PERLIMPLIB     *= ..\perlcore$(a)
-PERLDLL                = ..\perlcore.dll
+PERLIMPLIB     *= ..\perl56$(a)
+PERLDLL                = ..\perl56.dll
 .ELSE
 PERLIMPLIB     *= ..\perl$(a)
 PERLDLL                = ..\perl.dll
@@ -545,7 +624,8 @@ MICROCORE_SRC       =               \
                ..\toke.c       \
                ..\universal.c  \
                ..\utf8.c       \
-               ..\util.c
+               ..\util.c       \
+               ..\xsutils.c
 
 EXTRACORE_SRC  += perllib.c
 
@@ -616,7 +696,7 @@ CORE_NOCFG_H        =               \
                ..\unixish.h    \
                ..\utf8.h       \
                ..\util.h       \
-               ..\warning.h    \
+               ..\warnings.h   \
                ..\XSUB.h       \
                ..\EXTERN.h     \
                ..\perlvars.h   \
@@ -625,7 +705,10 @@ CORE_NOCFG_H       =               \
                .\include\dirent.h      \
                .\include\netdb.h       \
                .\include\sys\socket.h  \
-               .\win32.h
+               .\win32.h       \
+               .\perlhost.h    \
+               .\vdir.h        \
+               .\vmem.h
 
 CORE_H         = $(CORE_NOCFG_H) .\config.h
 
@@ -642,6 +725,12 @@ X2P_OBJ            = $(X2P_SRC:db:+$(o))
 PERLDLL_OBJ    = $(CORE_OBJ)
 PERLEXE_OBJ    = perlmain$(o)
 
+.IF "$(CCTYPE)" == "GCC"
+PERLEXE_OBJ    += .\gcrt0$(o)
+MINI_OBJ       += $(MINIDIR)\gcrt0$(o)
+DLL_OBJ                += .\gdllcrt0$(o)
+.ENDIF
+
 PERLDLL_OBJ    += $(WIN32_OBJ) $(DLL_OBJ)
 
 .IF "$(USE_SETARGV)" != ""
@@ -649,7 +738,7 @@ SETARGV_OBJ = setargv$(o)
 .ENDIF
 
 DYNAMIC_EXT    = Socket IO Fcntl Opcode SDBM_File POSIX attrs Thread B re \
-               Data/Dumper Devel/Peek ByteLoader
+               Data/Dumper Devel/Peek ByteLoader Devel/DProf File/Glob
 STATIC_EXT     = DynaLoader
 NONXS_EXT      = Errno
 
@@ -668,6 +757,8 @@ DUMPER              = $(EXTDIR)\Data\Dumper\Dumper
 ERRNO          = $(EXTDIR)\Errno\Errno
 PEEK           = $(EXTDIR)\Devel\Peek\Peek
 BYTELOADER     = $(EXTDIR)\ByteLoader\ByteLoader
+DPROF          = $(EXTDIR)\Devel\DProf\DProf
+GLOB           = $(EXTDIR)\File\Glob\Glob
 
 SOCKET_DLL     = $(AUTODIR)\Socket\Socket.dll
 FCNTL_DLL      = $(AUTODIR)\Fcntl\Fcntl.dll
@@ -682,6 +773,8 @@ DUMPER_DLL  = $(AUTODIR)\Data\Dumper\Dumper.dll
 PEEK_DLL       = $(AUTODIR)\Devel\Peek\Peek.dll
 RE_DLL         = $(AUTODIR)\re\re.dll
 BYTELOADER_DLL = $(AUTODIR)\ByteLoader\ByteLoader.dll
+DPROF_DLL      = $(AUTODIR)\Devel\DProf\DProf.dll
+GLOB_DLL       = $(AUTODIR)\File\Glob\Glob.dll
 
 ERRNO_PM       = $(LIBDIR)\Errno.pm
 
@@ -698,7 +791,9 @@ EXTENSION_C =               \
                $(DUMPER).c     \
                $(PEEK).c       \
                $(B).c          \
-               $(BYTELOADER).c
+               $(BYTELOADER).c \
+               $(DPROF).c      \
+               $(GLOB).c
 
 EXTENSION_DLL  =               \
                $(SOCKET_DLL)   \
@@ -713,7 +808,9 @@ EXTENSION_DLL       =               \
                $(B_DLL)        \
                $(RE_DLL)       \
                $(THREAD_DLL)   \
-               $(BYTELOADER_DLL)
+               $(BYTELOADER_DLL)       \
+               $(DPROF_DLL)    \
+               $(GLOB_DLL)
 
 EXTENSION_PM   =               \
                $(ERRNO_PM)
@@ -723,53 +820,146 @@ POD2MAN          = $(PODDIR)\pod2man
 POD2LATEX      = $(PODDIR)\pod2latex
 POD2TEXT       = $(PODDIR)\pod2text
 
+# vars must be separated by "\t+~\t+", since we're using the tempfile
+# version of config_sh.pl (we were overflowing someone's buffer by
+# trying to fit them all on the command line)
+#      -- BKS 10-17-1999
 CFG_VARS       =                                       \
-               "INST_DRV=$(INST_DRV)"                  \
-               "INST_TOP=$(INST_TOP)"                  \
-               "INST_VER=$(INST_VER)"                  \
-               "INST_ARCH=$(INST_ARCH)"                \
-               "archname=$(ARCHNAME)"                  \
-               "cc=$(CC)"                              \
-               "ccflags=$(OPTIMIZE:s/"/\"/) $(DEFINES) $(BUILDOPT)"    \
-               "cf_email=$(EMAIL)"                     \
-               "d_crypt=$(D_CRYPT)"                    \
-               "d_mymalloc=$(PERL_MALLOC)"             \
-               "libs=$(LIBFILES:f)"                    \
-               "incpath=$(CCINCDIR:s/"/\"/)"           \
-               "libperl=$(PERLIMPLIB:f)"               \
-               "libpth=$(CCLIBDIR:s/"/\"/);$(EXTRALIBDIRS:s/"/\"/)"    \
-               "libc=$(LIBC)"                          \
-               "make=dmake"                            \
-               "_o=$(o)" "obj_ext=$(o)"                \
-               "_a=$(a)" "lib_ext=$(a)"                \
-               "static_ext=$(STATIC_EXT)"              \
-               "dynamic_ext=$(DYNAMIC_EXT)"            \
-               "nonxs_ext=$(NONXS_EXT)"                \
-               "usethreads=$(USE_THREADS)"             \
-               "usemultiplicity=$(USE_MULTI)"          \
-               "LINK_FLAGS=$(LINK_FLAGS:s/"/\"/)"              \
-               "optimize=$(OPTIMIZE:s/"/\"/)"
+               INST_DRV=$(INST_DRV)            ~       \
+               INST_TOP=$(INST_TOP)            ~       \
+               INST_VER=$(INST_VER:s/\/\\/)    ~       \
+               INST_ARCH=$(INST_ARCH)          ~       \
+               archname=$(ARCHNAME)            ~       \
+               cc=$(CC)                        ~       \
+               ccflags=$(OPTIMIZE) $(DEFINES) $(BUILDOPT)      ~       \
+               cf_email=$(EMAIL)               ~       \
+               d_crypt=$(D_CRYPT)              ~       \
+               d_mymalloc=$(PERL_MALLOC)       ~       \
+               libs=$(LIBFILES:f)              ~       \
+               incpath=$(CCINCDIR)             ~       \
+               libperl=$(PERLIMPLIB:f)         ~       \
+               libpth=$(CCLIBDIR);$(EXTRALIBDIRS)              ~       \
+               libc=$(LIBC)                    ~       \
+               make=dmake                      ~       \
+               _o=$(o) obj_ext=$(o)            ~       \
+               _a=$(a) lib_ext=$(a)            ~       \
+               static_ext=$(STATIC_EXT)        ~       \
+               dynamic_ext=$(DYNAMIC_EXT)      ~       \
+               nonxs_ext=$(NONXS_EXT)          ~       \
+               usethreads=$(USE_THREADS)       ~       \
+               usemultiplicity=$(USE_MULTI)    ~       \
+               LINK_FLAGS=$(LINK_FLAGS:s/\/\\/)                ~       \
+               optimize=$(OPTIMIZE)
+
+#
+# set up targets varying between Win95 and WinNT builds
+#
+
+.IF "$(IS_WIN95)" == "define"
+MK2            = .\makefile.95
+RIGHTMAKE      = __switch_makefiles
+NOOP           = @rem
+.ELSE
+MK2            = __not_needed
+RIGHTMAKE      = __not_needed
+.ENDIF
 
 #
 # Top targets
 #
 
-all : .\config.h $(GLOBEXE) $(MINIMOD) $(CONFIGPM) $(PERLEXE) $(PERL95EXE) \
+all : $(CRTIMPLIBS) .\config.h $(GLOBEXE) $(MINIPERL) $(MK2)           \
+       $(RIGHTMAKE) $(MINIMOD) $(CONFIGPM) $(PERLEXE) $(PERL95EXE)     \
        $(X2P) $(EXTENSION_DLL) $(EXTENSION_PM)
 
 $(DYNALOADER)$(o) : $(DYNALOADER).c $(CORE_H) $(EXTDIR)\DynaLoader\dlutils.c
 
-#------------------------------------------------------------
+#----------------------------------------------------------------
+
+#-------------------- BEGIN Win95 SPECIFIC ----------------------
+
+# this target is a jump-off point for Win95
+#  1. it switches to the Win95-specific makefile if it exists
+#     (__do_switc_makefiles)
+#  2. it prints a message when the Win95-specific one finishes (__done)
+#  3. it then kills this makefile by trying to make __no_such_target
+
+__switch_makefiles: __do_switch_makefiles __done __no_such_target
+
+__do_switch_makefiles:
+.IF "$(NOTFIRST)" != "true"
+       if exist $(MK2) $(MAKE:s/-S//) -f $(MK2) $(MAKETARGETS) NOTFIRST=true
+.ELSE
+       $(NOOP)
+.ENDIF
+
+.IF "$(NOTFIRST)" != "true"
+__done:
+       @echo Build process complete. Ignore any errors after this message.
+       @echo Run "dmake test" to test and "dmake install" to install
+
+.ELSE
+# dummy targets for Win95-specific makefile
+
+__done:
+       $(NOOP)
+
+__no_such_target:
+       $(NOOP)
+
+.ENDIF
+
+# This target is used to generate the new makefile (.\makefile.95) for Win95
+
+.\makefile.95: .\makefile.mk
+       $(MINIPERL) genmk95.pl makefile.mk $(MK2)
+
+#--------------------- END Win95 SPECIFIC ---------------------
+
+#--------------------- BEGIN GCC/Mingw32 SPECIFIC -------------
+
+# make GCC-ish implib for PerlCRT.dll if needed
+$(PERLCRT_A): $(PERLCRT_DEF)
+       if not exist $(COREDIR) mkdir $(COREDIR)
+       $(IMPLIB) --def $(PERLCRT_DEF)  \
+               --dllname $(LIBCDLL)            \
+               --output-lib $(PERLCRT_A)
+
+# make GCC-ish oldnames implib for our CRT (whether it's MSVCRT or PerlCRT)
+$(OLDNAMES_A): $(OLDNAMES_DEF)
+       $(IMPLIB) --def $(OLDNAMES_DEF) \
+               --dllname $(LIBCDLL)            \
+               --output-lib $(OLDNAMES_A)      \
+               --add-underscore
+
+# MSVCRT-using runtime startup files
+$(MINIDIR)\gcrt0$(o): .\gstartup.c
+       $(CC) -c $(CFLAGS) -DEXESTARTUP $(OBJOUT_FLAG)$@ .\gstartup.c
+
+.\gcrt0$(o): .\gstartup.c
+       $(CC) -c $(CFLAGS) -DEXESTARTUP $(OBJOUT_FLAG)$@ .\gstartup.c
+
+.\gdllcrt0$(o): .\gstartup.c
+       $(CC) -c $(CFLAGS) -DDLLSTARTUP $(OBJOUT_FLAG)$@ .\gstartup.c
+       $(XCOPY) $@ $(COREDIR)
+
+
+#--------------------- END GCC/Mingw32 SPECIFIC ---------------
+
+# a blank target for when builds don't need to do certain things
+# this target added for Win95 port but used to keep the WinNT port able to 
+# use this file
+__not_needed:
 
 $(GLOBEXE) : perlglob$(o)
 .IF "$(CCTYPE)" == "BORLAND"
        $(CC) -c -w -v -tWM -I"$(CCINCDIR)" perlglob.c
-       $(LINK32) -Tpe -ap $(LINK_FLAGS) c0x32$(o) perlglob$(o) \
+       $(LINK32) -Tpe -ap $(BLINK_FLAGS) c0x32$(o) perlglob$(o) \
            "$(CCLIBDIR)\32BIT\wildargs$(o)",$@,,import32.lib cw32mt.lib,
 .ELIF "$(CCTYPE)" == "GCC"
-       $(LINK32) $(LINK_FLAGS) -o $@ perlglob$(o) $(LIBFILES)
+       $(LINK32) $(BLINK_FLAGS) -o $@ perlglob$(o) $(LIBFILES)
 .ELSE
-       $(LINK32) $(LINK_FLAGS) $(LIBFILES) -out:$@ -subsystem:$(SUBSYS) \
+       $(LINK32) $(BLINK_FLAGS) $(LIBFILES) -out:$@ -subsystem:$(SUBSYS) \
            perlglob$(o) setargv$(o) 
 .ENDIF
 
@@ -783,7 +973,8 @@ config.w32 : $(CFGSH_TMPL)
        copy $(CFGH_TMPL) config.h
 
 ..\config.sh : config.w32 $(MINIPERL) config_sh.PL
-       $(MINIPERL) -I..\lib config_sh.PL $(CFG_VARS) config.w32 > ..\config.sh
+       $(MINIPERL) -I..\lib config_sh.PL --cfgsh-option-file \
+           $(mktmp $(CFG_VARS)) config.w32 > ..\config.sh
 
 # this target is for when changes to the main config.sh happen
 # edit config.{b,v,g}c and make this target once for each supported
@@ -805,29 +996,35 @@ $(CONFIGPM) : $(MINIPERL) ..\config.sh config_h.PL ..\minimod.pl
        $(XCOPY) ..\ext\re\re.pm $(LIBDIR)\*.*
        $(RCOPY) include $(COREDIR)\*.*
        $(MINIPERL) -I..\lib config_h.PL "INST_VER=$(INST_VER)" \
-           || $(MAKE) $(MAKEMACROS) $(CONFIGPM)
+           || $(MAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)
 
-$(MINIPERL) : $(MINIDIR) $(MINI_OBJ)
+$(MINIPERL) : $(MINIDIR) $(MINI_OBJ) $(CRTIPMLIBS)
 .IF "$(CCTYPE)" == "BORLAND"
-       $(LINK32) -Tpe -ap $(LINK_FLAGS) \
+       $(LINK32) -Tpe -ap $(BLINK_FLAGS) \
            @$(mktmp c0x32$(o) $(MINI_OBJ:s,\,\\),$(@:s,\,\\),,$(LIBFILES),)
 .ELIF "$(CCTYPE)" == "GCC"
-       $(LINK32) -v -o $@ $(LINK_FLAGS) \
-           $(mktmp $(LKPRE) $(MINI_OBJ:s,\,\\) $(LIBFILES) $(LKPOST))
+       $(LINK32) -v -nostdlib -o $@ $(BLINK_FLAGS) \
+           $(mktmp $(LKPRE) $(MINI_OBJ:s,\,\\) $(LIBFILES) $(LKPOST)) 
 .ELSE
        $(LINK32) -subsystem:console -out:$@ \
-           @$(mktmp $(LINK_FLAGS) $(LIBFILES) $(MINI_OBJ:s,\,\\))
+           @$(mktmp $(BLINK_FLAGS) $(LIBFILES) $(MINI_OBJ:s,\,\\))
 .ENDIF
 
 $(MINIDIR) :
        if not exist "$(MINIDIR)" mkdir "$(MINIDIR)"
 
 $(MINICORE_OBJ) : $(CORE_NOCFG_H)
-       $(CC) -c $(CFLAGS) $(OBJOUT_FLAG)$@ ..\$(*B).c
+       $(CC) -c $(CFLAGS) -DPERL_EXTERNAL_GLOB $(OBJOUT_FLAG)$@ ..\$(*B).c
 
 $(MINIWIN32_OBJ) : $(CORE_NOCFG_H)
        $(CC) -c $(CFLAGS) $(OBJOUT_FLAG)$@ $(*B).c
 
+# -DPERL_IMPLICIT_SYS needs C++ for perllib.c
+.IF "$(USE_IMP_SYS)$(USE_OBJECT)" == "defineundef"
+perllib$(o)    : perllib.c
+       $(CC) -c -I. $(CFLAGS_O) $(CXX_FLAG) $(OBJOUT_FLAG)$@ perllib.c
+.ENDIF
+
 # 1. we don't want to rebuild miniperl.exe when config.h changes
 # 2. we don't want to rebuild miniperl.exe with non-default config.h
 $(MINI_OBJ)    : $(CORE_NOCFG_H)
@@ -854,7 +1051,7 @@ $(PERLDLL): perldll.def $(PERLDLL_OBJ)
        $(LINK32) -mdll -o $@ -Wl,--base-file -Wl,perl.base $(LINK_FLAGS) \
            $(mktmp $(LKPRE) $(PERLDLL_OBJ:s,\,\\) $(LIBFILES) $(LKPOST))
        dlltool --output-lib $(PERLIMPLIB) \
-                --dllname perl.dll \
+                --dllname $(PERLDLL:b).dll \
                 --def perldll.def \
                 --base-file perl.base \
                 --output-exp perl.exp
@@ -889,14 +1086,14 @@ $(X2P) : $(MINIPERL) $(X2P_OBJ)
        $(MINIPERL) ..\x2p\find2perl.PL
        $(MINIPERL) ..\x2p\s2p.PL
 .IF "$(CCTYPE)" == "BORLAND"
-       $(LINK32) -Tpe -ap $(LINK_FLAGS) \
+       $(LINK32) -Tpe -ap $(BLINK_FLAGS) \
            @$(mktmp c0x32$(o) $(X2P_OBJ:s,\,\\),$(@:s,\,\\),,$(LIBFILES),)
 .ELIF "$(CCTYPE)" == "GCC"
-       $(LINK32) -v -o $@ $(LINK_FLAGS) \
+       $(LINK32) -v -o $@ $(BLINK_FLAGS) \
            $(mktmp $(LKPRE) $(X2P_OBJ:s,\,\\) $(LIBFILES) $(LKPOST))
 .ELSE
        $(LINK32) -subsystem:console -out:$@ \
-           @$(mktmp $(LINK_FLAGS) $(LIBFILES) $(X2P_OBJ:s,\,\\))
+           @$(mktmp $(BLINK_FLAGS) $(LIBFILES) $(X2P_OBJ:s,\,\\))
 .ENDIF
 
 perlmain.c : runperl.c 
@@ -907,16 +1104,18 @@ perlmain$(o) : perlmain.c
 
 $(PERLEXE): $(PERLDLL) $(CONFIGPM) $(PERLEXE_OBJ)
 .IF "$(CCTYPE)" == "BORLAND"
-       $(LINK32) -Tpe -ap $(LINK_FLAGS) \
+       $(LINK32) -Tpe -ap $(BLINK_FLAGS) \
            @$(mktmp c0x32$(o) $(PERLEXE_OBJ:s,\,\\)\n \
            $(@:s,\,\\),\n \
            $(PERLIMPLIB) $(LIBFILES)\n)
 .ELIF "$(CCTYPE)" == "GCC"
-       $(LINK32) -o $@ $(LINK_FLAGS)  \
+       $(LINK32) -nostdlib -o $@ $(BLINK_FLAGS)  \
            $(PERLEXE_OBJ) $(PERLIMPLIB) $(LIBFILES)
 .ELSE
-       $(LINK32) -subsystem:console -out:$@ $(LINK_FLAGS) $(LIBFILES) \
+       $(LINK32) -subsystem:console -out:$@ $(BLINK_FLAGS) $(LIBFILES) \
            $(PERLEXE_OBJ) $(SETARGV_OBJ) $(PERLIMPLIB) 
+       copy $(PERLEXE) $(WPERLEXE)
+       editbin /subsystem:windows $(WPERLEXE)
 .ENDIF
        copy splittree.pl .. 
        $(MINIPERL) -I..\lib ..\splittree.pl "../LIB" $(AUTODIR)
@@ -944,7 +1143,7 @@ DynaLoadmt$(o) : $(DYNALOADER).c
            $(OBJOUT_FLAG)DynaLoadmt$(o) $(DYNALOADER).c
 
 $(PERL95EXE): $(PERLDLL) $(CONFIGPM) $(PERL95_OBJ)
-       $(LINK32) -subsystem:console -nodefaultlib -out:$@ $(LINK_FLAGS) \
+       $(LINK32) -subsystem:console -nodefaultlib -out:$@ $(BLINK_FLAGS) \
            $(LIBBASEFILES) $(PERL95_OBJ) $(SETARGV_OBJ) $(PERLIMPLIB) \
            libcmt.lib
 
@@ -955,7 +1154,9 @@ $(PERL95EXE): $(PERLDLL) $(CONFIGPM) $(PERL95_OBJ)
 $(DYNALOADER).c: $(MINIPERL) $(EXTDIR)\DynaLoader\dl_win32.xs $(CONFIGPM)
        if not exist $(AUTODIR) mkdir $(AUTODIR)
        cd $(EXTDIR)\$(*B) && ..\$(MINIPERL) -I..\..\lib $(*B)_pm.PL
+       cd $(EXTDIR)\$(*B) && ..\$(MINIPERL) -I..\..\lib XSLoader_pm.PL
        $(XCOPY) $(EXTDIR)\$(*B)\$(*B).pm $(LIBDIR)\$(NULL)
+       $(XCOPY) $(EXTDIR)\$(*B)\XSLoader.pm $(LIBDIR)\$(NULL)
        cd $(EXTDIR)\$(*B) && $(XSUBPP) dl_win32.xs > $(*B).c
        $(XCOPY) $(EXTDIR)\$(*B)\dlutils.c .
 
@@ -967,6 +1168,16 @@ $(DUMPER_DLL): $(PERLEXE) $(DUMPER).xs
        ..\..\..\miniperl -I..\..\..\lib Makefile.PL INSTALLDIRS=perl
        cd $(EXTDIR)\Data\$(*B) && $(MAKE)
 
+$(DPROF_DLL): $(PERLEXE) $(DPROF).xs
+       cd $(EXTDIR)\Devel\$(*B) && \
+       ..\..\..\miniperl -I..\..\..\lib Makefile.PL INSTALLDIRS=perl
+       cd $(EXTDIR)\Devel\$(*B) && $(MAKE)
+
+$(GLOB_DLL): $(PERLEXE) $(GLOB).xs
+       cd $(EXTDIR)\File\$(*B) && \
+       ..\..\..\miniperl -I..\..\..\lib Makefile.PL INSTALLDIRS=perl
+       cd $(EXTDIR)\File\$(*B) && $(MAKE)
+
 $(PEEK_DLL): $(PERLEXE) $(PEEK).xs
        cd $(EXTDIR)\Devel\$(*B) && \
        ..\..\..\miniperl -I..\..\..\lib Makefile.PL INSTALLDIRS=perl
@@ -1051,12 +1262,14 @@ distclean: clean
        -del /f $(EXTENSION_C) $(DYNALOADER).c $(ERRNO).pm
        -del /f $(EXTDIR)\DynaLoader\dl_win32.xs
        -del /f $(LIBDIR)\.exists $(LIBDIR)\attrs.pm $(LIBDIR)\DynaLoader.pm
+       -del /f $(LIBDIR)\XSLoader.pm
        -del /f $(LIBDIR)\Fcntl.pm $(LIBDIR)\IO.pm $(LIBDIR)\Opcode.pm
        -del /f $(LIBDIR)\ops.pm $(LIBDIR)\Safe.pm $(LIBDIR)\Thread.pm
        -del /f $(LIBDIR)\SDBM_File.pm $(LIBDIR)\Socket.pm $(LIBDIR)\POSIX.pm
        -del /f $(LIBDIR)\B.pm $(LIBDIR)\O.pm $(LIBDIR)\re.pm
        -del /f $(LIBDIR)\Data\Dumper.pm $(LIBDIR)\ByteLoader.pm
-       -del /f $(LIBDIR)\Devel\Peek.pm
+       -del /f $(LIBDIR)\Devel\Peek.pm $(LIBDIR)\Devel\DProf.pm
+       -del /f $(LIBDIR)\File\Glob.pm
        -rmdir /s /q $(LIBDIR)\IO || rmdir /s $(LIBDIR)\IO
        -rmdir /s /q $(LIBDIR)\Thread || rmdir /s $(LIBDIR)\Thread
        -rmdir /s /q $(LIBDIR)\B || rmdir /s $(LIBDIR)\B
@@ -1064,7 +1277,7 @@ distclean: clean
        -del /f $(PODDIR)\*.html
        -del /f $(PODDIR)\*.bat
        -cd ..\utils && del /f h2ph splain perlbug pl2pm c2ph h2xs perldoc \
-           pstruct *.bat
+           dprofpp *.bat
        -cd ..\x2p && del /f find2perl s2p *.bat
        -del /f ..\config.sh ..\splittree.pl perlmain.c dlutils.c config.h.new
        -del /f $(CONFIGPM)
@@ -1079,11 +1292,12 @@ distclean: clean
 
 install : all installbare installhtml
 
-installbare : utils
+installbare : $(RIGHTMAKE) utils
        $(PERLEXE) ..\installperl
 .IF "$(PERL95EXE)" != ""
        $(XCOPY) $(PERL95EXE) $(INST_BIN)\*.*
 .ENDIF
+       if exist $(WPERLEXE) $(XCOPY) $(WPERLEXE) $(INST_BIN)\*.*
        $(XCOPY) $(GLOBEXE) $(INST_BIN)\*.*
        $(XCOPY) bin\*.bat $(INST_SCRIPT)\*.*
 
@@ -1116,7 +1330,7 @@ test-prep : all utils
        $(XCOPY) $(GLOBEXE) ..\t\$(NULL)
 .ENDIF
 
-test : test-prep
+test : $(RIGHTMAKE) test-prep
        cd ..\t && $(PERLEXE) -I..\lib harness
 
 test-notty : test-prep
@@ -1132,6 +1346,7 @@ clean :
        -@erase /f config.h
        -@erase $(GLOBEXE)
        -@erase $(PERLEXE)
+       -@erase $(WPERLEXE)
        -@erase $(PERLDLL)
        -@erase $(CORE_OBJ)
        -rmdir /s /q $(MINIDIR) || rmdir /s $(MINIDIR)