This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Bump Data::Dumper version
[perl5.git] / win32 / GNUmakefile
1 #
2 # Makefile to build perl on Windows using GMAKE.
3 # Supported compilers:
4 #       Microsoft Visual C++ 7.0 or later
5 #       MinGW with gcc-3.4.5-5.3.0
6 #       MinGW64 with gcc-4.4.3 or later
7 #       Windows SDK 64-bit compiler and tools
8 #
9 # This is set up to build a perl.exe that runs off a shared library
10 # (perl533.dll).  Also makes individual DLLs for the XS extensions.
11 #
12 # The easiest way to customize the build process is to use parameters like this:
13 #
14 # c:\dev\perlsrc\win32> gmake INST_TOP=c:\sw\perl CCHOME=c:\sw\mingw USE_64_BIT_INT=define
15
16
17 ##
18 ## Make sure you read README.win32 *before* you mess with anything here!
19 ##
20
21 #
22 # We set this to point to cmd.exe in case GNU Make finds sh.exe in the path.
23 # Comment this line out if necessary
24 #
25 SHELL := cmd.exe
26
27 # define whether you want to use native gcc compiler or cross-compiler
28 # possible values: gcc
29 #                  i686-w64-mingw32-gcc
30 #                  x86_64-w64-mingw32-gcc
31 GCCBIN := gcc
32
33 ifeq ($(GCCBIN),x86_64-w64-mingw32-gcc)
34 GCCCROSS := x86_64-w64-mingw32
35 endif
36 ifeq ($(GCCBIN),i686-w64-mingw32-gcc)
37 GCCCROSS := i686-w64-mingw32
38 endif
39
40
41 ##
42 ## Build configuration.  Edit the values below to suit your needs.
43 ##
44
45 #
46 # Set these to wherever you want "gmake install" to put your
47 # newly built perl.
48 #
49 INST_DRV := c:
50 INST_TOP := $(INST_DRV)\perl
51
52 #
53 # Uncomment if you want to build a 32-bit Perl using a 32-bit compiler
54 # on a 64-bit version of Windows.
55 #
56 #WIN64          := undef
57
58 #
59 # Comment this out if you DON'T want your perl installation to be versioned.
60 # This means that the new installation will overwrite any files from the
61 # old installation at the same INST_TOP location.  Leaving it enabled is
62 # the safest route, as perl adds the extra version directory to all the
63 # locations it installs files to.  If you disable it, an alternative
64 # versioned installation can be obtained by setting INST_TOP above to a
65 # path that includes an arbitrary version string.
66 #
67 #INST_VER       := \5.33.8
68
69 #
70 # Comment this out if you DON'T want your perl installation to have
71 # architecture specific components.  This means that architecture-
72 # specific files will be installed along with the architecture-neutral
73 # files.  Leaving it enabled is safer and more flexible, in case you
74 # want to build multiple flavors of perl and install them together in
75 # the same location.  Commenting it out gives you a simpler
76 # installation that is easier to understand for beginners.
77 #
78 #INST_ARCH      := \$(ARCHNAME)
79
80 #
81 # Uncomment this if you want perl to run
82 #       $Config{sitelibexp}\sitecustomize.pl
83 # before anything else.  This script can then be set up, for example,
84 # to add additional entries to @INC.
85 #
86 #USE_SITECUST   := define
87
88 #
89 # uncomment to enable multiple interpreters.  This is needed for fork()
90 # emulation and for thread support, and is auto-enabled by USE_IMP_SYS
91 # and USE_ITHREADS below.
92 #
93 USE_MULTI       := define
94
95 #
96 # Interpreter cloning/threads; now reasonably complete.
97 # This should be enabled to get the fork() emulation.  This needs (and
98 # will auto-enable) USE_MULTI above.
99 #
100 USE_ITHREADS    := define
101
102 #
103 # uncomment to enable the implicit "host" layer for all system calls
104 # made by perl.  This is also needed to get fork().  This needs (and
105 # will auto-enable) USE_MULTI above.
106 #
107 USE_IMP_SYS     := define
108
109 #
110 # Comment out next assign to disable perl's I/O subsystem and use compiler's
111 # stdio for IO - depending on your compiler vendor and run time library you may
112 # then get a number of fails from make test i.e. bugs - complain to them not us ;-).
113 # You will also be unable to take full advantage of perl5.8's support for multiple
114 # encodings and may see lower IO performance. You have been warned.
115 #
116 USE_PERLIO      := define
117
118 #
119 # Uncomment this if you're building a 32-bit perl and want 64-bit integers.
120 # (If you're building a 64-bit perl then you will have 64-bit integers whether
121 # or not this is uncommented.)
122 #
123 #USE_64_BIT_INT := define
124
125 #
126 # Uncomment this if you want to support the use of long doubles in GCC builds.
127 # This option is not supported for MSVC builds.
128 #
129 #USE_LONG_DOUBLE := define
130
131 #
132 # Uncomment these if you want to support the use of __float128 in GCC builds.
133 # This option is not supported for MSVC builds.
134 #
135 #USE_QUADMATH := define
136 #I_QUADMATH := define
137
138 #
139 # Comment this out if you want to build perl without __USE_MINGW_ANSI_STDIO defined.
140 # (If you're building perl with USE_LONG_DOUBLE defined then
141 # __USE_MINGW_ANSI_STDIO will be defined whether or not this is uncommented.)
142 # The advantage of defining __USE_MINGW_ANSI_STDIO is that it provides correct
143 # (s)printf formatting of numbers, whereas the MS runtime might not.
144 # This option has no effect on MSVC builds.
145 #
146 USE_MINGW_ANSI_STDIO := define
147
148 #
149 # Comment this out if you want the legacy default behavior of including '.' at
150 # the end of @INC.
151 #
152 DEFAULT_INC_EXCLUDES_DOT := define
153
154 #
155 # Uncomment this if you want to disable looking up values from
156 # HKEY_CURRENT_USER\Software\Perl and HKEY_LOCAL_MACHINE\Software\Perl in
157 # the Registry.
158 #
159 #USE_NO_REGISTRY := define
160
161 #
162 # uncomment exactly one of the following
163 #
164 # Visual C++ .NET 2002/2003 (aka Visual C++ 7.0/7.1) (full version)
165 #CCTYPE         := MSVC70
166 # Visual C++ Toolkit 2003 (aka Visual C++ 7.1) (free command-line tools)
167 #CCTYPE         := MSVC70FREE
168 # Windows Server 2003 SP1 Platform SDK (April 2005) (64-bit compiler and tools)
169 #CCTYPE         := SDK2003SP1
170 # Visual C++ 2005 (aka Visual C++ 8.0) (full version or Express Edition)
171 #CCTYPE         := MSVC80
172 # Visual C++ 2008 (aka Visual C++ 9.0) (full version or Express Edition)
173 #CCTYPE         := MSVC90
174 # Visual C++ 2010 (aka Visual C++ 10.0) (full version or Express Edition)
175 #CCTYPE         := MSVC100
176 # Visual C++ 2012 (aka Visual C++ 11.0) (full version or Express Edition)
177 #CCTYPE         := MSVC110
178 # Visual C++ 2013 (aka Visual C++ 12.0) (full version or Express Edition)
179 #CCTYPE         := MSVC120
180 # Visual C++ 2015 (aka Visual C++ 14.0) (full version or Express Edition)
181 #CCTYPE         := MSVC140
182 # Visual C++ 2017 (aka Visual C++ 14.1) (full version or Community Edition)
183 #CCTYPE         := MSVC141
184 # Visual C++ 2019 (aka Visual C++ 14.2) (full version or Community Edition)
185 #CCTYPE         := MSVC142
186 # MinGW or mingw-w64 with gcc-3.4.5 or later
187 #CCTYPE         := GCC
188
189 #
190 # If you are using Intel C++ Compiler uncomment this
191 #
192 #__ICC          := define
193
194 #
195 # Uncomment this if you want to build everything in C++ mode
196 #
197 #USE_CPLUSPLUS  := define
198
199 #
200 # uncomment next line if you want debug version of perl (big/slow)
201 # If not enabled, we automatically try to use maximum optimization
202 # with all compilers that are known to have a working optimizer.
203 #
204 #CFG            := Debug
205
206 #
207 # uncomment to enable linking with setargv.obj under the Visual C
208 # compiler. Setting this options enables perl to expand wildcards in
209 # arguments, but it may be harder to use alternate methods like
210 # File::DosGlob that are more powerful.  This option is supported only with
211 # Visual C.
212 #
213 #USE_SETARGV    := define
214
215 #
216 # set this if you wish to use perl's malloc
217 # WARNING: Turning this on/off WILL break binary compatibility with extensions
218 # you may have compiled with/without it.  Be prepared to recompile all
219 # extensions if you change the default.  Currently, this cannot be enabled
220 # if you ask for USE_IMP_SYS above.
221 #
222 #PERL_MALLOC    := define
223
224 #
225 # set this to enable debugging mstats
226 # This must be enabled to use the Devel::Peek::mstat() function.  This cannot
227 # be enabled without PERL_MALLOC as well.
228 #
229 #DEBUG_MSTATS   := define
230
231 #
232 # set this to additionally provide a statically linked perl-static.exe.
233 # Note that dynamic loading will not work with this perl, so you must
234 # include required modules statically using the STATIC_EXT or ALL_STATIC
235 # variables below. A static library perl533s.lib will also be created.
236 # Ordinary perl.exe is not affected by this option.
237 #
238 #BUILD_STATIC   := define
239
240 #
241 # in addition to BUILD_STATIC the option ALL_STATIC makes *every*
242 # extension get statically built.
243 # This will result in a very large perl executable, but the main purpose
244 # is to have proper linking set so as to be able to create miscellaneous
245 # executables with different built-in extensions. It implies BUILD_STATIC.
246 #
247 #ALL_STATIC     := define
248
249 #
250 # set the install locations of the compiler
251 # Running VCVARS32.BAT, VCVARSALL.BAT or similar is *required* when using
252 # Visual C++.
253 #
254 # For GCC builds this should be the directory containing the bin, include,
255 # lib directories for your compiler.
256 #
257 #CCHOME         := C:\MinGW
258
259 #
260 # Additional compiler flags can be specified here.
261 #
262 BUILDOPT        := $(BUILDOPTEXTRA)
263
264 #
265 # This should normally be disabled.  Enabling it will disable the File::Glob
266 # implementation of CORE::glob.
267 #
268 #BUILDOPT       += -DPERL_EXTERNAL_GLOB
269
270 #
271 # Perl needs to read scripts in text mode so that the DATA filehandle
272 # works correctly with seek() and tell(), or around auto-flushes of
273 # all filehandles (e.g. by system(), backticks, fork(), etc).
274 #
275 # The current version on the ByteLoader module on CPAN however only
276 # works if scripts are read in binary mode.  But before you disable text
277 # mode script reading (and break some DATA filehandle functionality)
278 # please check first if an updated ByteLoader isn't available on CPAN.
279 #
280 BUILDOPT        += -DPERL_TEXTMODE_SCRIPTS
281
282 #
283 # specify semicolon-separated list of extra directories that modules will
284 # look for libraries (spaces in path names need not be quoted)
285 #
286 EXTRALIBDIRS    :=
287
288 #
289 # set this to your email address (perl will guess a value from
290 # your loginname and your hostname, which may not be right)
291 #
292 #EMAIL          :=
293
294 ##
295 ## Build configuration ends.
296 ##
297
298 ##################### CHANGE THESE ONLY IF YOU MUST #####################
299
300 PERL_MALLOC     ?= undef
301 DEBUG_MSTATS    ?= undef
302
303 USE_SITECUST    ?= undef
304 USE_MULTI       ?= undef
305 USE_ITHREADS    ?= undef
306 USE_IMP_SYS     ?= undef
307 USE_PERLIO      ?= undef
308 USE_LARGE_FILES ?= undef
309 USE_64_BIT_INT  ?= undef
310 USE_LONG_DOUBLE ?= undef
311 USE_QUADMATH    ?= undef
312 I_QUADMATH      ?= undef
313 DEFAULT_INC_EXCLUDES_DOT ?= undef
314 USE_NO_REGISTRY ?= undef
315
316 ifeq ($(USE_IMP_SYS),define)
317 PERL_MALLOC     = undef
318 endif
319
320 ifeq ($(PERL_MALLOC),undef)
321 DEBUG_MSTATS    = undef
322 endif
323
324 ifeq ($(DEBUG_MSTATS),define)
325 BUILDOPT        += -DPERL_DEBUGGING_MSTATS
326 endif
327
328 ifeq ("$(USE_IMP_SYS) $(USE_MULTI)","define undef")
329 USE_MULTI       = define
330 endif
331
332 ifeq ("$(USE_ITHREADS) $(USE_MULTI)","define undef")
333 USE_MULTI       = define
334 endif
335
336 ifeq ($(USE_SITECUST),define)
337 BUILDOPT        += -DUSE_SITECUSTOMIZE
338 endif
339
340 ifneq ($(USE_MULTI),undef)
341 BUILDOPT        += -DPERL_IMPLICIT_CONTEXT
342 endif
343
344 ifneq ($(USE_IMP_SYS),undef)
345 BUILDOPT        += -DPERL_IMPLICIT_SYS
346 endif
347
348 ifeq ($(USE_NO_REGISTRY),define)
349 BUILDOPT        += -DWIN32_NO_REGISTRY
350 endif
351
352 ifeq ($(CCTYPE),GCC)
353 GCCTARGET       := $(shell $(GCCBIN) -dumpmachine)
354 endif
355
356 #no explicit CCTYPE given, do auto detection
357 ifeq ($(CCTYPE),)
358 GCCTARGET       := $(shell $(GCCBIN) -dumpmachine 2>NUL)
359 #do we have a GCC?
360 ifneq ($(GCCTARGET),)
361 CCTYPE          := GCC
362 else
363 WIN64           := $(shell for /f "tokens=3 delims=.^ " \
364         %%i in ('cl ^2^>^&1') do @if "%%i" == "32-bit" echo undef)
365 #major version of CL has diff position based on 32 vs 64
366 #Microsoft (R) C/C++ Optimizing Compiler Version 15.00.30729.01 for x64
367 #Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
368 #use var to capture 1st line only, not 8th token of lines 2 & 3 in cl.exe output
369 #removing the cmd /c (extra scope) on the echo causes the env var to be undef
370 #when echo executes but it isn't undef for the "set MSVCVER", gmake or
371 #cmd.exe bug?
372 ifeq ($(WIN64),undef)
373 MSVCVER         := $(shell (set MSVCVER=) & (for /f "tokens=8,9 delims=.^ " \
374         %%i in ('cl ^2^>^&1') do if not defined MSVCVER if %%i%% geq 19 \
375         (set /A "MSVCVER=((%%i-5)*10)+(%%j/10)") \
376         else (set /A "MSVCVER=(%%i-6)*10")) & cmd /c echo %%MSVCVER%%)
377 else
378 MSVCVER         := $(shell (set MSVCVER=) & (for /f "tokens=7,8 delims=.^ " \
379         %%i in ('cl ^2^>^&1') do if not defined MSVCVER if %%i%% geq 19 \
380         (set /A "MSVCVER=((%%i-5)*10)+(%%j/10)") \
381         else (set /A "MSVCVER=(%%i-6)*10")) & cmd /c echo %%MSVCVER%%)
382 endif
383 #autodetect failed, reset to empty string
384 ifeq ($(MSVCVER),-50)
385 CCTYPE          := 
386 else
387 CCTYPE          := MSVC$(MSVCVER)
388 endif
389 endif
390 endif
391
392 # Versions of Visual C++ up to VC++ 7.1 define $(MSVCDir); versions since then
393 # define $(VCINSTALLDIR) instead, but for VC++ 14.1 we need the subfolder given
394 # by $(VCToolsInstallDir).
395 ifeq ($(CCHOME),)
396 ifeq ($(CCTYPE),GCC)
397 CCHOME          := C:\MinGW
398 else ifeq ($(CCTYPE),MSVC70)
399 CCHOME          := $(MSVCDir)
400 else ifeq ($(CCTYPE),MSVC70FREE)
401 CCHOME          := $(MSVCDir)
402 else ifeq ($(CCTYPE),MSVC141)
403 CCHOME          := $(VCToolsInstallDir)
404 else ifeq ($(CCTYPE),MSVC142)
405 CCHOME          := $(VCToolsInstallDir)
406 else
407 CCHOME          := $(VCINSTALLDIR)
408 endif
409 endif
410
411 ifeq ($(CCTYPE),GCC)
412 ifeq ($(GCCTARGET),x86_64-w64-mingw32)
413 WIN64 := define
414 PROCESSOR_ARCHITECTURE := x64
415 endif
416 ifeq ($(GCCTARGET),i686-w64-mingw32)
417 WIN64 := undef
418 PROCESSOR_ARCHITECTURE := x86
419 endif
420 endif
421
422 PROCESSOR_ARCHITECTURE  ?= x86
423
424 ifeq ($(WIN64),undef)
425 PROCESSOR_ARCHITECTURE  = x86
426 endif
427
428 ifeq ($(WIN64),)
429 # When we are running from a 32bit cmd.exe on AMD64 then
430 # PROCESSOR_ARCHITECTURE is set to x86 and PROCESSOR_ARCHITEW6432
431 # is set to AMD64
432 ifneq ($(PROCESSOR_ARCHITEW6432),)
433 PROCESSOR_ARCHITECTURE  = $(PROCESSOR_ARCHITEW6432)
434 WIN64                   = define
435 else ifeq ($(PROCESSOR_ARCHITECTURE),AMD64)
436 WIN64                   = define
437 else ifeq ($(PROCESSOR_ARCHITECTURE),IA64)
438 WIN64                   = define
439 else
440 WIN64                   = undef
441 endif
442 endif
443
444 ifeq ($(WIN64),define)
445 USE_64_BIT_INT  = define
446 endif
447
448 # Disable the long double option for MSVC builds since that compiler
449 # does not support it.
450 ifneq ($(CCTYPE),GCC)
451 USE_LONG_DOUBLE = undef
452 USE_QUADMATH = undef
453 I_QUADMATH = undef
454 endif
455
456 ARCHITECTURE = $(PROCESSOR_ARCHITECTURE)
457 ifeq ($(ARCHITECTURE),AMD64)
458 ARCHITECTURE    = x64
459 endif
460 ifeq ($(ARCHITECTURE),IA64)
461 ARCHITECTURE    = ia64
462 endif
463
464 ifeq ($(USE_MULTI),define)
465 ARCHNAME        = MSWin32-$(ARCHITECTURE)-multi
466 else
467 ifeq ($(USE_PERLIO),define)
468 ARCHNAME        = MSWin32-$(ARCHITECTURE)-perlio
469 else
470 ARCHNAME        = MSWin32-$(ARCHITECTURE)
471 endif
472 endif
473
474 ifeq ($(USE_PERLIO),define)
475 BUILDOPT        += -DUSE_PERLIO
476 endif
477
478 ifeq ($(USE_ITHREADS),define)
479 ARCHNAME        := $(ARCHNAME)-thread
480 endif
481
482 ifneq ($(WIN64),define)
483 ifeq ($(USE_64_BIT_INT),define)
484 ARCHNAME        := $(ARCHNAME)-64int
485 endif
486 endif
487
488 ifeq ($(USE_LONG_DOUBLE),define)
489 ARCHNAME        := $(ARCHNAME)-ld
490 endif
491
492 ifeq ($(USE_QUADMATH),define)
493 ARCHNAME        := $(ARCHNAME)-quadmath
494 endif
495
496 ifeq ($(CCTYPE),GCC)
497 GCCVER          := $(shell $(GCCBIN) -dumpversion)
498 GCCVER1         := $(shell for /f "delims=. tokens=1,2,3" %%i in ('$(GCCBIN) -dumpversion') do echo %%i)
499 GCCVER2         := $(shell for /f "delims=. tokens=1,2,3" %%i in ('$(GCCBIN) -dumpversion') do echo %%j)
500 GCCVER3         := $(shell for /f "delims=. tokens=1,2,3" %%i in ('$(GCCBIN) -dumpversion') do echo %%k)
501 endif
502
503 # Set the install location of the compiler headers/libraries.
504 # These are saved into $Config{incpath} and $Config{libpth}.
505 ifneq ($(GCCCROSS),)
506 CCINCDIR := $(CCHOME)\$(GCCCROSS)\include
507 CCLIBDIR := $(CCHOME)\$(GCCCROSS)\lib
508 ARCHPREFIX := $(GCCCROSS)-
509 else ifeq ($(CCTYPE),GCC)
510 CCINCDIR := $(CCHOME)\include
511 CCLIBDIR := $(CCHOME)\lib;$(CCHOME)\$(GCCTARGET)\lib;$(CCHOME)\lib\gcc\$(GCCTARGET)\$(GCCVER)
512 ARCHPREFIX :=
513 else
514 CCINCDIR := $(CCHOME)\include
515 ifeq ($(CCTYPE),MSVC141)
516 ifeq ($(WIN64),define)
517 CCLIBDIR := $(CCHOME)\lib\x64
518 else
519 CCLIBDIR := $(CCHOME)\lib\x86
520 endif
521 else ifeq ($(CCTYPE),MSVC142)
522 ifeq ($(WIN64),define)
523 CCLIBDIR := $(CCHOME)\lib\x64
524 else
525 CCLIBDIR := $(CCHOME)\lib\x86
526 endif
527 else
528 ifeq ($(WIN64),define)
529 CCLIBDIR := $(CCHOME)\lib\amd64
530 else
531 CCLIBDIR := $(CCHOME)\lib
532 endif
533 endif
534 ARCHPREFIX :=
535 endif
536
537 # Set DLL location for GCC compilers.
538 ifeq ($(CCTYPE),GCC)
539 ifneq ($(GCCCROSS),)
540 CCDLLDIR := $(CCHOME)\$(GCCCROSS)\lib
541 else
542 CCDLLDIR := $(CCHOME)\bin
543 endif
544 endif
545
546 ARCHDIR         = ..\lib\$(ARCHNAME)
547 COREDIR         = ..\lib\CORE
548 AUTODIR         = ..\lib\auto
549 LIBDIR          = ..\lib
550 EXTDIR          = ..\ext
551 DISTDIR         = ..\dist
552 CPANDIR         = ..\cpan
553 PODDIR          = ..\pod
554 HTMLDIR         = .\html
555
556 INST_SCRIPT     = $(INST_TOP)$(INST_VER)\bin
557 INST_BIN        = $(INST_SCRIPT)$(INST_ARCH)
558 INST_LIB        = $(INST_TOP)$(INST_VER)\lib
559 INST_ARCHLIB    = $(INST_LIB)$(INST_ARCH)
560 INST_COREDIR    = $(INST_ARCHLIB)\CORE
561 INST_HTML       = $(INST_TOP)$(INST_VER)\html
562
563 #
564 # Programs to compile, build .lib files and link
565 #
566
567 MINIBUILDOPT    :=
568
569 ifeq ($(CCTYPE),GCC)
570
571 CC              = $(ARCHPREFIX)gcc
572 LINK32          = $(ARCHPREFIX)g++
573 LIB32           = $(ARCHPREFIX)ar rc
574 IMPLIB          = $(ARCHPREFIX)dlltool
575 RSC             = $(ARCHPREFIX)windres
576
577 ifeq ($(USE_LONG_DOUBLE),define)
578 BUILDOPT        += -D__USE_MINGW_ANSI_STDIO
579 MINIBUILDOPT    += -D__USE_MINGW_ANSI_STDIO
580 else ifeq ($(USE_MINGW_ANSI_STDIO),define)
581 BUILDOPT        += -D__USE_MINGW_ANSI_STDIO
582 MINIBUILDOPT    += -D__USE_MINGW_ANSI_STDIO
583 endif
584
585
586 # If you are using GCC, 4.3 or later by default we add the -fwrapv option.
587 # See https://github.com/Perl/perl5/issues/13690
588 #
589 GCCWRAPV := $(shell if "$(GCCVER1)"=="4" (if "$(GCCVER2)" geq "3" echo define) else if "$(GCCVER1)" geq "5" (echo define))
590
591 ifeq ($(GCCWRAPV),define)
592 BUILDOPT        += -fwrapv
593 MINIBUILDOPT    += -fwrapv
594 endif
595
596 i = .i
597 o = .o
598 a = .a
599
600 #
601 # Options
602 #
603
604 INCLUDES        = -I.\include -I. -I..
605 DEFINES         = -DWIN32
606 ifeq ($(WIN64),define)
607 DEFINES         += -DWIN64
608 endif
609 LOCDEFS         = -DPERLDLL -DPERL_CORE
610 CXX_FLAG        = -xc++
611 LIBC            =
612 LIBFILES        = $(LIBC) -lmoldname -lkernel32 -luser32 -lgdi32 -lwinspool \
613         -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -lnetapi32 \
614         -luuid -lws2_32 -lmpr -lwinmm -lversion -lodbc32 -lodbccp32 -lcomctl32
615
616 ifeq ($(USE_QUADMATH),define)
617 LIBFILES        += -lquadmath
618 endif
619
620 ifeq ($(CFG),Debug)
621 OPTIMIZE        = -g -O2
622 LINK_DBG        = -g
623 DEFINES         += -DDEBUGGING
624 else
625 OPTIMIZE        = -s -O2
626 LINK_DBG        = -s
627 endif
628
629 EXTRACFLAGS     =
630 ifeq ($(USE_CPLUSPLUS),define)
631 EXTRACFLAGS     += $(CXX_FLAG)
632 endif
633 CFLAGS          = $(EXTRACFLAGS) $(INCLUDES) $(DEFINES) $(LOCDEFS) $(OPTIMIZE)
634 LINK_FLAGS      = $(LINK_DBG) -L"$(INST_COREDIR)" -L"$(subst ;," -L",$(CCLIBDIR))"
635 OBJOUT_FLAG     = -o
636 EXEOUT_FLAG     = -o
637 LIBOUT_FLAG     =
638 PDBOUT          =
639
640 BUILDOPT        += -fno-strict-aliasing -mms-bitfields
641 MINIBUILDOPT    += -fno-strict-aliasing
642
643 TESTPREPGCC     = test-prep-gcc
644
645 else
646
647 o = .obj
648
649 # All but the free version of VC++ 7.1 can load DLLs on demand.  Makes the test
650 # suite run in about 10% less time.
651 ifneq ($(CCTYPE),MSVC70FREE)
652 # If no registry, advapi32 is only used for Perl_pp_getlogin/getlogin/GetUserNameA
653 # which is rare to execute
654 ifneq ($(USE_NO_REGISTRY),undef)
655 DELAYLOAD       = -DELAYLOAD:ws2_32.dll -DELAYLOAD:advapi32.dll delayimp.lib
656 MINIDELAYLOAD   =
657 else
658 DELAYLOAD       = -DELAYLOAD:ws2_32.dll delayimp.lib
659 #miniperl never does any registry lookups
660 MINIDELAYLOAD   = -DELAYLOAD:advapi32.dll
661 endif
662 endif
663
664 # Visual C++ 2005 and 2008 (VC++ 8.0 and 9.0) create manifest files for EXEs and
665 # DLLs. These either need copying everywhere with the binaries, or else need
666 # embedding in them otherwise MSVCR80.dll or MSVCR90.dll won't be found. For
667 # simplicity, embed them if they exist (and delete them afterwards so that they
668 # don't get installed too).
669 EMBED_EXE_MANI  = if exist $@.manifest mt -nologo -manifest $@.manifest -outputresource:$@;1 && \
670                   if exist $@.manifest del $@.manifest
671 EMBED_DLL_MANI  = if exist $@.manifest mt -nologo -manifest $@.manifest -outputresource:$@;2 && \
672                   if exist $@.manifest del $@.manifest
673 # This one is for perl.exe which already has an embedded manifest, so we want to
674 # append to it, not replace it.
675 APPEND_EXE_MANI = if exist $@.manifest mt -nologo -manifest $@.manifest -updateresource:$@;1 && \
676                   if exist $@.manifest del $@.manifest
677
678 # Most relevant compiler-specific options fall into two groups:
679 # either pre-MSVC80 or MSVC80 onwards, so define a macro for this.
680 ifeq ($(CCTYPE),MSVC70)
681 PREMSVC80       = define
682 else ifeq ($(CCTYPE),MSVC70FREE)
683 PREMSVC80       = define
684 else
685 PREMSVC80       = undef
686 endif
687
688 ifneq ($(__ICC),define)
689 CC              = cl
690 LINK32          = link
691 else
692 CC              = icl
693 LINK32          = xilink
694 endif
695 LIB32           = $(LINK32) -lib
696 RSC             = rc
697
698 #
699 # Options
700 #
701
702 INCLUDES        = -I.\include -I. -I..
703 #PCHFLAGS       = -Fpc:\temp\vcmoduls.pch -YX
704 DEFINES         = -DWIN32 -D_CONSOLE -DNO_STRICT
705 LOCDEFS         = -DPERLDLL -DPERL_CORE
706 CXX_FLAG        = -TP -EHsc
707 EXTRACFLAGS     = -nologo -GF -W3
708
709 ifeq ($(CCTYPE),MSVC140)
710 LIBC            = ucrt.lib
711 else ifeq ($(CCTYPE),MSVC141)
712 LIBC            = ucrt.lib
713 else ifeq ($(CCTYPE),MSVC142)
714 LIBC            = ucrt.lib
715 else
716 LIBC            = msvcrt.lib
717 endif
718
719 ifeq ($(CFG),Debug)
720 OPTIMIZE        = -Od -Zi
721 LINK_DBG        = -debug
722 DEFINES         += -DDEBUGGING
723 EXTRACFLAGS     += -MD
724 else ifeq ($(CFG),DebugSymbols)
725 OPTIMIZE        = -Od -Zi
726 LINK_DBG        = -debug
727 EXTRACFLAGS     += -MD
728 else ifeq ($(CFG),DebugFull)
729 ifeq ($(CCTYPE),MSVC140)
730 LIBC            = ucrtd.lib
731 else ifeq ($(CCTYPE),MSVC141)
732 LIBC            = ucrtd.lib
733 else ifeq ($(CCTYPE),MSVC142)
734 LIBC            = ucrtd.lib
735 else
736 LIBC            = msvcrtd.lib
737 endif
738 OPTIMIZE        = -Od -Zi
739 LINK_DBG        = -debug
740 DEFINES         += -D_DEBUG -DDEBUGGING
741 EXTRACFLAGS     += -MDd
742
743 else
744 # Enable Whole Program Optimizations (WPO) and Link Time Code Generation (LTCG).
745 # -O1 yields smaller code, which turns out to be faster than -O2 on x86 and x64
746 OPTIMIZE        = -O1 -Zi -GL
747 # we enable debug symbols in release builds also
748 LINK_DBG        = -debug -opt:ref,icf -ltcg
749 # you may want to enable this if you want COFF symbols in the executables
750 # in addition to the PDB symbols.  The default Dr. Watson that ships with
751 # Windows can use the former but not latter.  The free WinDbg can be
752 # installed to get better stack traces from just the PDB symbols, so we
753 # avoid the bloat of COFF symbols by default.
754 #LINK_DBG       += -debugtype:both
755 LIB_FLAGS       = -ltcg
756 EXTRACFLAGS     += -MD
757 endif
758
759 ifeq ($(WIN64),define)
760 DEFINES         += -DWIN64
761 OPTIMIZE        += -fp:precise
762 endif
763
764 # For now, silence warnings from VC++ 8.0 onwards about "unsafe" CRT functions
765 # and POSIX CRT function names being deprecated.
766 ifeq ($(PREMSVC80),undef)
767 DEFINES         += -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE
768 endif
769
770 # Likewise for deprecated Winsock APIs in VC++ 14.0 onwards for now.
771 ifeq ($(CCTYPE),MSVC140)
772 DEFINES         += -D_WINSOCK_DEPRECATED_NO_WARNINGS
773 else ifeq ($(CCTYPE),MSVC141)
774 DEFINES         += -D_WINSOCK_DEPRECATED_NO_WARNINGS
775 else ifeq ($(CCTYPE),MSVC142)
776 DEFINES         += -D_WINSOCK_DEPRECATED_NO_WARNINGS
777 endif
778
779 # The Windows Server 2003 SP1 SDK compiler only defines _configthreadlocale() if
780 # _MT is defined, i.e. when using /MT (the LIBCMT.lib version of the CRT), which
781 # the perl build doesn't use. We therefore specify NO_THREAD_SAFE_LOCALE so that
782 # perl.h doesn't set USE_THREAD_SAFE_LOCALE, which it otherwise would do since
783 # _MSC_VER is 1400 for this compiler (as per MSVC80).
784 ifeq ($(CCTYPE),SDK2003SP1)
785 DEFINES         += -DNO_THREAD_SAFE_LOCALE
786 endif
787
788 # In VS 2005 (VC++ 8.0) Microsoft changes time_t from 32-bit to
789 # 64-bit, even in 32-bit mode.  It also provides the _USE_32BIT_TIME_T
790 # preprocessor option to revert back to the old functionality for
791 # backward compatibility.  We define this symbol here for older 32-bit
792 # compilers only (which aren't using it at all) for the sole purpose
793 # of getting it into $Config{ccflags}.  That way if someone builds
794 # Perl itself with e.g. VC7 but later installs an XS module using VC8
795 # the time_t types will still be compatible.
796 ifeq ($(WIN64),undef)
797 ifeq ($(PREMSVC80),define)
798 BUILDOPT        += -D_USE_32BIT_TIME_T
799 endif
800 endif
801
802 LIBBASEFILES    = oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib \
803         comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib \
804         netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib version.lib \
805         odbc32.lib odbccp32.lib comctl32.lib
806
807 ifeq ($(CCTYPE),MSVC140)
808 ifeq ($(CFG),DebugFull)
809 LIBBASEFILES    += msvcrtd.lib vcruntimed.lib
810 else
811 LIBBASEFILES    += msvcrt.lib vcruntime.lib
812 endif
813 else ifeq ($(CCTYPE),MSVC141)
814 ifeq ($(CFG),DebugFull)
815 LIBBASEFILES    += msvcrtd.lib vcruntimed.lib
816 else
817 LIBBASEFILES    += msvcrt.lib vcruntime.lib
818 endif
819 else ifeq ($(CCTYPE),MSVC142)
820 ifeq ($(CFG),DebugFull)
821 LIBBASEFILES    += msvcrtd.lib vcruntimed.lib
822 else
823 LIBBASEFILES    += msvcrt.lib vcruntime.lib
824 endif
825 endif
826
827 # Avoid __intel_new_proc_init link error for libircmt.
828 # libmmd is /MD equivelent, other variants exist.
829 # libmmd is Intel C's math addon funcs to MS CRT, contains long doubles, C99,
830 # and optimized C89 funcs
831 ifeq ($(__ICC),define)
832 LIBBASEFILES    += libircmt.lib libmmd.lib
833 endif
834
835 # The Windows Server 2003 SP1 SDK compiler links against MSVCRT.dll, which
836 # doesn't include the buffer overrun verification code used by the /GS switch.
837 # Since the code links against libraries that are compiled with /GS, this
838 # "security cookie verification" code must be included via bufferoverflow.lib.
839 ifeq ($(CCTYPE),SDK2003SP1)
840 LIBBASEFILES    += bufferoverflowU.lib
841 endif
842
843 LIBFILES        = $(LIBBASEFILES) $(LIBC)
844
845 ifeq ($(__ICC),define)
846 EXTRACFLAGS     += -Qstd=c99
847 endif
848 ifeq ($(USE_CPLUSPLUS),define)
849 EXTRACFLAGS     += $(CXX_FLAG)
850 endif
851 CFLAGS          = $(EXTRACFLAGS) $(INCLUDES) $(DEFINES) $(LOCDEFS) \
852                 $(PCHFLAGS) $(OPTIMIZE)
853 LINK_FLAGS      = -nologo -nodefaultlib $(LINK_DBG) \
854                 -libpath:"$(INST_COREDIR)" \
855                 -machine:$(PROCESSOR_ARCHITECTURE)
856 LIB_FLAGS       += -nologo
857 OBJOUT_FLAG     = -Fo
858 EXEOUT_FLAG     = -Fe
859 LIBOUT_FLAG     = /out:
860 PDBOUT          = -Fd$(*).pdb
861 TESTPREPGCC     =
862
863 endif
864
865 CFLAGS_O        = $(CFLAGS) $(BUILDOPT)
866
867 RSC_FLAGS       =
868
869 # VS 2017 (VC++ 14.1) requires at minimum Windows 7 SP1 (with latest Windows Updates)
870
871 # For XP support in >= VS 2013 (VC++ 12.0), subsystem is always in Config.pm
872 # LINK_FLAGS else subsystem is only needed for EXE building, not XS DLL building
873 # Console vs GUI makes no difference for DLLs, so use default for cleaner
874 # building cmd lines
875
876 ifeq ($(CCTYPE),MSVC120)
877 ifeq ($(WIN64),define)
878 LINK_FLAGS      += -subsystem:console,"5.02"
879 else
880 LINK_FLAGS      += -subsystem:console,"5.01"
881 endif
882
883 else ifeq ($(CCTYPE),MSVC140)
884 ifeq ($(WIN64),define)
885 LINK_FLAGS      += -subsystem:console,"5.02"
886 else
887 LINK_FLAGS      += -subsystem:console,"5.01"
888 endif
889
890 else ifeq ($(CCTYPE),MSVC141)
891 ifeq ($(WIN64),define)
892 LINK_FLAGS      += -subsystem:console,"5.02"
893 else
894 LINK_FLAGS      += -subsystem:console,"5.01"
895 endif
896
897 else ifeq ($(CCTYPE),MSVC142)
898 ifeq ($(WIN64),define)
899 LINK_FLAGS      += -subsystem:console,"5.02"
900 else
901 LINK_FLAGS      += -subsystem:console,"5.01"
902 endif
903
904 else ifneq ($(CCTYPE),GCC)
905 PRIV_LINK_FLAGS += -subsystem:console
906 endif
907
908 BLINK_FLAGS     = $(PRIV_LINK_FLAGS) $(LINK_FLAGS)
909
910 #################### do not edit below this line #######################
911 ############# NO USER-SERVICEABLE PARTS BEYOND THIS POINT ##############
912
913 #prevent -j from reaching EUMM/make_ext.pl/"sub makes", Win32 EUMM not parallel
914 #compatible yet
915 unexport MAKEFLAGS
916
917 a ?= .lib
918
919 .SUFFIXES : .c .i $(o) .dll $(a) .exe .rc .res
920
921 %$(o): %.c
922         $(CC) -c -I$(<D) $(CFLAGS_O) $(OBJOUT_FLAG)$@ $(PDBOUT) $<
923
924 %.i: %.c
925         $(CC) -c -I$(<D) $(CFLAGS_O) -E $< >$@
926
927 %.c: %.y
928         $(NOOP)
929
930 %.dll: %$(o)
931         $(LINK32) -o $@ $(BLINK_FLAGS) $< $(LIBFILES)
932         $(IMPLIB) --input-def $(*F).def --output-lib $(*F).a $@
933
934 %.res: %.rc
935 ifeq ($(CCTYPE),GCC)
936         $(RSC) --use-temp-file --include-dir=. --include-dir=.. -O COFF -D INCLUDE_MANIFEST -i $< -o $@
937 else
938         $(RSC) -i.. -DINCLUDE_MANIFEST $<
939 endif
940
941 #
942 # various targets
943
944 #do not put $(MINIPERL) as a dep/prereq in a rule, instead put $(HAVEMINIPERL)
945 #$(MINIPERL) is not a buildable target, use "gmake mp" if you want to just build
946 #miniperl alone
947 MINIPERL        = ..\miniperl.exe
948 HAVEMINIPERL    = ..\lib\buildcustomize.pl
949 MINIDIR         = mini
950 PERLEXE         = ..\perl.exe
951 WPERLEXE        = ..\wperl.exe
952 PERLEXESTATIC   = ..\perl-static.exe
953 STATICDIR       = .\static.tmp
954 GLOBEXE         = ..\perlglob.exe
955 CONFIGPM        = ..\lib\Config.pm
956 GENUUDMAP       = ..\generate_uudmap.exe
957 ifeq ($(BUILD_STATIC),define)
958 PERLSTATIC      = static
959 else
960 ifeq ($(ALL_STATIC),define)
961 PERLSTATIC      = static
962 else
963 PERLSTATIC      =
964 endif
965 endif
966
967 # Unicode data files generated by mktables
968 UNIDATAFILES     = ..\lib\unicore\Decomposition.pl ..\lib\unicore\TestProp.pl \
969                    ..\lib\unicore\CombiningClass.pl ..\lib\unicore\Name.pl \
970                    ..\lib\unicore\UCD.pl ..\lib\unicore\Name.pm            \
971                    ..\lib\unicore\mktables.lst
972
973 # Directories of Unicode data files generated by mktables
974 UNIDATADIR1     = ..\lib\unicore\To
975 UNIDATADIR2     = ..\lib\unicore\lib
976
977 PERLEXE_MANIFEST= .\perlexe.manifest
978 PERLEXE_ICO     = .\perlexe.ico
979 PERLEXE_RES     = .\perlexe.res
980 PERLDLL_RES     =
981
982 # Nominate a target which causes extensions to be re-built
983 # This used to be $(PERLEXE), but at worst it is the .dll that they depend
984 # on and really only the interface - i.e. the .def file used to export symbols
985 # from the .dll
986 PERLDEP = $(PERLIMPLIB)
987
988
989 PL2BAT          = bin\pl2bat.pl
990
991 UTILS           =                       \
992                 ..\utils\h2ph           \
993                 ..\utils\splain         \
994                 ..\utils\perlbug        \
995                 ..\utils\pl2pm          \
996                 ..\utils\h2xs           \
997                 ..\utils\perldoc        \
998                 ..\utils\perlivp        \
999                 ..\utils\libnetcfg      \
1000                 ..\utils\enc2xs         \
1001                 ..\utils\encguess       \
1002                 ..\utils\piconv         \
1003                 ..\utils\corelist       \
1004                 ..\utils\cpan           \
1005                 ..\utils\xsubpp         \
1006                 ..\utils\pod2html       \
1007                 ..\utils\prove          \
1008                 ..\utils\ptar           \
1009                 ..\utils\ptardiff       \
1010                 ..\utils\ptargrep       \
1011                 ..\utils\zipdetails     \
1012                 ..\utils\shasum         \
1013                 ..\utils\instmodsh      \
1014                 ..\utils\json_pp        \
1015                 bin\exetype.pl          \
1016                 bin\runperl.pl          \
1017                 bin\pl2bat.pl           \
1018                 bin\perlglob.pl         \
1019                 bin\search.pl
1020
1021 ifeq ($(CCTYPE),GCC)
1022
1023 CFGSH_TMPL      = config.gc
1024 CFGH_TMPL       = config_H.gc
1025 PERLIMPLIB      = $(COREDIR)\libperl533$(a)
1026 PERLIMPLIBBASE  = libperl533$(a)
1027 PERLSTATICLIB   = ..\libperl533s$(a)
1028 INT64           = long long
1029
1030 else
1031
1032 CFGSH_TMPL      = config.vc
1033 CFGH_TMPL       = config_H.vc
1034 INT64           = __int64
1035
1036 endif
1037
1038 # makedef.pl must be updated if this changes, and this should normally
1039 # only change when there is an incompatible revision of the public API.
1040 PERLIMPLIB      ?= $(COREDIR)\perl533$(a)
1041 PERLIMPLIBBASE  ?= perl533$(a)
1042 PERLEXPLIB      ?= $(COREDIR)\perl533.exp
1043 PERLSTATICLIB   ?= ..\perl533s$(a)
1044 PERLDLL         = ..\perl533.dll
1045 PERLDLLBASE     = perl533.dll
1046
1047 # don't let "gmake -n all" try to run "miniperl.exe make_ext.pl"
1048 PLMAKE          = gmake
1049
1050 XCOPY           = xcopy /f /r /i /d /y
1051 RCOPY           = xcopy /f /r /i /e /d /y
1052 NOOP            = @rem
1053
1054 #first ones are arrange in compile time order for faster parallel building
1055 #see #123867 for details
1056 MICROCORE_SRC   =               \
1057                 ..\toke.c       \
1058                 ..\regcomp.c    \
1059                 ..\regexec.c    \
1060                 ..\op.c         \
1061                 ..\sv.c         \
1062                 ..\pp.c         \
1063                 ..\pp_ctl.c     \
1064                 ..\pp_sys.c     \
1065                 ..\pp_pack.c    \
1066                 ..\pp_hot.c     \
1067                 ..\gv.c         \
1068                 ..\perl.c       \
1069                 ..\utf8.c       \
1070                 ..\dump.c       \
1071                 ..\hv.c         \
1072                 ..\av.c         \
1073                 ..\caretx.c     \
1074                 ..\deb.c        \
1075                 ..\doio.c       \
1076                 ..\doop.c       \
1077                 ..\dquote.c     \
1078                 ..\globals.c    \
1079                 ..\mro_core.c   \
1080                 ..\locale.c     \
1081                 ..\keywords.c   \
1082                 ..\mathoms.c    \
1083                 ..\mg.c         \
1084                 ..\numeric.c    \
1085                 ..\pad.c        \
1086                 ..\perly.c      \
1087                 ..\pp_sort.c    \
1088                 ..\reentr.c     \
1089                 ..\run.c        \
1090                 ..\scope.c      \
1091                 ..\taint.c      \
1092                 ..\time64.c     \
1093                 ..\universal.c  \
1094                 ..\util.c
1095
1096 EXTRACORE_SRC   += perllib.c
1097
1098 ifeq ($(PERL_MALLOC),define)
1099 EXTRACORE_SRC   += ..\malloc.c
1100 endif
1101
1102 EXTRACORE_SRC   += ..\perlio.c
1103
1104 WIN32_SRC       =               \
1105                 .\win32.c       \
1106                 .\win32sck.c    \
1107                 .\win32thread.c \
1108                 .\fcrypt.c
1109
1110 # We need this for miniperl build unless we override canned
1111 # config.h #define building mini\*
1112 #ifeq ($(USE_PERLIO)" == "define"
1113 WIN32_SRC       += .\win32io.c
1114 #endif
1115
1116 CORE_NOCFG_H    =               \
1117                 ..\av.h         \
1118                 ..\cop.h        \
1119                 ..\cv.h         \
1120                 ..\dosish.h     \
1121                 ..\embed.h      \
1122                 ..\form.h       \
1123                 ..\gv.h         \
1124                 ..\handy.h      \
1125                 ..\hv.h         \
1126                 ..\hv_func.h    \
1127                 ..\iperlsys.h   \
1128                 ..\mg.h         \
1129                 ..\nostdio.h    \
1130                 ..\op.h         \
1131                 ..\opcode.h     \
1132                 ..\perl.h       \
1133                 ..\perlapi.h    \
1134                 ..\perlsdio.h   \
1135                 ..\perly.h      \
1136                 ..\pp.h         \
1137                 ..\proto.h      \
1138                 ..\regcomp.h    \
1139                 ..\regexp.h     \
1140                 ..\scope.h      \
1141                 ..\sv.h         \
1142                 ..\thread.h     \
1143                 ..\unixish.h    \
1144                 ..\utf8.h       \
1145                 ..\util.h       \
1146                 ..\warnings.h   \
1147                 ..\XSUB.h       \
1148                 ..\EXTERN.h     \
1149                 ..\perlvars.h   \
1150                 ..\intrpvar.h   \
1151                 .\include\dirent.h      \
1152                 .\include\netdb.h       \
1153                 .\include\sys\errno2.h  \
1154                 .\include\sys\socket.h  \
1155                 .\win32.h
1156
1157 CORE_H          = $(CORE_NOCFG_H) .\config.h ..\git_version.h
1158
1159 UUDMAP_H        = ..\uudmap.h
1160 BITCOUNT_H      = ..\bitcount.h
1161 MG_DATA_H       = ..\mg_data.h
1162 GENERATED_HEADERS = $(UUDMAP_H) $(BITCOUNT_H) $(MG_DATA_H)
1163
1164 HAVE_COREDIR    = .coreheaders
1165
1166 MICROCORE_OBJ   = $(MICROCORE_SRC:.c=$(o))
1167 CORE_OBJ        = $(MICROCORE_OBJ) $(EXTRACORE_SRC:.c=$(o))
1168 WIN32_OBJ       = $(WIN32_SRC:.c=$(o))
1169
1170 MINICORE_OBJ    = $(subst ..\,mini\,$(MICROCORE_OBJ))   \
1171                   $(MINIDIR)\miniperlmain$(o)   \
1172                   $(MINIDIR)\perlio$(o)
1173 MINIWIN32_OBJ   = $(subst .\,mini\,$(WIN32_OBJ))
1174 MINI_OBJ        = $(MINICORE_OBJ) $(MINIWIN32_OBJ)
1175 DLL_OBJ         = $(DYNALOADER)
1176
1177 PERLDLL_OBJ     = $(CORE_OBJ)
1178 PERLEXE_OBJ     = perlmain$(o)
1179 PERLEXEST_OBJ   = perlmainst$(o)
1180
1181 PERLDLL_OBJ     += $(WIN32_OBJ) $(DLL_OBJ)
1182
1183 ifneq ($(USE_SETARGV),)
1184 SETARGV_OBJ     = setargv$(o)
1185 endif
1186
1187 ifeq ($(ALL_STATIC),define)
1188 # some exclusions, unfortunately, until fixed:
1189 #  - MakeMaker isn't capable enough for SDBM_File (small bug)
1190 STATIC_EXT      = * !SDBM_File
1191 NORMALIZE_STATIC = Normalize_static
1192 else
1193 # specify static extensions here, for example:
1194 # (be sure to include Win32CORE to load Win32 on demand)
1195 #STATIC_EXT     = Win32CORE Cwd Compress/Raw/Zlib
1196 STATIC_EXT      = Win32CORE
1197 NORMALIZE_DYN   = Normalize_dyn
1198 endif
1199
1200 DYNALOADER      = ..\DynaLoader$(o)
1201
1202 # vars must be separated by "\t+~\t+", since we're using the tempfile
1203 # version of config_sh.pl (we were overflowing someone's buffer by
1204 # trying to fit them all on the command line)
1205 #       -- BKS 10-17-1999
1206 CFG_VARS        =                                       \
1207                 "INST_TOP=$(INST_TOP)"                  \
1208                 "INST_VER=$(INST_VER)"                  \
1209                 "INST_ARCH=$(INST_ARCH)"                \
1210                 "archname=$(ARCHNAME)"                  \
1211                 "cc=$(CC)"                              \
1212                 "ld=$(LINK32)"                          \
1213                 "ccflags=$(subst ",\",$(EXTRACFLAGS) $(DEFINES) $(BUILDOPT))" \
1214                 "usecplusplus=$(USE_CPLUSPLUS)"         \
1215                 "cf_email=$(EMAIL)"                     \
1216                 "d_mymalloc=$(PERL_MALLOC)"             \
1217                 "i_quadmath=$(I_QUADMATH)"              \
1218                 "libs=$(LIBFILES)"                      \
1219                 "incpath=$(subst ",\",$(CCINCDIR))"                     \
1220                 "libperl=$(subst ",\",$(PERLIMPLIBBASE))"               \
1221                 "libpth=$(subst ",\",$(CCLIBDIR);$(EXTRALIBDIRS))"      \
1222                 "libc=$(LIBC)"                          \
1223                 "make=$(PLMAKE)"                                \
1224                 "_o=$(o)"                               \
1225                 "obj_ext=$(o)"                          \
1226                 "_a=$(a)"                               \
1227                 "lib_ext=$(a)"                          \
1228                 "static_ext=$(STATIC_EXT)"              \
1229                 "usethreads=$(USE_ITHREADS)"            \
1230                 "useithreads=$(USE_ITHREADS)"           \
1231                 "usemultiplicity=$(USE_MULTI)"          \
1232                 "useperlio=$(USE_PERLIO)"               \
1233                 "use64bitint=$(USE_64_BIT_INT)"         \
1234                 "uselongdouble=$(USE_LONG_DOUBLE)"      \
1235                 "usequadmath=$(USE_QUADMATH)"           \
1236                 "usesitecustomize=$(USE_SITECUST)"      \
1237                 "default_inc_excludes_dot=$(DEFAULT_INC_EXCLUDES_DOT)"  \
1238                 "LINK_FLAGS=$(subst ",\",$(LINK_FLAGS))"\
1239                 "optimize=$(subst ",\",$(OPTIMIZE))"    \
1240                 "ARCHPREFIX=$(ARCHPREFIX)"              \
1241                 "WIN64=$(WIN64)"
1242
1243 #
1244 # Top targets
1245 #
1246
1247 .PHONY: all info
1248
1249 all : info rebasePE Extensions_nonxs $(PERLSTATIC)
1250
1251 info :
1252 ifeq ($(CCTYPE),GCC)
1253         @echo # CCTYPE=$(CCTYPE)&& \
1254         echo # GCCBIN=$(GCCBIN)&& \
1255         echo # GCCVER=$(GCCVER1).$(GCCVER2).$(GCCVER3)&& \
1256         echo # GCCTARGET=$(GCCTARGET)&& \
1257         echo # GCCCROSS=$(GCCCROSS)&& \
1258         echo # WIN64=$(WIN64)&& \
1259         echo # ARCHITECTURE=$(ARCHITECTURE)&& \
1260         echo # ARCHNAME=$(ARCHNAME)&& \
1261         echo # MAKE=$(PLMAKE)
1262 else
1263         @echo # CCTYPE=$(CCTYPE)&& \
1264         echo # WIN64=$(WIN64)&& \
1265         echo # ARCHITECTURE=$(ARCHITECTURE)&& \
1266         echo # ARCHNAME=$(ARCHNAME)&& \
1267         echo # MAKE=$(PLMAKE)
1268 endif
1269 ifeq ($(CCTYPE),)
1270         @echo Unable to detect gcc and/or architecture!
1271         @exit 1
1272 endif
1273
1274
1275 ..\regcomp$(o) : ..\regnodes.h ..\regcharclass.h
1276
1277 ..\regexec$(o) : ..\regnodes.h ..\regcharclass.h
1278
1279 reonly : ..\regnodes.h .\config.h ..\git_version.h $(GLOBEXE) $(HAVEMINIPERL)\
1280         $(CONFIGPM) $(UNIDATAFILES) $(PERLEXE)                          \
1281         Extensions_reonly
1282
1283 static: $(PERLEXESTATIC)
1284
1285 #----------------------------------------------------------------
1286
1287 $(GLOBEXE) : perlglob.c
1288 ifeq ($(CCTYPE),GCC)
1289         $(LINK32) $(EXTRACFLAGS) $(OPTIMIZE) $(BLINK_FLAGS) -mconsole -o $@ perlglob.c $(LIBFILES)
1290 else
1291         $(CC) $(EXTRACFLAGS) $(OPTIMIZE) $(PDBOUT) -Fe$@ perlglob.c -link $(BLINK_FLAGS) \
1292         setargv$(o) $(LIBFILES) && $(EMBED_EXE_MANI)
1293 endif
1294
1295 ..\git_version.h : $(HAVEMINIPERL) ..\make_patchnum.pl
1296         $(MINIPERL) -I..\lib ..\make_patchnum.pl
1297
1298 # make sure that we recompile perl.c if the git version changes
1299 ..\perl$(o) : ..\git_version.h
1300
1301 ..\config.sh : $(CFGSH_TMPL) config_sh.PL FindExt.pm $(HAVEMINIPERL)
1302         $(MINIPERL) -I..\lib config_sh.PL $(CFG_VARS) $(CFGSH_TMPL) > ..\config.sh
1303
1304 # This target is for when changes to the main config.sh happen.
1305 # Edit config.gc, then make perl using GCC in a minimal configuration (i.e.
1306 # with MULTI, ITHREADS, IMP_SYS, LARGE_FILES and PERLIO off), then make
1307 # this target to regenerate config_H.gc.
1308 regen_config_h:
1309         $(MINIPERL) -I..\lib config_sh.PL --prebuilt $(CFG_VARS) $(CFGSH_TMPL) > ..\config.sh
1310         $(MINIPERL) -I..\lib ..\configpm --chdir=..
1311         -del /f $(CFGH_TMPL)
1312         -$(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)"
1313         rename config.h $(CFGH_TMPL)
1314
1315 $(CONFIGPM): ..\config.sh config_h.PL
1316         $(MINIPERL) -I..\lib ..\configpm --chdir=..
1317         -$(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)"
1318
1319 .\config.h : $(CONFIGPM)
1320
1321 # See the comment in Makefile.SH explaining this seemingly cranky ordering
1322 ..\lib\buildcustomize.pl : $(MINI_OBJ) ..\write_buildcustomize.pl
1323 ifeq ($(CCTYPE),GCC)
1324         $(LINK32) -mconsole -o $(MINIPERL) $(BLINK_FLAGS) $(MINI_OBJ) $(LIBFILES)
1325 else
1326         $(LINK32) -out:$(MINIPERL) $(BLINK_FLAGS) \
1327             $(DELAYLOAD) $(MINIDELAYLOAD) $(LIBFILES) $(MINI_OBJ)
1328         $(subst $@,$(MINIPERL),$(EMBED_EXE_MANI))
1329
1330 endif
1331         $(MINIPERL) -I..\lib -f ..\write_buildcustomize.pl ..
1332
1333 #convinence target, get a working miniperl
1334 mp : $(CONFIGPM)
1335
1336 $(MINIDIR)\.exists : $(CFGH_TMPL)
1337         if not exist "$(MINIDIR)" mkdir "$(MINIDIR)"
1338 #
1339 # Copy the template config.h and set configurables at the end of it
1340 # as per the options chosen and compiler used.
1341 # Note: This config.h is only used to build miniperl.exe anyway, but
1342 # it's as well to have its options correct to be sure that it builds
1343 # and so that it's "-V" options are correct for use by makedef.pl. The
1344 # real config.h used to build perl.exe is generated from the top-level
1345 # config_h.SH by config_h.PL (run by miniperl.exe).
1346 #
1347 # MINIDIR generates config.h so miniperl.exe is not rebuilt when the 2nd
1348 # config.h is generated in CONFIGPM target, see also the comments for $(MINI_OBJ).
1349         copy $(CFGH_TMPL) config.h
1350         @(echo.&& \
1351         echo #ifndef _config_h_footer_&& \
1352         echo #define _config_h_footer_&& \
1353         echo #undef PTRSIZE&& \
1354         echo #undef SSize_t&& \
1355         echo #undef HAS_ATOLL&& \
1356         echo #undef HAS_STRTOLL&& \
1357         echo #undef HAS_STRTOULL&& \
1358         echo #undef Size_t_size&& \
1359         echo #undef IVTYPE&& \
1360         echo #undef UVTYPE&& \
1361         echo #undef IVSIZE&& \
1362         echo #undef UVSIZE&& \
1363         echo #undef NV_PRESERVES_UV&& \
1364         echo #undef NV_PRESERVES_UV_BITS&& \
1365         echo #undef IVdf&& \
1366         echo #undef UVuf&& \
1367         echo #undef UVof&& \
1368         echo #undef UVxf&& \
1369         echo #undef UVXf&& \
1370         echo #undef USE_64_BIT_INT&& \
1371         echo #undef Gconvert&& \
1372         echo #undef HAS_FREXPL&& \
1373         echo #undef HAS_ISNANL&& \
1374         echo #undef HAS_MODFL&& \
1375         echo #undef HAS_MODFL_PROTO&& \
1376         echo #undef HAS_SQRTL&& \
1377         echo #undef HAS_STRTOLD&& \
1378         echo #undef PERL_PRIfldbl&& \
1379         echo #undef PERL_PRIgldbl&& \
1380         echo #undef PERL_PRIeldbl&& \
1381         echo #undef PERL_SCNfldbl&& \
1382         echo #undef NVTYPE&& \
1383         echo #undef NVSIZE&& \
1384         echo #undef LONG_DOUBLESIZE&& \
1385         echo #undef NV_OVERFLOWS_INTEGERS_AT&& \
1386         echo #undef NVef&& \
1387         echo #undef NVff&& \
1388         echo #undef NVgf&& \
1389         echo #undef USE_LONG_DOUBLE&& \
1390         echo #undef I_QUADMATH&& \
1391         echo #undef USE_QUADMATH&& \
1392         echo #undef USE_CPLUSPLUS)>> config.h
1393 ifeq ($(CCTYPE),MSVC140)
1394         @(echo #undef FILE_ptr&& \
1395         echo #undef FILE_cnt&& \
1396         echo #undef FILE_base&& \
1397         echo #undef FILE_bufsiz&& \
1398         echo #define FILE_ptr^(fp^) PERLIO_FILE_ptr^(fp^)&& \
1399         echo #define FILE_cnt^(fp^) PERLIO_FILE_cnt^(fp^)&& \
1400         echo #define FILE_base^(fp^) PERLIO_FILE_base^(fp^)&& \
1401         echo #define FILE_bufsiz^(fp^) ^(PERLIO_FILE_cnt^(fp^) + PERLIO_FILE_ptr^(fp^) - PERLIO_FILE_base^(fp^)^)&& \
1402         echo #define I_STDBOOL)>> config.h
1403 else ifeq ($(CCTYPE),MSVC141)
1404         @(echo #undef FILE_ptr&& \
1405         echo #undef FILE_cnt&& \
1406         echo #undef FILE_base&& \
1407         echo #undef FILE_bufsiz&& \
1408         echo #define FILE_ptr^(fp^) PERLIO_FILE_ptr^(fp^)&& \
1409         echo #define FILE_cnt^(fp^) PERLIO_FILE_cnt^(fp^)&& \
1410         echo #define FILE_base^(fp^) PERLIO_FILE_base^(fp^)&& \
1411         echo #define FILE_bufsiz^(fp^) ^(PERLIO_FILE_cnt^(fp^) + PERLIO_FILE_ptr^(fp^) - PERLIO_FILE_base^(fp^)^)&& \
1412         echo #define I_STDBOOL)>> config.h
1413 else ifeq ($(CCTYPE),MSVC142)
1414         @(echo #undef FILE_ptr&& \
1415         echo #undef FILE_cnt&& \
1416         echo #undef FILE_base&& \
1417         echo #undef FILE_bufsiz&& \
1418         echo #define FILE_ptr^(fp^) PERLIO_FILE_ptr^(fp^)&& \
1419         echo #define FILE_cnt^(fp^) PERLIO_FILE_cnt^(fp^)&& \
1420         echo #define FILE_base^(fp^) PERLIO_FILE_base^(fp^)&& \
1421         echo #define FILE_bufsiz^(fp^) ^(PERLIO_FILE_cnt^(fp^) + PERLIO_FILE_ptr^(fp^) - PERLIO_FILE_base^(fp^)^)&& \
1422         echo #define I_STDBOOL)>> config.h
1423 endif
1424 ifeq ($(WIN64),define)
1425 ifeq ($(CCTYPE),GCC)
1426         @(echo #define LONG_DOUBLESIZE ^16)>> config.h
1427 else
1428         @(echo #define LONG_DOUBLESIZE ^8)>> config.h
1429 endif
1430         @(echo #define PTRSIZE ^8&& \
1431         echo #define SSize_t $(INT64)&& \
1432         echo #define HAS_ATOLL&& \
1433         echo #define HAS_STRTOLL&& \
1434         echo #define HAS_STRTOULL&& \
1435         echo #define Size_t_size ^8)>> config.h
1436 else
1437 ifeq ($(CCTYPE),GCC)
1438         @(echo #define LONG_DOUBLESIZE ^12)>> config.h
1439 else
1440         @(echo #define LONG_DOUBLESIZE ^8)>> config.h
1441 endif
1442         @(echo #define PTRSIZE ^4&& \
1443         echo #define SSize_t int&& \
1444         echo #undef HAS_ATOLL&& \
1445         echo #undef HAS_STRTOLL&& \
1446         echo #undef HAS_STRTOULL&& \
1447         echo #define Size_t_size ^4)>> config.h
1448 endif
1449 ifeq ($(USE_64_BIT_INT),define)
1450         @(echo #define IVTYPE $(INT64)&& \
1451         echo #define UVTYPE unsigned $(INT64)&& \
1452         echo #define IVSIZE ^8&& \
1453         echo #define UVSIZE ^8)>> config.h
1454 ifeq ($(USE_LONG_DOUBLE),define)
1455         @(echo #define NV_PRESERVES_UV&& \
1456         echo #define NV_PRESERVES_UV_BITS 64)>> config.h
1457 else ifeq ($(USE_QUADMATH),define)
1458         @(echo #define NV_PRESERVES_UV&& \
1459         echo #define NV_PRESERVES_UV_BITS 64)>> config.h
1460 else
1461         @(echo #undef NV_PRESERVES_UV&& \
1462         echo #define NV_PRESERVES_UV_BITS 53)>> config.h
1463 endif
1464         @(echo #define IVdf "I64d"&& \
1465         echo #define UVuf "I64u"&& \
1466         echo #define UVof "I64o"&& \
1467         echo #define UVxf "I64x"&& \
1468         echo #define UVXf "I64X"&& \
1469         echo #define USE_64_BIT_INT)>> config.h
1470 else
1471         @(echo #define IVTYPE long&& \
1472         echo #define UVTYPE unsigned long&& \
1473         echo #define IVSIZE ^4&& \
1474         echo #define UVSIZE ^4&& \
1475         echo #define NV_PRESERVES_UV&& \
1476         echo #define NV_PRESERVES_UV_BITS 32&& \
1477         echo #define IVdf "ld"&& \
1478         echo #define UVuf "lu"&& \
1479         echo #define UVof "lo"&& \
1480         echo #define UVxf "lx"&& \
1481         echo #define UVXf "lX"&& \
1482         echo #undef USE_64_BIT_INT)>> config.h
1483 endif
1484 ifeq ($(USE_LONG_DOUBLE),define)
1485         @(echo #define Gconvert^(x,n,t,b^) sprintf^(^(b^),"%%.*""Lg",^(n^),^(x^)^)&& \
1486         echo #define HAS_FREXPL&& \
1487         echo #define HAS_ISNANL&& \
1488         echo #define HAS_MODFL&& \
1489         echo #define HAS_MODFL_PROTO&& \
1490         echo #define HAS_SQRTL&& \
1491         echo #define HAS_STRTOLD&& \
1492         echo #define PERL_PRIfldbl "Lf"&& \
1493         echo #define PERL_PRIgldbl "Lg"&& \
1494         echo #define PERL_PRIeldbl "Le"&& \
1495         echo #define PERL_SCNfldbl "Lf"&& \
1496         echo #define NVTYPE long double&& \
1497         echo #define NVSIZE LONG_DOUBLESIZE&& \
1498         echo #define NV_OVERFLOWS_INTEGERS_AT 256.0*256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0*2.0*2.0*2.0&& \
1499         echo #define NVef "Le"&& \
1500         echo #define NVff "Lf"&& \
1501         echo #define NVgf "Lg"&& \
1502         echo #undef I_QUADMATH&& \
1503         echo #undef USE_QUADMATH&& \
1504         echo #define USE_LONG_DOUBLE)>> config.h
1505 else ifeq ($(USE_QUADMATH),define)
1506         @(echo #define Gconvert^(x,n,t,b^) sprintf^(^(b^),"%%.*""Lg",^(n^),^(x^)^)&& \
1507         echo #define HAS_FREXPL&& \
1508         echo #define HAS_ISNANL&& \
1509         echo #define HAS_MODFL&& \
1510         echo #define HAS_MODFL_PROTO&& \
1511         echo #define HAS_SQRTL&& \
1512         echo #define HAS_STRTOLD&& \
1513         echo #define PERL_PRIfldbl "Lf"&& \
1514         echo #define PERL_PRIgldbl "Lg"&& \
1515         echo #define PERL_PRIeldbl "Le"&& \
1516         echo #define PERL_SCNfldbl "Lf"&& \
1517         echo #define NVTYPE __float128&& \
1518         echo #define NVSIZE 16&& \
1519         echo #define NV_OVERFLOWS_INTEGERS_AT 256.0*256.0*256.0*256.0*256.0*256.0*256.0*256.0*256.0*256.0*256.0*256.0*256.0*256.0*2.0&& \
1520         echo #define NVef "Qe"&& \
1521         echo #define NVff "Qf"&& \
1522         echo #define NVgf "Qg"&& \
1523         echo #undef USE_LONG_DOUBLE&& \
1524         echo #define I_QUADMATH&& \
1525         echo #define USE_QUADMATH)>> config.h
1526 else
1527         @(echo #define Gconvert^(x,n,t,b^) sprintf^(^(b^),"%%.*g",^(n^),^(x^)^)&& \
1528         echo #undef HAS_FREXPL&& \
1529         echo #undef HAS_ISNANL&& \
1530         echo #undef HAS_MODFL&& \
1531         echo #undef HAS_MODFL_PROTO&& \
1532         echo #undef HAS_SQRTL&& \
1533         echo #undef HAS_STRTOLD&& \
1534         echo #undef PERL_PRIfldbl&& \
1535         echo #undef PERL_PRIgldbl&& \
1536         echo #undef PERL_PRIeldbl&& \
1537         echo #undef PERL_SCNfldbl&& \
1538         echo #define NVTYPE double&& \
1539         echo #define NVSIZE ^8&& \
1540         echo #define NV_OVERFLOWS_INTEGERS_AT 256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0&& \
1541         echo #define NVef "e"&& \
1542         echo #define NVff "f"&& \
1543         echo #define NVgf "g"&& \
1544         echo #undef I_QUADMATH&& \
1545         echo #undef USE_QUADMATH&& \
1546         echo #undef USE_LONG_DOUBLE)>> config.h
1547 endif
1548 ifeq ($(USE_CPLUSPLUS),define)
1549         @(echo #define USE_CPLUSPLUS&& \
1550         echo #endif)>> config.h
1551 else
1552         @(echo #undef USE_CPLUSPLUS&& \
1553         echo #endif)>> config.h
1554 endif
1555 #separate line since this is sentinal that this target is done
1556         @rem. > $(MINIDIR)\.exists
1557
1558 $(MINICORE_OBJ) : $(CORE_NOCFG_H)
1559         $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_EXTERNAL_GLOB -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ $(PDBOUT) ..\$(*F).c
1560
1561 $(MINIWIN32_OBJ) : $(CORE_NOCFG_H)
1562         $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ $(PDBOUT) $(*F).c
1563
1564 # -DPERL_IMPLICIT_SYS needs C++ for perllib.c
1565 # rules wrapped in .IFs break Win9X build (we end up with unbalanced []s
1566 # unless the .IF is true), so instead we use a .ELSE with the default.
1567 # This is the only file that depends on perlhost.h, vmem.h, and vdir.h
1568
1569 perllib$(o)     : perllib.c perllibst.h .\perlhost.h .\vdir.h .\vmem.h
1570 ifeq ($(USE_IMP_SYS),define)
1571         $(CC) -c -I. $(CFLAGS_O) $(CXX_FLAG) $(OBJOUT_FLAG)$@ $(PDBOUT) perllib.c
1572 else
1573         $(CC) -c -I. $(CFLAGS_O) $(OBJOUT_FLAG)$@ $(PDBOUT) perllib.c
1574 endif
1575
1576 # 1. we don't want to rebuild miniperl.exe when config.h changes
1577 # 2. we don't want to rebuild miniperl.exe with non-default config.h
1578 # 3. we can't have miniperl.exe depend on git_version.h, as miniperl creates it
1579 $(MINI_OBJ)     : $(MINIDIR)\.exists $(CORE_NOCFG_H)
1580
1581 $(WIN32_OBJ)    : $(CORE_H)
1582
1583 $(CORE_OBJ)     : $(CORE_H)
1584
1585 $(DLL_OBJ)      : $(CORE_H)
1586
1587
1588 perllibst.h : $(HAVEMINIPERL) $(CONFIGPM) create_perllibst_h.pl
1589         $(MINIPERL) -I..\lib create_perllibst_h.pl
1590
1591 perldll.def : $(HAVEMINIPERL) $(CONFIGPM) ..\embed.fnc ..\makedef.pl
1592         $(MINIPERL) -I..\lib -w ..\makedef.pl PLATFORM=win32 $(OPTIMIZE) $(DEFINES) \
1593         $(BUILDOPT) CCTYPE=$(CCTYPE) TARG_DIR=..\ > perldll.def
1594
1595 $(PERLEXPLIB) : $(PERLIMPLIB)
1596
1597 $(PERLIMPLIB) : perldll.def
1598 ifeq ($(CCTYPE),GCC)
1599         $(IMPLIB) -k -d perldll.def -D $(PERLDLLBASE) -l $(PERLIMPLIB) -e $(PERLEXPLIB)
1600 else
1601         lib -def:perldll.def -machine:$(ARCHITECTURE) /OUT:$(PERLIMPLIB)
1602 endif
1603
1604 $(PERLDLL): $(PERLEXPLIB) $(PERLDLL_OBJ) $(PERLDLL_RES) Extensions_static
1605 ifeq ($(CCTYPE),GCC)
1606         $(LINK32) -mdll -o $@ $(BLINK_FLAGS) \
1607            $(PERLDLL_OBJ) $(shell type Extensions_static) $(LIBFILES) $(PERLEXPLIB)
1608 else
1609         $(LINK32) -dll -out:$@ $(BLINK_FLAGS) \
1610             @Extensions_static \
1611             $(DELAYLOAD) $(LIBFILES) \
1612             $(PERLDLL_RES) $(PERLDLL_OBJ) $(PERLEXPLIB)
1613         $(EMBED_DLL_MANI)
1614 endif
1615
1616 $(PERLSTATICLIB): $(PERLDLL_OBJ) Extensions_static
1617 ifeq ($(CCTYPE),GCC)
1618         $(LIB32) $(LIB_FLAGS) $@ $(PERLDLL_OBJ)
1619         if exist $(STATICDIR) rmdir /s /q $(STATICDIR)
1620         for %%i in ($(shell type Extensions_static)) do \
1621                 @mkdir $(STATICDIR) && cd $(STATICDIR) && \
1622                 $(ARCHPREFIX)ar x ..\%%i && \
1623                 $(ARCHPREFIX)ar q ..\$@ *$(o) && \
1624                 cd .. && rmdir /s /q $(STATICDIR)
1625 else
1626         $(LIB32) $(LIB_FLAGS) -out:$@ @Extensions_static \
1627             $(PERLDLL_OBJ)
1628 endif
1629         $(XCOPY) $(PERLSTATICLIB) $(COREDIR)
1630
1631 $(PERLEXE_RES): perlexe.rc $(PERLEXE_MANIFEST) $(PERLEXE_ICO)
1632
1633 $(MINIDIR)\globals$(o) : $(GENERATED_HEADERS)
1634
1635 $(UUDMAP_H) $(MG_DATA_H) : $(BITCOUNT_H)
1636
1637 $(BITCOUNT_H) : $(GENUUDMAP)
1638         $(GENUUDMAP) $(GENERATED_HEADERS)
1639
1640 $(GENUUDMAP) : ..\mg_raw.h
1641 ifeq ($(CCTYPE),GCC)
1642         $(LINK32) $(CFLAGS_O) -o..\generate_uudmap.exe ..\generate_uudmap.c \
1643         $(BLINK_FLAGS) $(LIBFILES)
1644 else
1645         $(CC) $(CFLAGS_O) $(PDBOUT) -Fe..\generate_uudmap.exe ..\generate_uudmap.c -link $(LIBFILES) $(BLINK_FLAGS)
1646         $(EMBED_EXE_MANI)
1647 endif
1648
1649 .PHONY: MakePPPort
1650
1651 MakePPPort : $(HAVEMINIPERL) $(CONFIGPM)
1652         $(MINIPERL) -I..\lib ..\mkppport
1653
1654 # also known as $(HAVE_COREDIR)
1655 .coreheaders : $(CORE_H)
1656         $(XCOPY) *.h $(COREDIR)\\*.*
1657         $(RCOPY) include $(COREDIR)\\*.*
1658         $(XCOPY) ..\\*.h $(COREDIR)\\*.*
1659         rem. > $@
1660
1661 perlmain$(o) : runperl.c $(CONFIGPM)
1662         $(CC) $(subst -DPERLDLL,-UPERLDLL,$(CFLAGS_O)) $(OBJOUT_FLAG)$@ $(PDBOUT) -c runperl.c
1663
1664 perlmainst$(o) : runperl.c $(CONFIGPM)
1665         $(CC) $(CFLAGS_O) $(OBJOUT_FLAG)$@ $(PDBOUT) -c runperl.c
1666
1667 $(PERLEXE): $(CONFIGPM) $(PERLEXE_OBJ) $(PERLEXE_RES) $(PERLIMPLIB)
1668 ifeq ($(CCTYPE),GCC)
1669         $(LINK32) -mconsole -o $@ $(BLINK_FLAGS)  \
1670             $(PERLEXE_OBJ) $(PERLEXE_RES) $(PERLIMPLIB) $(LIBFILES)
1671 else
1672         $(LINK32) -out:$@ $(BLINK_FLAGS) \
1673             $(PERLEXE_OBJ) $(PERLEXE_RES) $(PERLIMPLIB) $(LIBFILES) $(SETARGV_OBJ)
1674         $(APPEND_EXE_MANI)
1675 endif
1676         copy $(PERLEXE) $(WPERLEXE)
1677         $(MINIPERL) -I..\lib bin\exetype.pl $(WPERLEXE) WINDOWS
1678
1679 $(PERLEXESTATIC): $(PERLSTATICLIB) $(CONFIGPM) $(PERLEXEST_OBJ) $(PERLEXE_RES)
1680 ifeq ($(CCTYPE),GCC)
1681         $(LINK32) -mconsole -o $@ $(BLINK_FLAGS) \
1682             $(PERLEXEST_OBJ) $(PERLEXE_RES) $(PERLSTATICLIB) $(LIBFILES)
1683 else
1684         $(LINK32) -out:$@ $(BLINK_FLAGS) \
1685             $(PERLEXEST_OBJ) $(PERLEXE_RES) $(PERLSTATICLIB) $(LIBFILES) $(SETARGV_OBJ)
1686         $(APPEND_EXE_MANI)
1687 endif
1688
1689 #-------------------------------------------------------------------------------
1690 # There's no direct way to mark a dependency on
1691 # DynaLoader.pm, so this will have to do
1692
1693 #most of deps of this target are in DYNALOADER and therefore omitted here
1694 Extensions : $(PERLDEP) $(DYNALOADER) Extension_lib $(GLOBEXE) MakePPPort
1695         $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic !Unicode/Normalize
1696
1697 Normalize_static : $(CONFIGPM) $(GLOBEXE) $(HAVE_COREDIR) $(UNIDATAFILES)
1698         $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --static +Unicode/Normalize
1699
1700 Normalize_dyn : $(PERLDEP) $(DYNALOADER) $(GLOBEXE) $(UNIDATAFILES)
1701         $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic +Unicode/Normalize
1702
1703 Extensions_reonly : $(PERLDEP) $(DYNALOADER)
1704         $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic +re
1705
1706 Exts_static_general : ..\make_ext.pl $(CONFIGPM) Extension_lib $(GLOBEXE) $(HAVE_COREDIR) MakePPPort
1707         $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --static !Unicode/Normalize
1708
1709 Extensions_static : list_static_libs.pl Exts_static_general $(NORMALIZE_STATIC)
1710         $(MINIPERL) -I..\lib list_static_libs.pl > Extensions_static
1711
1712 Extensions_nonxs : ..\make_ext.pl ..\pod\perlfunc.pod $(CONFIGPM) $(GLOBEXE)
1713         $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --nonxs !libs
1714
1715 Extension_lib : ..\make_ext.pl $(CONFIGPM)
1716         $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) lib
1717
1718 #lib must be built, it can't be buildcustomize.pl-ed, and is required for XS building
1719 $(DYNALOADER) : ..\make_ext.pl $(CONFIGPM) $(HAVE_COREDIR)
1720         $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(EXTDIR) --dir=$(DISTDIR) --dynaloader
1721
1722 Extensions_clean :
1723         -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=clean
1724
1725 Extensions_realclean :
1726         -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=realclean
1727
1728 # all PE files need to be built by the time this target runs, PP files can still
1729 # be running in parallel like UNIDATAFILES, this target a placeholder for the
1730 # future
1731 ifeq ($(PERLSTATIC),static)
1732 rebasePE : Extensions $(PERLDLL) $(PERLEXE) $(PERLEXESTATIC)
1733 else
1734 rebasePE : Extensions $(PERLDLL) $(NORMALIZE_DYN) $(PERLEXE)
1735 endif
1736         $(NOOP)
1737
1738 #-------------------------------------------------------------------------------
1739
1740 doc: $(PERLEXE) $(PERLDLL) ..\pod\perltoc.pod
1741         $(PERLEXE) -I..\lib ..\installhtml --podroot=.. --htmldir=$(HTMLDIR) \
1742             --podpath=pod:lib:utils --htmlroot="file://$(subst :,|,$(INST_HTML))"\
1743             --recurse
1744
1745 ..\utils\Makefile: $(CONFIGPM) ..\utils\Makefile.PL
1746         $(MINIPERL) -I..\lib ..\utils\Makefile.PL ..
1747
1748 # Note that this next section is parsed (and regenerated) by pod/buildtoc
1749 # so please check that script before making structural changes here
1750 utils: $(HAVEMINIPERL) ..\utils\Makefile
1751         cd ..\utils && $(PLMAKE) PERL=$(MINIPERL)
1752         copy ..\README.aix      ..\pod\perlaix.pod
1753         copy ..\README.amiga    ..\pod\perlamiga.pod
1754         copy ..\README.android  ..\pod\perlandroid.pod
1755         copy ..\README.bs2000   ..\pod\perlbs2000.pod
1756         copy ..\README.cn       ..\pod\perlcn.pod
1757         copy ..\README.cygwin   ..\pod\perlcygwin.pod
1758         copy ..\README.dos      ..\pod\perldos.pod
1759         copy ..\README.freebsd  ..\pod\perlfreebsd.pod
1760         copy ..\README.haiku    ..\pod\perlhaiku.pod
1761         copy ..\README.hpux     ..\pod\perlhpux.pod
1762         copy ..\README.hurd     ..\pod\perlhurd.pod
1763         copy ..\README.irix     ..\pod\perlirix.pod
1764         copy ..\README.jp       ..\pod\perljp.pod
1765         copy ..\README.ko       ..\pod\perlko.pod
1766         copy ..\README.linux    ..\pod\perllinux.pod
1767         copy ..\README.macos    ..\pod\perlmacos.pod
1768         copy ..\README.macosx   ..\pod\perlmacosx.pod
1769         copy ..\README.netware  ..\pod\perlnetware.pod
1770         copy ..\README.openbsd  ..\pod\perlopenbsd.pod
1771         copy ..\README.os2      ..\pod\perlos2.pod
1772         copy ..\README.os390    ..\pod\perlos390.pod
1773         copy ..\README.os400    ..\pod\perlos400.pod
1774         copy ..\README.plan9    ..\pod\perlplan9.pod
1775         copy ..\README.qnx      ..\pod\perlqnx.pod
1776         copy ..\README.riscos   ..\pod\perlriscos.pod
1777         copy ..\README.solaris  ..\pod\perlsolaris.pod
1778         copy ..\README.synology ..\pod\perlsynology.pod
1779         copy ..\README.tru64    ..\pod\perltru64.pod
1780         copy ..\README.tw       ..\pod\perltw.pod
1781         copy ..\README.vos      ..\pod\perlvos.pod
1782         copy ..\README.win32    ..\pod\perlwin32.pod
1783         copy ..\pod\perldelta.pod ..\pod\perl5338delta.pod
1784         $(MINIPERL) -I..\lib $(PL2BAT) $(UTILS)
1785         $(MINIPERL) -I..\lib ..\autodoc.pl ..
1786         $(MINIPERL) -I..\lib ..\pod\perlmodlib.PL -q ..
1787
1788 ..\pod\perltoc.pod: $(PERLEXE) $(PERLDLL) Extensions Extensions_nonxs $(NORMALIZE_DYN) utils
1789         $(PERLEXE) -f ..\pod\buildtoc -q
1790
1791 # Note that the pod cleanup in this next section is parsed (and regenerated
1792 # by pod/buildtoc so please check that script before making changes here
1793
1794 distclean: realclean
1795         -del /f $(MINIPERL) $(PERLEXE) $(PERLDLL) $(GLOBEXE) \
1796                 $(PERLIMPLIB) ..\miniperl$(a) $(PERLEXESTATIC) $(PERLSTATICLIB)
1797         -del /f $(LIBDIR)\Encode.pm $(LIBDIR)\encoding.pm $(LIBDIR)\Errno.pm
1798         -del /f $(LIBDIR)\Config.pod $(LIBDIR)\POSIX.pod $(LIBDIR)\threads.pm
1799         -del /f $(LIBDIR)\.exists $(LIBDIR)\attributes.pm $(LIBDIR)\DynaLoader.pm
1800         -del /f $(LIBDIR)\Fcntl.pm $(LIBDIR)\IO.pm $(LIBDIR)\Opcode.pm
1801         -del /f $(LIBDIR)\ops.pm $(LIBDIR)\Safe.pm
1802         -del /f $(LIBDIR)\SDBM_File.pm $(LIBDIR)\Socket.pm $(LIBDIR)\POSIX.pm
1803         -del /f $(LIBDIR)\B.pm $(LIBDIR)\O.pm $(LIBDIR)\re.pm
1804         -del /f $(LIBDIR)\File\Glob.pm
1805         -del /f $(LIBDIR)\Sys\Hostname.pm
1806         -del /f $(LIBDIR)\Time\HiRes.pm
1807         -del /f $(LIBDIR)\Unicode\Normalize.pm
1808         -del /f $(LIBDIR)\Math\BigInt\FastCalc.pm
1809         -del /f $(LIBDIR)\Storable.pm $(LIBDIR)\Storable\Limit.pm
1810         -del /f $(LIBDIR)\Win32.pm
1811         -del /f $(LIBDIR)\Win32CORE.pm
1812         -del /f $(LIBDIR)\Win32API\File.pm
1813         -del /f $(LIBDIR)\Win32API\File\cFile.pc
1814         -del /f $(LIBDIR)\buildcustomize.pl
1815         -del /f $(DISTDIR)\XSLoader\XSLoader.pm
1816         -del /f *.def *.map
1817         -if exist $(LIBDIR)\Amiga rmdir /s /q $(LIBDIR)\Amiga
1818         -if exist $(LIBDIR)\App rmdir /s /q $(LIBDIR)\App
1819         -if exist $(LIBDIR)\Archive rmdir /s /q $(LIBDIR)\Archive
1820         -if exist $(LIBDIR)\Attribute rmdir /s /q $(LIBDIR)\Attribute
1821         -if exist $(LIBDIR)\autodie rmdir /s /q $(LIBDIR)\autodie
1822         -if exist $(LIBDIR)\Carp rmdir /s /q $(LIBDIR)\Carp
1823         -if exist $(LIBDIR)\Compress rmdir /s /q $(LIBDIR)\Compress
1824         -if exist $(LIBDIR)\Config\Perl rmdir /s /q $(LIBDIR)\Config\Perl
1825         -if exist $(LIBDIR)\CPAN rmdir /s /q $(LIBDIR)\CPAN
1826         -if exist $(LIBDIR)\Data rmdir /s /q $(LIBDIR)\Data
1827         -if exist $(LIBDIR)\Devel rmdir /s /q $(LIBDIR)\Devel
1828         -if exist $(LIBDIR)\Digest rmdir /s /q $(LIBDIR)\Digest
1829         -if exist $(LIBDIR)\Encode rmdir /s /q $(LIBDIR)\Encode
1830         -if exist $(LIBDIR)\encoding rmdir /s /q $(LIBDIR)\encoding
1831         -if exist $(LIBDIR)\Exporter rmdir /s /q $(LIBDIR)\Exporter
1832         -if exist $(LIBDIR)\ExtUtils\CBuilder rmdir /s /q $(LIBDIR)\ExtUtils\CBuilder
1833         -if exist $(LIBDIR)\ExtUtils\Command rmdir /s /q $(LIBDIR)\ExtUtils\Command
1834         -if exist $(LIBDIR)\ExtUtils\Constant rmdir /s /q $(LIBDIR)\ExtUtils\Constant
1835         -if exist $(LIBDIR)\ExtUtils\Liblist rmdir /s /q $(LIBDIR)\ExtUtils\Liblist
1836         -if exist $(LIBDIR)\ExtUtils\MakeMaker rmdir /s /q $(LIBDIR)\ExtUtils\MakeMaker
1837         -if exist $(LIBDIR)\ExtUtils\ParseXS rmdir /s /q $(LIBDIR)\ExtUtils\ParseXS
1838         -if exist $(LIBDIR)\ExtUtils\Typemaps rmdir /s /q $(LIBDIR)\ExtUtils\Typemaps
1839         -if exist $(LIBDIR)\File\Spec rmdir /s /q $(LIBDIR)\File\Spec
1840         -if exist $(LIBDIR)\Filter rmdir /s /q $(LIBDIR)\Filter
1841         -if exist $(LIBDIR)\Hash rmdir /s /q $(LIBDIR)\Hash
1842         -if exist $(LIBDIR)\HTTP rmdir /s /q $(LIBDIR)\HTTP
1843         -if exist $(LIBDIR)\I18N rmdir /s /q $(LIBDIR)\I18N
1844         -if exist $(LIBDIR)\inc rmdir /s /q $(LIBDIR)\inc
1845         -if exist $(LIBDIR)\IO rmdir /s /q $(LIBDIR)\IO
1846         -if exist $(LIBDIR)\IPC rmdir /s /q $(LIBDIR)\IPC
1847         -if exist $(LIBDIR)\JSON rmdir /s /q $(LIBDIR)\JSON
1848         -if exist $(LIBDIR)\List rmdir /s /q $(LIBDIR)\List
1849         -if exist $(LIBDIR)\Locale rmdir /s /q $(LIBDIR)\Locale
1850         -if exist $(LIBDIR)\Math rmdir /s /q $(LIBDIR)\Math
1851         -if exist $(LIBDIR)\Memoize rmdir /s /q $(LIBDIR)\Memoize
1852         -if exist $(LIBDIR)\MIME rmdir /s /q $(LIBDIR)\MIME
1853         -if exist $(LIBDIR)\Module rmdir /s /q $(LIBDIR)\Module
1854         -if exist $(LIBDIR)\Net\FTP rmdir /s /q $(LIBDIR)\Net\FTP
1855         -if exist $(LIBDIR)\Params rmdir /s /q $(LIBDIR)\Params
1856         -if exist $(LIBDIR)\Parse rmdir /s /q $(LIBDIR)\Parse
1857         -if exist $(LIBDIR)\Perl rmdir /s /q $(LIBDIR)\Perl
1858         -if exist $(LIBDIR)\PerlIO rmdir /s /q $(LIBDIR)\PerlIO
1859         -if exist $(LIBDIR)\Pod\Perldoc rmdir /s /q $(LIBDIR)\Pod\Perldoc
1860         -if exist $(LIBDIR)\Pod\Simple rmdir /s /q $(LIBDIR)\Pod\Simple
1861         -if exist $(LIBDIR)\Pod\Text rmdir /s /q $(LIBDIR)\Pod\Text
1862         -if exist $(LIBDIR)\Scalar rmdir /s /q $(LIBDIR)\Scalar
1863         -if exist $(LIBDIR)\Search rmdir /s /q $(LIBDIR)\Search
1864         -if exist $(LIBDIR)\Sub rmdir /s /q $(LIBDIR)\Sub
1865         -if exist $(LIBDIR)\Sys rmdir /s /q $(LIBDIR)\Sys
1866         -if exist $(LIBDIR)\TAP rmdir /s /q $(LIBDIR)\TAP
1867         -if exist $(LIBDIR)\Term rmdir /s /q $(LIBDIR)\Term
1868         -if exist $(LIBDIR)\Test rmdir /s /q $(LIBDIR)\Test
1869         -if exist $(LIBDIR)\Test2 rmdir /s /q $(LIBDIR)\Test2
1870         -if exist $(LIBDIR)\Text rmdir /s /q $(LIBDIR)\Text
1871         -if exist $(LIBDIR)\Thread rmdir /s /q $(LIBDIR)\Thread
1872         -if exist $(LIBDIR)\threads rmdir /s /q $(LIBDIR)\threads
1873         -if exist $(LIBDIR)\Tie\Hash rmdir /s /q $(LIBDIR)\Tie\Hash
1874         -if exist $(LIBDIR)\Unicode\Collate rmdir /s /q $(LIBDIR)\Unicode\Collate
1875         -if exist $(LIBDIR)\Unicode\Collate\Locale rmdir /s /q $(LIBDIR)\Unicode\Collate\Locale
1876         -if exist $(LIBDIR)\version rmdir /s /q $(LIBDIR)\version
1877         -if exist $(LIBDIR)\VMS rmdir /s /q $(LIBDIR)\VMS
1878         -if exist $(LIBDIR)\Win32API rmdir /s /q $(LIBDIR)\Win32API
1879         -if exist $(LIBDIR)\XS rmdir /s /q $(LIBDIR)\XS
1880         -cd $(PODDIR) && del /f *.html *.bat roffitall \
1881             perl5338delta.pod perlaix.pod perlamiga.pod perlandroid.pod \
1882             perlapi.pod perlbs2000.pod perlcn.pod perlcygwin.pod \
1883             perldos.pod perlfreebsd.pod perlhaiku.pod perlhpux.pod \
1884             perlhurd.pod perlintern.pod perlirix.pod perljp.pod perlko.pod \
1885             perllinux.pod perlmacos.pod perlmacosx.pod perlmodlib.pod \
1886             perlnetware.pod perlopenbsd.pod perlos2.pod perlos390.pod \
1887             perlos400.pod perlplan9.pod perlqnx.pod perlriscos.pod \
1888             perlsolaris.pod perlsynology.pod perltoc.pod perltru64.pod \
1889             perltw.pod perluniprops.pod perlvos.pod perlwin32.pod
1890         -cd ..\utils && del /f h2ph splain perlbug pl2pm h2xs \
1891             perldoc perlivp libnetcfg enc2xs encguess piconv cpan *.bat \
1892             xsubpp pod2html instmodsh json_pp prove ptar ptardiff ptargrep shasum corelist zipdetails
1893         -del /f ..\config.sh perlmain.c dlutils.c config.h.new \
1894             perlmainst.c
1895         -del /f $(CONFIGPM)
1896         -del /f ..\lib\Config_git.pl
1897         -del /f "bin\*.bat"
1898         -del /f perllibst.h
1899         -del /f $(PERLEXE_RES) perl.base
1900         -cd .. && del /s *$(a) *.map *.pdb *.ilk *.bs *$(o) .exists pm_to_blib ppport.h
1901         -cd $(EXTDIR) && del /s *.def Makefile Makefile.old
1902         -cd $(DISTDIR) && del /s *.def Makefile Makefile.old
1903         -cd $(CPANDIR) && del /s *.def Makefile Makefile.old
1904         -del /s ..\utils\Makefile
1905         -if exist $(AUTODIR) rmdir /s /q $(AUTODIR)
1906         -if exist $(COREDIR) rmdir /s /q $(COREDIR)
1907         -if exist pod2htmd.tmp del pod2htmd.tmp
1908         -if exist $(HTMLDIR) rmdir /s /q $(HTMLDIR)
1909         -del /f ..\t\test_state
1910
1911 install : all installbare installhtml
1912
1913 installbare : utils ..\pod\perltoc.pod
1914         $(PERLEXE) ..\installperl
1915         if exist $(WPERLEXE) $(XCOPY) $(WPERLEXE) $(INST_BIN)\$(NULL)
1916         if exist $(PERLEXESTATIC) $(XCOPY) $(PERLEXESTATIC) $(INST_BIN)\$(NULL)
1917         $(XCOPY) $(GLOBEXE) $(INST_BIN)\$(NULL)
1918         if exist ..\perl*.pdb $(XCOPY) ..\perl*.pdb $(INST_BIN)\$(NULL)
1919         $(XCOPY) "bin\*.bat" $(INST_SCRIPT)\$(NULL)
1920
1921 installhtml : doc
1922         $(RCOPY) $(HTMLDIR)\*.* $(INST_HTML)\$(NULL)
1923
1924 inst_lib : $(CONFIGPM)
1925         $(RCOPY) ..\lib $(INST_LIB)\$(NULL)
1926
1927 $(UNIDATAFILES) : ..\pod\perluniprops.pod
1928
1929 ..\pod\perluniprops.pod: ..\lib\unicore\mktables $(CONFIGPM)
1930         $(MINIPERL) -I..\lib ..\lib\unicore\mktables -C ..\lib\unicore -P ..\pod -maketest -makelist -p
1931
1932 minitest : $(HAVEMINIPERL) $(GLOBEXE) $(CONFIGPM) $(UNIDATAFILES) utils
1933         $(XCOPY) $(MINIPERL) ..\t\$(NULL)
1934         if exist ..\t\perl.exe del /f ..\t\perl.exe
1935         rename ..\t\miniperl.exe perl.exe
1936         $(XCOPY) $(GLOBEXE) ..\t\$(NULL)
1937         attrib -r "..\t\*.*"
1938         cd ..\t && \
1939         $(MINIPERL) -I..\lib harness base/*.t comp/*.t cmd/*.t io/*.t opbasic/*.t op/*.t pragma/*.t
1940
1941 test-prep : all utils ..\pod\perltoc.pod $(TESTPREPGCC)
1942         $(XCOPY) $(PERLEXE) ..\t\$(NULL)
1943         $(XCOPY) $(PERLDLL) ..\t\$(NULL)
1944         $(XCOPY) $(GLOBEXE) ..\t\$(NULL)
1945 # If building with gcc versions 4.x.x or greater, then
1946 # the GCC helper DLL will also need copied to the test directory.
1947 # The name of the dll can change, depending upon which vendor has supplied
1948 # your compiler, and upon the values of "x".
1949 # libstdc++-6.dll is copied if it exists as it, too, may then be needed.
1950 # Without this copying, the op/taint.t test script will fail.
1951
1952 ifeq ($(CCTYPE),GCC)
1953
1954 test-prep-gcc :
1955         if exist $(CCDLLDIR)\libgcc_s_seh-1.dll $(XCOPY) $(CCDLLDIR)\libgcc_s_seh-1.dll ..\t\$(NULL)
1956         if exist $(CCDLLDIR)\libgcc_s_sjlj-1.dll $(XCOPY) $(CCDLLDIR)\libgcc_s_sjlj-1.dll ..\t\$(NULL)
1957         if exist $(CCDLLDIR)\libgcc_s_dw2-1.dll $(XCOPY) $(CCDLLDIR)\libgcc_s_dw2-1.dll ..\t\$(NULL)
1958         if exist $(CCDLLDIR)\libstdc++-6.dll $(XCOPY) $(CCDLLDIR)\libstdc++-6.dll ..\t\$(NULL)
1959         if exist $(CCDLLDIR)\libwinpthread-1.dll $(XCOPY) $(CCDLLDIR)\libwinpthread-1.dll ..\t\$(NULL)
1960         if exist $(CCDLLDIR)\libquadmath-0.dll $(XCOPY) $(CCDLLDIR)\libquadmath-0.dll ..\t\$(NULL)
1961
1962 endif
1963
1964 test : test-prep
1965         set PERL_STATIC_EXT=$(STATIC_EXT) && \
1966             cd ..\t && perl.exe harness $(TEST_SWITCHES) $(TEST_FILES)
1967
1968 test_porting : test-prep
1969         set PERL_STATIC_EXT=$(STATIC_EXT) && \
1970             cd ..\t && perl.exe harness $(TEST_SWITCHES) porting\*.t ..\lib\diagnostics.t
1971
1972 test-reonly : reonly utils
1973         $(XCOPY) $(PERLEXE) ..\t\$(NULL)
1974         $(XCOPY) $(PERLDLL) ..\t\$(NULL)
1975         $(XCOPY) $(GLOBEXE) ..\t\$(NULL)
1976         cd ..\t && perl.exe harness $(OPT) -re \bpat\\/ $(EXTRA)
1977
1978 regen :
1979         cd .. && regen.pl
1980
1981 test-notty : test-prep
1982         set PERL_STATIC_EXT=$(STATIC_EXT) && \
1983             set PERL_SKIP_TTY_TEST=1 && \
1984             cd ..\t && perl.exe harness $(TEST_SWITCHES) $(TEST_FILES)
1985
1986 _test :
1987         $(XCOPY) $(PERLEXE) ..\t\$(NULL)
1988         $(XCOPY) $(PERLDLL) ..\t\$(NULL)
1989         $(XCOPY) $(GLOBEXE) ..\t\$(NULL)
1990         set PERL_STATIC_EXT=$(STATIC_EXT) && \
1991             cd ..\t && perl.exe harness $(TEST_SWITCHES) $(TEST_FILES)
1992
1993 _clean :
1994         -@erase miniperlmain$(o)
1995         -@erase $(MINIPERL)
1996         -@erase perlglob$(o)
1997         -@erase perlmain$(o)
1998         -@erase perlmainst$(o)
1999         -@erase /f config.h
2000         -@erase /f ..\git_version.h
2001         -@erase $(GLOBEXE)
2002         -@erase $(PERLEXE)
2003         -@erase $(WPERLEXE)
2004         -@erase $(PERLEXESTATIC)
2005         -@erase $(PERLSTATICLIB)
2006         -@erase $(PERLDLL)
2007         -@erase $(CORE_OBJ)
2008         -@erase $(GENUUDMAP) $(GENUUDMAP_OBJ) $(GENERATED_HEADERS)
2009         -@erase .coreheaders
2010         -if exist $(MINIDIR) rmdir /s /q $(MINIDIR)
2011         -if exist $(UNIDATADIR1) rmdir /s /q $(UNIDATADIR1)
2012         -if exist $(UNIDATADIR2) rmdir /s /q $(UNIDATADIR2)
2013         -@erase $(UNIDATAFILES)
2014         -@erase $(WIN32_OBJ)
2015         -@erase $(DLL_OBJ)
2016         -@erase ..\*$(o) ..\*$(a) ..\*.exp *$(o) *$(a) *.exp *.res
2017         -@erase ..\t\*.exe ..\t\*.dll ..\t\*.bat
2018         -@erase *.ilk
2019         -@erase *.pdb ..\*.pdb
2020         -@erase Extensions_static
2021
2022 clean : Extensions_clean _clean
2023
2024 realclean : Extensions_realclean _clean
2025
2026 # Handy way to run perlbug -ok without having to install and run the
2027 # installed perlbug. We don't re-run the tests here - we trust the user.
2028 # Please *don't* use this unless all tests pass.
2029 # If you want to report test failures, use "gmake nok" instead.
2030 ok: utils $(PERLEXE) $(PERLDLL) Extensions_nonxs Extensions
2031         $(PERLEXE) ..\utils\perlbug -ok -s "(UNINSTALLED)"
2032
2033 okfile: utils $(PERLEXE) $(PERLDLL) Extensions_nonxs Extensions
2034         $(PERLEXE) ..\utils\perlbug -ok -s "(UNINSTALLED)" -F perl.ok
2035
2036 nok: utils $(PERLEXE) $(PERLDLL) Extensions_nonxs Extensions
2037         $(PERLEXE) ..\utils\perlbug -nok -s "(UNINSTALLED)"
2038
2039 nokfile: utils $(PERLEXE) $(PERLDLL) Extensions_nonxs Extensions
2040         $(PERLEXE) ..\utils\perlbug -nok -s "(UNINSTALLED)" -F perl.nok
2041