Makefile revision 1.33
1#
2# Makefile to build perl on Windows using Microsoft NMAKE.
3# Supported compilers:
4#	Microsoft Visual C++ 6.0 or later
5#	Windows SDK 64-bit compiler and tools
6#
7# This is set up to build a perl.exe that runs off a shared library
8# (perl528.dll).  Also makes individual DLLs for the XS extensions.
9#
10
11##
12## Make sure you read README.win32 *before* you mess with anything here!
13##
14
15##
16## Build configuration.  Edit the values below to suit your needs.
17##
18
19#
20# Set these to wherever you want "nmake install" to put your
21# newly built perl.
22#
23INST_DRV	= c:
24INST_TOP	= $(INST_DRV)\perl
25
26#
27# Uncomment if you want to build a 32-bit Perl using a 32-bit compiler
28# on a 64-bit version of Windows.
29#
30#WIN64		= undef
31
32#
33# Comment this out if you DON'T want your perl installation to be versioned.
34# This means that the new installation will overwrite any files from the
35# old installation at the same INST_TOP location.  Leaving it enabled is
36# the safest route, as perl adds the extra version directory to all the
37# locations it installs files to.  If you disable it, an alternative
38# versioned installation can be obtained by setting INST_TOP above to a
39# path that includes an arbitrary version string.
40#
41#INST_VER	= \5.28.1
42
43#
44# Comment this out if you DON'T want your perl installation to have
45# architecture specific components.  This means that architecture-
46# specific files will be installed along with the architecture-neutral
47# files.  Leaving it enabled is safer and more flexible, in case you
48# want to build multiple flavors of perl and install them together in
49# the same location.  Commenting it out gives you a simpler
50# installation that is easier to understand for beginners.
51#
52#INST_ARCH	= \$(ARCHNAME)
53
54#
55# Uncomment this if you want perl to run
56# 	$Config{sitelibexp}\sitecustomize.pl
57# before anything else.  This script can then be set up, for example,
58# to add additional entries to @INC.
59#
60#USE_SITECUST	= define
61
62#
63# uncomment to enable multiple interpreters.  This is needed for fork()
64# emulation and for thread support, and is auto-enabled by USE_IMP_SYS
65# and USE_ITHREADS below.
66#
67USE_MULTI	= define
68
69#
70# Interpreter cloning/threads; now reasonably complete.
71# This should be enabled to get the fork() emulation.  This needs (and
72# will auto-enable) USE_MULTI above.
73#
74USE_ITHREADS	= define
75
76#
77# uncomment to enable the implicit "host" layer for all system calls
78# made by perl.  This is also needed to get fork().  This needs (and
79# will auto-enable) USE_MULTI above.
80#
81USE_IMP_SYS	= define
82
83#
84# Comment this out if you don't want to enable large file support for
85# some reason.  Should normally only be changed to maintain compatibility
86# with an older release of perl.
87#
88USE_LARGE_FILES	= define
89
90#
91# Uncomment this if you're building a 32-bit perl and want 64-bit integers.
92# (If you're building a 64-bit perl then you will have 64-bit integers whether
93# or not this is uncommented.)
94# Note: This option is not supported in 32-bit MSVC60 builds.
95#
96#USE_64_BIT_INT	= define
97
98#
99# Comment this out if you want the legacy default behavior of including '.' at
100# the end of @INC.
101#
102DEFAULT_INC_EXCLUDES_DOT = define
103
104#
105# Uncomment this if you want to disable looking up values from
106# HKEY_CURRENT_USER\Software\Perl and HKEY_LOCAL_MACHINE\Software\Perl in
107# the Registry.
108#
109#USE_NO_REGISTRY = define
110
111#
112# uncomment exactly one of the following
113#
114# Visual C++ 6.0 (aka Visual C++ 98)
115CCTYPE		= MSVC60
116# Visual C++ .NET 2002/2003 (aka Visual C++ 7.0/7.1) (full version)
117#CCTYPE		= MSVC70
118# Visual C++ Toolkit 2003 (aka Visual C++ 7.1) (free command-line tools)
119#CCTYPE		= MSVC70FREE
120# Windows Server 2003 SP1 Platform SDK (April 2005)
121#CCTYPE		= SDK2003SP1
122# Visual C++ 2005 (aka Visual C++ 8.0) (full version or Express Edition)
123#CCTYPE		= MSVC80
124# Visual C++ 2008 (aka Visual C++ 9.0) (full version or Express Edition)
125#CCTYPE		= MSVC90
126# Visual C++ 2010 (aka Visual C++ 10.0) (full version or Express Edition)
127#CCTYPE		= MSVC100
128# Visual C++ 2012 (aka Visual C++ 11.0) (full version or Express Edition)
129#CCTYPE		= MSVC110
130# Visual C++ 2013 (aka Visual C++ 12.0) (full version or Express Edition)
131#CCTYPE		= MSVC120
132# Visual C++ 2015 (aka Visual C++ 14.0) (full version or Express Edition)
133#CCTYPE		= MSVC140
134# Visual C++ 2017 (aka Visual C++ 14.1) (full version or Community Edition)
135#CCTYPE		= MSVC141
136
137#
138# If you are using Intel C++ Compiler uncomment this
139#
140#__ICC		= define
141
142#
143# Uncomment this if you want to build everything in C++ mode
144#
145#USE_CPLUSPLUS	= define
146
147#
148# uncomment next line if you want debug version of perl (big/slow)
149# If not enabled, we automatically try to use maximum optimization
150# with all compilers that are known to have a working optimizer.
151#
152# You can also set CFG = DebugSymbols for a slightly smaller/faster
153# debug build without the special debugging code in perl which is
154# enabled via -DDEBUGGING;
155#
156# or you can set CFG = DebugFull for an even fuller (bigger/slower)
157# debug build using the debug version of the CRT, and enabling VC++
158# debug features such as extra assertions and invalid parameter warnings
159# in perl and CRT code via -D_DEBUG.  (Note that the invalid parameter
160# handler does get triggered from time to time in this configuration,
161# which causes warnings to be printed on STDERR, which in turn causes a
162# few tests to fail.)
163#
164#CFG		= Debug
165
166#
167# uncomment to enable linking with setargv.obj under the Visual C
168# compiler. Setting this options enables perl to expand wildcards in
169# arguments, but it may be harder to use alternate methods like
170# File::DosGlob that are more powerful.  This option is supported only with
171# Visual C.
172#
173#USE_SETARGV	= define
174
175#
176# set this if you wish to use perl's malloc
177# WARNING: Turning this on/off WILL break binary compatibility with extensions
178# you may have compiled with/without it.  Be prepared to recompile all
179# extensions if you change the default.  Currently, this cannot be enabled
180# if you ask for USE_IMP_SYS above.
181#
182#PERL_MALLOC	= define
183
184#
185# set this to enable debugging mstats
186# This must be enabled to use the Devel::Peek::mstat() function.  This cannot
187# be enabled without PERL_MALLOC as well.
188#
189#DEBUG_MSTATS	= define
190
191#
192# set this to additionally provide a statically linked perl-static.exe.
193# Note that dynamic loading will not work with this perl, so you must
194# include required modules statically using the STATIC_EXT or ALL_STATIC
195# variables below. A static library perl528s.lib will also be created.
196# Ordinary perl.exe is not affected by this option.
197#
198#BUILD_STATIC	= define
199
200#
201# in addition to BUILD_STATIC the option ALL_STATIC makes *every*
202# extension get statically built.
203# This will result in a very large perl executable, but the main purpose
204# is to have proper linking set so as to be able to create miscellaneous
205# executables with different built-in extensions.
206#
207#ALL_STATIC	= define
208
209#
210# set the install location of the compiler
211# Running VCVARS32.BAT, VCVARSALL.BAT or similar is *required* when using
212# Visual C++.
213# Versions of Visual C++ up to VC++ 7.1 define $(MSVCDir); versions since then
214# define $(VCINSTALLDIR) instead, but for VC++ 14.1 we need the subfolder given
215# by $(VCToolsInstallDir).
216#
217!IF "$(CCTYPE)" == "MSVC60" || \
218    "$(CCTYPE)" == "MSVC70" || "$(CCTYPE)" == "MSVC70FREE"
219CCHOME		= $(MSVCDIR)
220!ELSE
221!  IF "$(CCTYPE)" == "MSVC141"
222CCHOME		= $(VCTOOLSINSTALLDIR)
223!  ELSE
224CCHOME		= $(VCINSTALLDIR)
225!  ENDIF
226!ENDIF
227
228#
229# Additional compiler flags can be specified here.
230#
231BUILDOPT	= $(BUILDOPTEXTRA)
232
233#
234# This should normally be disabled.  Enabling it will disable the File::Glob
235# implementation of CORE::glob.
236#
237#BUILDOPT	= $(BUILDOPT) -DPERL_EXTERNAL_GLOB
238
239#
240# Perl needs to read scripts in text mode so that the DATA filehandle
241# works correctly with seek() and tell(), or around auto-flushes of
242# all filehandles (e.g. by system(), backticks, fork(), etc).
243#
244# The current version on the ByteLoader module on CPAN however only
245# works if scripts are read in binary mode.  But before you disable text
246# mode script reading (and break some DATA filehandle functionality)
247# please check first if an updated ByteLoader isn't available on CPAN.
248#
249BUILDOPT	= $(BUILDOPT) -DPERL_TEXTMODE_SCRIPTS
250
251#
252# specify semicolon-separated list of extra directories that modules will
253# look for libraries (spaces in path names need not be quoted)
254#
255EXTRALIBDIRS	=
256
257#
258# set this to your email address (perl will guess a value from
259# from your loginname and your hostname, which may not be right)
260#
261#EMAIL		=
262
263##
264## Build configuration ends.
265##
266
267##################### CHANGE THESE ONLY IF YOU MUST #####################
268
269!IF "$(USE_IMP_SYS)" == "define"
270PERL_MALLOC	= undef
271DEBUG_MSTATS	= undef
272!ENDIF
273
274!IF "$(PERL_MALLOC)" == ""
275PERL_MALLOC	= undef
276DEBUG_MSTATS	= undef
277!ENDIF
278
279!IF "$(DEBUG_MSTATS)" == ""
280DEBUG_MSTATS	= undef
281!ENDIF
282
283!IF "$(DEBUG_MSTATS)" == "define"
284BUILDOPT	= $(BUILDOPT) -DPERL_DEBUGGING_MSTATS
285!ENDIF
286
287!IF "$(USE_SITECUST)" == ""
288USE_SITECUST	= undef
289!ENDIF
290
291!IF "$(USE_MULTI)" == ""
292USE_MULTI	= undef
293!ENDIF
294
295!IF "$(USE_ITHREADS)" == ""
296USE_ITHREADS	= undef
297!ENDIF
298
299!IF "$(USE_IMP_SYS)" == ""
300USE_IMP_SYS	= undef
301!ENDIF
302
303!IF "$(USE_LARGE_FILES)" == ""
304USE_LARGE_FILES	= undef
305!ENDIF
306
307!IF "$(USE_64_BIT_INT)" == ""
308USE_64_BIT_INT	= undef
309!ENDIF
310
311!IF "$(DEFAULT_INC_EXCLUDES_DOT)" == ""
312DEFAULT_INC_EXCLUDES_DOT = undef
313!ENDIF
314
315!IF "$(USE_NO_REGISTRY)" == ""
316USE_NO_REGISTRY	= undef
317!ENDIF
318
319!IF "$(USE_IMP_SYS)$(USE_MULTI)" == "defineundef"
320USE_MULTI	= define
321!ENDIF
322
323!IF "$(USE_ITHREADS)$(USE_MULTI)" == "defineundef"
324USE_MULTI	= define
325!ENDIF
326
327!IF "$(USE_SITECUST)" == "define"
328BUILDOPT	= $(BUILDOPT) -DUSE_SITECUSTOMIZE
329!ENDIF
330
331!IF "$(USE_MULTI)" != "undef"
332BUILDOPT	= $(BUILDOPT) -DPERL_IMPLICIT_CONTEXT
333!ENDIF
334
335!IF "$(USE_IMP_SYS)" != "undef"
336BUILDOPT	= $(BUILDOPT) -DPERL_IMPLICIT_SYS
337!ENDIF
338
339!IF "$(USE_NO_REGISTRY)" != "undef"
340BUILDOPT	= $(BUILDOPT) -DWIN32_NO_REGISTRY
341!ENDIF
342
343!IF "$(PROCESSOR_ARCHITECTURE)" == ""
344PROCESSOR_ARCHITECTURE	= x86
345!ENDIF
346
347!IF "$(WIN64)" == ""
348# When we are running from a 32bit cmd.exe on AMD64 then
349# PROCESSOR_ARCHITECTURE is set to x86 and PROCESSOR_ARCHITEW6432
350# is set to AMD64
351!IF "$(PROCESSOR_ARCHITEW6432)" != ""
352PROCESSOR_ARCHITECTURE	= $(PROCESSOR_ARCHITEW6432)
353WIN64			= define
354!ELSE
355!IF "$(PROCESSOR_ARCHITECTURE)" == "AMD64" || "$(PROCESSOR_ARCHITECTURE)" == "IA64"
356WIN64			= define
357!ELSE
358WIN64			= undef
359!ENDIF
360!ENDIF
361!ENDIF
362
363!IF "$(WIN64)" == "define"
364USE_64_BIT_INT	= define
365!ENDIF
366
367# Treat 64-bit MSVC60 (doesn't really exist) as SDK2003SP1 because
368# both link against MSVCRT.dll (which is part of Windows itself) and
369# not against a compiler specific versioned runtime.
370!IF "$(WIN64)" == "define" && "$(CCTYPE)" == "MSVC60"
371CCTYPE		= SDK2003SP1
372!ENDIF
373
374# Disable the 64-bit-int option for (32-bit) MSVC60 builds since that compiler
375# does not support it.
376!IF "$(CCTYPE)" == "MSVC60"
377!UNDEF USE_64_BIT_INT
378USE_64_BIT_INT	= undef
379!ENDIF
380
381# Most relevant compiler-specific options fall into two groups:
382# either pre-MSVC80 or MSVC80 onwards, so define a macro for this.
383!IF "$(CCTYPE)" == "MSVC60" || \
384    "$(CCTYPE)" == "MSVC70" || "$(CCTYPE)" == "MSVC70FREE"
385PREMSVC80	= define
386!ELSE
387PREMSVC80	= undef
388!ENDIF
389
390ARCHITECTURE = $(PROCESSOR_ARCHITECTURE)
391!IF "$(ARCHITECTURE)" == "AMD64"
392ARCHITECTURE	= x64
393!ENDIF
394!IF "$(ARCHITECTURE)" == "IA64"
395ARCHITECTURE	= ia64
396!ENDIF
397
398!IF "$(USE_MULTI)" == "define"
399ARCHNAME	= MSWin32-$(ARCHITECTURE)-multi
400!ELSE
401ARCHNAME	= MSWin32-$(ARCHITECTURE)-perlio
402!ENDIF
403
404!IF "$(USE_ITHREADS)" == "define"
405ARCHNAME	= $(ARCHNAME)-thread
406!ENDIF
407
408!IF "$(WIN64)" != "define"
409!IF "$(USE_64_BIT_INT)" == "define"
410ARCHNAME	= $(ARCHNAME)-64int
411!ENDIF
412!ENDIF
413
414# All but the free version of VC++ 7.1 can load DLLs on demand.  Makes the test
415# suite run in about 10% less time.
416!IF "$(CCTYPE)" != "MSVC70FREE"
417# If no registry, advapi32 is only used for Perl_pp_getlogin/getlogin/GetUserNameA
418# which is rare to execute
419!IF "$(USE_NO_REGISTRY)" != "undef"
420DELAYLOAD	= -DELAYLOAD:ws2_32.dll -DELAYLOAD:advapi32.dll delayimp.lib
421MINIDELAYLOAD	=
422!ELSE
423DELAYLOAD	= -DELAYLOAD:ws2_32.dll delayimp.lib
424#miniperl never does any registry lookups
425MINIDELAYLOAD	= -DELAYLOAD:advapi32.dll
426!ENDIF
427!ENDIF
428
429# Visual C++ 2005 and 2008 (VC++ 8.0 and 9.0) create manifest files for EXEs and
430# DLLs. These either need copying everywhere with the binaries, or else need
431# embedding in them otherwise MSVCR80.dll or MSVCR90.dll won't be found. For
432# simplicity, embed them if they exist (and delete them afterwards so that they
433# don't get installed too).
434EMBED_EXE_MANI	= if exist $@.manifest mt -nologo -manifest $@.manifest -outputresource:$@;1 && \
435		  if exist $@.manifest del $@.manifest
436EMBED_DLL_MANI	= if exist $@.manifest mt -nologo -manifest $@.manifest -outputresource:$@;2 && \
437		  if exist $@.manifest del $@.manifest
438
439# Set the install location of the compiler headers/libraries.
440# These are saved into $Config{incpath} and $Config{libpth}.
441CCINCDIR	= $(CCHOME)\include
442!IF "$(CCTYPE)" == "MSVC141"
443!  IF "$(WIN64)" == "define"
444CCLIBDIR	= $(CCHOME)\lib\x64
445!  ELSE
446CCLIBDIR	= $(CCHOME)\lib\x86
447!  ENDIF
448!ELSE
449!  IF "$(WIN64)" == "define"
450CCLIBDIR	= $(CCHOME)\lib\amd64
451!  ELSE
452CCLIBDIR	= $(CCHOME)\lib
453!  ENDIF
454!ENDIF
455
456ARCHDIR		= ..\lib\$(ARCHNAME)
457COREDIR		= ..\lib\CORE
458AUTODIR		= ..\lib\auto
459LIBDIR		= ..\lib
460EXTDIR		= ..\ext
461DISTDIR		= ..\dist
462CPANDIR		= ..\cpan
463PODDIR		= ..\pod
464HTMLDIR		= .\html
465
466INST_SCRIPT	= $(INST_TOP)$(INST_VER)\bin
467INST_BIN	= $(INST_SCRIPT)$(INST_ARCH)
468INST_LIB	= $(INST_TOP)$(INST_VER)\lib
469INST_ARCHLIB	= $(INST_LIB)$(INST_ARCH)
470INST_COREDIR	= $(INST_ARCHLIB)\CORE
471INST_HTML	= $(INST_TOP)$(INST_VER)\html
472
473#
474# Programs to compile, build .lib files and link
475#
476
477!IF "$(__ICC)" != "define"
478CC		= cl
479LINK32		= link
480!ELSE
481CC		= icl
482LINK32		= xilink
483!ENDIF
484LIB32		= $(LINK32) -lib
485RSC		= rc
486
487#
488# Options
489#
490
491INCLUDES	= -I$(COREDIR) -I.\include -I. -I..
492#PCHFLAGS	= -Fpc:\temp\vcmoduls.pch -YX
493DEFINES		= -DWIN32 -D_CONSOLE -DNO_STRICT
494LOCDEFS		= -DPERLDLL -DPERL_CORE
495CXX_FLAG	= -TP -EHsc
496
497!IF "$(CCTYPE)" == "MSVC140" || "$(CCTYPE)" == "MSVC141"
498LIBC		= ucrt.lib
499!ELSE
500LIBC		= msvcrt.lib
501!ENDIF
502
503!IF  "$(CFG)" == "Debug"
504OPTIMIZE	= -Od -MD -Zi -DDEBUGGING
505LINK_DBG	= -debug
506!ELSE
507!IF  "$(CFG)" == "DebugSymbols"
508OPTIMIZE	= -Od -MD -Zi
509LINK_DBG	= -debug
510!ELSE
511!IF  "$(CFG)" == "DebugFull"
512!IF "$(CCTYPE)" == "MSVC140" || "$(CCTYPE)" == "MSVC141"
513LIBC		= ucrtd.lib
514!ELSE
515LIBC		= msvcrtd.lib
516!ENDIF
517OPTIMIZE	= -Od -MDd -Zi -D_DEBUG -DDEBUGGING
518LINK_DBG	= -debug
519!ELSE
520# -O1 yields smaller code, which turns out to be faster than -O2 on x86 and x64
521OPTIMIZE	= -O1 -MD -Zi -DNDEBUG
522# we enable debug symbols in release builds also
523LINK_DBG	= -debug -opt:ref,icf
524# you may want to enable this if you want COFF symbols in the executables
525# in addition to the PDB symbols.  The default Dr. Watson that ships with
526# Windows can use the the former but not latter.  The free WinDbg can be
527# installed to get better stack traces from just the PDB symbols, so we
528# avoid the bloat of COFF symbols by default.
529#LINK_DBG	= $(LINK_DBG) -debugtype:both
530!  IF "$(CCTYPE)" != "MSVC60"
531# enable Whole Program Optimizations (WPO) and Link Time Code Generation (LTCG)
532OPTIMIZE	= $(OPTIMIZE) -GL
533LINK_DBG	= $(LINK_DBG) -ltcg
534LIB_FLAGS	= -ltcg
535!  ENDIF
536!ENDIF
537!ENDIF
538!ENDIF
539
540!IF "$(WIN64)" == "define"
541DEFINES		= $(DEFINES) -DWIN64 -DCONSERVATIVE
542OPTIMIZE	= $(OPTIMIZE) -fp:precise
543!ENDIF
544
545# For now, silence warnings from VC++ 8.0 onwards about "unsafe" CRT functions
546# and POSIX CRT function names being deprecated.
547!IF "$(PREMSVC80)" == "undef"
548DEFINES		= $(DEFINES) -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE
549!ENDIF
550
551# Likewise for deprecated Winsock APIs in VC++ 14.0 onwards for now.
552!IF "$(CCTYPE)" == "MSVC140" || "$(CCTYPE)" == "MSVC141"
553DEFINES		= $(DEFINES) -D_WINSOCK_DEPRECATED_NO_WARNINGS
554!ENDIF
555
556# In VS 2005 (VC++ 8.0) Microsoft changes time_t from 32-bit to
557# 64-bit, even in 32-bit mode.  It also provides the _USE_32BIT_TIME_T
558# preprocessor option to revert back to the old functionality for
559# backward compatibility.  We define this symbol here for older 32-bit
560# compilers only (which aren't using it at all) for the sole purpose
561# of getting it into $Config{ccflags}.  That way if someone builds
562# Perl itself with e.g. VC6 but later installs an XS module using VC8
563# the time_t types will still be compatible.
564!IF "$(WIN64)" == "undef"
565!  IF "$(PREMSVC80)" == "define"
566BUILDOPT	= $(BUILDOPT) -D_USE_32BIT_TIME_T
567!  ENDIF
568!ENDIF
569
570LIBBASEFILES	= \
571		oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib \
572		comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib \
573		netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib \
574		version.lib odbc32.lib odbccp32.lib comctl32.lib
575
576!IF "$(CCTYPE)" == "MSVC140" || "$(CCTYPE)" == "MSVC141"
577!  IF  "$(CFG)" == "DebugFull"
578LIBBASEFILES	= $(LIBBASEFILES) msvcrtd.lib vcruntimed.lib
579!  ELSE
580LIBBASEFILES	= $(LIBBASEFILES) msvcrt.lib vcruntime.lib
581!  ENDIF
582!ENDIF
583
584# Avoid __intel_new_proc_init link error for libircmt.
585# libmmd is /MD equivelent, other variants exist.
586# libmmd is Intel C's math addon funcs to MS CRT, contains long doubles, C99,
587# and optimized C89 funcs
588!IF "$(__ICC)" == "define"
589LIBBASEFILES	= $(LIBBASEFILES) libircmt.lib libmmd.lib
590!ENDIF
591
592# The 64 bit Windows Server 2003 SP1 SDK compilers link against MSVCRT.dll, which
593# doesn't include the buffer overrun verification code used by the /GS switch.
594# Since the code links against libraries that are compiled with /GS, this
595# "security cookie verification" code must be included via bufferoverflow.lib.
596!IF "$(WIN64)" == "define" && "$(CCTYPE)" == "SDK2003SP1"
597LIBBASEFILES    = $(LIBBASEFILES) bufferoverflowU.lib
598!ENDIF
599
600LIBFILES	= $(LIBBASEFILES) $(LIBC)
601
602#EXTRACFLAGS	= -nologo -GF -W4 -wd4127 -wd4706
603EXTRACFLAGS	= -nologo -GF -W3
604!IF "$(__ICC)" == "define"
605EXTRACFLAGS	= $(EXTRACFLAGS) -Qstd=c99
606!ENDIF
607!IF "$(USE_CPLUSPLUS)" == "define"
608EXTRACFLAGS	= $(EXTRACFLAGS) $(CXX_FLAG)
609!ENDIF
610CFLAGS		= $(EXTRACFLAGS) $(INCLUDES) $(DEFINES) $(LOCDEFS) \
611		$(PCHFLAGS) $(OPTIMIZE)
612LINK_FLAGS	= -nologo -nodefaultlib $(LINK_DBG) \
613		-libpath:"$(INST_COREDIR)" \
614		-machine:$(PROCESSOR_ARCHITECTURE)
615LIB_FLAGS	= $(LIB_FLAGS) -nologo
616OBJOUT_FLAG	= -Fo
617EXEOUT_FLAG	= -Fe
618
619CFLAGS_O	= $(CFLAGS) $(BUILDOPT)
620
621!IF "$(PREMSVC80)" == "undef"
622PRIV_LINK_FLAGS	= $(PRIV_LINK_FLAGS) "/manifestdependency:type='Win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'"
623!ELSE
624RSC_FLAGS	= -DINCLUDE_MANIFEST
625!ENDIF
626
627# VS 2017 (VC++ 14.1) requires at minimum Windows 7 SP1 (with latest Windows Updates)
628
629# For XP support in >= VS 2013 (VC++ 12.0), subsystem is always in Config.pm
630# LINK_FLAGS else subsystem is only needed for EXE building, not XS DLL building
631# Console vs GUI makes no difference for DLLs, so use default for cleaner
632# building cmd lines
633!IF "$(CCTYPE)" == "MSVC120" || "$(CCTYPE)" == "MSVC140"
634!  IF "$(WIN64)" == "define"
635LINK_FLAGS	= $(LINK_FLAGS) -subsystem:console,"5.02"
636!  ELSE
637LINK_FLAGS	= $(LINK_FLAGS) -subsystem:console,"5.01"
638!  ENDIF
639
640!ELSE
641PRIV_LINK_FLAGS	= $(PRIV_LINK_FLAGS) -subsystem:console
642!ENDIF
643
644BLINK_FLAGS	= $(PRIV_LINK_FLAGS) $(LINK_FLAGS)
645
646#################### do not edit below this line #######################
647############# NO USER-SERVICEABLE PARTS BEYOND THIS POINT ##############
648
649o = .obj
650
651#
652# Rules
653#
654
655#clear the list, we dont support .cxx .bas .cbl .for .pas .f .f90
656# .asm .cpp are not currently used but they are included for completeness
657.SUFFIXES :
658.SUFFIXES : .c $(o) .cpp .asm .dll .lib .exe .rc .res
659
660.c$(o):
661	$(CC) -c -I$(<D) $(CFLAGS_O) $(OBJOUT_FLAG)$@ $<
662
663.c.i:
664	$(CC) -c -I$(<D) $(CFLAGS_O) -P $(OBJOUT_FLAG)$@ $<
665
666.y.c:
667	$(NOOP)
668
669$(o).dll:
670	$(LINK32) -dll -implib:$(*B).lib -def:$(*B).def \
671	    -out:$@ $(BLINK_FLAGS) $(LIBFILES) $< $(LIBPERL)
672	$(EMBED_DLL_MANI)
673
674.rc.res:
675	$(RSC) -i.. $(RSC_FLAGS) $<
676
677#
678# various targets
679
680# makedef.pl must be updated if this changes, and this should normally
681# only change when there is an incompatible revision of the public API.
682PERLIMPLIB	= ..\perl528.lib
683PERLSTATICLIB	= ..\perl528s.lib
684PERLDLL		= ..\perl528.dll
685
686MINIPERL	= ..\miniperl.exe
687MINIDIR		= .\mini
688PERLEXE		= ..\perl.exe
689WPERLEXE	= ..\wperl.exe
690PERLEXESTATIC	= ..\perl-static.exe
691GLOBEXE		= ..\perlglob.exe
692CONFIGPM	= ..\lib\Config.pm ..\lib\Config_heavy.pl
693GENUUDMAP	= ..\generate_uudmap.exe
694!IF "$(BUILD_STATIC)" == "define" || "$(ALL_STATIC)" == "define"
695PERLSTATIC	= static
696!ELSE
697PERLSTATIC	= 
698!ENDIF
699
700# Unicode data files generated by mktables
701FIRSTUNIFILE     = ..\lib\unicore\Decomposition.pl
702UNIDATAFILES	 = ..\lib\unicore\Decomposition.pl \
703		   ..\lib\unicore\CombiningClass.pl ..\lib\unicore\Name.pl \
704		   ..\lib\unicore\Heavy.pl ..\lib\unicore\mktables.lst     \
705		   ..\lib\unicore\UCD.pl ..\lib\unicore\Name.pm            \
706		   ..\lib\unicore\TestProp.pl
707
708# Directories of Unicode data files generated by mktables
709UNIDATADIR1	= ..\lib\unicore\To
710UNIDATADIR2	= ..\lib\unicore\lib
711
712PERLEXE_MANIFEST= .\perlexe.manifest
713PERLEXE_ICO	= .\perlexe.ico
714PERLEXE_RES	= .\perlexe.res
715PERLDLL_RES	=
716
717# Nominate a target which causes extensions to be re-built
718# This used to be $(PERLEXE), but at worst it is the .dll that they depend
719# on and really only the interface - i.e. the .def file used to export symbols
720# from the .dll
721PERLDEP		= perldll.def
722
723PL2BAT		= bin\pl2bat.pl
724GLOBBAT		= bin\perlglob.bat
725
726UTILS		=			\
727		..\utils\h2ph		\
728		..\utils\splain		\
729		..\utils\perlbug	\
730		..\utils\pl2pm 		\
731		..\utils\h2xs		\
732		..\utils\perldoc	\
733		..\utils\perlivp	\
734		..\utils\libnetcfg	\
735		..\utils\enc2xs		\
736		..\utils\encguess		\
737		..\utils\piconv		\
738		..\utils\corelist	\
739		..\utils\cpan		\
740		..\utils\xsubpp		\
741		..\utils\prove		\
742		..\utils\ptar		\
743		..\utils\ptardiff	\
744		..\utils\ptargrep	\
745		..\utils\zipdetails	\
746		..\utils\shasum		\
747		..\utils\instmodsh	\
748		..\utils\json_pp	\
749		..\utils\pod2html	\
750		bin\exetype.pl		\
751		bin\runperl.pl		\
752		bin\pl2bat.pl		\
753		bin\perlglob.pl		\
754		bin\search.pl
755
756MAKE		= nmake -nologo
757MAKE_BARE	= nmake
758
759CFGSH_TMPL	= config.vc
760CFGH_TMPL	= config_H.vc
761
762XCOPY		= xcopy /f /r /i /d /y
763RCOPY		= xcopy /f /r /i /e /d /y
764NOOP		= @rem
765NULL		=
766
767DEL		= del
768
769MICROCORE_SRC	=		\
770		..\av.c		\
771		..\caretx.c	\
772		..\deb.c	\
773		..\doio.c	\
774		..\doop.c	\
775		..\dquote.c	\
776		..\dump.c	\
777		..\globals.c	\
778		..\gv.c		\
779		..\mro_core.c	\
780		..\hv.c		\
781		..\locale.c	\
782		..\keywords.c	\
783		..\mathoms.c    \
784		..\mg.c		\
785		..\numeric.c	\
786		..\op.c		\
787		..\pad.c	\
788		..\perl.c	\
789		..\perlapi.c	\
790		..\perly.c	\
791		..\pp.c		\
792		..\pp_ctl.c	\
793		..\pp_hot.c	\
794		..\pp_pack.c	\
795		..\pp_sort.c	\
796		..\pp_sys.c	\
797		..\reentr.c	\
798		..\regcomp.c	\
799		..\regexec.c	\
800		..\run.c	\
801		..\scope.c	\
802		..\sv.c		\
803		..\taint.c	\
804		..\time64.c	\
805		..\toke.c	\
806		..\universal.c	\
807		..\utf8.c	\
808		..\util.c
809
810EXTRACORE_SRC	= $(EXTRACORE_SRC) perllib.c
811
812!IF "$(PERL_MALLOC)" == "define"
813EXTRACORE_SRC	= $(EXTRACORE_SRC) ..\malloc.c
814!ENDIF
815
816EXTRACORE_SRC	= $(EXTRACORE_SRC) ..\perlio.c
817
818WIN32_SRC	=		\
819		.\win32.c	\
820		.\win32io.c	\
821		.\win32sck.c	\
822		.\win32thread.c	\
823		.\fcrypt.c
824
825CORE_NOCFG_H	=		\
826		..\av.h		\
827		..\cop.h	\
828		..\cv.h		\
829		..\dosish.h	\
830		..\embed.h	\
831		..\form.h	\
832		..\gv.h		\
833		..\handy.h	\
834		..\hv.h		\
835		..\hv_func.h	\
836		..\iperlsys.h	\
837		..\mg.h		\
838		..\nostdio.h	\
839		..\op.h		\
840		..\opcode.h	\
841		..\perl.h	\
842		..\perlapi.h	\
843		..\perlsdio.h	\
844		..\perly.h	\
845		..\pp.h		\
846		..\proto.h	\
847		..\regcomp.h	\
848		..\regexp.h	\
849		..\scope.h	\
850		..\sv.h		\
851		..\thread.h	\
852		..\unixish.h	\
853		..\utf8.h	\
854		..\util.h	\
855		..\warnings.h	\
856		..\XSUB.h	\
857		..\EXTERN.h	\
858		..\perlvars.h	\
859		..\intrpvar.h	\
860		.\include\dirent.h	\
861		.\include\netdb.h	\
862		.\include\sys\errno2.h	\
863		.\include\sys\socket.h	\
864		.\win32.h
865
866CORE_H		= $(CORE_NOCFG_H) .\config.h ..\git_version.h
867
868UUDMAP_H	= ..\uudmap.h
869BITCOUNT_H	= ..\bitcount.h
870MG_DATA_H	= ..\mg_data.h
871GENERATED_HEADERS = $(UUDMAP_H) $(BITCOUNT_H) $(MG_DATA_H)
872
873MICROCORE_OBJ	= $(MICROCORE_SRC:.c=.obj)
874CORE_OBJ	= $(MICROCORE_OBJ) $(EXTRACORE_SRC:.c=.obj)
875WIN32_OBJ	= $(WIN32_SRC:.c=.obj)
876MINICORE_OBJ	= $(MICROCORE_OBJ:..\=.\mini\)	\
877		  $(MINIDIR)\miniperlmain$(o)	\
878		  $(MINIDIR)\perlio$(o)
879MINIWIN32_OBJ	= $(WIN32_OBJ:.\=.\mini\)
880MINI_OBJ	= $(MINICORE_OBJ) $(MINIWIN32_OBJ)
881DLL_OBJ		= $(DYNALOADER)
882GENUUDMAP_OBJ	= $(GENUUDMAP:.exe=.obj)
883
884PERLDLL_OBJ	= $(CORE_OBJ)
885PERLEXE_OBJ	= perlmain$(o)
886PERLEXEST_OBJ	= perlmainst$(o)
887
888PERLDLL_OBJ	= $(PERLDLL_OBJ) $(WIN32_OBJ) $(DLL_OBJ)
889
890!IF "$(USE_SETARGV)" != ""
891SETARGV_OBJ	= setargv$(o)
892!ENDIF
893
894!IF "$(ALL_STATIC)" == "define"
895# some exclusions, unfortunately, until fixed:
896#  - MakeMaker isn't capable enough for SDBM_File (small bug)
897STATIC_EXT	= * !SDBM_File
898!ELSE
899# specify static extensions here, for example:
900# (be sure to include Win32CORE to load Win32 on demand)
901#STATIC_EXT	= Win32CORE Cwd Compress/Raw/Zlib
902STATIC_EXT	= Win32CORE
903!ENDIF
904
905DYNALOADER	= ..\DynaLoader$(o)
906
907CFG_VARS	=					\
908		"INST_TOP=$(INST_TOP)"			\
909		"INST_VER=$(INST_VER)"			\
910		"INST_ARCH=$(INST_ARCH)"		\
911		"archname=$(ARCHNAME)"			\
912		"cc=$(CC)"				\
913		"ld=$(LINK32)"				\
914		"ccflags=$(EXTRACFLAGS) $(OPTIMIZE:"=\") $(DEFINES) $(BUILDOPT)"	\
915		"usecplusplus=$(USE_CPLUSPLUS)"		\
916		"cf_email=$(EMAIL)"	 		\
917		"d_mymalloc=$(PERL_MALLOC)"		\
918		"libs=$(LIBFILES)"			\
919		"incpath=$(CCINCDIR:"=\")"		\
920		"libperl=$(PERLIMPLIB:..\=)"		\
921		"libpth=$(CCLIBDIR:"=\");$(EXTRALIBDIRS:"=\")"	\
922		"libc=$(LIBC)"				\
923		"make=$(MAKE_BARE)"				\
924		"static_ext=$(STATIC_EXT)"		\
925		"usethreads=$(USE_ITHREADS)"		\
926		"useithreads=$(USE_ITHREADS)"		\
927		"usemultiplicity=$(USE_MULTI)"		\
928		"use64bitint=$(USE_64_BIT_INT)"		\
929		"uselongdouble=undef"			\
930		"uselargefiles=$(USE_LARGE_FILES)"	\
931		"usesitecustomize=$(USE_SITECUST)"	\
932		"default_inc_excludes_dot=$(DEFAULT_INC_EXCLUDES_DOT)"	\
933		"LINK_FLAGS=$(LINK_FLAGS:"=\")"		\
934		"optimize=$(OPTIMIZE:"=\")"		\
935		"WIN64=$(WIN64)"
936
937#
938# Top targets
939#
940
941all : .\config.h ..\git_version.h $(GLOBEXE) $(CONFIGPM) \
942	$(UNIDATAFILES) MakePPPort $(PERLEXE) Extensions_nonxs Extensions PostExt \
943	$(PERLSTATIC)
944	@echo	Everything is up to date. '$(MAKE_BARE) test' to run test suite.
945
946regnodes : ..\regnodes.h
947
948..\regcomp$(o) : ..\regnodes.h ..\regcharclass.h
949
950..\regexec$(o) : ..\regnodes.h ..\regcharclass.h
951
952reonly : regnodes .\config.h ..\git_version.h $(GLOBEXE) $(CONFIGPM) \
953	$(UNIDATAFILES) $(PERLEXE) Extensions_reonly
954	@echo	Perl and 're' are up to date.
955
956static: $(PERLEXESTATIC)
957
958#------------------------------------------------------------
959
960$(GLOBEXE) : perlglob$(o)
961	$(LINK32) $(BLINK_FLAGS) $(LIBFILES) -out:$@ \
962	    perlglob$(o) setargv$(o)
963	$(EMBED_EXE_MANI)
964
965perlglob$(o)  : perlglob.c
966
967#
968# Copy the template config.h and set configurables at the end of it
969# as per the options chosen and compiler used.
970# Note: This config.h is only used to build miniperl.exe anyway, but
971# it's as well to have its options correct to be sure that it builds
972# and so that it's "-V" options are correct for use by makedef.pl. The
973# real config.h used to build perl.exe is generated from the top-level
974# config_h.SH by config_h.PL (run by miniperl.exe).
975#
976.\config.h : $(CFGH_TMPL)
977	-del /f config.h
978	copy $(CFGH_TMPL) config.h
979	@echo.>>$@
980	@echo #ifndef _config_h_footer_>>$@
981	@echo #define _config_h_footer_>>$@
982!IF "$(CCTYPE)" == "MSVC140" || "$(CCTYPE)" == "MSVC141"
983	@echo #undef FILE_ptr>>$@
984	@echo #define FILE_ptr(fp) PERLIO_FILE_ptr(fp)>>$@
985	@echo #undef FILE_cnt>>$@
986	@echo #define FILE_cnt(fp) PERLIO_FILE_cnt(fp)>>$@
987	@echo #undef FILE_base>>$@
988	@echo #define FILE_base(fp) PERLIO_FILE_base(fp)>>$@
989	@echo #undef FILE_bufsiz>>$@
990	@echo #define FILE_bufsiz(fp) (PERLIO_FILE_cnt(fp) + PERLIO_FILE_ptr(fp) - PERLIO_FILE_base(fp))>>$@
991	@echo #define I_STDBOOL>>$@
992!ENDIF
993	@echo #undef Off_t>>$@
994	@echo #undef LSEEKSIZE>>$@
995	@echo #undef Off_t_size>>$@
996	@echo #undef PTRSIZE>>$@
997	@echo #undef SSize_t>>$@
998	@echo #undef HAS_ATOLL>>$@
999	@echo #undef HAS_STRTOLL>>$@
1000	@echo #undef HAS_STRTOULL>>$@
1001	@echo #undef IVTYPE>>$@
1002	@echo #undef UVTYPE>>$@
1003	@echo #undef IVSIZE>>$@
1004	@echo #undef UVSIZE>>$@
1005	@echo #undef NV_PRESERVES_UV>>$@
1006	@echo #undef NV_PRESERVES_UV_BITS>>$@
1007	@echo #undef IVdf>>$@
1008	@echo #undef UVuf>>$@
1009	@echo #undef UVof>>$@
1010	@echo #undef UVxf>>$@
1011	@echo #undef UVXf>>$@
1012	@echo #undef USE_64_BIT_INT>>$@
1013	@echo #undef Size_t_size>>$@
1014	@echo #undef USE_CPLUSPLUS>>$@
1015!IF "$(USE_LARGE_FILES)"=="define"
1016	@echo #define Off_t __int64>>$@
1017	@echo #define LSEEKSIZE ^8>>$@
1018	@echo #define Off_t_size ^8>>$@
1019!ELSE
1020	@echo #define Off_t long>>$@
1021	@echo #define LSEEKSIZE ^4>>$@
1022	@echo #define Off_t_size ^4>>$@
1023!ENDIF
1024!IF "$(WIN64)"=="define"
1025	@echo #define PTRSIZE ^8>>$@
1026	@echo #define SSize_t __int64>>$@
1027	@echo #define HAS_ATOLL>>$@
1028	@echo #define HAS_STRTOLL>>$@
1029	@echo #define HAS_STRTOULL>>$@
1030	@echo #define Size_t_size ^8>>$@
1031!ELSE
1032	@echo #define PTRSIZE ^4>>$@
1033	@echo #define SSize_t int>>$@
1034	@echo #undef HAS_ATOLL>>$@
1035	@echo #undef HAS_STRTOLL>>$@
1036	@echo #undef HAS_STRTOULL>>$@
1037	@echo #define Size_t_size ^4>>$@
1038!ENDIF
1039!IF "$(USE_64_BIT_INT)"=="define"
1040	@echo #define IVTYPE __int64>>$@
1041	@echo #define UVTYPE unsigned __int64>>$@
1042	@echo #define IVSIZE ^8>>$@
1043	@echo #define UVSIZE ^8>>$@
1044	@echo #undef NV_PRESERVES_UV>>$@
1045	@echo #define NV_PRESERVES_UV_BITS 53>>$@
1046	@echo #define IVdf "I64d">>$@
1047	@echo #define UVuf "I64u">>$@
1048	@echo #define UVof "I64o">>$@
1049	@echo #define UVxf "I64x">>$@
1050	@echo #define UVXf "I64X">>$@
1051	@echo #define USE_64_BIT_INT>>$@
1052!ELSE
1053	@echo #define IVTYPE long>>$@
1054	@echo #define UVTYPE unsigned long>>$@
1055	@echo #define IVSIZE ^4>>$@
1056	@echo #define UVSIZE ^4>>$@
1057	@echo #define NV_PRESERVES_UV>>$@
1058	@echo #define NV_PRESERVES_UV_BITS 32>>$@
1059	@echo #define IVdf "ld">>$@
1060	@echo #define UVuf "lu">>$@
1061	@echo #define UVof "lo">>$@
1062	@echo #define UVxf "lx">>$@
1063	@echo #define UVXf "lX">>$@
1064	@echo #undef USE_64_BIT_INT>>$@
1065!ENDIF
1066!IF "$(USE_CPLUSPLUS)"=="define"
1067	@echo #define USE_CPLUSPLUS>>$@
1068!ELSE
1069	@echo #undef USE_CPLUSPLUS>>$@
1070!ENDIF
1071	@echo #endif>>$@
1072
1073..\git_version.h : $(MINIPERL) ..\make_patchnum.pl
1074	cd .. && miniperl -Ilib make_patchnum.pl && cd win32
1075
1076# make sure that we recompile perl.c if the git version changes
1077..\perl$(o) : ..\git_version.h
1078
1079..\config.sh : $(CFGSH_TMPL) config_sh.PL FindExt.pm $(MINIPERL)
1080	$(MINIPERL) -I..\lib config_sh.PL $(CFG_VARS) $(CFGSH_TMPL) > ..\config.sh
1081
1082# This target is for when changes to the main config.sh happen.
1083# Edit config.vc, then make perl in a minimal configuration (i.e. with MULTI,
1084# ITHREADS, IMP_SYS and LARGE_FILES off), then make this target
1085# to regenerate config_H.vc.
1086regen_config_h:
1087	$(MINIPERL) -I..\lib config_sh.PL $(CFG_VARS) $(CFGSH_TMPL) > ..\config.sh
1088	$(MINIPERL) -I..\lib ..\configpm --chdir=..
1089	-del /f $(CFGH_TMPL)
1090	-$(MINIPERL) -I..\lib config_h.PL
1091	rename config.h $(CFGH_TMPL)
1092
1093$(CONFIGPM) : $(MINIPERL) ..\config.sh config_h.PL
1094	$(MINIPERL) -I..\lib ..\configpm --chdir=..
1095	$(XCOPY) ..\*.h $(COREDIR)\*.*
1096	$(XCOPY) *.h $(COREDIR)\*.*
1097	$(RCOPY) include $(COREDIR)\*.*
1098	-$(MINIPERL) -I..\lib config_h.PL
1099	if errorlevel 1 $(MAKE) /$(MAKEFLAGS) $(CONFIGPM)
1100
1101# See the comment in Makefile.SH explaining this seemingly cranky ordering
1102$(MINIPERL) : ..\lib\buildcustomize.pl 
1103
1104..\lib\buildcustomize.pl : $(MINIDIR) $(MINI_OBJ) ..\write_buildcustomize.pl
1105	$(LINK32) -out:$(MINIPERL) @<<
1106	$(BLINK_FLAGS) $(DELAYLOAD) $(MINIDELAYLOAD) $(LIBFILES) $(MINI_OBJ)
1107<<
1108	$(EMBED_EXE_MANI:..\lib\buildcustomize.pl=..\miniperl.exe)
1109	$(MINIPERL) -I..\lib -f ..\write_buildcustomize.pl ..
1110
1111$(MINIDIR) :
1112	if not exist "$(MINIDIR)" mkdir "$(MINIDIR)"
1113
1114$(MINICORE_OBJ) : $(CORE_NOCFG_H)
1115	$(CC) -c $(CFLAGS) -DPERL_EXTERNAL_GLOB -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ ..\$(*F).c
1116
1117$(MINIWIN32_OBJ) : $(CORE_NOCFG_H)
1118	$(CC) -c $(CFLAGS) -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ $(*F).c
1119
1120# -DPERL_IMPLICIT_SYS needs C++ for perllib.c
1121# This is the only file that depends on perlhost.h, vmem.h, and vdir.h
1122!IF "$(USE_IMP_SYS)" == "define"
1123perllib$(o)	: perllib.c .\perlhost.h .\vdir.h .\vmem.h
1124	$(CC) -c -I. $(CFLAGS_O) $(CXX_FLAG) $(OBJOUT_FLAG)$@ perllib.c
1125!ENDIF
1126
1127# 1. we don't want to rebuild miniperl.exe when config.h changes
1128# 2. we don't want to rebuild miniperl.exe with non-default config.h
1129# 3. we can't have miniperl.exe depend on git_version.h, as miniperl creates it
1130$(MINI_OBJ)	: $(CORE_NOCFG_H)
1131
1132$(WIN32_OBJ)	: $(CORE_H)
1133$(CORE_OBJ)	: $(CORE_H)
1134$(DLL_OBJ)	: $(CORE_H)
1135
1136perldll.def : $(MINIPERL) $(CONFIGPM) ..\embed.fnc ..\makedef.pl create_perllibst_h.pl
1137	$(MINIPERL) -I..\lib create_perllibst_h.pl
1138	$(MINIPERL) -I..\lib -w ..\makedef.pl PLATFORM=win32 $(OPTIMIZE) $(DEFINES) $(BUILDOPT) \
1139	    CCTYPE=$(CCTYPE) TARG_DIR=..\ > perldll.def
1140
1141$(PERLDLL): perldll.def $(PERLDLL_OBJ) $(PERLDLL_RES) Extensions_static
1142	$(LINK32) -dll -def:perldll.def -base:0x28000000 -out:$@ @Extensions_static @<<
1143		$(BLINK_FLAGS) $(DELAYLOAD) $(LIBFILES) $(PERLDLL_OBJ) $(PERLDLL_RES)
1144<<
1145	$(EMBED_DLL_MANI)
1146	$(XCOPY) $(PERLIMPLIB) $(COREDIR)
1147
1148$(PERLSTATICLIB): Extensions_static
1149	$(LIB32) $(LIB_FLAGS) -out:$@ @Extensions_static @<<
1150		$(PERLDLL_OBJ)
1151<<
1152	$(XCOPY) $(PERLSTATICLIB) $(COREDIR)
1153
1154$(PERLEXE_RES): perlexe.rc $(PERLEXE_MANIFEST) $(PERLEXE_ICO)
1155
1156$(MINIDIR)\globals$(o) : $(GENERATED_HEADERS)
1157
1158$(UUDMAP_H) $(MG_DATA_H) : $(BITCOUNT_H)
1159
1160$(BITCOUNT_H) : $(GENUUDMAP)
1161	$(GENUUDMAP) $(GENERATED_HEADERS)
1162
1163$(GENUUDMAP_OBJ) : ..\mg_raw.h
1164
1165$(GENUUDMAP) : $(GENUUDMAP_OBJ)
1166	$(LINK32) -out:$@ @<<
1167		$(BLINK_FLAGS) $(LIBFILES) $(GENUUDMAP_OBJ)
1168<<
1169	$(EMBED_EXE_MANI)
1170
1171perlmain.c : runperl.c
1172	copy runperl.c perlmain.c
1173
1174perlmain$(o) : perlmain.c
1175	$(CC) $(CFLAGS_O:-DPERLDLL=-UPERLDLL) $(OBJOUT_FLAG)$@ -c perlmain.c
1176
1177perlmainst.c : runperl.c
1178	copy runperl.c perlmainst.c
1179
1180perlmainst$(o) : perlmainst.c
1181	$(CC) $(CFLAGS_O) $(OBJOUT_FLAG)$@ -c perlmainst.c
1182
1183$(PERLEXE): $(PERLDLL) $(CONFIGPM) $(PERLEXE_OBJ) $(PERLEXE_RES)
1184	$(LINK32) -out:$@ $(BLINK_FLAGS) \
1185	    $(PERLEXE_OBJ) $(PERLEXE_RES) $(PERLIMPLIB) $(LIBFILES) $(SETARGV_OBJ)
1186	$(EMBED_EXE_MANI)
1187	copy $(PERLEXE) $(WPERLEXE)
1188	$(MINIPERL) -I..\lib bin\exetype.pl $(WPERLEXE) WINDOWS
1189
1190$(PERLEXESTATIC): $(PERLSTATICLIB) $(CONFIGPM) $(PERLEXEST_OBJ) $(PERLEXE_RES)
1191	$(LINK32) -out:$@ $(BLINK_FLAGS) \
1192	    $(PERLEXEST_OBJ) $(PERLEXE_RES) $(PERLSTATICLIB) $(LIBFILES) $(SETARGV_OBJ)
1193	$(EMBED_EXE_MANI)
1194
1195MakePPPort: $(MINIPERL) $(CONFIGPM) Extensions_nonxs
1196	$(MINIPERL) -I..\lib ..\mkppport
1197
1198#-------------------------------------------------------------------------------
1199# There's no direct way to mark a dependency on
1200# DynaLoader.pm, so this will have to do
1201Extensions: ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) $(DYNALOADER)
1202	$(XCOPY) ..\*.h $(COREDIR)\*.*
1203	$(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic
1204
1205Extensions_reonly: ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) $(DYNALOADER)
1206	$(XCOPY) ..\*.h $(COREDIR)\*.*
1207	$(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic +re
1208
1209Extensions_static : ..\make_ext.pl ..\lib\buildcustomize.pl list_static_libs.pl $(PERLDEP) $(CONFIGPM) Extensions_nonxs
1210	$(XCOPY) ..\*.h $(COREDIR)\*.*
1211	$(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --static
1212	$(MINIPERL) -I..\lib list_static_libs.pl > Extensions_static
1213
1214Extensions_nonxs: ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) ..\pod\perlfunc.pod
1215	$(XCOPY) ..\*.h $(COREDIR)\*.*
1216	$(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --nonxs
1217
1218$(DYNALOADER) : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) Extensions_nonxs
1219	$(XCOPY) ..\*.h $(COREDIR)\*.*
1220	$(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --dynaloader
1221
1222Extensions_clean: 
1223	-if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=clean
1224
1225Extensions_realclean: 
1226	-if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=realclean
1227
1228PostExt: ..\lib\Storable\Limit.pm
1229
1230..\lib\Storable\Limit.pm: $(PERLEXE) Extensions
1231	cd ..\dist\Storable && $(MAKE) lib\Storable\Limit.pm
1232	if not exist ..\lib\Storable mkdir ..\lib\Storable
1233	copy ..\dist\Storable\lib\Storable\Limit.pm ..\lib\Storable\Limit.pm
1234
1235#-------------------------------------------------------------------------------
1236
1237doc: $(PERLEXE) ..\pod\perltoc.pod
1238	$(PERLEXE) ..\installhtml --podroot=.. --htmldir=$(HTMLDIR) \
1239	    --podpath=pod:lib:utils --htmlroot="file://$(INST_HTML::=|)" \
1240	    --recurse
1241
1242..\utils\Makefile: $(CONFIGPM) ..\utils\Makefile.PL
1243	$(MINIPERL) -I..\lib ..\utils\Makefile.PL ..
1244
1245# Note that this next section is parsed (and regenerated) by pod/buildtoc
1246# so please check that script before making structural changes here
1247
1248utils: $(PERLEXE) ..\utils\Makefile
1249	cd ..\utils
1250	$(MAKE) PERL=$(MINIPERL)
1251	cd ..\pod
1252	copy ..\README.aix      ..\pod\perlaix.pod
1253	copy ..\README.amiga    ..\pod\perlamiga.pod
1254	copy ..\README.android  ..\pod\perlandroid.pod
1255	copy ..\README.bs2000   ..\pod\perlbs2000.pod
1256	copy ..\README.ce       ..\pod\perlce.pod
1257	copy ..\README.cn       ..\pod\perlcn.pod
1258	copy ..\README.cygwin   ..\pod\perlcygwin.pod
1259	copy ..\README.dos      ..\pod\perldos.pod
1260	copy ..\README.freebsd  ..\pod\perlfreebsd.pod
1261	copy ..\README.haiku    ..\pod\perlhaiku.pod
1262	copy ..\README.hpux     ..\pod\perlhpux.pod
1263	copy ..\README.hurd     ..\pod\perlhurd.pod
1264	copy ..\README.irix     ..\pod\perlirix.pod
1265	copy ..\README.jp       ..\pod\perljp.pod
1266	copy ..\README.ko       ..\pod\perlko.pod
1267	copy ..\README.linux    ..\pod\perllinux.pod
1268	copy ..\README.macos    ..\pod\perlmacos.pod
1269	copy ..\README.macosx   ..\pod\perlmacosx.pod
1270	copy ..\README.netware  ..\pod\perlnetware.pod
1271	copy ..\README.openbsd  ..\pod\perlopenbsd.pod
1272	copy ..\README.os2      ..\pod\perlos2.pod
1273	copy ..\README.os390    ..\pod\perlos390.pod
1274	copy ..\README.os400    ..\pod\perlos400.pod
1275	copy ..\README.plan9    ..\pod\perlplan9.pod
1276	copy ..\README.qnx      ..\pod\perlqnx.pod
1277	copy ..\README.riscos   ..\pod\perlriscos.pod
1278	copy ..\README.solaris  ..\pod\perlsolaris.pod
1279	copy ..\README.symbian  ..\pod\perlsymbian.pod
1280	copy ..\README.synology ..\pod\perlsynology.pod
1281	copy ..\README.tru64    ..\pod\perltru64.pod
1282	copy ..\README.tw       ..\pod\perltw.pod
1283	copy ..\README.vos      ..\pod\perlvos.pod
1284	copy ..\README.win32    ..\pod\perlwin32.pod
1285	copy ..\pod\perldelta.pod ..\pod\perl5281delta.pod
1286	cd ..\win32
1287	$(PERLEXE) $(PL2BAT) $(UTILS)
1288	$(MINIPERL) -I..\lib ..\autodoc.pl ..
1289	$(MINIPERL) -I..\lib ..\pod\perlmodlib.PL -q ..
1290
1291..\pod\perltoc.pod: $(PERLEXE) Extensions Extensions_nonxs
1292	$(PERLEXE) -f ..\pod\buildtoc -q
1293
1294# Note that the pod cleanup in this next section is parsed (and regenerated
1295# by pod/buildtoc so please check that script before making changes here
1296
1297distclean: realclean
1298	-del /f $(MINIPERL) $(PERLEXE) $(PERLDLL) $(GLOBEXE) \
1299		$(PERLIMPLIB) ..\miniperl.lib $(PERLEXESTATIC) $(PERLSTATICLIB)
1300	-del /f $(LIBDIR)\Encode.pm $(LIBDIR)\encoding.pm $(LIBDIR)\Errno.pm
1301	-del /f $(LIBDIR)\Config.pod $(LIBDIR)\POSIX.pod $(LIBDIR)\threads.pm
1302	-del /f $(LIBDIR)\.exists $(LIBDIR)\attributes.pm $(LIBDIR)\DynaLoader.pm
1303	-del /f $(LIBDIR)\Fcntl.pm $(LIBDIR)\IO.pm $(LIBDIR)\Opcode.pm
1304	-del /f $(LIBDIR)\ops.pm $(LIBDIR)\Safe.pm
1305	-del /f $(LIBDIR)\SDBM_File.pm $(LIBDIR)\Socket.pm $(LIBDIR)\POSIX.pm
1306	-del /f $(LIBDIR)\B.pm $(LIBDIR)\O.pm $(LIBDIR)\re.pm
1307	-del /f $(LIBDIR)\File\Glob.pm
1308	-del /f $(LIBDIR)\Storable.pm
1309	-del /f $(LIBDIR)\Sys\Hostname.pm
1310	-del /f $(LIBDIR)\Time\HiRes.pm
1311	-del /f $(LIBDIR)\Unicode\Normalize.pm
1312	-del /f $(LIBDIR)\Math\BigInt\FastCalc.pm
1313	-del /f $(LIBDIR)\Storable.pm $(LIBDIR)\Storable\Limit.pm
1314	-del /f $(LIBDIR)\Win32.pm
1315	-del /f $(LIBDIR)\Win32CORE.pm
1316	-del /f $(LIBDIR)\Win32API\File.pm
1317	-del /f $(LIBDIR)\Win32API\File\cFile.pc
1318	-del /f $(LIBDIR)\buildcustomize.pl
1319	-del /f $(DISTDIR)\XSLoader\XSLoader.pm
1320	-del /f *.def *.map
1321	-if exist $(LIBDIR)\Amiga rmdir /s /q $(LIBDIR)\Amiga
1322	-if exist $(LIBDIR)\App rmdir /s /q $(LIBDIR)\App
1323	-if exist $(LIBDIR)\Archive rmdir /s /q $(LIBDIR)\Archive
1324	-if exist $(LIBDIR)\Attribute rmdir /s /q $(LIBDIR)\Attribute
1325	-if exist $(LIBDIR)\autodie rmdir /s /q $(LIBDIR)\autodie
1326	-if exist $(LIBDIR)\Carp rmdir /s /q $(LIBDIR)\Carp
1327	-if exist $(LIBDIR)\Compress rmdir /s /q $(LIBDIR)\Compress
1328	-if exist $(LIBDIR)\Config\Perl rmdir /s /q $(LIBDIR)\Config\Perl
1329	-if exist $(LIBDIR)\CPAN rmdir /s /q $(LIBDIR)\CPAN
1330	-if exist $(LIBDIR)\Data rmdir /s /q $(LIBDIR)\Data
1331	-if exist $(LIBDIR)\Devel rmdir /s /q $(LIBDIR)\Devel
1332	-if exist $(LIBDIR)\Digest rmdir /s /q $(LIBDIR)\Digest
1333	-if exist $(LIBDIR)\Encode rmdir /s /q $(LIBDIR)\Encode
1334	-if exist $(LIBDIR)\encoding rmdir /s /q $(LIBDIR)\encoding
1335	-if exist $(LIBDIR)\Exporter rmdir /s /q $(LIBDIR)\Exporter
1336	-if exist $(LIBDIR)\ExtUtils\CBuilder rmdir /s /q $(LIBDIR)\ExtUtils\CBuilder
1337	-if exist $(LIBDIR)\ExtUtils\Command rmdir /s /q $(LIBDIR)\ExtUtils\Command
1338	-if exist $(LIBDIR)\ExtUtils\Constant rmdir /s /q $(LIBDIR)\ExtUtils\Constant
1339	-if exist $(LIBDIR)\ExtUtils\Liblist rmdir /s /q $(LIBDIR)\ExtUtils\Liblist
1340	-if exist $(LIBDIR)\ExtUtils\MakeMaker rmdir /s /q $(LIBDIR)\ExtUtils\MakeMaker
1341	-if exist $(LIBDIR)\ExtUtils\ParseXS rmdir /s /q $(LIBDIR)\ExtUtils\ParseXS
1342	-if exist $(LIBDIR)\ExtUtils\Typemaps rmdir /s /q $(LIBDIR)\ExtUtils\Typemaps
1343	-if exist $(LIBDIR)\File\Spec rmdir /s /q $(LIBDIR)\File\Spec
1344	-if exist $(LIBDIR)\Filter rmdir /s /q $(LIBDIR)\Filter
1345	-if exist $(LIBDIR)\Hash rmdir /s /q $(LIBDIR)\Hash
1346	-if exist $(LIBDIR)\HTTP rmdir /s /q $(LIBDIR)\HTTP
1347	-if exist $(LIBDIR)\I18N rmdir /s /q $(LIBDIR)\I18N
1348	-if exist $(LIBDIR)\inc rmdir /s /q $(LIBDIR)\inc
1349	-if exist $(LIBDIR)\IO rmdir /s /q $(LIBDIR)\IO
1350	-if exist $(LIBDIR)\IPC rmdir /s /q $(LIBDIR)\IPC
1351	-if exist $(LIBDIR)\JSON rmdir /s /q $(LIBDIR)\JSON
1352	-if exist $(LIBDIR)\List rmdir /s /q $(LIBDIR)\List
1353	-if exist $(LIBDIR)\Locale rmdir /s /q $(LIBDIR)\Locale
1354	-if exist $(LIBDIR)\Math rmdir /s /q $(LIBDIR)\Math
1355	-if exist $(LIBDIR)\Memoize rmdir /s /q $(LIBDIR)\Memoize
1356	-if exist $(LIBDIR)\MIME rmdir /s /q $(LIBDIR)\MIME
1357	-if exist $(LIBDIR)\Module rmdir /s /q $(LIBDIR)\Module
1358	-if exist $(LIBDIR)\Net\FTP rmdir /s /q $(LIBDIR)\Net\FTP
1359	-if exist $(LIBDIR)\OpenBSD rmdir /s /q $(LIBDIR)\OpenBSD
1360	-if exist $(LIBDIR)\Params rmdir /s /q $(LIBDIR)\Params
1361	-if exist $(LIBDIR)\Parse rmdir /s /q $(LIBDIR)\Parse
1362	-if exist $(LIBDIR)\Perl rmdir /s /q $(LIBDIR)\Perl
1363	-if exist $(LIBDIR)\PerlIO rmdir /s /q $(LIBDIR)\PerlIO
1364	-if exist $(LIBDIR)\Pod\Perldoc rmdir /s /q $(LIBDIR)\Pod\Perldoc
1365	-if exist $(LIBDIR)\Pod\Simple rmdir /s /q $(LIBDIR)\Pod\Simple
1366	-if exist $(LIBDIR)\Pod\Text rmdir /s /q $(LIBDIR)\Pod\Text
1367	-if exist $(LIBDIR)\Scalar rmdir /s /q $(LIBDIR)\Scalar
1368	-if exist $(LIBDIR)\Search rmdir /s /q $(LIBDIR)\Search
1369	-if exist $(LIBDIR)\Sub rmdir /s /q $(LIBDIR)\Sub
1370	-if exist $(LIBDIR)\Sys rmdir /s /q $(LIBDIR)\Sys
1371	-if exist $(LIBDIR)\TAP rmdir /s /q $(LIBDIR)\TAP
1372	-if exist $(LIBDIR)\Term rmdir /s /q $(LIBDIR)\Term
1373	-if exist $(LIBDIR)\Test rmdir /s /q $(LIBDIR)\Test
1374	-if exist $(LIBDIR)\Test2 rmdir /s /q $(LIBDIR)\Test2
1375	-if exist $(LIBDIR)\Text rmdir /s /q $(LIBDIR)\Text
1376	-if exist $(LIBDIR)\Thread rmdir /s /q $(LIBDIR)\Thread
1377	-if exist $(LIBDIR)\threads rmdir /s /q $(LIBDIR)\threads
1378	-if exist $(LIBDIR)\Tie\Hash rmdir /s /q $(LIBDIR)\Tie\Hash
1379	-if exist $(LIBDIR)\Unicode\Collate rmdir /s /q $(LIBDIR)\Unicode\Collate
1380	-if exist $(LIBDIR)\Unicode\Collate\Locale rmdir /s /q $(LIBDIR)\Unicode\Collate\Locale
1381	-if exist $(LIBDIR)\version rmdir /s /q $(LIBDIR)\version
1382	-if exist $(LIBDIR)\VMS rmdir /s /q $(LIBDIR)\VMS
1383	-if exist $(LIBDIR)\Win32API rmdir /s /q $(LIBDIR)\Win32API
1384	-if exist $(LIBDIR)\XS rmdir /s /q $(LIBDIR)\XS
1385	-cd $(PODDIR) && del /f *.html *.bat roffitall \
1386	    perl5281delta.pod perlaix.pod perlamiga.pod perlandroid.pod \
1387	    perlapi.pod perlbs2000.pod perlce.pod perlcn.pod perlcygwin.pod \
1388	    perldos.pod perlfreebsd.pod perlhaiku.pod perlhpux.pod \
1389	    perlhurd.pod perlintern.pod perlirix.pod perljp.pod perlko.pod \
1390	    perllinux.pod perlmacos.pod perlmacosx.pod perlmodlib.pod \
1391	    perlnetware.pod perlopenbsd.pod perlos2.pod perlos390.pod \
1392	    perlos400.pod perlplan9.pod perlqnx.pod perlriscos.pod \
1393	    perlsolaris.pod perlsymbian.pod perlsynology.pod perltoc.pod \
1394	    perltru64.pod perltw.pod perluniprops.pod perlvos.pod \
1395	    perlwin32.pod
1396	-cd ..\utils && del /f h2ph splain perlbug pl2pm h2xs \
1397	    perldoc perlivp libnetcfg enc2xs encguess piconv cpan *.bat \
1398	    xsubpp pod2html instmodsh json_pp prove ptar ptardiff ptargrep shasum corelist zipdetails
1399	-del /f ..\config.sh perlmain.c dlutils.c config.h.new \
1400	        perlmainst.c
1401	-del /f $(CONFIGPM)
1402	-del /f ..\lib\Config_git.pl
1403	-del /f bin\*.bat
1404	-del /f perllibst.h
1405	-del /f $(PERLEXE_RES) perl.base
1406	-cd .. && del /s *.lib *.map *.pdb *.ilk *.bs *$(o) .exists pm_to_blib ppport.h
1407	-cd $(EXTDIR) && del /s *.def Makefile Makefile.old
1408	-cd $(DISTDIR) && del /s *.def Makefile Makefile.old
1409	-cd $(CPANDIR) && del /s *.def Makefile Makefile.old
1410	-del /s ..\utils\Makefile
1411	-if exist $(AUTODIR) rmdir /s /q $(AUTODIR)
1412	-if exist $(COREDIR) rmdir /s /q $(COREDIR)
1413	-if exist pod2htmd.tmp del pod2htmd.tmp
1414	-if exist $(HTMLDIR) rmdir /s /q $(HTMLDIR)
1415	-del /f ..\t\test_state
1416
1417install : all installbare installhtml
1418
1419installbare : utils ..\pod\perltoc.pod
1420	$(PERLEXE) ..\installperl
1421	if exist $(WPERLEXE) $(XCOPY) $(WPERLEXE) $(INST_BIN)\*.*
1422	if exist $(PERLEXESTATIC) $(XCOPY) $(PERLEXESTATIC) $(INST_BIN)\*.*
1423	$(XCOPY) $(GLOBEXE) $(INST_BIN)\*.*
1424	if exist ..\perl*.pdb $(XCOPY) ..\perl*.pdb $(INST_BIN)\*.*
1425	$(XCOPY) bin\*.bat $(INST_SCRIPT)\*.*
1426
1427installhtml : doc
1428	$(RCOPY) $(HTMLDIR)\*.* $(INST_HTML)\*.*
1429
1430inst_lib : $(CONFIGPM)
1431	$(RCOPY) ..\lib $(INST_LIB)\*.*
1432
1433$(UNIDATAFILES) ..\pod\perluniprops.pod : $(MINIPERL) $(CONFIGPM) ..\lib\unicore\mktables Extensions_nonxs
1434	cd ..\lib\unicore && \
1435	..\$(MINIPERL) -I.. mktables -P ..\..\pod -maketest -makelist -p -check $@ $(FIRSTUNIFILE)
1436
1437minitest : .\config.h $(MINIPERL) ..\git_version.h $(GLOBEXE) $(CONFIGPM) $(UNIDATAFILES)
1438	$(XCOPY) $(MINIPERL) ..\t\$(NULL)
1439	if exist ..\t\perl.exe del /f ..\t\perl.exe
1440	rename ..\t\miniperl.exe perl.exe
1441	$(XCOPY) $(GLOBEXE) ..\t\$(NULL)
1442# Note this perl.exe is miniperl
1443	cd ..\t && perl.exe TEST base/*.t comp/*.t cmd/*.t run/*.t io/*.t re/*.t opbasic/*.t op/*.t uni/*.t perf/*.t pragma/*.t
1444
1445test-prep : all utils ../pod/perltoc.pod
1446	$(XCOPY) $(PERLEXE) ..\t\$(NULL)
1447	$(XCOPY) $(PERLDLL) ..\t\$(NULL)
1448	$(XCOPY) $(GLOBEXE) ..\t\$(NULL)
1449	set PERL_STATIC_EXT=$(STATIC_EXT)
1450
1451test : test-prep
1452	cd ..\t
1453	perl.exe harness $(TEST_SWITCHES) $(TEST_FILES)
1454	cd ..\win32
1455
1456test_porting : test-prep
1457	cd ..\t
1458	perl.exe harness $(TEST_SWITCHES) porting\*.t ..\lib\diagnostics.t
1459	cd ..\win32
1460
1461test-reonly : reonly utils
1462	$(XCOPY) $(PERLEXE) ..\t\$(NULL)
1463	$(XCOPY) $(PERLDLL) ..\t\$(NULL)
1464	$(XCOPY) $(GLOBEXE) ..\t\$(NULL)
1465	cd ..\t
1466	perl.exe harness $(OPT) -re \bre\\/ $(EXTRA)
1467	cd ..\win32
1468
1469regen :
1470	cd ..
1471	regen.pl
1472	cd win32
1473
1474test-notty : test-prep
1475	set PERL_SKIP_TTY_TEST=1
1476	cd ..\t
1477	perl.exe harness $(TEST_SWITCHES) $(TEST_FILES)
1478	cd ..\win32
1479
1480_test : 
1481       $(XCOPY) $(PERLEXE) ..\t\$(NULL)
1482       $(XCOPY) $(PERLDLL) ..\t\$(NULL)
1483       $(XCOPY) $(GLOBEXE) ..\t\$(NULL)
1484       cd ..\t
1485       perl.exe harness $(TEST_SWITCHES) $(TEST_FILES)
1486       cd ..\win32
1487
1488_clean :
1489	-@$(DEL) miniperlmain$(o)
1490	-@$(DEL) $(MINIPERL)
1491	-@$(DEL) perlglob$(o)
1492	-@$(DEL) perlmain$(o)
1493	-@$(DEL) perlmainst$(o)
1494	-@$(DEL) config.h
1495	-@$(DEL) ..\git_version.h
1496	-@$(DEL) $(GLOBEXE)
1497	-@$(DEL) $(PERLEXE)
1498	-@$(DEL) $(WPERLEXE)
1499	-@$(DEL) $(PERLEXESTATIC)
1500	-@$(DEL) $(PERLSTATICLIB)
1501	-@$(DEL) $(PERLDLL)
1502	-@$(DEL) $(CORE_OBJ)
1503	-@$(DEL) $(GENUUDMAP) $(GENUUDMAP_OBJ) $(GENERATED_HEADERS)
1504	-if exist $(MINIDIR) rmdir /s /q $(MINIDIR)
1505	-if exist $(UNIDATADIR1) rmdir /s /q $(UNIDATADIR1)
1506	-if exist $(UNIDATADIR2) rmdir /s /q $(UNIDATADIR2)
1507	-@$(DEL) $(UNIDATAFILES)
1508	-@$(DEL) $(WIN32_OBJ)
1509	-@$(DEL) $(DLL_OBJ)
1510	-@$(DEL) ..\*$(o) ..\*.lib ..\*.exp *$(o) *.lib *.exp *.res
1511	-@$(DEL) ..\t\*.exe ..\t\*.dll ..\t\*.bat
1512	-@$(DEL) *.ilk
1513	-@$(DEL) *.pdb
1514	-@$(DEL) Extensions_static
1515
1516clean : Extensions_clean _clean
1517
1518realclean : Extensions_realclean _clean
1519
1520# Handy way to run perlbug -ok without having to install and run the
1521# installed perlbug. We don't re-run the tests here - we trust the user.
1522# Please *don't* use this unless all tests pass.
1523# If you want to report test failures, use "nmake nok" instead.
1524ok: utils
1525	$(PERLEXE) ..\utils\perlbug -ok -s "(UNINSTALLED)"
1526
1527okfile: utils
1528	$(PERLEXE) ..\utils\perlbug -ok -s "(UNINSTALLED)" -F perl.ok
1529
1530nok: utils
1531	$(PERLEXE) ..\utils\perlbug -nok -s "(UNINSTALLED)"
1532
1533nokfile: utils
1534	$(PERLEXE) ..\utils\perlbug -nok -s "(UNINSTALLED)" -F perl.nok
1535