2 # Makefile to build perl on Windowns NT using Microsoft NMAKE.
5 # This is set up to build a perl.exe that runs off a shared library
6 # (perl.dll). Also makes individual DLLs for the XS extensions.
10 # Set these to wherever you want "nmake install" to put your
13 INST_TOP=$(INST_DRV)\perl5004.5x
14 BUILDOPT=-DUSE_THREADS
15 #BUILDOPT=-DMULTIPLICITY
16 #BUILDOPT=-DMULTIPLICITY -DUSE_THREADS
17 #BUILDOPT=-DPERL_GLOBAL_STRUCT -DMULTIPLICITY
19 # -DUSE_PERLIO -D__STDC__=1 -DUSE_SFIO -DI_SFIO -I\sfio97\include
22 # uncomment one if you are using Visual C++ 2.x or Borland
23 # comment out both if you are using Visual C++ 4.x and above
28 # uncomment next line if you want debug version of perl (big,slow)
32 # set the install locations of the compiler include/libraries
35 CCINCDIR = $(CCHOME)\include
36 CCLIBDIR = $(CCHOME)\lib
39 # set this to point to cmd.exe (only needed if you use some
40 # alternate shell that doesn't grok cmd.exe style commands)
41 #SHELL = g:\winnt\system32\cmd.exe
44 # set this to your email address (perl will guess a value from
45 # from your loginname and your hostname, which may not be right)
48 ##################### CHANGE THESE ONLY IF YOU MUST #####################
51 # Programs to compile, build .lib files and link
56 .IF "$(CCTYPE)" == "BORLAND"
67 INCLUDES = -I.\include -I. -I.. -I$(CCINCDIR)
68 #PCHFLAGS = -H -H$(INTDIR)\bcmoduls.pch
69 DEFINES = -DWIN32 $(BUILDOPT)
70 LOCDEFS = -DPERLDLL -DPERL_CORE
73 LIBFILES = import32.lib $(LIBC) odbc32.lib odbccp32.lib
77 .IF "$(CFG)" == "Debug"
78 OPTIMIZE = -v $(RUNTIME) -DDEBUGGING
81 OPTIMIZE = -5 -O2 $(RUNTIME)
85 CFLAGS = -w -d -tWM -tWD $(INCLUDES) $(DEFINES) $(LOCDEFS) $(PCHFLAGS) $(OPTIMIZE)
86 LINK_FLAGS = $(LINK_DBG) -L$(CCLIBDIR)
97 .IF "$(RUNTIME)" == ""
100 INCLUDES = -I.\include -I. -I..
101 #PCHFLAGS = -Fp$(INTDIR)\vcmoduls.pch -YX
102 DEFINES = -DWIN32 -D_CONSOLE $(BUILDOPT)
103 LOCDEFS = -DPERLDLL -DPERL_CORE
106 .IF "$(RUNTIME)" == "-MD"
114 .IF "$(CFG)" == "Debug"
115 .IF "$(CCTYPE)" == "MSVC20"
116 OPTIMIZE = -Od $(RUNTIME) -Z7 -D_DEBUG -DDEBUGGING
118 OPTIMIZE = -Od $(RUNTIME)d -Z7 -D_DEBUG -DDEBUGGING
120 LINK_DBG = -debug -pdb:none
122 .IF "$(CCTYPE)" == "MSVC20"
123 OPTIMIZE = -Od $(RUNTIME) -DNDEBUG
125 OPTIMIZE = -Od $(RUNTIME) -DNDEBUG
130 # we don't add LIBC here, the compiler do it based on -MD/-MT
131 LIBFILES = oldnames.lib kernel32.lib user32.lib gdi32.lib \
132 winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib \
133 oleaut32.lib netapi32.lib uuid.lib wsock32.lib mpr.lib winmm.lib \
134 version.lib odbc32.lib odbccp32.lib
136 CFLAGS = -nologo -W3 $(INCLUDES) $(DEFINES) $(LOCDEFS) $(PCHFLAGS) $(OPTIMIZE)
137 LINK_FLAGS = -nologo $(LINK_DBG) -machine:$(PROCESSOR_ARCHITECTURE)
142 #################### do not edit below this line #######################
143 ############# NO USER-SERVICEABLE PARTS BEYOND THIS POINT ##############
149 .SUFFIXES : .c .obj .dll .lib .exe
152 $(CC) -c $(CFLAGS) $(OBJOUT_FLAG)$@ $<
154 .IF "$(CCTYPE)" == "BORLAND"
157 $(LINK32) -Tpd -ap $(LINK_FLAGS) c0d32.obj $<,$@,,$(LIBFILES),$(*B).def
158 $(IMPLIB) $(*B).lib $@
162 $(LINK32) -dll -subsystem:windows -implib:$(*B).lib -def:$(*B).def \
163 -out:$@ $(LINK_FLAGS) $(LIBFILES) $< $(LIBPERL)
168 INST_BIN=$(INST_TOP)\bin
169 INST_LIB=$(INST_TOP)\lib
170 INST_POD=$(INST_LIB)\pod
171 INST_HTML=$(INST_POD)\html
175 EXTUTILSDIR=$(LIBDIR)\extutils
179 PERLIMPLIB=..\perl.lib
180 MINIPERL=..\miniperl.exe
183 GLOBEXE=..\perlglob.exe
184 CONFIGPM=..\lib\Config.pm
185 MINIMOD=..\lib\ExtUtils\Miniperl.pm
188 GLOBBAT = bin\perlglob.bat
190 .IF "$(CCTYPE)" == "BORLAND"
192 # Borland wildargs is incompatible with MS setargv
193 CFGSH_TMPL = config.bc
194 CFGH_TMPL = config_H.bc
195 # Borland's perl.exe will work on W95, so we don't make this
200 CFGSH_TMPL = config.vc
201 CFGH_TMPL = config_H.vc
202 PERL95EXE=..\perl95.exe
206 XCOPY=xcopy /f /r /i /d
207 RCOPY=xcopy /f /r /i /e /d
211 # filenames given to xsubpp must have forward slashes (since it puts
212 # full pathnames in #line strings)
213 XSUBPP=..\$(MINIPERL) -I..\..\lib ..\$(EXTUTILSDIR)\xsubpp -C++ -prototypes
243 CORE_OBJ= ..\av.obj \
271 WIN32_C = perllib.c \
276 WIN32_OBJ = win32.obj \
280 PERL95_OBJ = perl95.obj \
284 DLL_OBJ = perllib.obj $(DYNALOADER).obj
320 .\include\sys\socket.h \
323 DYNAMIC_EXT=Socket IO Fcntl Opcode SDBM_File attrs Thread
324 STATIC_EXT=DynaLoader
326 DYNALOADER=$(EXTDIR)\DynaLoader\DynaLoader
327 SOCKET=$(EXTDIR)\Socket\Socket
328 FCNTL=$(EXTDIR)\Fcntl\Fcntl
329 OPCODE=$(EXTDIR)\Opcode\Opcode
330 SDBM_FILE=$(EXTDIR)\SDBM_File\SDBM_File
332 ATTRS=$(EXTDIR)\attrs\attrs
333 THREAD=$(EXTDIR)\Thread\Thread
335 SOCKET_DLL=..\lib\auto\Socket\Socket.dll
336 FCNTL_DLL=..\lib\auto\Fcntl\Fcntl.dll
337 OPCODE_DLL=..\lib\auto\Opcode\Opcode.dll
338 SDBM_FILE_DLL=..\lib\auto\SDBM_File\SDBM_File.dll
339 IO_DLL=..\lib\auto\IO\IO.dll
340 ATTRS_DLL=..\lib\auto\attrs\attrs.dll
341 THREAD_DLL=..\lib\auto\Thread\Thread.dll
343 STATICLINKMODULES=DynaLoader
353 POD2HTML=$(PODDIR)\pod2html
354 POD2MAN=$(PODDIR)\pod2man
355 POD2LATEX=$(PODDIR)\pod2latex
356 POD2TEXT=$(PODDIR)\pod2text
362 all: $(PERLEXE) $(PERL95EXE) $(GLOBEXE) $(DYNALOADMODULES) $(MINIMOD) $(GLOBBAT)
364 $(DYNALOADER).obj : $(DYNALOADER).c $(CORE_H) $(EXTDIR)\DynaLoader\dlutils.c
366 #------------------------------------------------------------
368 $(GLOBEXE): perlglob.obj
369 .IF "$(CCTYPE)" == "BORLAND"
370 $(CC) -c -w -v -tWM -I$(CCINCDIR) perlglob.c
371 $(LINK32) -Tpe -ap $(LINK_FLAGS) c0x32.obj perlglob.obj \
372 $(CCLIBDIR)\32BIT\wildargs.obj,$@,,import32.lib cw32mt.lib,
374 $(LINK32) $(LINK_FLAGS) $(LIBFILES) -out:$@ -subsystem:$(SUBSYS) \
375 perlglob.obj setargv.obj
378 $(GLOBBAT) : ..\lib\File\DosGlob.pm $(MINIPERL)
379 $(MINIPERL) $(PL2BAT) - < ..\lib\File\DosGlob.pm > $(GLOBBAT)
381 perlglob.obj : perlglob.c
383 ..\miniperlmain.obj : ..\miniperlmain.c $(CORE_H)
385 config.w32 : $(CFGSH_TMPL)
386 copy $(CFGSH_TMPL) config.w32
388 .\config.h : $(CFGH_TMPL)
390 copy $(CFGH_TMPL) config.h
392 ..\config.sh : config.w32 $(MINIPERL) config_sh.PL
393 $(MINIPERL) -I..\lib config_sh.PL \
394 "INST_DRV=$(INST_DRV)" \
395 "INST_TOP=$(INST_TOP)" \
397 "ccflags=$(OPTIMIZE) $(DEFINES)" \
398 "cf_email=$(EMAIL)" \
399 "libs=$(LIBFILES:f)" \
400 "incpath=$(CCINCDIR)" \
401 "libpth=$(strip $(CCLIBDIR) $(LIBFILES:d))" \
403 "static_ext=$(STATIC_EXT)" \
404 "dynamic_ext=$(DYNAMIC_EXT)" \
405 "ldflags=$(LINK_FLAGS)" \
406 "optimize=$(OPTIMIZE)" \
407 config.w32 > ..\config.sh
409 $(CONFIGPM) : $(MINIPERL) ..\config.sh config_h.PL ..\minimod.pl
410 cd .. && miniperl configpm
411 if exist lib\* $(RCOPY) lib\*.* ..\lib\$(NULL)
412 $(XCOPY) ..\*.h ..\lib\CORE\*.*
413 $(XCOPY) *.h ..\lib\CORE\*.*
414 $(RCOPY) include ..\lib\CORE\*.*
415 $(MINIPERL) -I..\lib config_h.PL || $(MAKE) CCTYPE=$(CCTYPE) \
416 RUNTIME=$(RUNTIME) CFG=$(CFG) $(CONFIGPM)
418 $(MINIPERL) : ..\miniperlmain.obj $(CORE_OBJ) $(WIN32_OBJ)
419 .IF "$(CCTYPE)" == "BORLAND"
420 $(LINK32) -Tpe -ap $(LINK_FLAGS) \
421 @$(mktmp c0x32.obj ..\miniperlmain.obj \
422 $(CORE_OBJ:s,\,\\) $(WIN32_OBJ:s,\,\\),$@,,$(LIBFILES),)
424 $(LINK32) -subsystem:console -out:$@ \
425 @$(mktmp $(LINK_FLAGS) $(LIBFILES) ..\miniperlmain.obj \
426 $(CORE_OBJ:s,\,\\) $(WIN32_OBJ:s,\,\\))
429 $(WIN32_OBJ) : $(CORE_H)
430 $(CORE_OBJ) : $(CORE_H)
431 $(DLL_OBJ) : $(CORE_H)
433 perldll.def : $(MINIPERL) $(CONFIGPM) ..\global.sym makedef.pl
434 $(MINIPERL) -w makedef.pl $(OPTIMIZE) $(DEFINES) \
435 CCTYPE=$(CCTYPE) > perldll.def
437 $(PERLDLL): perldll.def $(CORE_OBJ) $(WIN32_OBJ) $(DLL_OBJ)
438 .IF "$(CCTYPE)" == "BORLAND"
439 $(LINK32) -Tpd -ap $(LINK_FLAGS) \
440 @$(mktmp c0d32.obj $(CORE_OBJ:s,\,\\) \
441 $(WIN32_OBJ:s,\,\\) $(DLL_OBJ:s,\,\\)\n \
447 $(LINK32) -dll -def:perldll.def -out:$@ \
448 @$(mktmp $(LINK_FLAGS) $(LIBFILES) $(CORE_OBJ:s,\,\\) \
449 $(WIN32_OBJ:s,\,\\) $(DLL_OBJ:s,\,\\))
451 $(XCOPY) $(PERLIMPLIB) ..\lib\CORE
453 perl.def : $(MINIPERL) makeperldef.pl
454 $(MINIPERL) -I..\lib makeperldef.pl $(NULL) > perl.def
456 $(MINIMOD) : $(MINIPERL) ..\minimod.pl
457 cd .. && miniperl minimod.pl > lib\ExtUtils\Miniperl.pm
459 perlmain.c : runperl.c
460 copy runperl.c perlmain.c
462 perlmain.obj : perlmain.c
463 $(CC) $(CFLAGS) -UPERLDLL -c perlmain.c
465 $(PERLEXE): $(PERLDLL) $(CONFIGPM) perlmain.obj
466 .IF "$(CCTYPE)" == "BORLAND"
467 $(LINK32) -Tpe -ap $(LINK_FLAGS) \
468 @$(mktmp c0x32.obj perlmain.obj $(WINIOMAYBE)\n \
470 $(PERLIMPLIB) $(LIBFILES)\n)
472 $(LINK32) -subsystem:console -out:perl.exe $(LINK_FLAGS) $(LIBFILES) \
473 perlmain.obj $(WINIOMAYBE) $(PERLIMPLIB)
478 $(MINIPERL) -I..\lib ..\splittree.pl "../LIB" "../LIB/auto"
480 .IF "$(CCTYPE)" != "BORLAND"
483 copy runperl.c perl95.c
485 perl95.obj : perl95.c
486 $(CC) $(CFLAGS) -MT -UPERLDLL -DWIN95FIX -c perl95.c
488 win32sckmt.obj : win32sck.c
489 $(CC) $(CFLAGS) -MT -UPERLDLL -DWIN95FIX -c $(OBJOUT_FLAG)win32sckmt.obj win32sck.c
491 win32mt.obj : win32.c
492 $(CC) $(CFLAGS) -MT -UPERLDLL -DWIN95FIX -c $(OBJOUT_FLAG)win32mt.obj win32.c
494 $(PERL95EXE): $(PERLDLL) $(CONFIGPM) $(PERL95_OBJ)
495 $(LINK32) -subsystem:console -out:perl95.exe $(LINK_FLAGS) $(LIBFILES) \
496 $(PERL95_OBJ) $(PERLIMPLIB)
502 $(DYNALOADER).c: $(MINIPERL) $(EXTDIR)\DynaLoader\dl_win32.xs $(CONFIGPM)
503 if not exist ..\lib\auto mkdir ..\lib\auto
504 $(XCOPY) $(EXTDIR)\$(*B)\$(*B).pm $(LIBDIR)\$(NULL)
505 cd $(EXTDIR)\$(*B) && $(XSUBPP) dl_win32.xs > $(*B).c
506 $(XCOPY) $(EXTDIR)\$(*B)\dlutils.c .
508 $(EXTDIR)\DynaLoader\dl_win32.xs: dl_win32.xs
509 copy dl_win32.xs $(EXTDIR)\DynaLoader\dl_win32.xs
511 $(THREAD_DLL): $(PERLEXE) $(THREAD).xs
512 cd $(EXTDIR)\$(*B) && \
513 ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl
514 cd $(EXTDIR)\$(*B) && $(MAKE)
516 $(ATTRS_DLL): $(PERLEXE) $(ATTRS).xs
517 cd $(EXTDIR)\$(*B) && \
518 ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl
519 cd $(EXTDIR)\$(*B) && $(MAKE)
521 $(IO_DLL): $(PERLEXE) $(IO).xs
522 cd $(EXTDIR)\$(*B) && \
523 ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl
524 cd $(EXTDIR)\$(*B) && $(MAKE)
526 $(SDBM_FILE_DLL) : $(PERLEXE) $(SDBM_FILE).xs
527 cd $(EXTDIR)\$(*B) && \
528 ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl
529 cd $(EXTDIR)\$(*B) && $(MAKE)
531 $(FCNTL_DLL): $(PERLEXE) $(FCNTL).xs
532 cd $(EXTDIR)\$(*B) && \
533 ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl
534 cd $(EXTDIR)\$(*B) && $(MAKE)
536 $(OPCODE_DLL): $(PERLEXE) $(OPCODE).xs
537 cd $(EXTDIR)\$(*B) && \
538 ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl
539 cd $(EXTDIR)\$(*B) && $(MAKE)
541 $(SOCKET_DLL): $(PERLEXE) $(SOCKET).xs
542 cd $(EXTDIR)\$(*B) && \
543 ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl
544 cd $(EXTDIR)\$(*B) && $(MAKE)
547 cd ..\pod && $(MAKE) -f ..\win32\pod.mak checkpods \
548 pod2html pod2latex pod2man pod2text
549 cd ..\pod && $(XCOPY) *.bat ..\win32\bin\*.*
550 copy ..\README.win32 ..\pod\perlwin32.pod
551 $(PERLEXE) ..\installhtml --podroot=.. --htmldir=./html \
552 --podpath=pod:lib:ext:utils --htmlroot="//$(INST_HTML:s,:,|,)" \
553 --libpod=perlfunc:perlguts:perlvar:perlrun:perlop --recurse
556 cd ..\utils && $(MAKE) PERL=$(MINIPERL)
557 cd ..\utils && $(PERLEXE) ..\win32\$(PL2BAT) h2ph splain perlbug \
558 pl2pm c2ph h2xs perldoc pstruct
559 $(XCOPY) ..\utils\*.bat bin\*.*
560 $(PERLEXE) $(PL2BAT) bin\network.pl bin\www.pl bin\runperl.pl \
564 -del /f $(MINIPERL) $(PERLEXE) $(PERL95EXE) $(PERLDLL) $(GLOBEXE) \
565 $(PERLIMPLIB) ..\miniperl.lib $(MINIMOD)
567 -del /f $(SOCKET_DLL) $(IO_DLL) $(SDBM_FILE_DLL) $(FCNTL_DLL) \
568 $(OPCODE_DLL) $(ATTRS_DLL) $(THREAD_DLL)
569 -del /f $(SOCKET).c $(IO).c $(SDBM_FILE).c $(FCNTL).c $(OPCODE).c \
570 $(DYNALOADER).c $(ATTRS).c $(THREAD).c
571 -del /f $(PODDIR)\*.html
572 -del /f $(PODDIR)\*.bat
573 -del /f ..\config.sh ..\splittree.pl perlmain.c dlutils.c config.h.new
574 .IF "$(PERL95EXE)" != ""
578 -cd $(EXTDIR) && del /s *.lib *.def *.map *.bs Makefile *.obj pm_to_blib
579 -rmdir /s /q ..\lib\auto
580 -rmdir /s /q ..\lib\CORE
582 install : all doc utils
583 if not exist $(INST_TOP) mkdir $(INST_TOP)
584 echo I $(INST_TOP) L $(LIBDIR)
585 $(XCOPY) $(PERLEXE) $(INST_BIN)\*.*
586 .IF "$(PERL95EXE)" != ""
587 $(XCOPY) $(PERL95EXE) $(INST_BIN)\*.*
589 $(XCOPY) $(GLOBEXE) $(INST_BIN)\*.*
590 $(XCOPY) $(PERLDLL) $(INST_BIN)\*.*
591 $(XCOPY) bin\*.bat $(INST_BIN)\*.*
592 $(RCOPY) ..\lib $(INST_LIB)\*.*
593 $(XCOPY) ..\pod\*.bat $(INST_BIN)\*.*
594 $(XCOPY) ..\pod\*.pod $(INST_POD)\*.*
595 $(RCOPY) html\*.* $(INST_HTML)\*.*
597 inst_lib : $(CONFIGPM)
599 $(MINIPERL) -I..\lib ..\splittree.pl "../LIB" "../LIB/auto"
600 $(RCOPY) ..\lib $(INST_LIB)\*.*
602 minitest : $(MINIPERL) $(GLOBEXE) $(CONFIGPM)
603 $(XCOPY) $(MINIPERL) ..\t\perl.exe
604 .IF "$(CCTYPE)" == "BORLAND"
605 $(XCOPY) $(GLOBBAT) ..\t\$(NULL)
607 $(XCOPY) $(GLOBEXE) ..\t\$(NULL)
612 $(MINIPERL) -I..\lib test base/*.t comp/*.t cmd/*.t io/*.t op/*.t pragma/*.t
615 $(XCOPY) $(PERLEXE) ..\t\$(NULL)
616 $(XCOPY) $(PERLDLL) ..\t\$(NULL)
617 .IF "$(CCTYPE)" == "BORLAND"
618 $(XCOPY) $(GLOBBAT) ..\t\$(NULL)
620 $(XCOPY) $(GLOBEXE) ..\t\$(NULL)
624 cd ..\t && $(PERLEXE) -I..\lib harness
626 test-notty : test-prep
627 set PERL_SKIP_TTY_TEST=1 && \
628 cd ..\t && $(PERLEXE) -I.\lib harness
631 -@erase miniperlmain.obj
643 -@erase ..\*.obj ..\*.lib ..\*.exp *.obj *.lib *.exp
644 -@erase ..\t\*.exe ..\t\*.dll ..\t\*.bat