New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[PATCH] WIP add parallel support for Win32 dmake building #14523
Comments
From @bulk88Created by @bulk88See attached patch. See also C:\p521\srcpara\t>perl harness -v porting/utils.t Test Summary Report C:\p521\srcpara\t> Perl Info
|
From @bulk880001-WIP-add-parallel-support-for-Win32-dmake-building.patchFrom 65d7dea602117f21496b3ab4143a466fea831cb2 Mon Sep 17 00:00:00 2001
From: Daniel Dragan <bulk88@hotmail.com>
Date: Wed, 18 Feb 2015 00:24:25 -0500
Subject: [PATCH] WIP add parallel support for Win32 dmake building
-PDBOUT is required to run multiple VC cl.exe processes, otherwise all
VC cl.exe processes will error out trying to lock and write to a
file called "vc*0.pdb", PDBOUT is empty for GCC builds since they dont
have PDB files
-to reduce excess IO calls checking for miniperl.exe plus remove a
"Found file corresponding to virtual target" warning that dmake emits,
make this makefile unaware that miniperl.exe exists. dmake has a very bad
exponential number of IO/stat() calls for every target that is yet
unbuilt, see procmon logs in [perl #123854], so instead of a stat on
../miniperl.exe, then ../lib/buildcustomize.pl, it will be just a stat on
../lib/buildcustomize.pl
-remove makefile awareness of ..\lib\Config_heavy.pl,
if ..\lib\Config_heavy.pl is ever updated, so is ..\lib\Config.pm
less IO calls for dmake, see also commit 962e59f394
-to break up the sequential nature of this makefile, allow (XS) Extensions
to build, before (AKA parallel with) perl5**.dll and perl.exe are built.
This is achieved by running makedef.pl very early, and generating
perl5**.lib/libperl5**.a from the def file, and NOT generating
perl5**.lib/libperl5**.a from perl5**.dll at link time of perl5**.dll.
The conquence of this is, declspec(dllexport) is now unusable, but exports
should be centrally managed anyways (embed.fnc/etc) so this isn't a big
issue.
-EUMM makefiles shouldn't be subject to parallelism, untested and disable
for now, plus creating PLMAKE allows "dmake -n" to work for diagnosing
this makefile
-slim down all target. Extensions* and UNIDATAFILES now know how to build
themselves, the parallel nature says you can't rely on left to right
execution of deps in a parent node to make a child (dep) node build
-miniperl.exe used to be unbuildable from a clean tree except from all
target, since miniperl.exe didn't depend on mini config.h. Also mini dir
can't be a target, since each .obj built will dirty the mini dir's time
stamp and infinite loop happens, instead use a .exists file
-dmake rescans for all outstanding targets, at each recipe line to run,
this early in the build process, there are an enormous amount of files to
test for, so the echos are very slow, 350ms each, so combine as many of
the lines of mini/.exists AKA mini config.h together as possible. ".IF"
can't be put inside "one line", so not all lines were merged. Shell "if"
could be used to further group the echos but this enough to make the pause
/cpu spining not really noticable. USE_CPLUSPLUS contains an unrolled line
(the #endif) on both sides. See also procmon logs in [perl #123854]
-perllib.obj/.o needs perllibst.h which is built by miniperl+a script,
perllibst.h target doesn't need any Extensions*, so perllib.obj is still
quick to build
-perldll.def doesn't need perllibst.h since makedef.pl uses
$Config{static_ext} to find boot xsubs to export, makedef.pl does not
read perllibst.h, remove perllibst.h for more parallelism/less things to
build before perldll.def runs, and therefore Extensions (XS) starts to
run quicker, and Extensions (XS) is the longest target to build
-perlmain and perlmainst .obj/.o needs full perl headers to compile, they
aren't like generate_uudmap.exe and perlglob.exe which are perlapi unaware
-perl.exe doesn't need perl5**.dll to build, just the imp lib to
perl5**.dll, perl.exe is in the same category as XS modules, more
parallelism
-ppport.h isn't needed in blead perl, since blead is the newest perl in the
world, this allows Extensions (XS) to run sooner, ppport.h is replaced by
a dummy file
-break up the dependencies of all the Extensions* targets, static
(just Win32CORE normally), dynamic XS and non-XS, these 3 run in parallel
now, non-XS doesn't need perl5**.lib/.a or any C headers, just PP
Config.pm
-DLL XS requires PP DynaLoader.pm for dl_findfile() otherwise
Mkbootstrap.pm fatally errors, Mkbootstrap.pm could be revised to not load
DynaLoader on Win32, since " if ($Config{'dlsrc'} =~ /^dl_dld/){" is
false, but this is the easier path right now
-DynaLoader requires module lib to build itself, but Extensions_nonxs
happens to not need mod lib, so move where mod lib is built
-in utils target, change it so it can run with miniperl, more parallelism,
pl2bat doesn't require full perl, the full perl stuff is from
commit 3fe9a6f19e from 5.003 and no ML archive is available to explain why
full perl was used instead of mini perl
-add 4 modules to buildcustomize so nonxs and xs build simultaneously
-remove ancient cruft from commit 26618a56da from 1997 from README.w32
dmake is automatically set inside CFG_VARS today. OSRELEASE is irrelavent
today, Perl doesn't use any of the defaults (like name of CC) from the
maketool.
-Time-HiRes has had a min ver of 5.6.0 since commit 90e44bf683 / release
1.9724 in 2011. dTHXR and aTHXR are for 5.005 threads compat but they are
pointless since there is usage of "unsafe" dTHX in other places in
Time-HiRes. Perl's headers don't define those 2, so they were defined to
>= 5.6.0 threads in ppport.h but a dummy ppport.h file is used, which
doesn't contain those defines to the new API, so remove usage of
pre-5.6.0 macros, this allows Time-HiRes to compile with the dummy
ppport.h with blead perl
---
Porting/Maintainers.pl | 2 +
README.win32 | 17 +-
cpan/Time-HiRes/HiRes.pm | 2 +-
cpan/Time-HiRes/HiRes.xs | 4 +-
t/porting/customized.dat | 1 +
win32/makefile.mk | 476 +++++++++++++++++++++++++----------------------
write_buildcustomize.pl | 12 +-
7 files changed, 282 insertions(+), 232 deletions(-)
diff --git a/Porting/Maintainers.pl b/Porting/Maintainers.pl
index 078a4d3..28dc981 100755
--- a/Porting/Maintainers.pl
+++ b/Porting/Maintainers.pl
@@ -1223,6 +1223,8 @@ use File::Glob qw(:case);
'Time::HiRes' => {
'DISTRIBUTION' => 'ZEFRAM/Time-HiRes-1.9726.tar.gz',
'FILES' => q[cpan/Time-HiRes],
+ # CPAN release eventually
+ 'CUSTOMIZED' => [ 'HiRes.xs' ],
},
'Time::Local' => {
diff --git a/README.win32 b/README.win32
index 403c517..6bf0e45 100644
--- a/README.win32
+++ b/README.win32
@@ -96,8 +96,9 @@ See L<Usage Hints for Perl on Windows> below for general hints about this.
=item Make
You need a "make" program to build the sources. If you are using
-Visual C++ or the Windows SDK tools, nmake will work. Builds using
-the gcc need dmake.
+Visual C++ or the Windows SDK tools, nmake will work, but if you want parallel
+building you may use dmake with Visual C++ instead of nmake. Builds using
+gcc need dmake.
dmake is a freely available make that has very nice macro features
and parallelability.
@@ -135,13 +136,6 @@ console already set up for your target architecture (x86-32 or x86-64 or IA64).
With the newer compilers, you may also use the older batch files if you choose
so.
-You can also use dmake to build using Visual C++; provided, however,
-you set OSRELEASE to "microsft" (or whatever the directory name
-under which the Visual C dmake configuration lives) in your environment
-and edit win32/config.vc to change "make=nmake" into "make=dmake". The
-latter step is only essential if you want to use dmake as your default
-make for building extensions using MakeMaker.
-
=item Microsoft Visual C++ 2008-2013 Express Edition
These free versions of Visual C++ 2008-2013 Professional contain the same
@@ -400,6 +394,11 @@ perl521.dll at the perl toplevel, and various other extension dll's
under the lib\auto directory. If the build fails for any reason, make
sure you have done the previous steps correctly.
+To try dmake's parallel mode, type "dmake -P2", where 2, is the maximum number
+of parallel jobs you want to run. A number of things in the build process will
+run in parallel, but there are serialization points where you will see just 1
+CPU maxed out. This is normal.
+
If you are advanced enough with building C code, here is a suggestion to speed
up building perl, and the later C<make test>. Try to keep your PATH enviromental
variable with the least number of folders possible (remember to keep your C
diff --git a/cpan/Time-HiRes/HiRes.pm b/cpan/Time-HiRes/HiRes.pm
index cf64bc1..0ee2c62 100644
--- a/cpan/Time-HiRes/HiRes.pm
+++ b/cpan/Time-HiRes/HiRes.pm
@@ -23,7 +23,7 @@ our @EXPORT_OK = qw (usleep sleep ualarm alarm gettimeofday time tv_interval
stat lstat
);
-our $VERSION = '1.9726';
+our $VERSION = '1.9726_01';
our $XS_VERSION = $VERSION;
$VERSION = eval $VERSION;
diff --git a/cpan/Time-HiRes/HiRes.xs b/cpan/Time-HiRes/HiRes.xs
index 96640e9..9a852c4 100644
--- a/cpan/Time-HiRes/HiRes.xs
+++ b/cpan/Time-HiRes/HiRes.xs
@@ -731,7 +731,7 @@ myNVtime()
static void
hrstatns(UV *atime_nsec, UV *mtime_nsec, UV *ctime_nsec)
{
- dTHXR;
+ dTHX;
#if TIME_HIRES_STAT == 1
*atime_nsec = PL_statcache.st_atimespec.tv_nsec;
*mtime_nsec = PL_statcache.st_mtimespec.tv_nsec;
@@ -1284,7 +1284,7 @@ PROTOTYPE: ;$
fakeop.op_flags = GIMME_V == G_ARRAY ? OPf_WANT_LIST :
GIMME_V == G_SCALAR ? OPf_WANT_SCALAR : OPf_WANT_VOID;
PL_op = &fakeop;
- (void)fakeop.op_ppaddr(aTHXR);
+ (void)fakeop.op_ppaddr(aTHX);
SPAGAIN;
LEAVE;
nret = SP+1 - &ST(0);
diff --git a/t/porting/customized.dat b/t/porting/customized.dat
index b2b33ba..72ced32 100644
--- a/t/porting/customized.dat
+++ b/t/porting/customized.dat
@@ -22,6 +22,7 @@ Text::Balanced cpan/Text-Balanced/t/08_extvar.t 0776ef2cbdad5b1fbefb300541d07921
Text::Balanced cpan/Text-Balanced/t/09_gentag.t 42361b5dfb3bb728bce20f4fb0d92ccfb27c2ba7
Text::ParseWords cpan/Text-ParseWords/t/ParseWords.t 9bae51c9b944cd5c0bbabe9d397e573976a2be8e
Text::ParseWords cpan/Text-ParseWords/t/taint.t 3cff0dae812801f7aa1738d6070508f2c5bcc2e5
+Time::HiRes cpan/Time-HiRes/HiRes.xs 0a850b6dee1f2c60ade3d4c33fab7c69b02ddc45
podlators cpan/podlators/scripts/pod2man.PL f81acf53f3ff46cdcc5ebdd661c5d13eb35d20d6
podlators cpan/podlators/scripts/pod2text.PL b4693fcfe4a0a1b38a215cfb8985a65d5d025d69
threads dist/threads/lib/threads.pm e1b210ff6d66a0e1d43aa8f040954fc811e3d250
diff --git a/win32/makefile.mk b/win32/makefile.mk
index 62becb0..99e6bff 100644
--- a/win32/makefile.mk
+++ b/win32/makefile.mk
@@ -509,6 +509,7 @@ LINK_FLAGS = $(LINK_DBG) -L"$(INST_COREDIR)" -L"$(CCLIBDIR)"
OBJOUT_FLAG = -o
EXEOUT_FLAG = -o
LIBOUT_FLAG =
+PDBOUT =
BUILDOPT += -fno-strict-aliasing -mms-bitfields
@@ -652,11 +653,11 @@ CFLAGS = $(EXTRACFLAGS) $(INCLUDES) $(DEFINES) $(LOCDEFS) \
LINK_FLAGS = -nologo -nodefaultlib $(LINK_DBG) \
-libpath:"$(INST_COREDIR)" \
-machine:$(PROCESSOR_ARCHITECTURE)
-LIB_FLAGS = $(LIB_FLAGS) -nologo
+LIB_FLAGS += -nologo
OBJOUT_FLAG = -Fo
EXEOUT_FLAG = -Fe
LIBOUT_FLAG = /out:
-
+PDBOUT = -Fd$*.pdb
.ENDIF
CFLAGS_O = $(CFLAGS) $(BUILDOPT)
@@ -701,7 +702,7 @@ LKPOST = )
.SUFFIXES : .c .i $(o) .dll $(a) .exe .rc .res
.c$(o):
- $(CC) -c $(null,$(<:d) $(NULL) -I$(<:d)) $(CFLAGS_O) $(OBJOUT_FLAG)$@ $<
+ $(CC) -c $(null,$(<:d) $(NULL) -I$(<:d)) $(CFLAGS_O) $(OBJOUT_FLAG)$@ $(PDBOUT) $<
.c.i:
$(CC) -c $(null,$(<:d) $(NULL) -I$(<:d)) $(CFLAGS_O) -E $< >$@
@@ -728,14 +729,19 @@ $(o).dll:
#
# various targets
+
+#do not put $(MINIPERL) as a dep/prereq in a rule, instead put $(HAVEMINIPERL)
+#$(MINIPERL) is not a buildable target, use "dmake mp" if you want to just build
+#miniperl alone
MINIPERL = ..\miniperl.exe
+HAVEMINIPERL = ..\lib\buildcustomize.pl
MINIDIR = .\mini
PERLEXE = ..\perl.exe
WPERLEXE = ..\wperl.exe
PERLEXESTATIC = ..\perl-static.exe
STATICDIR = .\static.tmp
GLOBEXE = ..\perlglob.exe
-CONFIGPM = ..\lib\Config.pm ..\lib\Config_heavy.pl
+CONFIGPM = ..\lib\Config.pm
GENUUDMAP = ..\generate_uudmap.exe
.IF "$(BUILD_STATIC)" == "define" || "$(ALL_STATIC)" == "define"
PERLSTATIC = static
@@ -762,7 +768,7 @@ PERLDLL_RES =
# This used to be $(PERLEXE), but at worst it is the .dll that they depend
# on and really only the interface - i.e. the .def file used to export symbols
# from the .dll
-PERLDEP = perldll.def
+PERLDEP = $(PERLIMPLIB)
PL2BAT = bin\pl2bat.pl
@@ -818,9 +824,17 @@ INT64 = __int64
# makedef.pl must be updated if this changes, and this should normally
# only change when there is an incompatible revision of the public API.
PERLIMPLIB *= ..\perl521$(a)
+PERLEXPLIB *= ..\perl521.exp
PERLSTATICLIB *= ..\perl521s$(a)
PERLDLL = ..\perl521.dll
+#EUMM on Win32 isn't ready for parallel make, so only allow this file to be parallel
+#$(MAKE) will contain the -P that this makefile was called with, which is bad for
+#make_ext.pl, also $(MAKE) is special cased by dmake to execute recipes
+#containing $(MAKE) when "dmake -n" is executed, which causes recursive calls
+#to dmake, which means "dmake -n" is then broken as a diagnostic tool
+PLMAKE = dmake
+
XCOPY = xcopy /f /r /i /d /y
RCOPY = xcopy /f /r /i /e /d /y
NOOP = @rem
@@ -1001,9 +1015,7 @@ CFG_VARS = \
# Top targets
#
-all : CHECKDMAKE .\config.h ..\git_version.h $(GLOBEXE) $(MINIPERL) \
- $(CONFIGPM) $(UNIDATAFILES) MakePPPort \
- $(PERLEXE) Extensions Extensions_nonxs $(PERLSTATIC)
+all : CHECKDMAKE rebasePE $(UNIDATAFILES) Extensions_nonxs $(PERLSTATIC)
regnodes : ..\regnodes.h
@@ -1042,178 +1054,13 @@ perlglob$(o) : perlglob.c
config.w32 : $(CFGSH_TMPL)
copy $(CFGSH_TMPL) config.w32
-#
-# Copy the template config.h and set configurables at the end of it
-# as per the options chosen and compiler used.
-# Note: This config.h is only used to build miniperl.exe anyway, but
-# it's as well to have its options correct to be sure that it builds
-# and so that it's "-V" options are correct for use by makedef.pl. The
-# real config.h used to build perl.exe is generated from the top-level
-# config_h.SH by config_h.PL (run by miniperl.exe).
-#
-.\config.h : $(CFGH_TMPL) $(CORE_NOCFG_H)
- -del /f config.h
- copy $(CFGH_TMPL) config.h
- @echo.>>$@
- @echo #ifndef _config_h_footer_>>$@
- @echo #define _config_h_footer_>>$@
- @echo #undef Off_t>>$@
- @echo #undef LSEEKSIZE>>$@
- @echo #undef Off_t_size>>$@
- @echo #undef PTRSIZE>>$@
- @echo #undef SSize_t>>$@
- @echo #undef HAS_ATOLL>>$@
- @echo #undef HAS_STRTOLL>>$@
- @echo #undef HAS_STRTOULL>>$@
- @echo #undef Size_t_size>>$@
- @echo #undef IVTYPE>>$@
- @echo #undef UVTYPE>>$@
- @echo #undef IVSIZE>>$@
- @echo #undef UVSIZE>>$@
- @echo #undef NV_PRESERVES_UV>>$@
- @echo #undef NV_PRESERVES_UV_BITS>>$@
- @echo #undef IVdf>>$@
- @echo #undef UVuf>>$@
- @echo #undef UVof>>$@
- @echo #undef UVxf>>$@
- @echo #undef UVXf>>$@
- @echo #undef USE_64_BIT_INT>>$@
- @echo #undef Gconvert>>$@
- @echo #undef HAS_FREXPL>>$@
- @echo #undef HAS_ISNANL>>$@
- @echo #undef HAS_MODFL>>$@
- @echo #undef HAS_MODFL_PROTO>>$@
- @echo #undef HAS_SQRTL>>$@
- @echo #undef HAS_STRTOLD>>$@
- @echo #undef PERL_PRIfldbl>>$@
- @echo #undef PERL_PRIgldbl>>$@
- @echo #undef PERL_PRIeldbl>>$@
- @echo #undef PERL_SCNfldbl>>$@
- @echo #undef NVTYPE>>$@
- @echo #undef NVSIZE>>$@
- @echo #undef LONG_DOUBLESIZE>>$@
- @echo #undef NV_OVERFLOWS_INTEGERS_AT>>$@
- @echo #undef NVef>>$@
- @echo #undef NVff>>$@
- @echo #undef NVgf>>$@
- @echo #undef USE_LONG_DOUBLE>>$@
- @echo #undef USE_CPLUSPLUS>>$@
-.IF "$(USE_LARGE_FILES)"=="define"
- @echo #define Off_t $(INT64)>>$@
- @echo #define LSEEKSIZE ^8>>$@
- @echo #define Off_t_size ^8>>$@
-.ELSE
- @echo #define Off_t long>>$@
- @echo #define LSEEKSIZE ^4>>$@
- @echo #define Off_t_size ^4>>$@
-.ENDIF
-.IF "$(WIN64)"=="define"
- @echo #define PTRSIZE ^8>>$@
- @echo #define SSize_t $(INT64)>>$@
- @echo #define HAS_ATOLL>>$@
- @echo #define HAS_STRTOLL>>$@
- @echo #define HAS_STRTOULL>>$@
- @echo #define Size_t_size ^8>>$@
-.ELSE
- @echo #define PTRSIZE ^4>>$@
- @echo #define SSize_t int>>$@
- @echo #undef HAS_ATOLL>>$@
- @echo #undef HAS_STRTOLL>>$@
- @echo #undef HAS_STRTOULL>>$@
- @echo #define Size_t_size ^4>>$@
-.ENDIF
-.IF "$(USE_64_BIT_INT)"=="define"
- @echo #define IVTYPE $(INT64)>>$@
- @echo #define UVTYPE unsigned $(INT64)>>$@
- @echo #define IVSIZE ^8>>$@
- @echo #define UVSIZE ^8>>$@
-.IF "$(USE_LONG_DOUBLE)"=="define"
- @echo #define NV_PRESERVES_UV>>$@
- @echo #define NV_PRESERVES_UV_BITS 64>>$@
-.ELSE
- @echo #undef NV_PRESERVES_UV>>$@
- @echo #define NV_PRESERVES_UV_BITS 53>>$@
-.ENDIF
- @echo #define IVdf "I64d">>$@
- @echo #define UVuf "I64u">>$@
- @echo #define UVof "I64o">>$@
- @echo #define UVxf "I64x">>$@
- @echo #define UVXf "I64X">>$@
- @echo #define USE_64_BIT_INT>>$@
-.ELSE
- @echo #define IVTYPE long>>$@
- @echo #define UVTYPE unsigned long>>$@
- @echo #define IVSIZE ^4>>$@
- @echo #define UVSIZE ^4>>$@
- @echo #define NV_PRESERVES_UV>>$@
- @echo #define NV_PRESERVES_UV_BITS 32>>$@
- @echo #define IVdf "ld">>$@
- @echo #define UVuf "lu">>$@
- @echo #define UVof "lo">>$@
- @echo #define UVxf "lx">>$@
- @echo #define UVXf "lX">>$@
- @echo #undef USE_64_BIT_INT>>$@
-.ENDIF
-.IF "$(USE_LONG_DOUBLE)"=="define"
- @echo #define Gconvert(x,n,t,b) sprintf((b),"%.*""Lg",(n),(x))>>$@
- @echo #define HAS_FREXPL>>$@
- @echo #define HAS_ISNANL>>$@
- @echo #define HAS_MODFL>>$@
- @echo #define HAS_MODFL_PROTO>>$@
- @echo #define HAS_SQRTL>>$@
- @echo #define HAS_STRTOLD>>$@
- @echo #define PERL_PRIfldbl "Lf">>$@
- @echo #define PERL_PRIgldbl "Lg">>$@
- @echo #define PERL_PRIeldbl "Le">>$@
- @echo #define PERL_SCNfldbl "Lf">>$@
- @echo #define NVTYPE long double>>$@
-.IF "$(WIN64)"=="define"
- @echo #define NVSIZE ^16>>$@
- @echo #define LONG_DOUBLESIZE ^16>>$@
-.ELSE
- @echo #define NVSIZE ^12>>$@
- @echo #define LONG_DOUBLESIZE ^12>>$@
-.ENDIF
- @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>>$@
- @echo #define NVef "Le">>$@
- @echo #define NVff "Lf">>$@
- @echo #define NVgf "Lg">>$@
- @echo #define USE_LONG_DOUBLE>>$@
-.ELSE
- @echo #define Gconvert(x,n,t,b) sprintf((b),"%.*g",(n),(x))>>$@
- @echo #undef HAS_FREXPL>>$@
- @echo #undef HAS_ISNANL>>$@
- @echo #undef HAS_MODFL>>$@
- @echo #undef HAS_MODFL_PROTO>>$@
- @echo #undef HAS_SQRTL>>$@
- @echo #undef HAS_STRTOLD>>$@
- @echo #undef PERL_PRIfldbl>>$@
- @echo #undef PERL_PRIgldbl>>$@
- @echo #undef PERL_PRIeldbl>>$@
- @echo #undef PERL_SCNfldbl>>$@
- @echo #define NVTYPE double>>$@
- @echo #define NVSIZE ^8>>$@
- @echo #define LONG_DOUBLESIZE ^8>>$@
- @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>>$@
- @echo #define NVef "e">>$@
- @echo #define NVff "f">>$@
- @echo #define NVgf "g">>$@
- @echo #undef USE_LONG_DOUBLE>>$@
-.ENDIF
-.IF "$(USE_CPLUSPLUS)"=="define"
- @echo #define USE_CPLUSPLUS>>$@
-.ELSE
- @echo #undef USE_CPLUSPLUS>>$@
-.ENDIF
- @echo #endif>>$@
-
-..\git_version.h : $(MINIPERL) ..\make_patchnum.pl
+..\git_version.h : $(HAVEMINIPERL) ..\make_patchnum.pl
cd .. && miniperl -Ilib make_patchnum.pl
# make sure that we recompile perl.c if the git version changes
..\perl$(o) : ..\git_version.h
-..\config.sh : config.w32 $(MINIPERL) config_sh.PL FindExt.pm
+..\config.sh : config.w32 $(HAVEMINIPERL) config_sh.PL FindExt.pm
$(MINIPERL) -I..\lib config_sh.PL --cfgsh-option-file \
$(mktmp $(CFG_VARS)) config.w32 > ..\config.sh
@@ -1229,18 +1076,18 @@ regen_config_h:
-$(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)"
rename config.h $(CFGH_TMPL)
-$(CONFIGPM) : $(MINIPERL) ..\config.sh config_h.PL
+$(CONFIGPM): ..\config.sh config_h.PL
$(MINIPERL) -I..\lib ..\configpm --chdir=..
$(XCOPY) ..\*.h $(COREDIR)\*.*
$(XCOPY) *.h $(COREDIR)\*.*
$(RCOPY) include $(COREDIR)\*.*
$(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)" \
- || $(MAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)
+ || $(PLMAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)
-# See the comment in Makefile.SH explaining this seemingly cranky ordering
-$(MINIPERL) : ..\lib\buildcustomize.pl
+.\config.h : $(CONFIGPM)
-..\lib\buildcustomize.pl : $(MINIDIR) $(MINI_OBJ) $(CRTIPMLIBS) ..\write_buildcustomize.pl
+# See the comment in Makefile.SH explaining this seemingly cranky ordering
+..\lib\buildcustomize.pl : $(MINI_OBJ) ..\write_buildcustomize.pl
.IF "$(CCTYPE)" == "GCC"
$(LINK32) -v -mconsole -o $(MINIPERL) $(BLINK_FLAGS) \
$(mktmp $(LKPRE) $(MINI_OBJ) $(LIBFILES) $(LKPOST))
@@ -1251,31 +1098,202 @@ $(MINIPERL) : ..\lib\buildcustomize.pl
.ENDIF
$(MINIPERL) -I..\lib -f ..\write_buildcustomize.pl ..
-$(MINIDIR) :
+#convinence target, get a working miniperl
+mp : $(CONFIGPM)
+
+$(MINIDIR)\.exists : $(CFGH_TMPL)
if not exist "$(MINIDIR)" mkdir "$(MINIDIR)"
+#
+# Copy the template config.h and set configurables at the end of it
+# as per the options chosen and compiler used.
+# Note: This config.h is only used to build miniperl.exe anyway, but
+# it's as well to have its options correct to be sure that it builds
+# and so that it's "-V" options are correct for use by makedef.pl. The
+# real config.h used to build perl.exe is generated from the top-level
+# config_h.SH by config_h.PL (run by miniperl.exe).
+#
+# MINIDIR generates config.h so miniperl.exe is not rebuilt when the 2nd
+# config.h is generated in CONFIGPM target, see also the comments for $(MINI_OBJ).
+ -if exist config.h del /f config.h
+ copy $(CFGH_TMPL) config.h
+ @(echo.&& \
+ echo #ifndef _config_h_footer_&& \
+ echo #define _config_h_footer_&& \
+ echo #undef Off_t&& \
+ echo #undef LSEEKSIZE&& \
+ echo #undef Off_t_size&& \
+ echo #undef PTRSIZE&& \
+ echo #undef SSize_t&& \
+ echo #undef HAS_ATOLL&& \
+ echo #undef HAS_STRTOLL&& \
+ echo #undef HAS_STRTOULL&& \
+ echo #undef Size_t_size&& \
+ echo #undef IVTYPE&& \
+ echo #undef UVTYPE&& \
+ echo #undef IVSIZE&& \
+ echo #undef UVSIZE&& \
+ echo #undef NV_PRESERVES_UV&& \
+ echo #undef NV_PRESERVES_UV_BITS&& \
+ echo #undef IVdf&& \
+ echo #undef UVuf&& \
+ echo #undef UVof&& \
+ echo #undef UVxf&& \
+ echo #undef UVXf&& \
+ echo #undef USE_64_BIT_INT&& \
+ echo #undef Gconvert&& \
+ echo #undef HAS_FREXPL&& \
+ echo #undef HAS_ISNANL&& \
+ echo #undef HAS_MODFL&& \
+ echo #undef HAS_MODFL_PROTO&& \
+ echo #undef HAS_SQRTL&& \
+ echo #undef HAS_STRTOLD&& \
+ echo #undef PERL_PRIfldbl&& \
+ echo #undef PERL_PRIgldbl&& \
+ echo #undef PERL_PRIeldbl&& \
+ echo #undef PERL_SCNfldbl&& \
+ echo #undef NVTYPE&& \
+ echo #undef NVSIZE&& \
+ echo #undef LONG_DOUBLESIZE&& \
+ echo #undef NV_OVERFLOWS_INTEGERS_AT&& \
+ echo #undef NVef&& \
+ echo #undef NVff&& \
+ echo #undef NVgf&& \
+ echo #undef USE_LONG_DOUBLE&& \
+ echo #undef USE_CPLUSPLUS)>> config.h
+.IF "$(USE_LARGE_FILES)"=="define"
+ @(echo #define Off_t $(INT64)&& \
+ echo #define LSEEKSIZE ^8&& \
+ echo #define Off_t_size ^8)>> config.h
+.ELSE
+ @(echo #define Off_t long&& \
+ echo #define LSEEKSIZE ^4&& \
+ echo #define Off_t_size ^4)>> config.h
+.ENDIF
+.IF "$(WIN64)"=="define"
+ @(echo #define PTRSIZE ^8&& \
+ echo #define SSize_t $(INT64)&& \
+ echo #define HAS_ATOLL&& \
+ echo #define HAS_STRTOLL&& \
+ echo #define HAS_STRTOULL&& \
+ echo #define Size_t_size ^8)>> config.h
+.ELSE
+ @(echo #define PTRSIZE ^4&& \
+ echo #define SSize_t int&& \
+ echo #undef HAS_ATOLL&& \
+ echo #undef HAS_STRTOLL&& \
+ echo #undef HAS_STRTOULL&& \
+ echo #define Size_t_size ^4)>> config.h
+.ENDIF
+.IF "$(USE_64_BIT_INT)"=="define"
+ @(echo #define IVTYPE $(INT64)&& \
+ echo #define UVTYPE unsigned $(INT64)&& \
+ echo #define IVSIZE ^8&& \
+ echo #define UVSIZE ^8)>> config.h
+.IF "$(USE_LONG_DOUBLE)"=="define"
+ @(echo #define NV_PRESERVES_UV&& \
+ echo #define NV_PRESERVES_UV_BITS 64)>> config.h
+.ELSE
+ @(echo #undef NV_PRESERVES_UV&& \
+ echo #define NV_PRESERVES_UV_BITS 53)>> config.h
+.ENDIF
+ @(echo #define IVdf "I64d"&& \
+ echo #define UVuf "I64u"&& \
+ echo #define UVof "I64o"&& \
+ echo #define UVxf "I64x"&& \
+ echo #define UVXf "I64X"&& \
+ echo #define USE_64_BIT_INT)>> config.h
+.ELSE
+ @(echo #define IVTYPE long&& \
+ echo #define UVTYPE unsigned long&& \
+ echo #define IVSIZE ^4&& \
+ echo #define UVSIZE ^4&& \
+ echo #define NV_PRESERVES_UV&& \
+ echo #define NV_PRESERVES_UV_BITS 32&& \
+ echo #define IVdf "ld"&& \
+ echo #define UVuf "lu"&& \
+ echo #define UVof "lo"&& \
+ echo #define UVxf "lx"&& \
+ echo #define UVXf "lX"&& \
+ echo #undef USE_64_BIT_INT)>> config.h
+.ENDIF
+.IF "$(USE_LONG_DOUBLE)"=="define"
+ @(echo #define Gconvert^(x,n,t,b^) sprintf^(^(b^),"%.*""Lg",^(n^),^(x^)^)&& \
+ echo #define HAS_FREXPL&& \
+ echo #define HAS_ISNANL&& \
+ echo #define HAS_MODFL&& \
+ echo #define HAS_MODFL_PROTO&& \
+ echo #define HAS_SQRTL&& \
+ echo #define HAS_STRTOLD&& \
+ echo #define PERL_PRIfldbl "Lf"&& \
+ echo #define PERL_PRIgldbl "Lg"&& \
+ echo #define PERL_PRIeldbl "Le"&& \
+ echo #define PERL_SCNfldbl "Lf"&& \
+ echo #define NVTYPE long double)>> config.h
+.IF "$(WIN64)"=="define"
+ @(echo #define NVSIZE ^16&& \
+ echo #define LONG_DOUBLESIZE ^16)>> config.h
+.ELSE
+ @(echo #define NVSIZE ^12&& \
+ echo #define LONG_DOUBLESIZE ^12)>> config.h
+.ENDIF
+ @(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&& \
+ echo #define NVef "Le"&& \
+ echo #define NVff "Lf"&& \
+ echo #define NVgf "Lg"&& \
+ echo #define USE_LONG_DOUBLE)>> config.h
+.ELSE
+ @(echo #define Gconvert^(x,n,t,b^) sprintf^(^(b^),"%.*g",^(n^),^(x^)^)&& \
+ echo #undef HAS_FREXPL&& \
+ echo #undef HAS_ISNANL&& \
+ echo #undef HAS_MODFL&& \
+ echo #undef HAS_MODFL_PROTO&& \
+ echo #undef HAS_SQRTL&& \
+ echo #undef HAS_STRTOLD&& \
+ echo #undef PERL_PRIfldbl&& \
+ echo #undef PERL_PRIgldbl&& \
+ echo #undef PERL_PRIeldbl&& \
+ echo #undef PERL_SCNfldbl&& \
+ echo #define NVTYPE double&& \
+ echo #define NVSIZE ^8&& \
+ echo #define LONG_DOUBLESIZE ^8&& \
+ 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&& \
+ echo #define NVef "e"&& \
+ echo #define NVff "f"&& \
+ echo #define NVgf "g"&& \
+ echo #undef USE_LONG_DOUBLE)>> config.h
+.ENDIF
+.IF "$(USE_CPLUSPLUS)"=="define"
+ @(echo #define USE_CPLUSPLUS&& \
+ echo #endif)>> config.h
+.ELSE
+ @(echo #undef USE_CPLUSPLUS&& \
+ echo #endif)>> config.h
+.ENDIF
+#separate line since this is sentinal that this target is done
+ rem. > $(MINIDIR)\.exists
$(MINICORE_OBJ) : $(CORE_NOCFG_H)
- $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_EXTERNAL_GLOB -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ ..\$(*B).c
+ $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_EXTERNAL_GLOB -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ $(PDBOUT) ..\$(*B).c
$(MINIWIN32_OBJ) : $(CORE_NOCFG_H)
- $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ $(*B).c
+ $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ $(PDBOUT) $(*B).c
# -DPERL_IMPLICIT_SYS needs C++ for perllib.c
# rules wrapped in .IFs break Win9X build (we end up with unbalanced []s unless
# unless the .IF is true), so instead we use a .ELSE with the default.
# This is the only file that depends on perlhost.h, vmem.h, and vdir.h
-perllib$(o) : perllib.c .\perlhost.h .\vdir.h .\vmem.h
+perllib$(o) : perllib.c perllibst.h .\perlhost.h .\vdir.h .\vmem.h
.IF "$(USE_IMP_SYS)" == "define"
- $(CC) -c -I. $(CFLAGS_O) $(CXX_FLAG) $(OBJOUT_FLAG)$@ perllib.c
+ $(CC) -c -I. $(CFLAGS_O) $(CXX_FLAG) $(OBJOUT_FLAG)$@ $(PDBOUT) perllib.c
.ELSE
- $(CC) -c -I. $(CFLAGS_O) $(OBJOUT_FLAG)$@ perllib.c
+ $(CC) -c -I. $(CFLAGS_O) $(OBJOUT_FLAG)$@ $(PDBOUT) perllib.c
.ENDIF
# 1. we don't want to rebuild miniperl.exe when config.h changes
# 2. we don't want to rebuild miniperl.exe with non-default config.h
# 3. we can't have miniperl.exe depend on git_version.h, as miniperl creates it
-$(MINI_OBJ) : $(CORE_NOCFG_H)
+$(MINI_OBJ) : $(MINIDIR)\.exists $(CORE_NOCFG_H)
$(WIN32_OBJ) : $(CORE_H)
@@ -1283,12 +1301,26 @@ $(CORE_OBJ) : $(CORE_H)
$(DLL_OBJ) : $(CORE_H)
-perldll.def : $(MINIPERL) $(CONFIGPM) ..\embed.fnc ..\makedef.pl create_perllibst_h.pl
+
+perllibst.h : $(HAVEMINIPERL) $(CONFIGPM) create_perllibst_h.pl
$(MINIPERL) -I..\lib create_perllibst_h.pl
+
+perldll.def : $(HAVEMINIPERL) $(CONFIGPM) ..\embed.fnc ..\makedef.pl
$(MINIPERL) -I..\lib -w ..\makedef.pl PLATFORM=win32 $(OPTIMIZE) $(DEFINES) \
$(BUILDOPT) CCTYPE=$(CCTYPE) TARG_DIR=..\ > perldll.def
-$(PERLDLL): perldll.def $(PERLDLL_OBJ) $(PERLDLL_RES) Extensions_static
+$(PERLIMPLIB) : perldll.def
+.IF "$(CCTYPE)" == "GCC"
+ $(IMPLIB) -k -d perldll.def -l $(PERLIMPLIB)
+.ELSE #VC family
+ lib -def:perldll.def -machine:$(ARCHITECTURE) /OUT:$(PERLIMPLIB)
+.ENDIF
+ $(XCOPY) $(PERLIMPLIB) $(COREDIR)
+
+#PERLEXPLIB is built in PERLIMPLIB
+$(PERLEXPLIB): $(PERLIMPLIB)
+
+$(PERLDLL): $(PERLEXPLIB) $(PERLDLL_OBJ) $(PERLDLL_RES) Extensions_static
.IF "$(CCTYPE)" == "GCC"
$(LINK32) -mdll -o $@ -Wl,--base-file -Wl,perl.base $(BLINK_FLAGS) \
$(mktmp $(LKPRE) $(PERLDLL_OBJ) \
@@ -1304,13 +1336,12 @@ $(PERLDLL): perldll.def $(PERLDLL_OBJ) $(PERLDLL_RES) Extensions_static
$(shell @type Extensions_static) \
$(LIBFILES) perl.exp $(LKPOST))
.ELSE
- $(LINK32) -dll -def:perldll.def -out:$@ $(BLINK_FLAGS) \
+ $(LINK32) -dll -out:$@ $(BLINK_FLAGS) \
@Extensions_static \
@$(mktmp -base:0x28000000 $(DELAYLOAD) $(LIBFILES) \
- $(PERLDLL_RES) $(PERLDLL_OBJ))
+ $(PERLDLL_RES) $(PERLDLL_OBJ) $(PERLEXPLIB))
$(EMBED_DLL_MANI)
.ENDIF
- $(XCOPY) $(PERLIMPLIB) $(COREDIR)
$(PERLSTATICLIB): $(PERLDLL_OBJ) Extensions_static
.IF "$(CCTYPE)" == "GCC"
@@ -1351,16 +1382,16 @@ $(GENUUDMAP) : $(GENUUDMAP_OBJ)
perlmain.c : runperl.c
copy runperl.c perlmain.c
-perlmain$(o) : perlmain.c
- $(CC) $(CFLAGS_O:s,-DPERLDLL,-UPERLDLL,) $(OBJOUT_FLAG)$@ -c perlmain.c
+perlmain$(o) : $(CONFIGPM) perlmain.c
+ $(CC) $(CFLAGS_O:s,-DPERLDLL,-UPERLDLL,) $(OBJOUT_FLAG)$@ $(PDBOUT) -c perlmain.c
perlmainst.c : runperl.c
copy runperl.c perlmainst.c
-perlmainst$(o) : perlmainst.c
- $(CC) $(CFLAGS_O) $(OBJOUT_FLAG)$@ -c perlmainst.c
+perlmainst$(o) : $(CONFIGPM) perlmainst.c
+ $(CC) $(CFLAGS_O) $(OBJOUT_FLAG)$@ $(PDBOUT) -c perlmainst.c
-$(PERLEXE): $(PERLDLL) $(CONFIGPM) $(PERLEXE_OBJ) $(PERLEXE_RES)
+$(PERLEXE): $(CONFIGPM) $(PERLEXE_OBJ) $(PERLEXE_RES) $(PERLIMPLIB)
.IF "$(CCTYPE)" == "GCC"
$(LINK32) -mconsole -o $@ $(BLINK_FLAGS) \
$(PERLEXE_OBJ) $(PERLEXE_RES) $(PERLIMPLIB) $(LIBFILES)
@@ -1382,43 +1413,52 @@ $(PERLEXESTATIC): $(PERLSTATICLIB) $(CONFIGPM) $(PERLEXEST_OBJ) $(PERLEXE_RES)
$(EMBED_EXE_MANI)
.ENDIF
-MakePPPort: $(MINIPERL) $(CONFIGPM) Extensions_nonxs
- $(MINIPERL) -I..\lib ..\mkppport
-
#-------------------------------------------------------------------------------
# There's no direct way to mark a dependency on
# DynaLoader.pm, so this will have to do
Extensions : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) $(DYNALOADER)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic
+ if not exist $(COREDIR)\ppport.h rem. > $(COREDIR)\ppport.h
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic
Extensions_reonly : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) $(DYNALOADER)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic +re
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic +re
-Extensions_static : ..\make_ext.pl ..\lib\buildcustomize.pl list_static_libs.pl $(PERLDEP) $(CONFIGPM) Extensions_nonxs
+Extensions_static : ..\make_ext.pl ..\lib\buildcustomize.pl list_static_libs.pl $(CONFIGPM)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --static
+ if not exist $(COREDIR)\ppport.h rem. > $(COREDIR)\ppport.h
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --static
$(MINIPERL) -I..\lib list_static_libs.pl > Extensions_static
-Extensions_nonxs : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) ..\pod\perlfunc.pod
- $(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --nonxs
+Extensions_nonxs : ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM) ..\pod\perlfunc.pod
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --nonxs !libs
-$(DYNALOADER) : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) Extensions_nonxs
+#lib must be built, it can't be buildcustomize.pl-ed, and is required for XS building
+$(DYNALOADER) : ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --dynaloader
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(EXTDIR) --dir=$(DISTDIR) --dynaloader lib
Extensions_clean :
- -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=clean
+ -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=clean
Extensions_realclean :
- -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=realclean
+ -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=realclean
+
+# all PE files need to be built by the time this target runs, PP files can still
+# be running in parallel like UNIDATAFILES, this target a placeholder for the
+# future
+.IF "$(BUILD_STATIC)"=="define"
+rebasePE : Extensions $(PERLDLL) $(PERLEXE) $(GLOBEXE) $(PERLEXESTATIC)
+.ELSE
+rebasePE : Extensions $(PERLDLL) $(PERLEXE) $(GLOBEXE)
+.ENDIF
+ $(NOOP)
#-------------------------------------------------------------------------------
-doc: $(PERLEXE) ..\pod\perltoc.pod
+doc: $(PERLEXE) $(PERLDLL) ..\pod\perltoc.pod
$(PERLEXE) ..\installhtml --podroot=.. --htmldir=$(HTMLDIR) \
--podpath=pod:lib:utils --htmlroot="file://$(INST_HTML:s,:,|,)"\
--recurse
@@ -1428,8 +1468,8 @@ doc: $(PERLEXE) ..\pod\perltoc.pod
# Note that this next section is parsed (and regenerated) by pod/buildtoc
# so please check that script before making structural changes here
-utils: $(PERLEXE) ..\utils\Makefile
- cd ..\utils && $(MAKE) PERL=$(MINIPERL)
+utils: $(HAVEMINIPERL) ..\utils\Makefile
+ cd ..\utils && $(PLMAKE) PERL=$(MINIPERL)
copy ..\README.aix ..\pod\perlaix.pod
copy ..\README.amiga ..\pod\perlamiga.pod
copy ..\README.android ..\pod\perlandroid.pod
@@ -1464,11 +1504,11 @@ utils: $(PERLEXE) ..\utils\Makefile
copy ..\README.vos ..\pod\perlvos.pod
copy ..\README.win32 ..\pod\perlwin32.pod
copy ..\pod\perldelta.pod ..\pod\perl5219delta.pod
- $(PERLEXE) $(PL2BAT) $(UTILS)
+ $(MINIPERL) -I..\lib $(PL2BAT) $(UTILS)
$(MINIPERL) -I..\lib ..\autodoc.pl ..
$(MINIPERL) -I..\lib ..\pod\perlmodlib.PL -q ..
-..\pod\perltoc.pod: $(PERLEXE) Extensions Extensions_nonxs
+..\pod\perltoc.pod: $(PERLEXE) $(PERLDLL) Extensions Extensions_nonxs
$(PERLEXE) -f ..\pod\buildtoc -q
# Note that the pod cleanup in this next section is parsed (and regenerated
@@ -1605,11 +1645,11 @@ installhtml : doc
inst_lib : $(CONFIGPM)
$(RCOPY) ..\lib $(INST_LIB)\*.*
-$(UNIDATAFILES) ..\pod\perluniprops.pod .UPDATEALL : $(MINIPERL) $(CONFIGPM) ..\lib\unicore\mktables Extensions_nonxs
+$(UNIDATAFILES) ..\pod\perluniprops.pod .UPDATEALL : $(CONFIGPM) ..\lib\unicore\mktables
cd ..\lib\unicore && \
..\$(MINIPERL) -I.. mktables -P ..\..\pod -maketest -makelist -p
-minitest : .\config.h $(MINIPERL) ..\git_version.h $(GLOBEXE) $(CONFIGPM) $(UNIDATAFILES) $(TESTPREPGCC)
+minitest : .\config.h $(HAVEMINIPERL) ..\git_version.h $(GLOBEXE) $(CONFIGPM) $(UNIDATAFILES) $(TESTPREPGCC)
$(XCOPY) $(MINIPERL) ..\t\$(NULL)
if exist ..\t\perl.exe del /f ..\t\perl.exe
rename ..\t\miniperl.exe perl.exe
diff --git a/write_buildcustomize.pl b/write_buildcustomize.pl
index 57a547c..e60dce5 100644
--- a/write_buildcustomize.pl
+++ b/write_buildcustomize.pl
@@ -41,8 +41,16 @@ my @toolchain = qw(cpan/AutoLoader/lib
dist/constant/lib
);
-# Used only in ExtUtils::Liblist::Kid::_win32_ext()
-push @toolchain, 'cpan/Text-ParseWords/lib' if $^O eq 'MSWin32';
+# Text-ParseWords used only in ExtUtils::Liblist::Kid::_win32_ext()
+# the rest are for XS building on Win32, since nonxs and xs build simultaneously
+# on Win32 if parallel building
+push @toolchain, qw(
+ cpan/Text-ParseWords/lib
+ dist/ExtUtils-ParseXS/lib
+ cpan/Getopt-Long/lib
+ cpan/parent/lib
+ cpan/ExtUtils-Constant/lib
+) if $^O eq 'MSWin32';
push @toolchain, 'ext/VMS-Filespec/lib' if $^O eq 'VMS';
unshift @INC, @toolchain;
--
1.8.0.msysgit.0
|
From @steve-m-hayOn 18 February 2015 at 05:49, bulk88 <perlbug-followup@perl.org> wrote:
I haven't had time to have a good look at this patch yet, but this |
The RT System itself - Status changed from 'new' to 'open' |
From @bulk88On Mon Mar 09 02:00:57 2015, shay wrote:
Grr, I tried to use the email response feature, and I sent this to "bugs-bitbucket@rt.perl.org" and it never appeared in this ticket. Reposting through the web interface. -FS is irrelevant if it was only introduced in VS 2013, which I can't Also /MP isn't that much of a wall time saver because of -GL, so instead See my earlier write up of /MP in -- |
From @bulk88Rebased patch attached, includes a small fix for using a 64 bit dmake with 32 bit CCs. -- |
From @bulk880001-WIP-add-parallel-support-for-Win32-dmake-building.patchFrom d530423c34ec693dfcfc0e6a26fe214ce6940e14 Mon Sep 17 00:00:00 2001
From: Daniel Dragan <bulk88@hotmail.com>
Date: Sun, 5 Apr 2015 18:41:23 -0400
Subject: [PATCH] WIP add parallel support for Win32 dmake building
-if building a 32 bit Perl, with a 64bit dmake, force
PROCESSOR_ARCHITECTURE to x86, otherwise the next couple macros will
try to build a 64 bit perl with 32 bit CCs
-PDBOUT is required to run multiple VC cl.exe processes, otherwise all
VC cl.exe processes will error out trying to lock and write to a
file called "vc*0.pdb", PDBOUT is empty for GCC builds since they dont
have PDB files
-to reduce excess IO calls checking for miniperl.exe plus remove a
"Found file corresponding to virtual target" warning that dmake emits,
make this makefile unaware that miniperl.exe exists. dmake has a very bad
exponential number of IO/stat() calls for every target that is yet
unbuilt, see procmon logs in [perl #123854], so instead of a stat on
../miniperl.exe, then ../lib/buildcustomize.pl, it will be just a stat on
../lib/buildcustomize.pl
-remove makefile awareness of ..\lib\Config_heavy.pl,
if ..\lib\Config_heavy.pl is ever updated, so is ..\lib\Config.pm
less IO calls for dmake, see also commit 962e59f394
-to break up the sequential nature of this makefile, allow (XS) Extensions
to build, before (AKA parallel with) perl5**.dll and perl.exe are built.
This is achieved by running makedef.pl very early, and generating
perl5**.lib/libperl5**.a from the def file, and NOT generating
perl5**.lib/libperl5**.a from perl5**.dll at link time of perl5**.dll.
The conquence of this is, declspec(dllexport) is now unusable, but exports
should be centrally managed anyways (embed.fnc/etc) so this isn't a big
issue.
-EUMM makefiles shouldn't be subject to parallelism, untested and disable
for now, plus creating PLMAKE allows "dmake -n" to work for diagnosing
this makefile
-slim down all target. Extensions* and UNIDATAFILES now know how to build
themselves, the parallel nature says you can't rely on left to right
execution of deps in a parent node to make a child (dep) node build
-miniperl.exe used to be unbuildable from a clean tree except from all
target, since miniperl.exe didn't depend on mini config.h. Also mini dir
can't be a target, since each .obj built will dirty the mini dir's time
stamp and infinite loop happens, instead use a .exists file
-dmake rescans for all outstanding targets, at each recipe line to run,
this early in the build process, there are an enormous amount of files to
test for, so the echos are very slow, 350ms each, so combine as many of
the lines of mini/.exists AKA mini config.h together as possible. ".IF"
can't be put inside "one line", so not all lines were merged. Shell "if"
could be used to further group the echos but this enough to make the pause
/cpu spining not really noticable. USE_CPLUSPLUS contains an unrolled line
(the #endif) on both sides. See also procmon logs in [perl #123854]
-perllib.obj/.o needs perllibst.h which is built by miniperl+a script,
perllibst.h target doesn't need any Extensions*, so perllib.obj is still
quick to build
-perldll.def doesn't need perllibst.h since makedef.pl uses
$Config{static_ext} to find boot xsubs to export, makedef.pl does not
read perllibst.h, remove perllibst.h for more parallelism/less things to
build before perldll.def runs, and therefore Extensions (XS) starts to
run quicker, and Extensions (XS) is the longest target to build
-perlmain and perlmainst .obj/.o needs full perl headers to compile, they
aren't like generate_uudmap.exe and perlglob.exe which are perlapi unaware
-perl.exe doesn't need perl5**.dll to build, just the imp lib to
perl5**.dll, perl.exe is in the same category as XS modules, more
parallelism
-ppport.h isn't needed in blead perl, since blead is the newest perl in the
world, this allows Extensions (XS) to run sooner, ppport.h is replaced by
a dummy file
-break up the dependencies of all the Extensions* targets, static
(just Win32CORE normally), dynamic XS and non-XS, these 3 run in parallel
now, non-XS doesn't need perl5**.lib/.a or any C headers, just PP
Config.pm
-DLL XS requires PP DynaLoader.pm for dl_findfile() otherwise
Mkbootstrap.pm fatally errors, Mkbootstrap.pm could be revised to not load
DynaLoader on Win32, since " if ($Config{'dlsrc'} =~ /^dl_dld/){" is
false, but this is the easier path right now
-DynaLoader requires module lib to build itself, but Extensions_nonxs
happens to not need mod lib, so move where mod lib is built
-in utils target, change it so it can run with miniperl, more parallelism,
pl2bat doesn't require full perl, the full perl stuff is from
commit 3fe9a6f19e from 5.003 and no ML archive is available to explain why
full perl was used instead of mini perl
-add 4 modules to buildcustomize so nonxs and xs build simultaneously
-remove ancient cruft from commit 26618a56da from 1997 from README.w32
dmake is automatically set inside CFG_VARS today. OSRELEASE is irrelavent
today, Perl doesn't use any of the defaults (like name of CC) from the
maketool.
-Time-HiRes has had a min ver of 5.6.0 since commit 90e44bf683 / release
1.9724 in 2011. dTHXR and aTHXR are for 5.005 threads compat but they are
pointless since there is usage of "unsafe" dTHX in other places in
Time-HiRes. Perl's headers don't define those 2, so they were defined to
>= 5.6.0 threads in ppport.h but a dummy ppport.h file is used, which
doesn't contain those defines to the new API, so remove usage of
pre-5.6.0 macros, this allows Time-HiRes to compile with the dummy
ppport.h with blead perl
---
Porting/Maintainers.pl | 2 +
README.win32 | 17 +-
cpan/Time-HiRes/HiRes.pm | 2 +-
cpan/Time-HiRes/HiRes.xs | 4 +-
t/porting/customized.dat | 1 +
win32/makefile.mk | 480 ++++++++++++++++++++++++++---------------------
write_buildcustomize.pl | 12 +-
7 files changed, 286 insertions(+), 232 deletions(-)
diff --git a/Porting/Maintainers.pl b/Porting/Maintainers.pl
index 39bbd61..38cb917 100755
--- a/Porting/Maintainers.pl
+++ b/Porting/Maintainers.pl
@@ -1175,6 +1175,8 @@ use File::Glob qw(:case);
'Time::HiRes' => {
'DISTRIBUTION' => 'ZEFRAM/Time-HiRes-1.9726.tar.gz',
'FILES' => q[cpan/Time-HiRes],
+ # CPAN release eventually
+ 'CUSTOMIZED' => [ 'HiRes.xs' ],
},
'Time::Local' => {
diff --git a/README.win32 b/README.win32
index 403c517..6bf0e45 100644
--- a/README.win32
+++ b/README.win32
@@ -96,8 +96,9 @@ See L<Usage Hints for Perl on Windows> below for general hints about this.
=item Make
You need a "make" program to build the sources. If you are using
-Visual C++ or the Windows SDK tools, nmake will work. Builds using
-the gcc need dmake.
+Visual C++ or the Windows SDK tools, nmake will work, but if you want parallel
+building you may use dmake with Visual C++ instead of nmake. Builds using
+gcc need dmake.
dmake is a freely available make that has very nice macro features
and parallelability.
@@ -135,13 +136,6 @@ console already set up for your target architecture (x86-32 or x86-64 or IA64).
With the newer compilers, you may also use the older batch files if you choose
so.
-You can also use dmake to build using Visual C++; provided, however,
-you set OSRELEASE to "microsft" (or whatever the directory name
-under which the Visual C dmake configuration lives) in your environment
-and edit win32/config.vc to change "make=nmake" into "make=dmake". The
-latter step is only essential if you want to use dmake as your default
-make for building extensions using MakeMaker.
-
=item Microsoft Visual C++ 2008-2013 Express Edition
These free versions of Visual C++ 2008-2013 Professional contain the same
@@ -400,6 +394,11 @@ perl521.dll at the perl toplevel, and various other extension dll's
under the lib\auto directory. If the build fails for any reason, make
sure you have done the previous steps correctly.
+To try dmake's parallel mode, type "dmake -P2", where 2, is the maximum number
+of parallel jobs you want to run. A number of things in the build process will
+run in parallel, but there are serialization points where you will see just 1
+CPU maxed out. This is normal.
+
If you are advanced enough with building C code, here is a suggestion to speed
up building perl, and the later C<make test>. Try to keep your PATH enviromental
variable with the least number of folders possible (remember to keep your C
diff --git a/cpan/Time-HiRes/HiRes.pm b/cpan/Time-HiRes/HiRes.pm
index cf64bc1..0ee2c62 100644
--- a/cpan/Time-HiRes/HiRes.pm
+++ b/cpan/Time-HiRes/HiRes.pm
@@ -23,7 +23,7 @@ our @EXPORT_OK = qw (usleep sleep ualarm alarm gettimeofday time tv_interval
stat lstat
);
-our $VERSION = '1.9726';
+our $VERSION = '1.9726_01';
our $XS_VERSION = $VERSION;
$VERSION = eval $VERSION;
diff --git a/cpan/Time-HiRes/HiRes.xs b/cpan/Time-HiRes/HiRes.xs
index 96640e9..9a852c4 100644
--- a/cpan/Time-HiRes/HiRes.xs
+++ b/cpan/Time-HiRes/HiRes.xs
@@ -731,7 +731,7 @@ myNVtime()
static void
hrstatns(UV *atime_nsec, UV *mtime_nsec, UV *ctime_nsec)
{
- dTHXR;
+ dTHX;
#if TIME_HIRES_STAT == 1
*atime_nsec = PL_statcache.st_atimespec.tv_nsec;
*mtime_nsec = PL_statcache.st_mtimespec.tv_nsec;
@@ -1284,7 +1284,7 @@ PROTOTYPE: ;$
fakeop.op_flags = GIMME_V == G_ARRAY ? OPf_WANT_LIST :
GIMME_V == G_SCALAR ? OPf_WANT_SCALAR : OPf_WANT_VOID;
PL_op = &fakeop;
- (void)fakeop.op_ppaddr(aTHXR);
+ (void)fakeop.op_ppaddr(aTHX);
SPAGAIN;
LEAVE;
nret = SP+1 - &ST(0);
diff --git a/t/porting/customized.dat b/t/porting/customized.dat
index fa37838..07b182f 100644
--- a/t/porting/customized.dat
+++ b/t/porting/customized.dat
@@ -10,6 +10,7 @@ Win32API::File cpan/Win32API-File/Makefile.PL 605d0aee31aebe84a99408f9ab5f644db5
Win32API::File cpan/Win32API-File/t/file.t 124e64aa77e755235eb297644a87fac5388d3d78
Win32API::File cpan/Win32API-File/t/tie.t 712ea7edd0cc805ce1c0b8172c01b03dd19b583d
Win32API::File cpan/Win32API-File/typemap 24bff088babeadac0873e8df390d1666d9d9db4a
+Time::HiRes cpan/Time-HiRes/HiRes.xs 0a850b6dee1f2c60ade3d4c33fab7c69b02ddc45
podlators cpan/podlators/scripts/pod2man.PL f81acf53f3ff46cdcc5ebdd661c5d13eb35d20d6
podlators cpan/podlators/scripts/pod2text.PL b4693fcfe4a0a1b38a215cfb8985a65d5d025d69
version cpan/version/lib/version.pm d0923b895d57f1d669ae36fcf85c87b16db341d1
diff --git a/win32/makefile.mk b/win32/makefile.mk
index 5fd10dc..7937c5c 100644
--- a/win32/makefile.mk
+++ b/win32/makefile.mk
@@ -345,6 +345,10 @@ BUILDOPT += -DPERL_IMPLICIT_SYS
PROCESSOR_ARCHITECTURE *= x86
+.IF "$(WIN64)" == "undef"
+PROCESSOR_ARCHITECTURE = x86
+.ENDIF
+
.IF "$(WIN64)" == ""
# When we are running from a 32bit cmd.exe on AMD64 then
# PROCESSOR_ARCHITECTURE is set to x86 and PROCESSOR_ARCHITEW6432
@@ -509,6 +513,7 @@ LINK_FLAGS = $(LINK_DBG) -L"$(INST_COREDIR)" -L"$(CCLIBDIR)"
OBJOUT_FLAG = -o
EXEOUT_FLAG = -o
LIBOUT_FLAG =
+PDBOUT =
BUILDOPT += -fno-strict-aliasing -mms-bitfields
@@ -652,11 +657,11 @@ CFLAGS = $(EXTRACFLAGS) $(INCLUDES) $(DEFINES) $(LOCDEFS) \
LINK_FLAGS = -nologo -nodefaultlib $(LINK_DBG) \
-libpath:"$(INST_COREDIR)" \
-machine:$(PROCESSOR_ARCHITECTURE)
-LIB_FLAGS = $(LIB_FLAGS) -nologo
+LIB_FLAGS += -nologo
OBJOUT_FLAG = -Fo
EXEOUT_FLAG = -Fe
LIBOUT_FLAG = /out:
-
+PDBOUT = -Fd$*.pdb
.ENDIF
CFLAGS_O = $(CFLAGS) $(BUILDOPT)
@@ -701,7 +706,7 @@ LKPOST = )
.SUFFIXES : .c .i $(o) .dll $(a) .exe .rc .res
.c$(o):
- $(CC) -c $(null,$(<:d) $(NULL) -I$(<:d)) $(CFLAGS_O) $(OBJOUT_FLAG)$@ $<
+ $(CC) -c $(null,$(<:d) $(NULL) -I$(<:d)) $(CFLAGS_O) $(OBJOUT_FLAG)$@ $(PDBOUT) $<
.c.i:
$(CC) -c $(null,$(<:d) $(NULL) -I$(<:d)) $(CFLAGS_O) -E $< >$@
@@ -728,14 +733,19 @@ $(o).dll:
#
# various targets
+
+#do not put $(MINIPERL) as a dep/prereq in a rule, instead put $(HAVEMINIPERL)
+#$(MINIPERL) is not a buildable target, use "dmake mp" if you want to just build
+#miniperl alone
MINIPERL = ..\miniperl.exe
+HAVEMINIPERL = ..\lib\buildcustomize.pl
MINIDIR = .\mini
PERLEXE = ..\perl.exe
WPERLEXE = ..\wperl.exe
PERLEXESTATIC = ..\perl-static.exe
STATICDIR = .\static.tmp
GLOBEXE = ..\perlglob.exe
-CONFIGPM = ..\lib\Config.pm ..\lib\Config_heavy.pl
+CONFIGPM = ..\lib\Config.pm
GENUUDMAP = ..\generate_uudmap.exe
.IF "$(BUILD_STATIC)" == "define" || "$(ALL_STATIC)" == "define"
PERLSTATIC = static
@@ -762,7 +772,7 @@ PERLDLL_RES =
# This used to be $(PERLEXE), but at worst it is the .dll that they depend
# on and really only the interface - i.e. the .def file used to export symbols
# from the .dll
-PERLDEP = perldll.def
+PERLDEP = $(PERLIMPLIB)
PL2BAT = bin\pl2bat.pl
@@ -818,9 +828,17 @@ INT64 = __int64
# makedef.pl must be updated if this changes, and this should normally
# only change when there is an incompatible revision of the public API.
PERLIMPLIB *= ..\perl521$(a)
+PERLEXPLIB *= ..\perl521.exp
PERLSTATICLIB *= ..\perl521s$(a)
PERLDLL = ..\perl521.dll
+#EUMM on Win32 isn't ready for parallel make, so only allow this file to be parallel
+#$(MAKE) will contain the -P that this makefile was called with, which is bad for
+#make_ext.pl, also $(MAKE) is special cased by dmake to execute recipes
+#containing $(MAKE) when "dmake -n" is executed, which causes recursive calls
+#to dmake, which means "dmake -n" is then broken as a diagnostic tool
+PLMAKE = dmake
+
XCOPY = xcopy /f /r /i /d /y
RCOPY = xcopy /f /r /i /e /d /y
NOOP = @rem
@@ -1001,9 +1019,7 @@ CFG_VARS = \
# Top targets
#
-all : CHECKDMAKE .\config.h ..\git_version.h $(GLOBEXE) $(MINIPERL) \
- $(CONFIGPM) $(UNIDATAFILES) MakePPPort \
- $(PERLEXE) Extensions Extensions_nonxs $(PERLSTATIC)
+all : CHECKDMAKE rebasePE $(UNIDATAFILES) Extensions_nonxs $(PERLSTATIC)
regnodes : ..\regnodes.h
@@ -1042,178 +1058,13 @@ perlglob$(o) : perlglob.c
config.w32 : $(CFGSH_TMPL)
copy $(CFGSH_TMPL) config.w32
-#
-# Copy the template config.h and set configurables at the end of it
-# as per the options chosen and compiler used.
-# Note: This config.h is only used to build miniperl.exe anyway, but
-# it's as well to have its options correct to be sure that it builds
-# and so that it's "-V" options are correct for use by makedef.pl. The
-# real config.h used to build perl.exe is generated from the top-level
-# config_h.SH by config_h.PL (run by miniperl.exe).
-#
-.\config.h : $(CFGH_TMPL) $(CORE_NOCFG_H)
- -del /f config.h
- copy $(CFGH_TMPL) config.h
- @echo.>>$@
- @echo #ifndef _config_h_footer_>>$@
- @echo #define _config_h_footer_>>$@
- @echo #undef Off_t>>$@
- @echo #undef LSEEKSIZE>>$@
- @echo #undef Off_t_size>>$@
- @echo #undef PTRSIZE>>$@
- @echo #undef SSize_t>>$@
- @echo #undef HAS_ATOLL>>$@
- @echo #undef HAS_STRTOLL>>$@
- @echo #undef HAS_STRTOULL>>$@
- @echo #undef Size_t_size>>$@
- @echo #undef IVTYPE>>$@
- @echo #undef UVTYPE>>$@
- @echo #undef IVSIZE>>$@
- @echo #undef UVSIZE>>$@
- @echo #undef NV_PRESERVES_UV>>$@
- @echo #undef NV_PRESERVES_UV_BITS>>$@
- @echo #undef IVdf>>$@
- @echo #undef UVuf>>$@
- @echo #undef UVof>>$@
- @echo #undef UVxf>>$@
- @echo #undef UVXf>>$@
- @echo #undef USE_64_BIT_INT>>$@
- @echo #undef Gconvert>>$@
- @echo #undef HAS_FREXPL>>$@
- @echo #undef HAS_ISNANL>>$@
- @echo #undef HAS_MODFL>>$@
- @echo #undef HAS_MODFL_PROTO>>$@
- @echo #undef HAS_SQRTL>>$@
- @echo #undef HAS_STRTOLD>>$@
- @echo #undef PERL_PRIfldbl>>$@
- @echo #undef PERL_PRIgldbl>>$@
- @echo #undef PERL_PRIeldbl>>$@
- @echo #undef PERL_SCNfldbl>>$@
- @echo #undef NVTYPE>>$@
- @echo #undef NVSIZE>>$@
- @echo #undef LONG_DOUBLESIZE>>$@
- @echo #undef NV_OVERFLOWS_INTEGERS_AT>>$@
- @echo #undef NVef>>$@
- @echo #undef NVff>>$@
- @echo #undef NVgf>>$@
- @echo #undef USE_LONG_DOUBLE>>$@
- @echo #undef USE_CPLUSPLUS>>$@
-.IF "$(USE_LARGE_FILES)"=="define"
- @echo #define Off_t $(INT64)>>$@
- @echo #define LSEEKSIZE ^8>>$@
- @echo #define Off_t_size ^8>>$@
-.ELSE
- @echo #define Off_t long>>$@
- @echo #define LSEEKSIZE ^4>>$@
- @echo #define Off_t_size ^4>>$@
-.ENDIF
-.IF "$(WIN64)"=="define"
- @echo #define PTRSIZE ^8>>$@
- @echo #define SSize_t $(INT64)>>$@
- @echo #define HAS_ATOLL>>$@
- @echo #define HAS_STRTOLL>>$@
- @echo #define HAS_STRTOULL>>$@
- @echo #define Size_t_size ^8>>$@
-.ELSE
- @echo #define PTRSIZE ^4>>$@
- @echo #define SSize_t int>>$@
- @echo #undef HAS_ATOLL>>$@
- @echo #undef HAS_STRTOLL>>$@
- @echo #undef HAS_STRTOULL>>$@
- @echo #define Size_t_size ^4>>$@
-.ENDIF
-.IF "$(USE_64_BIT_INT)"=="define"
- @echo #define IVTYPE $(INT64)>>$@
- @echo #define UVTYPE unsigned $(INT64)>>$@
- @echo #define IVSIZE ^8>>$@
- @echo #define UVSIZE ^8>>$@
-.IF "$(USE_LONG_DOUBLE)"=="define"
- @echo #define NV_PRESERVES_UV>>$@
- @echo #define NV_PRESERVES_UV_BITS 64>>$@
-.ELSE
- @echo #undef NV_PRESERVES_UV>>$@
- @echo #define NV_PRESERVES_UV_BITS 53>>$@
-.ENDIF
- @echo #define IVdf "I64d">>$@
- @echo #define UVuf "I64u">>$@
- @echo #define UVof "I64o">>$@
- @echo #define UVxf "I64x">>$@
- @echo #define UVXf "I64X">>$@
- @echo #define USE_64_BIT_INT>>$@
-.ELSE
- @echo #define IVTYPE long>>$@
- @echo #define UVTYPE unsigned long>>$@
- @echo #define IVSIZE ^4>>$@
- @echo #define UVSIZE ^4>>$@
- @echo #define NV_PRESERVES_UV>>$@
- @echo #define NV_PRESERVES_UV_BITS 32>>$@
- @echo #define IVdf "ld">>$@
- @echo #define UVuf "lu">>$@
- @echo #define UVof "lo">>$@
- @echo #define UVxf "lx">>$@
- @echo #define UVXf "lX">>$@
- @echo #undef USE_64_BIT_INT>>$@
-.ENDIF
-.IF "$(USE_LONG_DOUBLE)"=="define"
- @echo #define Gconvert(x,n,t,b) sprintf((b),"%.*""Lg",(n),(x))>>$@
- @echo #define HAS_FREXPL>>$@
- @echo #define HAS_ISNANL>>$@
- @echo #define HAS_MODFL>>$@
- @echo #define HAS_MODFL_PROTO>>$@
- @echo #define HAS_SQRTL>>$@
- @echo #define HAS_STRTOLD>>$@
- @echo #define PERL_PRIfldbl "Lf">>$@
- @echo #define PERL_PRIgldbl "Lg">>$@
- @echo #define PERL_PRIeldbl "Le">>$@
- @echo #define PERL_SCNfldbl "Lf">>$@
- @echo #define NVTYPE long double>>$@
-.IF "$(WIN64)"=="define"
- @echo #define NVSIZE ^16>>$@
- @echo #define LONG_DOUBLESIZE ^16>>$@
-.ELSE
- @echo #define NVSIZE ^12>>$@
- @echo #define LONG_DOUBLESIZE ^12>>$@
-.ENDIF
- @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>>$@
- @echo #define NVef "Le">>$@
- @echo #define NVff "Lf">>$@
- @echo #define NVgf "Lg">>$@
- @echo #define USE_LONG_DOUBLE>>$@
-.ELSE
- @echo #define Gconvert(x,n,t,b) sprintf((b),"%.*g",(n),(x))>>$@
- @echo #undef HAS_FREXPL>>$@
- @echo #undef HAS_ISNANL>>$@
- @echo #undef HAS_MODFL>>$@
- @echo #undef HAS_MODFL_PROTO>>$@
- @echo #undef HAS_SQRTL>>$@
- @echo #undef HAS_STRTOLD>>$@
- @echo #undef PERL_PRIfldbl>>$@
- @echo #undef PERL_PRIgldbl>>$@
- @echo #undef PERL_PRIeldbl>>$@
- @echo #undef PERL_SCNfldbl>>$@
- @echo #define NVTYPE double>>$@
- @echo #define NVSIZE ^8>>$@
- @echo #define LONG_DOUBLESIZE ^8>>$@
- @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>>$@
- @echo #define NVef "e">>$@
- @echo #define NVff "f">>$@
- @echo #define NVgf "g">>$@
- @echo #undef USE_LONG_DOUBLE>>$@
-.ENDIF
-.IF "$(USE_CPLUSPLUS)"=="define"
- @echo #define USE_CPLUSPLUS>>$@
-.ELSE
- @echo #undef USE_CPLUSPLUS>>$@
-.ENDIF
- @echo #endif>>$@
-
-..\git_version.h : $(MINIPERL) ..\make_patchnum.pl
+..\git_version.h : $(HAVEMINIPERL) ..\make_patchnum.pl
cd .. && miniperl -Ilib make_patchnum.pl
# make sure that we recompile perl.c if the git version changes
..\perl$(o) : ..\git_version.h
-..\config.sh : config.w32 $(MINIPERL) config_sh.PL FindExt.pm
+..\config.sh : config.w32 $(HAVEMINIPERL) config_sh.PL FindExt.pm
$(MINIPERL) -I..\lib config_sh.PL --cfgsh-option-file \
$(mktmp $(CFG_VARS)) config.w32 > ..\config.sh
@@ -1229,18 +1080,18 @@ regen_config_h:
-$(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)"
rename config.h $(CFGH_TMPL)
-$(CONFIGPM) : $(MINIPERL) ..\config.sh config_h.PL
+$(CONFIGPM): ..\config.sh config_h.PL
$(MINIPERL) -I..\lib ..\configpm --chdir=..
$(XCOPY) ..\*.h $(COREDIR)\*.*
$(XCOPY) *.h $(COREDIR)\*.*
$(RCOPY) include $(COREDIR)\*.*
$(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)" \
- || $(MAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)
+ || $(PLMAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)
-# See the comment in Makefile.SH explaining this seemingly cranky ordering
-$(MINIPERL) : ..\lib\buildcustomize.pl
+.\config.h : $(CONFIGPM)
-..\lib\buildcustomize.pl : $(MINIDIR) $(MINI_OBJ) $(CRTIPMLIBS) ..\write_buildcustomize.pl
+# See the comment in Makefile.SH explaining this seemingly cranky ordering
+..\lib\buildcustomize.pl : $(MINI_OBJ) ..\write_buildcustomize.pl
.IF "$(CCTYPE)" == "GCC"
$(LINK32) -v -mconsole -o $(MINIPERL) $(BLINK_FLAGS) \
$(mktmp $(LKPRE) $(MINI_OBJ) $(LIBFILES) $(LKPOST))
@@ -1251,31 +1102,202 @@ $(MINIPERL) : ..\lib\buildcustomize.pl
.ENDIF
$(MINIPERL) -I..\lib -f ..\write_buildcustomize.pl ..
-$(MINIDIR) :
+#convinence target, get a working miniperl
+mp : $(CONFIGPM)
+
+$(MINIDIR)\.exists : $(CFGH_TMPL)
if not exist "$(MINIDIR)" mkdir "$(MINIDIR)"
+#
+# Copy the template config.h and set configurables at the end of it
+# as per the options chosen and compiler used.
+# Note: This config.h is only used to build miniperl.exe anyway, but
+# it's as well to have its options correct to be sure that it builds
+# and so that it's "-V" options are correct for use by makedef.pl. The
+# real config.h used to build perl.exe is generated from the top-level
+# config_h.SH by config_h.PL (run by miniperl.exe).
+#
+# MINIDIR generates config.h so miniperl.exe is not rebuilt when the 2nd
+# config.h is generated in CONFIGPM target, see also the comments for $(MINI_OBJ).
+ -if exist config.h del /f config.h
+ copy $(CFGH_TMPL) config.h
+ @(echo.&& \
+ echo #ifndef _config_h_footer_&& \
+ echo #define _config_h_footer_&& \
+ echo #undef Off_t&& \
+ echo #undef LSEEKSIZE&& \
+ echo #undef Off_t_size&& \
+ echo #undef PTRSIZE&& \
+ echo #undef SSize_t&& \
+ echo #undef HAS_ATOLL&& \
+ echo #undef HAS_STRTOLL&& \
+ echo #undef HAS_STRTOULL&& \
+ echo #undef Size_t_size&& \
+ echo #undef IVTYPE&& \
+ echo #undef UVTYPE&& \
+ echo #undef IVSIZE&& \
+ echo #undef UVSIZE&& \
+ echo #undef NV_PRESERVES_UV&& \
+ echo #undef NV_PRESERVES_UV_BITS&& \
+ echo #undef IVdf&& \
+ echo #undef UVuf&& \
+ echo #undef UVof&& \
+ echo #undef UVxf&& \
+ echo #undef UVXf&& \
+ echo #undef USE_64_BIT_INT&& \
+ echo #undef Gconvert&& \
+ echo #undef HAS_FREXPL&& \
+ echo #undef HAS_ISNANL&& \
+ echo #undef HAS_MODFL&& \
+ echo #undef HAS_MODFL_PROTO&& \
+ echo #undef HAS_SQRTL&& \
+ echo #undef HAS_STRTOLD&& \
+ echo #undef PERL_PRIfldbl&& \
+ echo #undef PERL_PRIgldbl&& \
+ echo #undef PERL_PRIeldbl&& \
+ echo #undef PERL_SCNfldbl&& \
+ echo #undef NVTYPE&& \
+ echo #undef NVSIZE&& \
+ echo #undef LONG_DOUBLESIZE&& \
+ echo #undef NV_OVERFLOWS_INTEGERS_AT&& \
+ echo #undef NVef&& \
+ echo #undef NVff&& \
+ echo #undef NVgf&& \
+ echo #undef USE_LONG_DOUBLE&& \
+ echo #undef USE_CPLUSPLUS)>> config.h
+.IF "$(USE_LARGE_FILES)"=="define"
+ @(echo #define Off_t $(INT64)&& \
+ echo #define LSEEKSIZE ^8&& \
+ echo #define Off_t_size ^8)>> config.h
+.ELSE
+ @(echo #define Off_t long&& \
+ echo #define LSEEKSIZE ^4&& \
+ echo #define Off_t_size ^4)>> config.h
+.ENDIF
+.IF "$(WIN64)"=="define"
+ @(echo #define PTRSIZE ^8&& \
+ echo #define SSize_t $(INT64)&& \
+ echo #define HAS_ATOLL&& \
+ echo #define HAS_STRTOLL&& \
+ echo #define HAS_STRTOULL&& \
+ echo #define Size_t_size ^8)>> config.h
+.ELSE
+ @(echo #define PTRSIZE ^4&& \
+ echo #define SSize_t int&& \
+ echo #undef HAS_ATOLL&& \
+ echo #undef HAS_STRTOLL&& \
+ echo #undef HAS_STRTOULL&& \
+ echo #define Size_t_size ^4)>> config.h
+.ENDIF
+.IF "$(USE_64_BIT_INT)"=="define"
+ @(echo #define IVTYPE $(INT64)&& \
+ echo #define UVTYPE unsigned $(INT64)&& \
+ echo #define IVSIZE ^8&& \
+ echo #define UVSIZE ^8)>> config.h
+.IF "$(USE_LONG_DOUBLE)"=="define"
+ @(echo #define NV_PRESERVES_UV&& \
+ echo #define NV_PRESERVES_UV_BITS 64)>> config.h
+.ELSE
+ @(echo #undef NV_PRESERVES_UV&& \
+ echo #define NV_PRESERVES_UV_BITS 53)>> config.h
+.ENDIF
+ @(echo #define IVdf "I64d"&& \
+ echo #define UVuf "I64u"&& \
+ echo #define UVof "I64o"&& \
+ echo #define UVxf "I64x"&& \
+ echo #define UVXf "I64X"&& \
+ echo #define USE_64_BIT_INT)>> config.h
+.ELSE
+ @(echo #define IVTYPE long&& \
+ echo #define UVTYPE unsigned long&& \
+ echo #define IVSIZE ^4&& \
+ echo #define UVSIZE ^4&& \
+ echo #define NV_PRESERVES_UV&& \
+ echo #define NV_PRESERVES_UV_BITS 32&& \
+ echo #define IVdf "ld"&& \
+ echo #define UVuf "lu"&& \
+ echo #define UVof "lo"&& \
+ echo #define UVxf "lx"&& \
+ echo #define UVXf "lX"&& \
+ echo #undef USE_64_BIT_INT)>> config.h
+.ENDIF
+.IF "$(USE_LONG_DOUBLE)"=="define"
+ @(echo #define Gconvert^(x,n,t,b^) sprintf^(^(b^),"%.*""Lg",^(n^),^(x^)^)&& \
+ echo #define HAS_FREXPL&& \
+ echo #define HAS_ISNANL&& \
+ echo #define HAS_MODFL&& \
+ echo #define HAS_MODFL_PROTO&& \
+ echo #define HAS_SQRTL&& \
+ echo #define HAS_STRTOLD&& \
+ echo #define PERL_PRIfldbl "Lf"&& \
+ echo #define PERL_PRIgldbl "Lg"&& \
+ echo #define PERL_PRIeldbl "Le"&& \
+ echo #define PERL_SCNfldbl "Lf"&& \
+ echo #define NVTYPE long double)>> config.h
+.IF "$(WIN64)"=="define"
+ @(echo #define NVSIZE ^16&& \
+ echo #define LONG_DOUBLESIZE ^16)>> config.h
+.ELSE
+ @(echo #define NVSIZE ^12&& \
+ echo #define LONG_DOUBLESIZE ^12)>> config.h
+.ENDIF
+ @(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&& \
+ echo #define NVef "Le"&& \
+ echo #define NVff "Lf"&& \
+ echo #define NVgf "Lg"&& \
+ echo #define USE_LONG_DOUBLE)>> config.h
+.ELSE
+ @(echo #define Gconvert^(x,n,t,b^) sprintf^(^(b^),"%.*g",^(n^),^(x^)^)&& \
+ echo #undef HAS_FREXPL&& \
+ echo #undef HAS_ISNANL&& \
+ echo #undef HAS_MODFL&& \
+ echo #undef HAS_MODFL_PROTO&& \
+ echo #undef HAS_SQRTL&& \
+ echo #undef HAS_STRTOLD&& \
+ echo #undef PERL_PRIfldbl&& \
+ echo #undef PERL_PRIgldbl&& \
+ echo #undef PERL_PRIeldbl&& \
+ echo #undef PERL_SCNfldbl&& \
+ echo #define NVTYPE double&& \
+ echo #define NVSIZE ^8&& \
+ echo #define LONG_DOUBLESIZE ^8&& \
+ 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&& \
+ echo #define NVef "e"&& \
+ echo #define NVff "f"&& \
+ echo #define NVgf "g"&& \
+ echo #undef USE_LONG_DOUBLE)>> config.h
+.ENDIF
+.IF "$(USE_CPLUSPLUS)"=="define"
+ @(echo #define USE_CPLUSPLUS&& \
+ echo #endif)>> config.h
+.ELSE
+ @(echo #undef USE_CPLUSPLUS&& \
+ echo #endif)>> config.h
+.ENDIF
+#separate line since this is sentinal that this target is done
+ rem. > $(MINIDIR)\.exists
$(MINICORE_OBJ) : $(CORE_NOCFG_H)
- $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_EXTERNAL_GLOB -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ ..\$(*B).c
+ $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_EXTERNAL_GLOB -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ $(PDBOUT) ..\$(*B).c
$(MINIWIN32_OBJ) : $(CORE_NOCFG_H)
- $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ $(*B).c
+ $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ $(PDBOUT) $(*B).c
# -DPERL_IMPLICIT_SYS needs C++ for perllib.c
# rules wrapped in .IFs break Win9X build (we end up with unbalanced []s unless
# unless the .IF is true), so instead we use a .ELSE with the default.
# This is the only file that depends on perlhost.h, vmem.h, and vdir.h
-perllib$(o) : perllib.c .\perlhost.h .\vdir.h .\vmem.h
+perllib$(o) : perllib.c perllibst.h .\perlhost.h .\vdir.h .\vmem.h
.IF "$(USE_IMP_SYS)" == "define"
- $(CC) -c -I. $(CFLAGS_O) $(CXX_FLAG) $(OBJOUT_FLAG)$@ perllib.c
+ $(CC) -c -I. $(CFLAGS_O) $(CXX_FLAG) $(OBJOUT_FLAG)$@ $(PDBOUT) perllib.c
.ELSE
- $(CC) -c -I. $(CFLAGS_O) $(OBJOUT_FLAG)$@ perllib.c
+ $(CC) -c -I. $(CFLAGS_O) $(OBJOUT_FLAG)$@ $(PDBOUT) perllib.c
.ENDIF
# 1. we don't want to rebuild miniperl.exe when config.h changes
# 2. we don't want to rebuild miniperl.exe with non-default config.h
# 3. we can't have miniperl.exe depend on git_version.h, as miniperl creates it
-$(MINI_OBJ) : $(CORE_NOCFG_H)
+$(MINI_OBJ) : $(MINIDIR)\.exists $(CORE_NOCFG_H)
$(WIN32_OBJ) : $(CORE_H)
@@ -1283,12 +1305,26 @@ $(CORE_OBJ) : $(CORE_H)
$(DLL_OBJ) : $(CORE_H)
-perldll.def : $(MINIPERL) $(CONFIGPM) ..\embed.fnc ..\makedef.pl create_perllibst_h.pl
+
+perllibst.h : $(HAVEMINIPERL) $(CONFIGPM) create_perllibst_h.pl
$(MINIPERL) -I..\lib create_perllibst_h.pl
+
+perldll.def : $(HAVEMINIPERL) $(CONFIGPM) ..\embed.fnc ..\makedef.pl
$(MINIPERL) -I..\lib -w ..\makedef.pl PLATFORM=win32 $(OPTIMIZE) $(DEFINES) \
$(BUILDOPT) CCTYPE=$(CCTYPE) TARG_DIR=..\ > perldll.def
-$(PERLDLL): perldll.def $(PERLDLL_OBJ) $(PERLDLL_RES) Extensions_static
+$(PERLIMPLIB) : perldll.def
+.IF "$(CCTYPE)" == "GCC"
+ $(IMPLIB) -k -d perldll.def -l $(PERLIMPLIB)
+.ELSE #VC family
+ lib -def:perldll.def -machine:$(ARCHITECTURE) /OUT:$(PERLIMPLIB)
+.ENDIF
+ $(XCOPY) $(PERLIMPLIB) $(COREDIR)
+
+#PERLEXPLIB is built in PERLIMPLIB
+$(PERLEXPLIB): $(PERLIMPLIB)
+
+$(PERLDLL): $(PERLEXPLIB) $(PERLDLL_OBJ) $(PERLDLL_RES) Extensions_static
.IF "$(CCTYPE)" == "GCC"
$(LINK32) -mdll -o $@ -Wl,--base-file -Wl,perl.base $(BLINK_FLAGS) \
$(mktmp $(LKPRE) $(PERLDLL_OBJ) \
@@ -1304,13 +1340,12 @@ $(PERLDLL): perldll.def $(PERLDLL_OBJ) $(PERLDLL_RES) Extensions_static
$(shell @type Extensions_static) \
$(LIBFILES) perl.exp $(LKPOST))
.ELSE
- $(LINK32) -dll -def:perldll.def -out:$@ $(BLINK_FLAGS) \
+ $(LINK32) -dll -out:$@ $(BLINK_FLAGS) \
@Extensions_static \
@$(mktmp -base:0x28000000 $(DELAYLOAD) $(LIBFILES) \
- $(PERLDLL_RES) $(PERLDLL_OBJ))
+ $(PERLDLL_RES) $(PERLDLL_OBJ) $(PERLEXPLIB))
$(EMBED_DLL_MANI)
.ENDIF
- $(XCOPY) $(PERLIMPLIB) $(COREDIR)
$(PERLSTATICLIB): $(PERLDLL_OBJ) Extensions_static
.IF "$(CCTYPE)" == "GCC"
@@ -1351,16 +1386,16 @@ $(GENUUDMAP) : $(GENUUDMAP_OBJ)
perlmain.c : runperl.c
copy runperl.c perlmain.c
-perlmain$(o) : perlmain.c
- $(CC) $(CFLAGS_O:s,-DPERLDLL,-UPERLDLL,) $(OBJOUT_FLAG)$@ -c perlmain.c
+perlmain$(o) : $(CONFIGPM) perlmain.c
+ $(CC) $(CFLAGS_O:s,-DPERLDLL,-UPERLDLL,) $(OBJOUT_FLAG)$@ $(PDBOUT) -c perlmain.c
perlmainst.c : runperl.c
copy runperl.c perlmainst.c
-perlmainst$(o) : perlmainst.c
- $(CC) $(CFLAGS_O) $(OBJOUT_FLAG)$@ -c perlmainst.c
+perlmainst$(o) : $(CONFIGPM) perlmainst.c
+ $(CC) $(CFLAGS_O) $(OBJOUT_FLAG)$@ $(PDBOUT) -c perlmainst.c
-$(PERLEXE): $(PERLDLL) $(CONFIGPM) $(PERLEXE_OBJ) $(PERLEXE_RES)
+$(PERLEXE): $(CONFIGPM) $(PERLEXE_OBJ) $(PERLEXE_RES) $(PERLIMPLIB)
.IF "$(CCTYPE)" == "GCC"
$(LINK32) -mconsole -o $@ $(BLINK_FLAGS) \
$(PERLEXE_OBJ) $(PERLEXE_RES) $(PERLIMPLIB) $(LIBFILES)
@@ -1382,43 +1417,52 @@ $(PERLEXESTATIC): $(PERLSTATICLIB) $(CONFIGPM) $(PERLEXEST_OBJ) $(PERLEXE_RES)
$(EMBED_EXE_MANI)
.ENDIF
-MakePPPort: $(MINIPERL) $(CONFIGPM) Extensions_nonxs
- $(MINIPERL) -I..\lib ..\mkppport
-
#-------------------------------------------------------------------------------
# There's no direct way to mark a dependency on
# DynaLoader.pm, so this will have to do
Extensions : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) $(DYNALOADER)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic
+ if not exist $(COREDIR)\ppport.h rem. > $(COREDIR)\ppport.h
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic
Extensions_reonly : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) $(DYNALOADER)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic +re
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic +re
-Extensions_static : ..\make_ext.pl ..\lib\buildcustomize.pl list_static_libs.pl $(PERLDEP) $(CONFIGPM) Extensions_nonxs
+Extensions_static : ..\make_ext.pl ..\lib\buildcustomize.pl list_static_libs.pl $(CONFIGPM)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --static
+ if not exist $(COREDIR)\ppport.h rem. > $(COREDIR)\ppport.h
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --static
$(MINIPERL) -I..\lib list_static_libs.pl > Extensions_static
-Extensions_nonxs : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) ..\pod\perlfunc.pod
- $(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --nonxs
+Extensions_nonxs : ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM) ..\pod\perlfunc.pod
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --nonxs !libs
-$(DYNALOADER) : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) Extensions_nonxs
+#lib must be built, it can't be buildcustomize.pl-ed, and is required for XS building
+$(DYNALOADER) : ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --dynaloader
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(EXTDIR) --dir=$(DISTDIR) --dynaloader lib
Extensions_clean :
- -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=clean
+ -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=clean
Extensions_realclean :
- -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=realclean
+ -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=realclean
+
+# all PE files need to be built by the time this target runs, PP files can still
+# be running in parallel like UNIDATAFILES, this target a placeholder for the
+# future
+.IF "$(BUILD_STATIC)"=="define"
+rebasePE : Extensions $(PERLDLL) $(PERLEXE) $(GLOBEXE) $(PERLEXESTATIC)
+.ELSE
+rebasePE : Extensions $(PERLDLL) $(PERLEXE) $(GLOBEXE)
+.ENDIF
+ $(NOOP)
#-------------------------------------------------------------------------------
-doc: $(PERLEXE) ..\pod\perltoc.pod
+doc: $(PERLEXE) $(PERLDLL) ..\pod\perltoc.pod
$(PERLEXE) ..\installhtml --podroot=.. --htmldir=$(HTMLDIR) \
--podpath=pod:lib:utils --htmlroot="file://$(INST_HTML:s,:,|,)"\
--recurse
@@ -1428,8 +1472,8 @@ doc: $(PERLEXE) ..\pod\perltoc.pod
# Note that this next section is parsed (and regenerated) by pod/buildtoc
# so please check that script before making structural changes here
-utils: $(PERLEXE) ..\utils\Makefile
- cd ..\utils && $(MAKE) PERL=$(MINIPERL)
+utils: $(HAVEMINIPERL) ..\utils\Makefile
+ cd ..\utils && $(PLMAKE) PERL=$(MINIPERL)
copy ..\README.aix ..\pod\perlaix.pod
copy ..\README.amiga ..\pod\perlamiga.pod
copy ..\README.android ..\pod\perlandroid.pod
@@ -1464,11 +1508,11 @@ utils: $(PERLEXE) ..\utils\Makefile
copy ..\README.vos ..\pod\perlvos.pod
copy ..\README.win32 ..\pod\perlwin32.pod
copy ..\pod\perldelta.pod ..\pod\perl52111delta.pod
- $(PERLEXE) $(PL2BAT) $(UTILS)
+ $(MINIPERL) -I..\lib $(PL2BAT) $(UTILS)
$(MINIPERL) -I..\lib ..\autodoc.pl ..
$(MINIPERL) -I..\lib ..\pod\perlmodlib.PL -q ..
-..\pod\perltoc.pod: $(PERLEXE) Extensions Extensions_nonxs
+..\pod\perltoc.pod: $(PERLEXE) $(PERLDLL) Extensions Extensions_nonxs
$(PERLEXE) -f ..\pod\buildtoc -q
# Note that the pod cleanup in this next section is parsed (and regenerated
@@ -1605,11 +1649,11 @@ installhtml : doc
inst_lib : $(CONFIGPM)
$(RCOPY) ..\lib $(INST_LIB)\*.*
-$(UNIDATAFILES) ..\pod\perluniprops.pod .UPDATEALL : $(MINIPERL) $(CONFIGPM) ..\lib\unicore\mktables Extensions_nonxs
+$(UNIDATAFILES) ..\pod\perluniprops.pod .UPDATEALL : $(CONFIGPM) ..\lib\unicore\mktables
cd ..\lib\unicore && \
..\$(MINIPERL) -I.. mktables -P ..\..\pod -maketest -makelist -p
-minitest : .\config.h $(MINIPERL) ..\git_version.h $(GLOBEXE) $(CONFIGPM) $(UNIDATAFILES) $(TESTPREPGCC)
+minitest : .\config.h $(HAVEMINIPERL) ..\git_version.h $(GLOBEXE) $(CONFIGPM) $(UNIDATAFILES) $(TESTPREPGCC)
$(XCOPY) $(MINIPERL) ..\t\$(NULL)
if exist ..\t\perl.exe del /f ..\t\perl.exe
rename ..\t\miniperl.exe perl.exe
diff --git a/write_buildcustomize.pl b/write_buildcustomize.pl
index 5d819b5..1503018 100644
--- a/write_buildcustomize.pl
+++ b/write_buildcustomize.pl
@@ -41,8 +41,16 @@ my @toolchain = qw(cpan/AutoLoader/lib
dist/constant/lib
);
-# Used only in ExtUtils::Liblist::Kid::_win32_ext()
-push @toolchain, 'cpan/Text-ParseWords/lib' if $^O eq 'MSWin32';
+# Text-ParseWords used only in ExtUtils::Liblist::Kid::_win32_ext()
+# the rest are for XS building on Win32, since nonxs and xs build simultaneously
+# on Win32 if parallel building
+push @toolchain, qw(
+ cpan/Text-ParseWords/lib
+ dist/ExtUtils-ParseXS/lib
+ cpan/Getopt-Long/lib
+ cpan/parent/lib
+ cpan/ExtUtils-Constant/lib
+) if $^O eq 'MSWin32';
push @toolchain, 'ext/VMS-Filespec/lib' if $^O eq 'VMS';
unshift @INC, @toolchain;
--
1.8.0.msysgit.0
|
From @bulk88On Sun Apr 05 15:43:49 2015, bulk88 wrote:
Revised patch attached, ..\pod\perltoc.pod target got missing deps added. -- |
From @bulk880001-WIP-add-parallel-support-for-Win32-dmake-building.patchFrom 666d922f46d60d659869f8f3181a7ad1586ede6c Mon Sep 17 00:00:00 2001
From: Daniel Dragan <bulk88@hotmail.com>
Date: Sun, 10 May 2015 23:55:23 -0400
Subject: [PATCH] WIP add parallel support for Win32 dmake building
-if building a 32 bit Perl, with a 64bit dmake, force
PROCESSOR_ARCHITECTURE to x86, otherwise the next couple macros will
try to build a 64 bit perl with 32 bit CCs
-PDBOUT is required to run multiple VC cl.exe processes, otherwise all
VC cl.exe processes will error out trying to lock and write to a
file called "vc*0.pdb", PDBOUT is empty for GCC builds since they dont
have PDB files
-to reduce excess IO calls checking for miniperl.exe plus remove a
"Found file corresponding to virtual target" warning that dmake emits,
make this makefile unaware that miniperl.exe exists. dmake has a very bad
exponential number of IO/stat() calls for every target that is yet
unbuilt, see procmon logs in [perl #123854], so instead of a stat on
../miniperl.exe, then ../lib/buildcustomize.pl, it will be just a stat on
../lib/buildcustomize.pl
-remove makefile awareness of ..\lib\Config_heavy.pl,
if ..\lib\Config_heavy.pl is ever updated, so is ..\lib\Config.pm
less IO calls for dmake, see also commit 962e59f394
-to break up the sequential nature of this makefile, allow (XS) Extensions
to build, before (AKA parallel with) perl5**.dll and perl.exe are built.
This is achieved by running makedef.pl very early, and generating
perl5**.lib/libperl5**.a from the def file, and NOT generating
perl5**.lib/libperl5**.a from perl5**.dll at link time of perl5**.dll.
The conquence of this is, declspec(dllexport) is now unusable, but exports
should be centrally managed anyways (embed.fnc/etc) so this isn't a big
issue.
-EUMM makefiles shouldn't be subject to parallelism, untested and disable
for now, plus creating PLMAKE allows "dmake -n" to work for diagnosing
this makefile
-slim down all target. Extensions* and UNIDATAFILES now know how to build
themselves, the parallel nature says you can't rely on left to right
execution of deps in a parent node to make a child (dep) node build
-miniperl.exe used to be unbuildable from a clean tree except from all
target, since miniperl.exe didn't depend on mini config.h. Also mini dir
can't be a target, since each .obj built will dirty the mini dir's time
stamp and infinite loop happens, instead use a .exists file
-dmake rescans for all outstanding targets, at each recipe line to run,
this early in the build process, there are an enormous amount of files to
test for, so the echos are very slow, 350ms each, so combine as many of
the lines of mini/.exists AKA mini config.h together as possible. ".IF"
can't be put inside "one line", so not all lines were merged. Shell "if"
could be used to further group the echos but this enough to make the pause
/cpu spining not really noticable. USE_CPLUSPLUS contains an unrolled line
(the #endif) on both sides. See also procmon logs in [perl #123854]
-perllib.obj/.o needs perllibst.h which is built by miniperl+a script,
perllibst.h target doesn't need any Extensions*, so perllib.obj is still
quick to build
-perldll.def doesn't need perllibst.h since makedef.pl uses
$Config{static_ext} to find boot xsubs to export, makedef.pl does not
read perllibst.h, remove perllibst.h for more parallelism/less things to
build before perldll.def runs, and therefore Extensions (XS) starts to
run quicker, and Extensions (XS) is the longest target to build
-perlmain and perlmainst .obj/.o needs full perl headers to compile, they
aren't like generate_uudmap.exe and perlglob.exe which are perlapi unaware
-perl.exe doesn't need perl5**.dll to build, just the imp lib to
perl5**.dll, perl.exe is in the same category as XS modules, more
parallelism
-ppport.h isn't needed in blead perl, since blead is the newest perl in the
world, this allows Extensions (XS) to run sooner, ppport.h is replaced by
a dummy file
-break up the dependencies of all the Extensions* targets, static
(just Win32CORE normally), dynamic XS and non-XS, these 3 run in parallel
now, non-XS doesn't need perl5**.lib/.a or any C headers, just PP
Config.pm
-DLL XS requires PP DynaLoader.pm for dl_findfile() otherwise
Mkbootstrap.pm fatally errors, Mkbootstrap.pm could be revised to not load
DynaLoader on Win32, since " if ($Config{'dlsrc'} =~ /^dl_dld/){" is
false, but this is the easier path right now
-DynaLoader requires module lib to build itself, but Extensions_nonxs
happens to not need mod lib, so move where mod lib is built
-in utils target, change it so it can run with miniperl, more parallelism,
pl2bat doesn't require full perl, the full perl stuff is from
commit 3fe9a6f19e from 5.003 and no ML archive is available to explain why
full perl was used instead of mini perl
-add 4 modules to buildcustomize so nonxs and xs build simultaneously
-remove ancient cruft from commit 26618a56da from 1997 from README.w32
dmake is automatically set inside CFG_VARS today. OSRELEASE is irrelavent
today, Perl doesn't use any of the defaults (like name of CC) from the
maketool.
-Time-HiRes has had a min ver of 5.6.0 since commit 90e44bf683 / release
1.9724 in 2011. dTHXR and aTHXR are for 5.005 threads compat but they are
pointless since there is usage of "unsafe" dTHX in other places in
Time-HiRes. Perl's headers don't define those 2, so they were defined to
>= 5.6.0 threads in ppport.h but a dummy ppport.h file is used, which
doesn't contain those defines to the new API, so remove usage of
pre-5.6.0 macros, this allows Time-HiRes to compile with the dummy
ppport.h with blead perl
---
Porting/Maintainers.pl | 2 +
README.win32 | 17 +-
cpan/Time-HiRes/HiRes.pm | 2 +-
cpan/Time-HiRes/HiRes.xs | 4 +-
t/porting/customized.dat | 1 +
win32/makefile.mk | 480 +++++++++++++++++++++++++---------------------
write_buildcustomize.pl | 12 +-
7 files changed, 286 insertions(+), 232 deletions(-)
diff --git a/Porting/Maintainers.pl b/Porting/Maintainers.pl
index d31e190..38b8546 100755
--- a/Porting/Maintainers.pl
+++ b/Porting/Maintainers.pl
@@ -1173,6 +1173,8 @@ use File::Glob qw(:case);
'Time::HiRes' => {
'DISTRIBUTION' => 'ZEFRAM/Time-HiRes-1.9726.tar.gz',
'FILES' => q[cpan/Time-HiRes],
+ # CPAN release eventually
+ 'CUSTOMIZED' => [ 'HiRes.xs' ],
},
'Time::Local' => {
diff --git a/README.win32 b/README.win32
index 403c517..6bf0e45 100644
--- a/README.win32
+++ b/README.win32
@@ -96,8 +96,9 @@ See L<Usage Hints for Perl on Windows> below for general hints about this.
=item Make
You need a "make" program to build the sources. If you are using
-Visual C++ or the Windows SDK tools, nmake will work. Builds using
-the gcc need dmake.
+Visual C++ or the Windows SDK tools, nmake will work, but if you want parallel
+building you may use dmake with Visual C++ instead of nmake. Builds using
+gcc need dmake.
dmake is a freely available make that has very nice macro features
and parallelability.
@@ -135,13 +136,6 @@ console already set up for your target architecture (x86-32 or x86-64 or IA64).
With the newer compilers, you may also use the older batch files if you choose
so.
-You can also use dmake to build using Visual C++; provided, however,
-you set OSRELEASE to "microsft" (or whatever the directory name
-under which the Visual C dmake configuration lives) in your environment
-and edit win32/config.vc to change "make=nmake" into "make=dmake". The
-latter step is only essential if you want to use dmake as your default
-make for building extensions using MakeMaker.
-
=item Microsoft Visual C++ 2008-2013 Express Edition
These free versions of Visual C++ 2008-2013 Professional contain the same
@@ -400,6 +394,11 @@ perl521.dll at the perl toplevel, and various other extension dll's
under the lib\auto directory. If the build fails for any reason, make
sure you have done the previous steps correctly.
+To try dmake's parallel mode, type "dmake -P2", where 2, is the maximum number
+of parallel jobs you want to run. A number of things in the build process will
+run in parallel, but there are serialization points where you will see just 1
+CPU maxed out. This is normal.
+
If you are advanced enough with building C code, here is a suggestion to speed
up building perl, and the later C<make test>. Try to keep your PATH enviromental
variable with the least number of folders possible (remember to keep your C
diff --git a/cpan/Time-HiRes/HiRes.pm b/cpan/Time-HiRes/HiRes.pm
index cf64bc1..0ee2c62 100644
--- a/cpan/Time-HiRes/HiRes.pm
+++ b/cpan/Time-HiRes/HiRes.pm
@@ -23,7 +23,7 @@ our @EXPORT_OK = qw (usleep sleep ualarm alarm gettimeofday time tv_interval
stat lstat
);
-our $VERSION = '1.9726';
+our $VERSION = '1.9726_01';
our $XS_VERSION = $VERSION;
$VERSION = eval $VERSION;
diff --git a/cpan/Time-HiRes/HiRes.xs b/cpan/Time-HiRes/HiRes.xs
index 96640e9..9a852c4 100644
--- a/cpan/Time-HiRes/HiRes.xs
+++ b/cpan/Time-HiRes/HiRes.xs
@@ -731,7 +731,7 @@ myNVtime()
static void
hrstatns(UV *atime_nsec, UV *mtime_nsec, UV *ctime_nsec)
{
- dTHXR;
+ dTHX;
#if TIME_HIRES_STAT == 1
*atime_nsec = PL_statcache.st_atimespec.tv_nsec;
*mtime_nsec = PL_statcache.st_mtimespec.tv_nsec;
@@ -1284,7 +1284,7 @@ PROTOTYPE: ;$
fakeop.op_flags = GIMME_V == G_ARRAY ? OPf_WANT_LIST :
GIMME_V == G_SCALAR ? OPf_WANT_SCALAR : OPf_WANT_VOID;
PL_op = &fakeop;
- (void)fakeop.op_ppaddr(aTHXR);
+ (void)fakeop.op_ppaddr(aTHX);
SPAGAIN;
LEAVE;
nret = SP+1 - &ST(0);
diff --git a/t/porting/customized.dat b/t/porting/customized.dat
index fa37838..07b182f 100644
--- a/t/porting/customized.dat
+++ b/t/porting/customized.dat
@@ -10,6 +10,7 @@ Win32API::File cpan/Win32API-File/Makefile.PL 605d0aee31aebe84a99408f9ab5f644db5
Win32API::File cpan/Win32API-File/t/file.t 124e64aa77e755235eb297644a87fac5388d3d78
Win32API::File cpan/Win32API-File/t/tie.t 712ea7edd0cc805ce1c0b8172c01b03dd19b583d
Win32API::File cpan/Win32API-File/typemap 24bff088babeadac0873e8df390d1666d9d9db4a
+Time::HiRes cpan/Time-HiRes/HiRes.xs 0a850b6dee1f2c60ade3d4c33fab7c69b02ddc45
podlators cpan/podlators/scripts/pod2man.PL f81acf53f3ff46cdcc5ebdd661c5d13eb35d20d6
podlators cpan/podlators/scripts/pod2text.PL b4693fcfe4a0a1b38a215cfb8985a65d5d025d69
version cpan/version/lib/version.pm d0923b895d57f1d669ae36fcf85c87b16db341d1
diff --git a/win32/makefile.mk b/win32/makefile.mk
index fb9a54b..71e9cad 100644
--- a/win32/makefile.mk
+++ b/win32/makefile.mk
@@ -345,6 +345,10 @@ BUILDOPT += -DPERL_IMPLICIT_SYS
PROCESSOR_ARCHITECTURE *= x86
+.IF "$(WIN64)" == "undef"
+PROCESSOR_ARCHITECTURE = x86
+.ENDIF
+
.IF "$(WIN64)" == ""
# When we are running from a 32bit cmd.exe on AMD64 then
# PROCESSOR_ARCHITECTURE is set to x86 and PROCESSOR_ARCHITEW6432
@@ -509,6 +513,7 @@ LINK_FLAGS = $(LINK_DBG) -L"$(INST_COREDIR)" -L"$(CCLIBDIR)"
OBJOUT_FLAG = -o
EXEOUT_FLAG = -o
LIBOUT_FLAG =
+PDBOUT =
BUILDOPT += -fno-strict-aliasing -mms-bitfields
MINIBUILDOPT += -fno-strict-aliasing
@@ -655,11 +660,11 @@ CFLAGS = $(EXTRACFLAGS) $(INCLUDES) $(DEFINES) $(LOCDEFS) \
LINK_FLAGS = -nologo -nodefaultlib $(LINK_DBG) \
-libpath:"$(INST_COREDIR)" \
-machine:$(PROCESSOR_ARCHITECTURE)
-LIB_FLAGS = $(LIB_FLAGS) -nologo
+LIB_FLAGS += -nologo
OBJOUT_FLAG = -Fo
EXEOUT_FLAG = -Fe
LIBOUT_FLAG = /out:
-
+PDBOUT = -Fd$*.pdb
TESTPREPGCC =
.ENDIF
@@ -706,7 +711,7 @@ LKPOST = )
.SUFFIXES : .c .i $(o) .dll $(a) .exe .rc .res
.c$(o):
- $(CC) -c $(null,$(<:d) $(NULL) -I$(<:d)) $(CFLAGS_O) $(OBJOUT_FLAG)$@ $<
+ $(CC) -c $(null,$(<:d) $(NULL) -I$(<:d)) $(CFLAGS_O) $(OBJOUT_FLAG)$@ $(PDBOUT) $<
.c.i:
$(CC) -c $(null,$(<:d) $(NULL) -I$(<:d)) $(CFLAGS_O) -E $< >$@
@@ -733,14 +738,19 @@ $(o).dll:
#
# various targets
+
+#do not put $(MINIPERL) as a dep/prereq in a rule, instead put $(HAVEMINIPERL)
+#$(MINIPERL) is not a buildable target, use "dmake mp" if you want to just build
+#miniperl alone
MINIPERL = ..\miniperl.exe
+HAVEMINIPERL = ..\lib\buildcustomize.pl
MINIDIR = .\mini
PERLEXE = ..\perl.exe
WPERLEXE = ..\wperl.exe
PERLEXESTATIC = ..\perl-static.exe
STATICDIR = .\static.tmp
GLOBEXE = ..\perlglob.exe
-CONFIGPM = ..\lib\Config.pm ..\lib\Config_heavy.pl
+CONFIGPM = ..\lib\Config.pm
GENUUDMAP = ..\generate_uudmap.exe
.IF "$(BUILD_STATIC)" == "define" || "$(ALL_STATIC)" == "define"
PERLSTATIC = static
@@ -767,7 +777,7 @@ PERLDLL_RES =
# This used to be $(PERLEXE), but at worst it is the .dll that they depend
# on and really only the interface - i.e. the .def file used to export symbols
# from the .dll
-PERLDEP = perldll.def
+PERLDEP = $(PERLIMPLIB)
PL2BAT = bin\pl2bat.pl
@@ -823,9 +833,17 @@ INT64 = __int64
# makedef.pl must be updated if this changes, and this should normally
# only change when there is an incompatible revision of the public API.
PERLIMPLIB *= ..\perl521$(a)
+PERLEXPLIB *= ..\perl521.exp
PERLSTATICLIB *= ..\perl521s$(a)
PERLDLL = ..\perl521.dll
+#EUMM on Win32 isn't ready for parallel make, so only allow this file to be parallel
+#$(MAKE) will contain the -P that this makefile was called with, which is bad for
+#make_ext.pl, also $(MAKE) is special cased by dmake to execute recipes
+#containing $(MAKE) when "dmake -n" is executed, which causes recursive calls
+#to dmake, which means "dmake -n" is then broken as a diagnostic tool
+PLMAKE = dmake
+
XCOPY = xcopy /f /r /i /d /y
RCOPY = xcopy /f /r /i /e /d /y
NOOP = @rem
@@ -1006,9 +1024,7 @@ CFG_VARS = \
# Top targets
#
-all : CHECKDMAKE .\config.h ..\git_version.h $(GLOBEXE) $(MINIPERL) \
- $(CONFIGPM) $(UNIDATAFILES) MakePPPort \
- $(PERLEXE) Extensions Extensions_nonxs $(PERLSTATIC)
+all : CHECKDMAKE rebasePE $(UNIDATAFILES) Extensions_nonxs $(PERLSTATIC)
regnodes : ..\regnodes.h
@@ -1047,178 +1063,13 @@ perlglob$(o) : perlglob.c
config.w32 : $(CFGSH_TMPL)
copy $(CFGSH_TMPL) config.w32
-#
-# Copy the template config.h and set configurables at the end of it
-# as per the options chosen and compiler used.
-# Note: This config.h is only used to build miniperl.exe anyway, but
-# it's as well to have its options correct to be sure that it builds
-# and so that it's "-V" options are correct for use by makedef.pl. The
-# real config.h used to build perl.exe is generated from the top-level
-# config_h.SH by config_h.PL (run by miniperl.exe).
-#
-.\config.h : $(CFGH_TMPL) $(CORE_NOCFG_H)
- -del /f config.h
- copy $(CFGH_TMPL) config.h
- @echo.>>$@
- @echo #ifndef _config_h_footer_>>$@
- @echo #define _config_h_footer_>>$@
- @echo #undef Off_t>>$@
- @echo #undef LSEEKSIZE>>$@
- @echo #undef Off_t_size>>$@
- @echo #undef PTRSIZE>>$@
- @echo #undef SSize_t>>$@
- @echo #undef HAS_ATOLL>>$@
- @echo #undef HAS_STRTOLL>>$@
- @echo #undef HAS_STRTOULL>>$@
- @echo #undef Size_t_size>>$@
- @echo #undef IVTYPE>>$@
- @echo #undef UVTYPE>>$@
- @echo #undef IVSIZE>>$@
- @echo #undef UVSIZE>>$@
- @echo #undef NV_PRESERVES_UV>>$@
- @echo #undef NV_PRESERVES_UV_BITS>>$@
- @echo #undef IVdf>>$@
- @echo #undef UVuf>>$@
- @echo #undef UVof>>$@
- @echo #undef UVxf>>$@
- @echo #undef UVXf>>$@
- @echo #undef USE_64_BIT_INT>>$@
- @echo #undef Gconvert>>$@
- @echo #undef HAS_FREXPL>>$@
- @echo #undef HAS_ISNANL>>$@
- @echo #undef HAS_MODFL>>$@
- @echo #undef HAS_MODFL_PROTO>>$@
- @echo #undef HAS_SQRTL>>$@
- @echo #undef HAS_STRTOLD>>$@
- @echo #undef PERL_PRIfldbl>>$@
- @echo #undef PERL_PRIgldbl>>$@
- @echo #undef PERL_PRIeldbl>>$@
- @echo #undef PERL_SCNfldbl>>$@
- @echo #undef NVTYPE>>$@
- @echo #undef NVSIZE>>$@
- @echo #undef LONG_DOUBLESIZE>>$@
- @echo #undef NV_OVERFLOWS_INTEGERS_AT>>$@
- @echo #undef NVef>>$@
- @echo #undef NVff>>$@
- @echo #undef NVgf>>$@
- @echo #undef USE_LONG_DOUBLE>>$@
- @echo #undef USE_CPLUSPLUS>>$@
-.IF "$(USE_LARGE_FILES)"=="define"
- @echo #define Off_t $(INT64)>>$@
- @echo #define LSEEKSIZE ^8>>$@
- @echo #define Off_t_size ^8>>$@
-.ELSE
- @echo #define Off_t long>>$@
- @echo #define LSEEKSIZE ^4>>$@
- @echo #define Off_t_size ^4>>$@
-.ENDIF
-.IF "$(WIN64)"=="define"
- @echo #define PTRSIZE ^8>>$@
- @echo #define SSize_t $(INT64)>>$@
- @echo #define HAS_ATOLL>>$@
- @echo #define HAS_STRTOLL>>$@
- @echo #define HAS_STRTOULL>>$@
- @echo #define Size_t_size ^8>>$@
-.ELSE
- @echo #define PTRSIZE ^4>>$@
- @echo #define SSize_t int>>$@
- @echo #undef HAS_ATOLL>>$@
- @echo #undef HAS_STRTOLL>>$@
- @echo #undef HAS_STRTOULL>>$@
- @echo #define Size_t_size ^4>>$@
-.ENDIF
-.IF "$(USE_64_BIT_INT)"=="define"
- @echo #define IVTYPE $(INT64)>>$@
- @echo #define UVTYPE unsigned $(INT64)>>$@
- @echo #define IVSIZE ^8>>$@
- @echo #define UVSIZE ^8>>$@
-.IF "$(USE_LONG_DOUBLE)"=="define"
- @echo #define NV_PRESERVES_UV>>$@
- @echo #define NV_PRESERVES_UV_BITS 64>>$@
-.ELSE
- @echo #undef NV_PRESERVES_UV>>$@
- @echo #define NV_PRESERVES_UV_BITS 53>>$@
-.ENDIF
- @echo #define IVdf "I64d">>$@
- @echo #define UVuf "I64u">>$@
- @echo #define UVof "I64o">>$@
- @echo #define UVxf "I64x">>$@
- @echo #define UVXf "I64X">>$@
- @echo #define USE_64_BIT_INT>>$@
-.ELSE
- @echo #define IVTYPE long>>$@
- @echo #define UVTYPE unsigned long>>$@
- @echo #define IVSIZE ^4>>$@
- @echo #define UVSIZE ^4>>$@
- @echo #define NV_PRESERVES_UV>>$@
- @echo #define NV_PRESERVES_UV_BITS 32>>$@
- @echo #define IVdf "ld">>$@
- @echo #define UVuf "lu">>$@
- @echo #define UVof "lo">>$@
- @echo #define UVxf "lx">>$@
- @echo #define UVXf "lX">>$@
- @echo #undef USE_64_BIT_INT>>$@
-.ENDIF
-.IF "$(USE_LONG_DOUBLE)"=="define"
- @echo #define Gconvert(x,n,t,b) sprintf((b),"%.*""Lg",(n),(x))>>$@
- @echo #define HAS_FREXPL>>$@
- @echo #define HAS_ISNANL>>$@
- @echo #define HAS_MODFL>>$@
- @echo #define HAS_MODFL_PROTO>>$@
- @echo #define HAS_SQRTL>>$@
- @echo #define HAS_STRTOLD>>$@
- @echo #define PERL_PRIfldbl "Lf">>$@
- @echo #define PERL_PRIgldbl "Lg">>$@
- @echo #define PERL_PRIeldbl "Le">>$@
- @echo #define PERL_SCNfldbl "Lf">>$@
- @echo #define NVTYPE long double>>$@
-.IF "$(WIN64)"=="define"
- @echo #define NVSIZE ^16>>$@
- @echo #define LONG_DOUBLESIZE ^16>>$@
-.ELSE
- @echo #define NVSIZE ^12>>$@
- @echo #define LONG_DOUBLESIZE ^12>>$@
-.ENDIF
- @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>>$@
- @echo #define NVef "Le">>$@
- @echo #define NVff "Lf">>$@
- @echo #define NVgf "Lg">>$@
- @echo #define USE_LONG_DOUBLE>>$@
-.ELSE
- @echo #define Gconvert(x,n,t,b) sprintf((b),"%.*g",(n),(x))>>$@
- @echo #undef HAS_FREXPL>>$@
- @echo #undef HAS_ISNANL>>$@
- @echo #undef HAS_MODFL>>$@
- @echo #undef HAS_MODFL_PROTO>>$@
- @echo #undef HAS_SQRTL>>$@
- @echo #undef HAS_STRTOLD>>$@
- @echo #undef PERL_PRIfldbl>>$@
- @echo #undef PERL_PRIgldbl>>$@
- @echo #undef PERL_PRIeldbl>>$@
- @echo #undef PERL_SCNfldbl>>$@
- @echo #define NVTYPE double>>$@
- @echo #define NVSIZE ^8>>$@
- @echo #define LONG_DOUBLESIZE ^8>>$@
- @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>>$@
- @echo #define NVef "e">>$@
- @echo #define NVff "f">>$@
- @echo #define NVgf "g">>$@
- @echo #undef USE_LONG_DOUBLE>>$@
-.ENDIF
-.IF "$(USE_CPLUSPLUS)"=="define"
- @echo #define USE_CPLUSPLUS>>$@
-.ELSE
- @echo #undef USE_CPLUSPLUS>>$@
-.ENDIF
- @echo #endif>>$@
-
-..\git_version.h : $(MINIPERL) ..\make_patchnum.pl
+..\git_version.h : $(HAVEMINIPERL) ..\make_patchnum.pl
cd .. && miniperl -Ilib make_patchnum.pl
# make sure that we recompile perl.c if the git version changes
..\perl$(o) : ..\git_version.h
-..\config.sh : config.w32 $(MINIPERL) config_sh.PL FindExt.pm
+..\config.sh : config.w32 $(HAVEMINIPERL) config_sh.PL FindExt.pm
$(MINIPERL) -I..\lib config_sh.PL --cfgsh-option-file \
$(mktmp $(CFG_VARS)) config.w32 > ..\config.sh
@@ -1234,18 +1085,18 @@ regen_config_h:
-$(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)"
rename config.h $(CFGH_TMPL)
-$(CONFIGPM) : $(MINIPERL) ..\config.sh config_h.PL
+$(CONFIGPM): ..\config.sh config_h.PL
$(MINIPERL) -I..\lib ..\configpm --chdir=..
$(XCOPY) ..\*.h $(COREDIR)\*.*
$(XCOPY) *.h $(COREDIR)\*.*
$(RCOPY) include $(COREDIR)\*.*
$(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)" \
- || $(MAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)
+ || $(PLMAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)
-# See the comment in Makefile.SH explaining this seemingly cranky ordering
-$(MINIPERL) : ..\lib\buildcustomize.pl
+.\config.h : $(CONFIGPM)
-..\lib\buildcustomize.pl : $(MINIDIR) $(MINI_OBJ) $(CRTIPMLIBS) ..\write_buildcustomize.pl
+# See the comment in Makefile.SH explaining this seemingly cranky ordering
+..\lib\buildcustomize.pl : $(MINI_OBJ) ..\write_buildcustomize.pl
.IF "$(CCTYPE)" == "GCC"
$(LINK32) -v -mconsole -o $(MINIPERL) $(BLINK_FLAGS) \
$(mktmp $(LKPRE) $(MINI_OBJ) $(LIBFILES) $(LKPOST))
@@ -1256,31 +1107,202 @@ $(MINIPERL) : ..\lib\buildcustomize.pl
.ENDIF
$(MINIPERL) -I..\lib -f ..\write_buildcustomize.pl ..
-$(MINIDIR) :
+#convinence target, get a working miniperl
+mp : $(CONFIGPM)
+
+$(MINIDIR)\.exists : $(CFGH_TMPL)
if not exist "$(MINIDIR)" mkdir "$(MINIDIR)"
+#
+# Copy the template config.h and set configurables at the end of it
+# as per the options chosen and compiler used.
+# Note: This config.h is only used to build miniperl.exe anyway, but
+# it's as well to have its options correct to be sure that it builds
+# and so that it's "-V" options are correct for use by makedef.pl. The
+# real config.h used to build perl.exe is generated from the top-level
+# config_h.SH by config_h.PL (run by miniperl.exe).
+#
+# MINIDIR generates config.h so miniperl.exe is not rebuilt when the 2nd
+# config.h is generated in CONFIGPM target, see also the comments for $(MINI_OBJ).
+ -if exist config.h del /f config.h
+ copy $(CFGH_TMPL) config.h
+ @(echo.&& \
+ echo #ifndef _config_h_footer_&& \
+ echo #define _config_h_footer_&& \
+ echo #undef Off_t&& \
+ echo #undef LSEEKSIZE&& \
+ echo #undef Off_t_size&& \
+ echo #undef PTRSIZE&& \
+ echo #undef SSize_t&& \
+ echo #undef HAS_ATOLL&& \
+ echo #undef HAS_STRTOLL&& \
+ echo #undef HAS_STRTOULL&& \
+ echo #undef Size_t_size&& \
+ echo #undef IVTYPE&& \
+ echo #undef UVTYPE&& \
+ echo #undef IVSIZE&& \
+ echo #undef UVSIZE&& \
+ echo #undef NV_PRESERVES_UV&& \
+ echo #undef NV_PRESERVES_UV_BITS&& \
+ echo #undef IVdf&& \
+ echo #undef UVuf&& \
+ echo #undef UVof&& \
+ echo #undef UVxf&& \
+ echo #undef UVXf&& \
+ echo #undef USE_64_BIT_INT&& \
+ echo #undef Gconvert&& \
+ echo #undef HAS_FREXPL&& \
+ echo #undef HAS_ISNANL&& \
+ echo #undef HAS_MODFL&& \
+ echo #undef HAS_MODFL_PROTO&& \
+ echo #undef HAS_SQRTL&& \
+ echo #undef HAS_STRTOLD&& \
+ echo #undef PERL_PRIfldbl&& \
+ echo #undef PERL_PRIgldbl&& \
+ echo #undef PERL_PRIeldbl&& \
+ echo #undef PERL_SCNfldbl&& \
+ echo #undef NVTYPE&& \
+ echo #undef NVSIZE&& \
+ echo #undef LONG_DOUBLESIZE&& \
+ echo #undef NV_OVERFLOWS_INTEGERS_AT&& \
+ echo #undef NVef&& \
+ echo #undef NVff&& \
+ echo #undef NVgf&& \
+ echo #undef USE_LONG_DOUBLE&& \
+ echo #undef USE_CPLUSPLUS)>> config.h
+.IF "$(USE_LARGE_FILES)"=="define"
+ @(echo #define Off_t $(INT64)&& \
+ echo #define LSEEKSIZE ^8&& \
+ echo #define Off_t_size ^8)>> config.h
+.ELSE
+ @(echo #define Off_t long&& \
+ echo #define LSEEKSIZE ^4&& \
+ echo #define Off_t_size ^4)>> config.h
+.ENDIF
+.IF "$(WIN64)"=="define"
+ @(echo #define PTRSIZE ^8&& \
+ echo #define SSize_t $(INT64)&& \
+ echo #define HAS_ATOLL&& \
+ echo #define HAS_STRTOLL&& \
+ echo #define HAS_STRTOULL&& \
+ echo #define Size_t_size ^8)>> config.h
+.ELSE
+ @(echo #define PTRSIZE ^4&& \
+ echo #define SSize_t int&& \
+ echo #undef HAS_ATOLL&& \
+ echo #undef HAS_STRTOLL&& \
+ echo #undef HAS_STRTOULL&& \
+ echo #define Size_t_size ^4)>> config.h
+.ENDIF
+.IF "$(USE_64_BIT_INT)"=="define"
+ @(echo #define IVTYPE $(INT64)&& \
+ echo #define UVTYPE unsigned $(INT64)&& \
+ echo #define IVSIZE ^8&& \
+ echo #define UVSIZE ^8)>> config.h
+.IF "$(USE_LONG_DOUBLE)"=="define"
+ @(echo #define NV_PRESERVES_UV&& \
+ echo #define NV_PRESERVES_UV_BITS 64)>> config.h
+.ELSE
+ @(echo #undef NV_PRESERVES_UV&& \
+ echo #define NV_PRESERVES_UV_BITS 53)>> config.h
+.ENDIF
+ @(echo #define IVdf "I64d"&& \
+ echo #define UVuf "I64u"&& \
+ echo #define UVof "I64o"&& \
+ echo #define UVxf "I64x"&& \
+ echo #define UVXf "I64X"&& \
+ echo #define USE_64_BIT_INT)>> config.h
+.ELSE
+ @(echo #define IVTYPE long&& \
+ echo #define UVTYPE unsigned long&& \
+ echo #define IVSIZE ^4&& \
+ echo #define UVSIZE ^4&& \
+ echo #define NV_PRESERVES_UV&& \
+ echo #define NV_PRESERVES_UV_BITS 32&& \
+ echo #define IVdf "ld"&& \
+ echo #define UVuf "lu"&& \
+ echo #define UVof "lo"&& \
+ echo #define UVxf "lx"&& \
+ echo #define UVXf "lX"&& \
+ echo #undef USE_64_BIT_INT)>> config.h
+.ENDIF
+.IF "$(USE_LONG_DOUBLE)"=="define"
+ @(echo #define Gconvert^(x,n,t,b^) sprintf^(^(b^),"%.*""Lg",^(n^),^(x^)^)&& \
+ echo #define HAS_FREXPL&& \
+ echo #define HAS_ISNANL&& \
+ echo #define HAS_MODFL&& \
+ echo #define HAS_MODFL_PROTO&& \
+ echo #define HAS_SQRTL&& \
+ echo #define HAS_STRTOLD&& \
+ echo #define PERL_PRIfldbl "Lf"&& \
+ echo #define PERL_PRIgldbl "Lg"&& \
+ echo #define PERL_PRIeldbl "Le"&& \
+ echo #define PERL_SCNfldbl "Lf"&& \
+ echo #define NVTYPE long double)>> config.h
+.IF "$(WIN64)"=="define"
+ @(echo #define NVSIZE ^16&& \
+ echo #define LONG_DOUBLESIZE ^16)>> config.h
+.ELSE
+ @(echo #define NVSIZE ^12&& \
+ echo #define LONG_DOUBLESIZE ^12)>> config.h
+.ENDIF
+ @(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&& \
+ echo #define NVef "Le"&& \
+ echo #define NVff "Lf"&& \
+ echo #define NVgf "Lg"&& \
+ echo #define USE_LONG_DOUBLE)>> config.h
+.ELSE
+ @(echo #define Gconvert^(x,n,t,b^) sprintf^(^(b^),"%.*g",^(n^),^(x^)^)&& \
+ echo #undef HAS_FREXPL&& \
+ echo #undef HAS_ISNANL&& \
+ echo #undef HAS_MODFL&& \
+ echo #undef HAS_MODFL_PROTO&& \
+ echo #undef HAS_SQRTL&& \
+ echo #undef HAS_STRTOLD&& \
+ echo #undef PERL_PRIfldbl&& \
+ echo #undef PERL_PRIgldbl&& \
+ echo #undef PERL_PRIeldbl&& \
+ echo #undef PERL_SCNfldbl&& \
+ echo #define NVTYPE double&& \
+ echo #define NVSIZE ^8&& \
+ echo #define LONG_DOUBLESIZE ^8&& \
+ 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&& \
+ echo #define NVef "e"&& \
+ echo #define NVff "f"&& \
+ echo #define NVgf "g"&& \
+ echo #undef USE_LONG_DOUBLE)>> config.h
+.ENDIF
+.IF "$(USE_CPLUSPLUS)"=="define"
+ @(echo #define USE_CPLUSPLUS&& \
+ echo #endif)>> config.h
+.ELSE
+ @(echo #undef USE_CPLUSPLUS&& \
+ echo #endif)>> config.h
+.ENDIF
+#separate line since this is sentinal that this target is done
+ rem. > $(MINIDIR)\.exists
$(MINICORE_OBJ) : $(CORE_NOCFG_H)
- $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_EXTERNAL_GLOB -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ ..\$(*B).c
+ $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_EXTERNAL_GLOB -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ $(PDBOUT) ..\$(*B).c
$(MINIWIN32_OBJ) : $(CORE_NOCFG_H)
- $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ $(*B).c
+ $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ $(PDBOUT) $(*B).c
# -DPERL_IMPLICIT_SYS needs C++ for perllib.c
# rules wrapped in .IFs break Win9X build (we end up with unbalanced []s unless
# unless the .IF is true), so instead we use a .ELSE with the default.
# This is the only file that depends on perlhost.h, vmem.h, and vdir.h
-perllib$(o) : perllib.c .\perlhost.h .\vdir.h .\vmem.h
+perllib$(o) : perllib.c perllibst.h .\perlhost.h .\vdir.h .\vmem.h
.IF "$(USE_IMP_SYS)" == "define"
- $(CC) -c -I. $(CFLAGS_O) $(CXX_FLAG) $(OBJOUT_FLAG)$@ perllib.c
+ $(CC) -c -I. $(CFLAGS_O) $(CXX_FLAG) $(OBJOUT_FLAG)$@ $(PDBOUT) perllib.c
.ELSE
- $(CC) -c -I. $(CFLAGS_O) $(OBJOUT_FLAG)$@ perllib.c
+ $(CC) -c -I. $(CFLAGS_O) $(OBJOUT_FLAG)$@ $(PDBOUT) perllib.c
.ENDIF
# 1. we don't want to rebuild miniperl.exe when config.h changes
# 2. we don't want to rebuild miniperl.exe with non-default config.h
# 3. we can't have miniperl.exe depend on git_version.h, as miniperl creates it
-$(MINI_OBJ) : $(CORE_NOCFG_H)
+$(MINI_OBJ) : $(MINIDIR)\.exists $(CORE_NOCFG_H)
$(WIN32_OBJ) : $(CORE_H)
@@ -1288,12 +1310,26 @@ $(CORE_OBJ) : $(CORE_H)
$(DLL_OBJ) : $(CORE_H)
-perldll.def : $(MINIPERL) $(CONFIGPM) ..\embed.fnc ..\makedef.pl create_perllibst_h.pl
+
+perllibst.h : $(HAVEMINIPERL) $(CONFIGPM) create_perllibst_h.pl
$(MINIPERL) -I..\lib create_perllibst_h.pl
+
+perldll.def : $(HAVEMINIPERL) $(CONFIGPM) ..\embed.fnc ..\makedef.pl
$(MINIPERL) -I..\lib -w ..\makedef.pl PLATFORM=win32 $(OPTIMIZE) $(DEFINES) \
$(BUILDOPT) CCTYPE=$(CCTYPE) TARG_DIR=..\ > perldll.def
-$(PERLDLL): perldll.def $(PERLDLL_OBJ) $(PERLDLL_RES) Extensions_static
+$(PERLIMPLIB) : perldll.def
+.IF "$(CCTYPE)" == "GCC"
+ $(IMPLIB) -k -d perldll.def -l $(PERLIMPLIB)
+.ELSE #VC family
+ lib -def:perldll.def -machine:$(ARCHITECTURE) /OUT:$(PERLIMPLIB)
+.ENDIF
+ $(XCOPY) $(PERLIMPLIB) $(COREDIR)
+
+#PERLEXPLIB is built in PERLIMPLIB
+$(PERLEXPLIB): $(PERLIMPLIB)
+
+$(PERLDLL): $(PERLEXPLIB) $(PERLDLL_OBJ) $(PERLDLL_RES) Extensions_static
.IF "$(CCTYPE)" == "GCC"
$(LINK32) -mdll -o $@ -Wl,--base-file -Wl,perl.base $(BLINK_FLAGS) \
$(mktmp $(LKPRE) $(PERLDLL_OBJ) \
@@ -1309,13 +1345,12 @@ $(PERLDLL): perldll.def $(PERLDLL_OBJ) $(PERLDLL_RES) Extensions_static
$(shell @type Extensions_static) \
$(LIBFILES) perl.exp $(LKPOST))
.ELSE
- $(LINK32) -dll -def:perldll.def -out:$@ $(BLINK_FLAGS) \
+ $(LINK32) -dll -out:$@ $(BLINK_FLAGS) \
@Extensions_static \
@$(mktmp -base:0x28000000 $(DELAYLOAD) $(LIBFILES) \
- $(PERLDLL_RES) $(PERLDLL_OBJ))
+ $(PERLDLL_RES) $(PERLDLL_OBJ) $(PERLEXPLIB))
$(EMBED_DLL_MANI)
.ENDIF
- $(XCOPY) $(PERLIMPLIB) $(COREDIR)
$(PERLSTATICLIB): $(PERLDLL_OBJ) Extensions_static
.IF "$(CCTYPE)" == "GCC"
@@ -1356,16 +1391,16 @@ $(GENUUDMAP) : $(GENUUDMAP_OBJ)
perlmain.c : runperl.c
copy runperl.c perlmain.c
-perlmain$(o) : perlmain.c
- $(CC) $(CFLAGS_O:s,-DPERLDLL,-UPERLDLL,) $(OBJOUT_FLAG)$@ -c perlmain.c
+perlmain$(o) : $(CONFIGPM) perlmain.c
+ $(CC) $(CFLAGS_O:s,-DPERLDLL,-UPERLDLL,) $(OBJOUT_FLAG)$@ $(PDBOUT) -c perlmain.c
perlmainst.c : runperl.c
copy runperl.c perlmainst.c
-perlmainst$(o) : perlmainst.c
- $(CC) $(CFLAGS_O) $(OBJOUT_FLAG)$@ -c perlmainst.c
+perlmainst$(o) : $(CONFIGPM) perlmainst.c
+ $(CC) $(CFLAGS_O) $(OBJOUT_FLAG)$@ $(PDBOUT) -c perlmainst.c
-$(PERLEXE): $(PERLDLL) $(CONFIGPM) $(PERLEXE_OBJ) $(PERLEXE_RES)
+$(PERLEXE): $(CONFIGPM) $(PERLEXE_OBJ) $(PERLEXE_RES) $(PERLIMPLIB)
.IF "$(CCTYPE)" == "GCC"
$(LINK32) -mconsole -o $@ $(BLINK_FLAGS) \
$(PERLEXE_OBJ) $(PERLEXE_RES) $(PERLIMPLIB) $(LIBFILES)
@@ -1387,43 +1422,52 @@ $(PERLEXESTATIC): $(PERLSTATICLIB) $(CONFIGPM) $(PERLEXEST_OBJ) $(PERLEXE_RES)
$(EMBED_EXE_MANI)
.ENDIF
-MakePPPort: $(MINIPERL) $(CONFIGPM) Extensions_nonxs
- $(MINIPERL) -I..\lib ..\mkppport
-
#-------------------------------------------------------------------------------
# There's no direct way to mark a dependency on
# DynaLoader.pm, so this will have to do
Extensions : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) $(DYNALOADER)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic
+ if not exist $(COREDIR)\ppport.h rem. > $(COREDIR)\ppport.h
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic
Extensions_reonly : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) $(DYNALOADER)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic +re
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic +re
-Extensions_static : ..\make_ext.pl ..\lib\buildcustomize.pl list_static_libs.pl $(PERLDEP) $(CONFIGPM) Extensions_nonxs
+Extensions_static : ..\make_ext.pl ..\lib\buildcustomize.pl list_static_libs.pl $(CONFIGPM)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --static
+ if not exist $(COREDIR)\ppport.h rem. > $(COREDIR)\ppport.h
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --static
$(MINIPERL) -I..\lib list_static_libs.pl > Extensions_static
-Extensions_nonxs : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) ..\pod\perlfunc.pod
- $(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --nonxs
+Extensions_nonxs : ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM) ..\pod\perlfunc.pod
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --nonxs !libs
-$(DYNALOADER) : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) Extensions_nonxs
+#lib must be built, it can't be buildcustomize.pl-ed, and is required for XS building
+$(DYNALOADER) : ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --dynaloader
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(EXTDIR) --dir=$(DISTDIR) --dynaloader lib
Extensions_clean :
- -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=clean
+ -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=clean
Extensions_realclean :
- -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=realclean
+ -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=realclean
+
+# all PE files need to be built by the time this target runs, PP files can still
+# be running in parallel like UNIDATAFILES, this target a placeholder for the
+# future
+.IF "$(BUILD_STATIC)"=="define"
+rebasePE : Extensions $(PERLDLL) $(PERLEXE) $(GLOBEXE) $(PERLEXESTATIC)
+.ELSE
+rebasePE : Extensions $(PERLDLL) $(PERLEXE) $(GLOBEXE)
+.ENDIF
+ $(NOOP)
#-------------------------------------------------------------------------------
-doc: $(PERLEXE) ..\pod\perltoc.pod
+doc: $(PERLEXE) $(PERLDLL) ..\pod\perltoc.pod
$(PERLEXE) ..\installhtml --podroot=.. --htmldir=$(HTMLDIR) \
--podpath=pod:lib:utils --htmlroot="file://$(INST_HTML:s,:,|,)"\
--recurse
@@ -1433,8 +1477,8 @@ doc: $(PERLEXE) ..\pod\perltoc.pod
# Note that this next section is parsed (and regenerated) by pod/buildtoc
# so please check that script before making structural changes here
-utils: $(PERLEXE) ..\utils\Makefile
- cd ..\utils && $(MAKE) PERL=$(MINIPERL)
+utils: $(HAVEMINIPERL) ..\utils\Makefile
+ cd ..\utils && $(PLMAKE) PERL=$(MINIPERL)
copy ..\README.aix ..\pod\perlaix.pod
copy ..\README.amiga ..\pod\perlamiga.pod
copy ..\README.android ..\pod\perlandroid.pod
@@ -1469,11 +1513,11 @@ utils: $(PERLEXE) ..\utils\Makefile
copy ..\README.vos ..\pod\perlvos.pod
copy ..\README.win32 ..\pod\perlwin32.pod
copy ..\pod\perldelta.pod ..\pod\perl52112delta.pod
- $(PERLEXE) $(PL2BAT) $(UTILS)
+ $(MINIPERL) -I..\lib $(PL2BAT) $(UTILS)
$(MINIPERL) -I..\lib ..\autodoc.pl ..
$(MINIPERL) -I..\lib ..\pod\perlmodlib.PL -q ..
-..\pod\perltoc.pod: $(PERLEXE) Extensions Extensions_nonxs
+..\pod\perltoc.pod: $(PERLEXE) $(PERLDLL) Extensions Extensions_nonxs ..\pod\perluniprops.pod utils
$(PERLEXE) -f ..\pod\buildtoc -q
# Note that the pod cleanup in this next section is parsed (and regenerated
@@ -1610,11 +1654,11 @@ installhtml : doc
inst_lib : $(CONFIGPM)
$(RCOPY) ..\lib $(INST_LIB)\*.*
-$(UNIDATAFILES) ..\pod\perluniprops.pod .UPDATEALL : $(MINIPERL) $(CONFIGPM) ..\lib\unicore\mktables Extensions_nonxs
+$(UNIDATAFILES) ..\pod\perluniprops.pod .UPDATEALL : $(CONFIGPM) ..\lib\unicore\mktables
cd ..\lib\unicore && \
..\$(MINIPERL) -I.. mktables -P ..\..\pod -maketest -makelist -p
-minitest : .\config.h $(MINIPERL) ..\git_version.h $(GLOBEXE) $(CONFIGPM) $(UNIDATAFILES) $(TESTPREPGCC)
+minitest : .\config.h $(HAVEMINIPERL) ..\git_version.h $(GLOBEXE) $(CONFIGPM) $(UNIDATAFILES) $(TESTPREPGCC)
$(XCOPY) $(MINIPERL) ..\t\$(NULL)
if exist ..\t\perl.exe del /f ..\t\perl.exe
rename ..\t\miniperl.exe perl.exe
diff --git a/write_buildcustomize.pl b/write_buildcustomize.pl
index 5d819b5..1503018 100644
--- a/write_buildcustomize.pl
+++ b/write_buildcustomize.pl
@@ -41,8 +41,16 @@ my @toolchain = qw(cpan/AutoLoader/lib
dist/constant/lib
);
-# Used only in ExtUtils::Liblist::Kid::_win32_ext()
-push @toolchain, 'cpan/Text-ParseWords/lib' if $^O eq 'MSWin32';
+# Text-ParseWords used only in ExtUtils::Liblist::Kid::_win32_ext()
+# the rest are for XS building on Win32, since nonxs and xs build simultaneously
+# on Win32 if parallel building
+push @toolchain, qw(
+ cpan/Text-ParseWords/lib
+ dist/ExtUtils-ParseXS/lib
+ cpan/Getopt-Long/lib
+ cpan/parent/lib
+ cpan/ExtUtils-Constant/lib
+) if $^O eq 'MSWin32';
push @toolchain, 'ext/VMS-Filespec/lib' if $^O eq 'VMS';
unshift @INC, @toolchain;
--
1.7.9.msysgit.0
|
From @tonycozOn Sun May 10 20:59:50 2015, bulk88 wrote:
Doesn't apply as is, since blead has been bumped to 5.22. I applied the rejected chunks manually, and tried a build with VC: J:\dev\perl\git\perl\win32>dmake CCTYPE=MSVC90FREE since PERLEXPLIB isn't defined for VC builds. If I move the definition from the C< .IF "$(CCTYPE)" == "GCC" > block outside of We could avoid patching cpan/HiRes.xs by making the dummy ppport.h two lines Tony |
From @bulk88On Mon May 11 00:22:00 2015, tonyc wrote:
Rebased on blead/5.22 with the PERLEXPLIB stuff fixed and comments in README.win32 and comments in makefile.mk improved.
I could also add the fragment (dTHXR->dTHX, aTHXR->aTHX) of 5.005 threads API that Time::HiRes wants to core headers if Time::HiRes is abandoned (which it is according to Zefram its current maintainer per IRC today) but that might lead to redefinition warnings from the CPP, unless PPPort on CPAN is patched to do "#ifndef" although that now sounds like an exercise in bureaucracy vs your 2 line ppport.h idea or core patching Time::HiRes or CPAN release of Time::HiRes. The PPPort block currently is #if (PERL_BCDVERSION < 0x5006000) perms for Time::HiRes module userid type owner There are 2 ideas I did not do in this patch. First is reordering MICROCORE_SRC in compile time order (specifically ..\toke.c first ..\regcomp.c 2nd and ..\regexec.c 3rd, and the rest by alphabetic order, see http://www.nntp.perl.org/group/perl.perl5.porters/2014/12/msg223870.html for details). This is very important on my 8 core machine, since "r" and "t" are at the end of the alphabet/current MICROCORE_SRC list, and they take the longest period of time, and when compiling the interp, it winds up with 10-12 seconds spent with only 1 or 2 cores in use, just compiling those 3 ultra long compilands. All the other core .c files take 1 or 2 seconds to compile, so they all finish almost instantly, and as the dmake hits the letters t and r, and it blocks/serialized on just 2 cores which is bad. The point of this patch is compiling an interp on a 8 or 10 core machine should never take anymore wall time than the time to compile the LONGEST compiland. With the current alphabetic ordering it takes twice the longest compiland. Second idea is to reorganize make_ext.pl running so non-xs and dynamic (2 biggest ones, since Dynaloader and static (usually just Win32CORE) are noise in the scheme of things) are built together and then with some kind of load balancer .IF $(MAXPROCESS) == 1 with make_ext.pl doing modulus to know which modules to build of the global list. The other choice is hard code the module list into the win32 makefile as is done on the unix makefile, to let the make tool dispatch parallelism correctly with 1 invocation of make_ext.pl building only ONE module per invocation. -- |
From @bulk880001-WIP-add-parallel-support-for-Win32-dmake-building.patchFrom e64f4a23ff145e7782a5a674d6ce61e83d884fc4 Mon Sep 17 00:00:00 2001
From: Daniel Dragan <bulk88@hotmail.com>
Date: Mon, 11 May 2015 16:28:02 -0400
Subject: [PATCH] WIP add parallel support for Win32 dmake building
-if building a 32 bit Perl, with a 64bit dmake, force
PROCESSOR_ARCHITECTURE to x86, otherwise the next couple macros will
try to build a 64 bit perl with 32 bit CCs
-PDBOUT is required to run multiple VC cl.exe processes, otherwise all
VC cl.exe processes will error out trying to lock and write to a
file called "vc*0.pdb", PDBOUT is empty for GCC builds since they dont
have PDB files
-to reduce excess IO calls checking for miniperl.exe plus remove a
"Found file corresponding to virtual target" warning that dmake emits,
make this makefile unaware that miniperl.exe exists. dmake has a very bad
exponential number of IO/stat() calls for every target that is yet
unbuilt, see procmon logs in [perl #123854], so instead of a stat on
../miniperl.exe, then ../lib/buildcustomize.pl, it will be just a stat on
../lib/buildcustomize.pl
-remove makefile awareness of ..\lib\Config_heavy.pl,
if ..\lib\Config_heavy.pl is ever updated, so is ..\lib\Config.pm
less IO calls for dmake, see also commit 962e59f394
-to break up the sequential nature of this makefile, allow (XS) Extensions
to build, before (AKA parallel with) perl5**.dll and perl.exe are built.
This is achieved by running makedef.pl very early, and generating
perl5**.lib/libperl5**.a from the def file, and NOT generating
perl5**.lib/libperl5**.a from perl5**.dll at link time of perl5**.dll.
The conquence of this is, declspec(dllexport) is now unusable, but exports
should be centrally managed anyways (embed.fnc/etc) so this isn't a big
issue.
-EUMM makefiles shouldn't be subject to parallelism, untested and disable
for now, plus creating PLMAKE allows "dmake -n" to work for diagnosing
this makefile
-slim down all target. Extensions* and UNIDATAFILES now know how to build
themselves, the parallel nature says you can't rely on left to right
execution of deps in a parent node to make a child (dep) node build
-miniperl.exe used to be unbuildable from a clean tree except from all
target, since miniperl.exe didn't depend on mini config.h. Also mini dir
can't be a target, since each .obj built will dirty the mini dir's time
stamp and infinite loop happens, instead use a .exists file
-dmake rescans for all outstanding targets, at each recipe line to run,
this early in the build process, there are an enormous amount of files to
test for, so the echos are very slow, 350ms each, so combine as many of
the lines of mini/.exists AKA mini config.h together as possible. ".IF"
can't be put inside "one line", so not all lines were merged. Shell "if"
could be used to further group the echos but this enough to make the pause
/cpu spining not really noticable. USE_CPLUSPLUS contains an unrolled line
(the #endif) on both sides. See also procmon logs in [perl #123854]
-perllib.obj/.o needs perllibst.h which is built by miniperl+a script,
perllibst.h target doesn't need any Extensions*, so perllib.obj is still
quick to build
-perldll.def doesn't need perllibst.h since makedef.pl uses
$Config{static_ext} to find boot xsubs to export, makedef.pl does not
read perllibst.h, remove perllibst.h for more parallelism/less things to
build before perldll.def runs, and therefore Extensions (XS) starts to
run quicker, and Extensions (XS) is the longest target to build
-perlmain and perlmainst .obj/.o needs full perl headers to compile, they
aren't like generate_uudmap.exe and perlglob.exe which are perlapi unaware
-perl.exe doesn't need perl5**.dll to build, just the imp lib to
perl5**.dll, perl.exe is in the same category as XS modules, more
parallelism
-ppport.h isn't needed in blead perl, since blead is the newest perl in the
world, this allows Extensions (XS) to run sooner, ppport.h is replaced by
a dummy file
-break up the dependencies of all the Extensions* targets, static
(just Win32CORE normally), dynamic XS and non-XS, these 3 run in parallel
now, non-XS doesn't need perl5**.lib/.a or any C headers, just PP
Config.pm
-DLL XS requires PP DynaLoader.pm for dl_findfile() otherwise
Mkbootstrap.pm fatally errors, Mkbootstrap.pm could be revised to not load
DynaLoader on Win32, since " if ($Config{'dlsrc'} =~ /^dl_dld/){" is
false, but this is the easier path right now
-DynaLoader requires module lib to build itself, but Extensions_nonxs
happens to not need mod lib, so move where mod lib is built
-in utils target, change it so it can run with miniperl, more parallelism,
pl2bat doesn't require full perl, the full perl stuff is from
commit 3fe9a6f19e from 5.003 and no ML archive is available to explain why
full perl was used instead of mini perl
-add 4 modules to buildcustomize so nonxs and xs build simultaneously
-remove ancient cruft from commit 26618a56da from 1997 from README.w32
dmake is automatically set inside CFG_VARS today. OSRELEASE is irrelavent
today, Perl doesn't use any of the defaults (like name of CC) from the
maketool.
-Time-HiRes has had a min ver of 5.6.0 since commit 90e44bf683 / release
1.9724 in 2011. dTHXR and aTHXR are for 5.005 threads compat but they are
pointless since there is usage of "unsafe" dTHX in other places in
Time-HiRes. Perl's headers don't define those 2, so they were defined to
>= 5.6.0 threads in ppport.h but a dummy ppport.h file is used, which
doesn't contain those defines to the new API, so remove usage of
pre-5.6.0 macros, this allows Time-HiRes to compile with the dummy
ppport.h with blead perl
---
Porting/Maintainers.pl | 2 +
README.win32 | 24 ++--
cpan/Time-HiRes/HiRes.pm | 2 +-
cpan/Time-HiRes/HiRes.xs | 4 +-
t/porting/customized.dat | 1 +
win32/makefile.mk | 484 +++++++++++++++++++++++++---------------------
write_buildcustomize.pl | 12 +-
7 files changed, 294 insertions(+), 235 deletions(-)
diff --git a/Porting/Maintainers.pl b/Porting/Maintainers.pl
index d31e190..38b8546 100755
--- a/Porting/Maintainers.pl
+++ b/Porting/Maintainers.pl
@@ -1173,6 +1173,8 @@ use File::Glob qw(:case);
'Time::HiRes' => {
'DISTRIBUTION' => 'ZEFRAM/Time-HiRes-1.9726.tar.gz',
'FILES' => q[cpan/Time-HiRes],
+ # CPAN release eventually
+ 'CUSTOMIZED' => [ 'HiRes.xs' ],
},
'Time::Local' => {
diff --git a/README.win32 b/README.win32
index 605f980..8e87cc4 100644
--- a/README.win32
+++ b/README.win32
@@ -96,11 +96,13 @@ See L<Usage Hints for Perl on Windows> below for general hints about this.
=item Make
You need a "make" program to build the sources. If you are using
-Visual C++ or the Windows SDK tools, nmake will work. Builds using
-the gcc need dmake.
-
-dmake is a freely available make that has very nice macro features
-and parallelability.
+Visual C++ or the Windows SDK tools, you can use nmake supplied with Visual C++
+or Windows SDK. You may also use, for Visual C++ or Windows SDK, dmake instead
+of nmake. dmake is open source software, but is not included with Visual C++ or
+Windows SDK. If you want parallel building with Visual C++ or
+Windows SDK you must use dmake instead of nmake. Builds using gcc need dmake.
+nmake is not supported for gcc builds. gmake is not supported, but might be
+added in the future.
A port of dmake for Windows is available from:
@@ -135,13 +137,6 @@ console already set up for your target architecture (x86-32 or x86-64 or IA64).
With the newer compilers, you may also use the older batch files if you choose
so.
-You can also use dmake to build using Visual C++; provided, however,
-you set OSRELEASE to "microsft" (or whatever the directory name
-under which the Visual C dmake configuration lives) in your environment
-and edit win32/config.vc to change "make=nmake" into "make=dmake". The
-latter step is only essential if you want to use dmake as your default
-make for building extensions using MakeMaker.
-
=item Microsoft Visual C++ 2008-2013 Express Edition
These free versions of Visual C++ 2008-2013 Professional contain the same
@@ -400,6 +395,11 @@ perl522.dll at the perl toplevel, and various other extension dll's
under the lib\auto directory. If the build fails for any reason, make
sure you have done the previous steps correctly.
+To try dmake's parallel mode, type "dmake -P2", where 2, is the maximum number
+of parallel jobs you want to run. A number of things in the build process will
+run in parallel, but there are serialization points where you will see just 1
+CPU maxed out. This is normal.
+
If you are advanced enough with building C code, here is a suggestion to speed
up building perl, and the later C<make test>. Try to keep your PATH enviromental
variable with the least number of folders possible (remember to keep your C
diff --git a/cpan/Time-HiRes/HiRes.pm b/cpan/Time-HiRes/HiRes.pm
index cf64bc1..0ee2c62 100644
--- a/cpan/Time-HiRes/HiRes.pm
+++ b/cpan/Time-HiRes/HiRes.pm
@@ -23,7 +23,7 @@ our @EXPORT_OK = qw (usleep sleep ualarm alarm gettimeofday time tv_interval
stat lstat
);
-our $VERSION = '1.9726';
+our $VERSION = '1.9726_01';
our $XS_VERSION = $VERSION;
$VERSION = eval $VERSION;
diff --git a/cpan/Time-HiRes/HiRes.xs b/cpan/Time-HiRes/HiRes.xs
index 96640e9..9a852c4 100644
--- a/cpan/Time-HiRes/HiRes.xs
+++ b/cpan/Time-HiRes/HiRes.xs
@@ -731,7 +731,7 @@ myNVtime()
static void
hrstatns(UV *atime_nsec, UV *mtime_nsec, UV *ctime_nsec)
{
- dTHXR;
+ dTHX;
#if TIME_HIRES_STAT == 1
*atime_nsec = PL_statcache.st_atimespec.tv_nsec;
*mtime_nsec = PL_statcache.st_mtimespec.tv_nsec;
@@ -1284,7 +1284,7 @@ PROTOTYPE: ;$
fakeop.op_flags = GIMME_V == G_ARRAY ? OPf_WANT_LIST :
GIMME_V == G_SCALAR ? OPf_WANT_SCALAR : OPf_WANT_VOID;
PL_op = &fakeop;
- (void)fakeop.op_ppaddr(aTHXR);
+ (void)fakeop.op_ppaddr(aTHX);
SPAGAIN;
LEAVE;
nret = SP+1 - &ST(0);
diff --git a/t/porting/customized.dat b/t/porting/customized.dat
index fa37838..07b182f 100644
--- a/t/porting/customized.dat
+++ b/t/porting/customized.dat
@@ -10,6 +10,7 @@ Win32API::File cpan/Win32API-File/Makefile.PL 605d0aee31aebe84a99408f9ab5f644db5
Win32API::File cpan/Win32API-File/t/file.t 124e64aa77e755235eb297644a87fac5388d3d78
Win32API::File cpan/Win32API-File/t/tie.t 712ea7edd0cc805ce1c0b8172c01b03dd19b583d
Win32API::File cpan/Win32API-File/typemap 24bff088babeadac0873e8df390d1666d9d9db4a
+Time::HiRes cpan/Time-HiRes/HiRes.xs 0a850b6dee1f2c60ade3d4c33fab7c69b02ddc45
podlators cpan/podlators/scripts/pod2man.PL f81acf53f3ff46cdcc5ebdd661c5d13eb35d20d6
podlators cpan/podlators/scripts/pod2text.PL b4693fcfe4a0a1b38a215cfb8985a65d5d025d69
version cpan/version/lib/version.pm d0923b895d57f1d669ae36fcf85c87b16db341d1
diff --git a/win32/makefile.mk b/win32/makefile.mk
index 8c4b2fe..be45e4a 100644
--- a/win32/makefile.mk
+++ b/win32/makefile.mk
@@ -345,6 +345,10 @@ BUILDOPT += -DPERL_IMPLICIT_SYS
PROCESSOR_ARCHITECTURE *= x86
+.IF "$(WIN64)" == "undef"
+PROCESSOR_ARCHITECTURE = x86
+.ENDIF
+
.IF "$(WIN64)" == ""
# When we are running from a 32bit cmd.exe on AMD64 then
# PROCESSOR_ARCHITECTURE is set to x86 and PROCESSOR_ARCHITEW6432
@@ -509,6 +513,7 @@ LINK_FLAGS = $(LINK_DBG) -L"$(INST_COREDIR)" -L"$(CCLIBDIR)"
OBJOUT_FLAG = -o
EXEOUT_FLAG = -o
LIBOUT_FLAG =
+PDBOUT =
BUILDOPT += -fno-strict-aliasing -mms-bitfields
MINIBUILDOPT += -fno-strict-aliasing
@@ -655,11 +660,11 @@ CFLAGS = $(EXTRACFLAGS) $(INCLUDES) $(DEFINES) $(LOCDEFS) \
LINK_FLAGS = -nologo -nodefaultlib $(LINK_DBG) \
-libpath:"$(INST_COREDIR)" \
-machine:$(PROCESSOR_ARCHITECTURE)
-LIB_FLAGS = $(LIB_FLAGS) -nologo
+LIB_FLAGS += -nologo
OBJOUT_FLAG = -Fo
EXEOUT_FLAG = -Fe
LIBOUT_FLAG = /out:
-
+PDBOUT = -Fd$*.pdb
TESTPREPGCC =
.ENDIF
@@ -706,7 +711,7 @@ LKPOST = )
.SUFFIXES : .c .i $(o) .dll $(a) .exe .rc .res
.c$(o):
- $(CC) -c $(null,$(<:d) $(NULL) -I$(<:d)) $(CFLAGS_O) $(OBJOUT_FLAG)$@ $<
+ $(CC) -c $(null,$(<:d) $(NULL) -I$(<:d)) $(CFLAGS_O) $(OBJOUT_FLAG)$@ $(PDBOUT) $<
.c.i:
$(CC) -c $(null,$(<:d) $(NULL) -I$(<:d)) $(CFLAGS_O) -E $< >$@
@@ -733,14 +738,19 @@ $(o).dll:
#
# various targets
+
+#do not put $(MINIPERL) as a dep/prereq in a rule, instead put $(HAVEMINIPERL)
+#$(MINIPERL) is not a buildable target, use "dmake mp" if you want to just build
+#miniperl alone
MINIPERL = ..\miniperl.exe
+HAVEMINIPERL = ..\lib\buildcustomize.pl
MINIDIR = .\mini
PERLEXE = ..\perl.exe
WPERLEXE = ..\wperl.exe
PERLEXESTATIC = ..\perl-static.exe
STATICDIR = .\static.tmp
GLOBEXE = ..\perlglob.exe
-CONFIGPM = ..\lib\Config.pm ..\lib\Config_heavy.pl
+CONFIGPM = ..\lib\Config.pm
GENUUDMAP = ..\generate_uudmap.exe
.IF "$(BUILD_STATIC)" == "define" || "$(ALL_STATIC)" == "define"
PERLSTATIC = static
@@ -767,7 +777,7 @@ PERLDLL_RES =
# This used to be $(PERLEXE), but at worst it is the .dll that they depend
# on and really only the interface - i.e. the .def file used to export symbols
# from the .dll
-PERLDEP = perldll.def
+PERLDEP = $(PERLIMPLIB)
PL2BAT = bin\pl2bat.pl
@@ -823,9 +833,21 @@ INT64 = __int64
# makedef.pl must be updated if this changes, and this should normally
# only change when there is an incompatible revision of the public API.
PERLIMPLIB *= ..\perl522$(a)
+PERLEXPLIB *= ..\perl522.exp
PERLSTATICLIB *= ..\perl522s$(a)
PERLDLL = ..\perl522.dll
+#EUMM on Win32 isn't ready for parallel make, so only allow this file to be parallel
+#$(MAKE) will contain the -P that this makefile was called with, which is bad for
+#make_ext.pl since upto jobs*jobs processes will run instead of jobs
+#also any recipie containing $(MAKE) is special cased by dmake to execute recipes
+#containing $(MAKE) when "dmake -n" is executed, which causes recursive calls
+#to dmake, which means "dmake -n" is then broken as a diagnostic tool since
+#"dmake -n" will invoke all the make_ext.pl scripts build things instead of
+#showing what to build since $(MAKE) is an arg to make_ext.pl, not an invocation
+#of the dmake process
+PLMAKE = dmake
+
XCOPY = xcopy /f /r /i /d /y
RCOPY = xcopy /f /r /i /e /d /y
NOOP = @rem
@@ -1006,9 +1028,7 @@ CFG_VARS = \
# Top targets
#
-all : CHECKDMAKE .\config.h ..\git_version.h $(GLOBEXE) $(MINIPERL) \
- $(CONFIGPM) $(UNIDATAFILES) MakePPPort \
- $(PERLEXE) Extensions Extensions_nonxs $(PERLSTATIC)
+all : CHECKDMAKE rebasePE $(UNIDATAFILES) Extensions_nonxs $(PERLSTATIC)
regnodes : ..\regnodes.h
@@ -1047,178 +1067,13 @@ perlglob$(o) : perlglob.c
config.w32 : $(CFGSH_TMPL)
copy $(CFGSH_TMPL) config.w32
-#
-# Copy the template config.h and set configurables at the end of it
-# as per the options chosen and compiler used.
-# Note: This config.h is only used to build miniperl.exe anyway, but
-# it's as well to have its options correct to be sure that it builds
-# and so that it's "-V" options are correct for use by makedef.pl. The
-# real config.h used to build perl.exe is generated from the top-level
-# config_h.SH by config_h.PL (run by miniperl.exe).
-#
-.\config.h : $(CFGH_TMPL) $(CORE_NOCFG_H)
- -del /f config.h
- copy $(CFGH_TMPL) config.h
- @echo.>>$@
- @echo #ifndef _config_h_footer_>>$@
- @echo #define _config_h_footer_>>$@
- @echo #undef Off_t>>$@
- @echo #undef LSEEKSIZE>>$@
- @echo #undef Off_t_size>>$@
- @echo #undef PTRSIZE>>$@
- @echo #undef SSize_t>>$@
- @echo #undef HAS_ATOLL>>$@
- @echo #undef HAS_STRTOLL>>$@
- @echo #undef HAS_STRTOULL>>$@
- @echo #undef Size_t_size>>$@
- @echo #undef IVTYPE>>$@
- @echo #undef UVTYPE>>$@
- @echo #undef IVSIZE>>$@
- @echo #undef UVSIZE>>$@
- @echo #undef NV_PRESERVES_UV>>$@
- @echo #undef NV_PRESERVES_UV_BITS>>$@
- @echo #undef IVdf>>$@
- @echo #undef UVuf>>$@
- @echo #undef UVof>>$@
- @echo #undef UVxf>>$@
- @echo #undef UVXf>>$@
- @echo #undef USE_64_BIT_INT>>$@
- @echo #undef Gconvert>>$@
- @echo #undef HAS_FREXPL>>$@
- @echo #undef HAS_ISNANL>>$@
- @echo #undef HAS_MODFL>>$@
- @echo #undef HAS_MODFL_PROTO>>$@
- @echo #undef HAS_SQRTL>>$@
- @echo #undef HAS_STRTOLD>>$@
- @echo #undef PERL_PRIfldbl>>$@
- @echo #undef PERL_PRIgldbl>>$@
- @echo #undef PERL_PRIeldbl>>$@
- @echo #undef PERL_SCNfldbl>>$@
- @echo #undef NVTYPE>>$@
- @echo #undef NVSIZE>>$@
- @echo #undef LONG_DOUBLESIZE>>$@
- @echo #undef NV_OVERFLOWS_INTEGERS_AT>>$@
- @echo #undef NVef>>$@
- @echo #undef NVff>>$@
- @echo #undef NVgf>>$@
- @echo #undef USE_LONG_DOUBLE>>$@
- @echo #undef USE_CPLUSPLUS>>$@
-.IF "$(USE_LARGE_FILES)"=="define"
- @echo #define Off_t $(INT64)>>$@
- @echo #define LSEEKSIZE ^8>>$@
- @echo #define Off_t_size ^8>>$@
-.ELSE
- @echo #define Off_t long>>$@
- @echo #define LSEEKSIZE ^4>>$@
- @echo #define Off_t_size ^4>>$@
-.ENDIF
-.IF "$(WIN64)"=="define"
- @echo #define PTRSIZE ^8>>$@
- @echo #define SSize_t $(INT64)>>$@
- @echo #define HAS_ATOLL>>$@
- @echo #define HAS_STRTOLL>>$@
- @echo #define HAS_STRTOULL>>$@
- @echo #define Size_t_size ^8>>$@
-.ELSE
- @echo #define PTRSIZE ^4>>$@
- @echo #define SSize_t int>>$@
- @echo #undef HAS_ATOLL>>$@
- @echo #undef HAS_STRTOLL>>$@
- @echo #undef HAS_STRTOULL>>$@
- @echo #define Size_t_size ^4>>$@
-.ENDIF
-.IF "$(USE_64_BIT_INT)"=="define"
- @echo #define IVTYPE $(INT64)>>$@
- @echo #define UVTYPE unsigned $(INT64)>>$@
- @echo #define IVSIZE ^8>>$@
- @echo #define UVSIZE ^8>>$@
-.IF "$(USE_LONG_DOUBLE)"=="define"
- @echo #define NV_PRESERVES_UV>>$@
- @echo #define NV_PRESERVES_UV_BITS 64>>$@
-.ELSE
- @echo #undef NV_PRESERVES_UV>>$@
- @echo #define NV_PRESERVES_UV_BITS 53>>$@
-.ENDIF
- @echo #define IVdf "I64d">>$@
- @echo #define UVuf "I64u">>$@
- @echo #define UVof "I64o">>$@
- @echo #define UVxf "I64x">>$@
- @echo #define UVXf "I64X">>$@
- @echo #define USE_64_BIT_INT>>$@
-.ELSE
- @echo #define IVTYPE long>>$@
- @echo #define UVTYPE unsigned long>>$@
- @echo #define IVSIZE ^4>>$@
- @echo #define UVSIZE ^4>>$@
- @echo #define NV_PRESERVES_UV>>$@
- @echo #define NV_PRESERVES_UV_BITS 32>>$@
- @echo #define IVdf "ld">>$@
- @echo #define UVuf "lu">>$@
- @echo #define UVof "lo">>$@
- @echo #define UVxf "lx">>$@
- @echo #define UVXf "lX">>$@
- @echo #undef USE_64_BIT_INT>>$@
-.ENDIF
-.IF "$(USE_LONG_DOUBLE)"=="define"
- @echo #define Gconvert(x,n,t,b) sprintf((b),"%.*""Lg",(n),(x))>>$@
- @echo #define HAS_FREXPL>>$@
- @echo #define HAS_ISNANL>>$@
- @echo #define HAS_MODFL>>$@
- @echo #define HAS_MODFL_PROTO>>$@
- @echo #define HAS_SQRTL>>$@
- @echo #define HAS_STRTOLD>>$@
- @echo #define PERL_PRIfldbl "Lf">>$@
- @echo #define PERL_PRIgldbl "Lg">>$@
- @echo #define PERL_PRIeldbl "Le">>$@
- @echo #define PERL_SCNfldbl "Lf">>$@
- @echo #define NVTYPE long double>>$@
-.IF "$(WIN64)"=="define"
- @echo #define NVSIZE ^16>>$@
- @echo #define LONG_DOUBLESIZE ^16>>$@
-.ELSE
- @echo #define NVSIZE ^12>>$@
- @echo #define LONG_DOUBLESIZE ^12>>$@
-.ENDIF
- @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>>$@
- @echo #define NVef "Le">>$@
- @echo #define NVff "Lf">>$@
- @echo #define NVgf "Lg">>$@
- @echo #define USE_LONG_DOUBLE>>$@
-.ELSE
- @echo #define Gconvert(x,n,t,b) sprintf((b),"%.*g",(n),(x))>>$@
- @echo #undef HAS_FREXPL>>$@
- @echo #undef HAS_ISNANL>>$@
- @echo #undef HAS_MODFL>>$@
- @echo #undef HAS_MODFL_PROTO>>$@
- @echo #undef HAS_SQRTL>>$@
- @echo #undef HAS_STRTOLD>>$@
- @echo #undef PERL_PRIfldbl>>$@
- @echo #undef PERL_PRIgldbl>>$@
- @echo #undef PERL_PRIeldbl>>$@
- @echo #undef PERL_SCNfldbl>>$@
- @echo #define NVTYPE double>>$@
- @echo #define NVSIZE ^8>>$@
- @echo #define LONG_DOUBLESIZE ^8>>$@
- @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>>$@
- @echo #define NVef "e">>$@
- @echo #define NVff "f">>$@
- @echo #define NVgf "g">>$@
- @echo #undef USE_LONG_DOUBLE>>$@
-.ENDIF
-.IF "$(USE_CPLUSPLUS)"=="define"
- @echo #define USE_CPLUSPLUS>>$@
-.ELSE
- @echo #undef USE_CPLUSPLUS>>$@
-.ENDIF
- @echo #endif>>$@
-
-..\git_version.h : $(MINIPERL) ..\make_patchnum.pl
+..\git_version.h : $(HAVEMINIPERL) ..\make_patchnum.pl
cd .. && miniperl -Ilib make_patchnum.pl
# make sure that we recompile perl.c if the git version changes
..\perl$(o) : ..\git_version.h
-..\config.sh : config.w32 $(MINIPERL) config_sh.PL FindExt.pm
+..\config.sh : config.w32 $(HAVEMINIPERL) config_sh.PL FindExt.pm
$(MINIPERL) -I..\lib config_sh.PL --cfgsh-option-file \
$(mktmp $(CFG_VARS)) config.w32 > ..\config.sh
@@ -1234,18 +1089,18 @@ regen_config_h:
-$(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)"
rename config.h $(CFGH_TMPL)
-$(CONFIGPM) : $(MINIPERL) ..\config.sh config_h.PL
+$(CONFIGPM): ..\config.sh config_h.PL
$(MINIPERL) -I..\lib ..\configpm --chdir=..
$(XCOPY) ..\*.h $(COREDIR)\*.*
$(XCOPY) *.h $(COREDIR)\*.*
$(RCOPY) include $(COREDIR)\*.*
$(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)" \
- || $(MAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)
+ || $(PLMAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)
-# See the comment in Makefile.SH explaining this seemingly cranky ordering
-$(MINIPERL) : ..\lib\buildcustomize.pl
+.\config.h : $(CONFIGPM)
-..\lib\buildcustomize.pl : $(MINIDIR) $(MINI_OBJ) $(CRTIPMLIBS) ..\write_buildcustomize.pl
+# See the comment in Makefile.SH explaining this seemingly cranky ordering
+..\lib\buildcustomize.pl : $(MINI_OBJ) ..\write_buildcustomize.pl
.IF "$(CCTYPE)" == "GCC"
$(LINK32) -v -mconsole -o $(MINIPERL) $(BLINK_FLAGS) \
$(mktmp $(LKPRE) $(MINI_OBJ) $(LIBFILES) $(LKPOST))
@@ -1256,31 +1111,202 @@ $(MINIPERL) : ..\lib\buildcustomize.pl
.ENDIF
$(MINIPERL) -I..\lib -f ..\write_buildcustomize.pl ..
-$(MINIDIR) :
+#convinence target, get a working miniperl
+mp : $(CONFIGPM)
+
+$(MINIDIR)\.exists : $(CFGH_TMPL)
if not exist "$(MINIDIR)" mkdir "$(MINIDIR)"
+#
+# Copy the template config.h and set configurables at the end of it
+# as per the options chosen and compiler used.
+# Note: This config.h is only used to build miniperl.exe anyway, but
+# it's as well to have its options correct to be sure that it builds
+# and so that it's "-V" options are correct for use by makedef.pl. The
+# real config.h used to build perl.exe is generated from the top-level
+# config_h.SH by config_h.PL (run by miniperl.exe).
+#
+# MINIDIR generates config.h so miniperl.exe is not rebuilt when the 2nd
+# config.h is generated in CONFIGPM target, see also the comments for $(MINI_OBJ).
+ -if exist config.h del /f config.h
+ copy $(CFGH_TMPL) config.h
+ @(echo.&& \
+ echo #ifndef _config_h_footer_&& \
+ echo #define _config_h_footer_&& \
+ echo #undef Off_t&& \
+ echo #undef LSEEKSIZE&& \
+ echo #undef Off_t_size&& \
+ echo #undef PTRSIZE&& \
+ echo #undef SSize_t&& \
+ echo #undef HAS_ATOLL&& \
+ echo #undef HAS_STRTOLL&& \
+ echo #undef HAS_STRTOULL&& \
+ echo #undef Size_t_size&& \
+ echo #undef IVTYPE&& \
+ echo #undef UVTYPE&& \
+ echo #undef IVSIZE&& \
+ echo #undef UVSIZE&& \
+ echo #undef NV_PRESERVES_UV&& \
+ echo #undef NV_PRESERVES_UV_BITS&& \
+ echo #undef IVdf&& \
+ echo #undef UVuf&& \
+ echo #undef UVof&& \
+ echo #undef UVxf&& \
+ echo #undef UVXf&& \
+ echo #undef USE_64_BIT_INT&& \
+ echo #undef Gconvert&& \
+ echo #undef HAS_FREXPL&& \
+ echo #undef HAS_ISNANL&& \
+ echo #undef HAS_MODFL&& \
+ echo #undef HAS_MODFL_PROTO&& \
+ echo #undef HAS_SQRTL&& \
+ echo #undef HAS_STRTOLD&& \
+ echo #undef PERL_PRIfldbl&& \
+ echo #undef PERL_PRIgldbl&& \
+ echo #undef PERL_PRIeldbl&& \
+ echo #undef PERL_SCNfldbl&& \
+ echo #undef NVTYPE&& \
+ echo #undef NVSIZE&& \
+ echo #undef LONG_DOUBLESIZE&& \
+ echo #undef NV_OVERFLOWS_INTEGERS_AT&& \
+ echo #undef NVef&& \
+ echo #undef NVff&& \
+ echo #undef NVgf&& \
+ echo #undef USE_LONG_DOUBLE&& \
+ echo #undef USE_CPLUSPLUS)>> config.h
+.IF "$(USE_LARGE_FILES)"=="define"
+ @(echo #define Off_t $(INT64)&& \
+ echo #define LSEEKSIZE ^8&& \
+ echo #define Off_t_size ^8)>> config.h
+.ELSE
+ @(echo #define Off_t long&& \
+ echo #define LSEEKSIZE ^4&& \
+ echo #define Off_t_size ^4)>> config.h
+.ENDIF
+.IF "$(WIN64)"=="define"
+ @(echo #define PTRSIZE ^8&& \
+ echo #define SSize_t $(INT64)&& \
+ echo #define HAS_ATOLL&& \
+ echo #define HAS_STRTOLL&& \
+ echo #define HAS_STRTOULL&& \
+ echo #define Size_t_size ^8)>> config.h
+.ELSE
+ @(echo #define PTRSIZE ^4&& \
+ echo #define SSize_t int&& \
+ echo #undef HAS_ATOLL&& \
+ echo #undef HAS_STRTOLL&& \
+ echo #undef HAS_STRTOULL&& \
+ echo #define Size_t_size ^4)>> config.h
+.ENDIF
+.IF "$(USE_64_BIT_INT)"=="define"
+ @(echo #define IVTYPE $(INT64)&& \
+ echo #define UVTYPE unsigned $(INT64)&& \
+ echo #define IVSIZE ^8&& \
+ echo #define UVSIZE ^8)>> config.h
+.IF "$(USE_LONG_DOUBLE)"=="define"
+ @(echo #define NV_PRESERVES_UV&& \
+ echo #define NV_PRESERVES_UV_BITS 64)>> config.h
+.ELSE
+ @(echo #undef NV_PRESERVES_UV&& \
+ echo #define NV_PRESERVES_UV_BITS 53)>> config.h
+.ENDIF
+ @(echo #define IVdf "I64d"&& \
+ echo #define UVuf "I64u"&& \
+ echo #define UVof "I64o"&& \
+ echo #define UVxf "I64x"&& \
+ echo #define UVXf "I64X"&& \
+ echo #define USE_64_BIT_INT)>> config.h
+.ELSE
+ @(echo #define IVTYPE long&& \
+ echo #define UVTYPE unsigned long&& \
+ echo #define IVSIZE ^4&& \
+ echo #define UVSIZE ^4&& \
+ echo #define NV_PRESERVES_UV&& \
+ echo #define NV_PRESERVES_UV_BITS 32&& \
+ echo #define IVdf "ld"&& \
+ echo #define UVuf "lu"&& \
+ echo #define UVof "lo"&& \
+ echo #define UVxf "lx"&& \
+ echo #define UVXf "lX"&& \
+ echo #undef USE_64_BIT_INT)>> config.h
+.ENDIF
+.IF "$(USE_LONG_DOUBLE)"=="define"
+ @(echo #define Gconvert^(x,n,t,b^) sprintf^(^(b^),"%.*""Lg",^(n^),^(x^)^)&& \
+ echo #define HAS_FREXPL&& \
+ echo #define HAS_ISNANL&& \
+ echo #define HAS_MODFL&& \
+ echo #define HAS_MODFL_PROTO&& \
+ echo #define HAS_SQRTL&& \
+ echo #define HAS_STRTOLD&& \
+ echo #define PERL_PRIfldbl "Lf"&& \
+ echo #define PERL_PRIgldbl "Lg"&& \
+ echo #define PERL_PRIeldbl "Le"&& \
+ echo #define PERL_SCNfldbl "Lf"&& \
+ echo #define NVTYPE long double)>> config.h
+.IF "$(WIN64)"=="define"
+ @(echo #define NVSIZE ^16&& \
+ echo #define LONG_DOUBLESIZE ^16)>> config.h
+.ELSE
+ @(echo #define NVSIZE ^12&& \
+ echo #define LONG_DOUBLESIZE ^12)>> config.h
+.ENDIF
+ @(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&& \
+ echo #define NVef "Le"&& \
+ echo #define NVff "Lf"&& \
+ echo #define NVgf "Lg"&& \
+ echo #define USE_LONG_DOUBLE)>> config.h
+.ELSE
+ @(echo #define Gconvert^(x,n,t,b^) sprintf^(^(b^),"%.*g",^(n^),^(x^)^)&& \
+ echo #undef HAS_FREXPL&& \
+ echo #undef HAS_ISNANL&& \
+ echo #undef HAS_MODFL&& \
+ echo #undef HAS_MODFL_PROTO&& \
+ echo #undef HAS_SQRTL&& \
+ echo #undef HAS_STRTOLD&& \
+ echo #undef PERL_PRIfldbl&& \
+ echo #undef PERL_PRIgldbl&& \
+ echo #undef PERL_PRIeldbl&& \
+ echo #undef PERL_SCNfldbl&& \
+ echo #define NVTYPE double&& \
+ echo #define NVSIZE ^8&& \
+ echo #define LONG_DOUBLESIZE ^8&& \
+ 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&& \
+ echo #define NVef "e"&& \
+ echo #define NVff "f"&& \
+ echo #define NVgf "g"&& \
+ echo #undef USE_LONG_DOUBLE)>> config.h
+.ENDIF
+.IF "$(USE_CPLUSPLUS)"=="define"
+ @(echo #define USE_CPLUSPLUS&& \
+ echo #endif)>> config.h
+.ELSE
+ @(echo #undef USE_CPLUSPLUS&& \
+ echo #endif)>> config.h
+.ENDIF
+#separate line since this is sentinal that this target is done
+ rem. > $(MINIDIR)\.exists
$(MINICORE_OBJ) : $(CORE_NOCFG_H)
- $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_EXTERNAL_GLOB -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ ..\$(*B).c
+ $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_EXTERNAL_GLOB -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ $(PDBOUT) ..\$(*B).c
$(MINIWIN32_OBJ) : $(CORE_NOCFG_H)
- $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ $(*B).c
+ $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ $(PDBOUT) $(*B).c
# -DPERL_IMPLICIT_SYS needs C++ for perllib.c
# rules wrapped in .IFs break Win9X build (we end up with unbalanced []s unless
# unless the .IF is true), so instead we use a .ELSE with the default.
# This is the only file that depends on perlhost.h, vmem.h, and vdir.h
-perllib$(o) : perllib.c .\perlhost.h .\vdir.h .\vmem.h
+perllib$(o) : perllib.c perllibst.h .\perlhost.h .\vdir.h .\vmem.h
.IF "$(USE_IMP_SYS)" == "define"
- $(CC) -c -I. $(CFLAGS_O) $(CXX_FLAG) $(OBJOUT_FLAG)$@ perllib.c
+ $(CC) -c -I. $(CFLAGS_O) $(CXX_FLAG) $(OBJOUT_FLAG)$@ $(PDBOUT) perllib.c
.ELSE
- $(CC) -c -I. $(CFLAGS_O) $(OBJOUT_FLAG)$@ perllib.c
+ $(CC) -c -I. $(CFLAGS_O) $(OBJOUT_FLAG)$@ $(PDBOUT) perllib.c
.ENDIF
# 1. we don't want to rebuild miniperl.exe when config.h changes
# 2. we don't want to rebuild miniperl.exe with non-default config.h
# 3. we can't have miniperl.exe depend on git_version.h, as miniperl creates it
-$(MINI_OBJ) : $(CORE_NOCFG_H)
+$(MINI_OBJ) : $(MINIDIR)\.exists $(CORE_NOCFG_H)
$(WIN32_OBJ) : $(CORE_H)
@@ -1288,12 +1314,26 @@ $(CORE_OBJ) : $(CORE_H)
$(DLL_OBJ) : $(CORE_H)
-perldll.def : $(MINIPERL) $(CONFIGPM) ..\embed.fnc ..\makedef.pl create_perllibst_h.pl
+
+perllibst.h : $(HAVEMINIPERL) $(CONFIGPM) create_perllibst_h.pl
$(MINIPERL) -I..\lib create_perllibst_h.pl
+
+perldll.def : $(HAVEMINIPERL) $(CONFIGPM) ..\embed.fnc ..\makedef.pl
$(MINIPERL) -I..\lib -w ..\makedef.pl PLATFORM=win32 $(OPTIMIZE) $(DEFINES) \
$(BUILDOPT) CCTYPE=$(CCTYPE) TARG_DIR=..\ > perldll.def
-$(PERLDLL): perldll.def $(PERLDLL_OBJ) $(PERLDLL_RES) Extensions_static
+$(PERLIMPLIB) : perldll.def
+.IF "$(CCTYPE)" == "GCC"
+ $(IMPLIB) -k -d perldll.def -l $(PERLIMPLIB)
+.ELSE #VC family
+ lib -def:perldll.def -machine:$(ARCHITECTURE) /OUT:$(PERLIMPLIB)
+.ENDIF
+ $(XCOPY) $(PERLIMPLIB) $(COREDIR)
+
+#PERLEXPLIB is built in PERLIMPLIB
+$(PERLEXPLIB): $(PERLIMPLIB)
+
+$(PERLDLL): $(PERLEXPLIB) $(PERLDLL_OBJ) $(PERLDLL_RES) Extensions_static
.IF "$(CCTYPE)" == "GCC"
$(LINK32) -mdll -o $@ -Wl,--base-file -Wl,perl.base $(BLINK_FLAGS) \
$(mktmp $(LKPRE) $(PERLDLL_OBJ) \
@@ -1309,13 +1349,12 @@ $(PERLDLL): perldll.def $(PERLDLL_OBJ) $(PERLDLL_RES) Extensions_static
$(shell @type Extensions_static) \
$(LIBFILES) perl.exp $(LKPOST))
.ELSE
- $(LINK32) -dll -def:perldll.def -out:$@ $(BLINK_FLAGS) \
+ $(LINK32) -dll -out:$@ $(BLINK_FLAGS) \
@Extensions_static \
@$(mktmp -base:0x28000000 $(DELAYLOAD) $(LIBFILES) \
- $(PERLDLL_RES) $(PERLDLL_OBJ))
+ $(PERLDLL_RES) $(PERLDLL_OBJ) $(PERLEXPLIB))
$(EMBED_DLL_MANI)
.ENDIF
- $(XCOPY) $(PERLIMPLIB) $(COREDIR)
$(PERLSTATICLIB): $(PERLDLL_OBJ) Extensions_static
.IF "$(CCTYPE)" == "GCC"
@@ -1356,16 +1395,16 @@ $(GENUUDMAP) : $(GENUUDMAP_OBJ)
perlmain.c : runperl.c
copy runperl.c perlmain.c
-perlmain$(o) : perlmain.c
- $(CC) $(CFLAGS_O:s,-DPERLDLL,-UPERLDLL,) $(OBJOUT_FLAG)$@ -c perlmain.c
+perlmain$(o) : $(CONFIGPM) perlmain.c
+ $(CC) $(CFLAGS_O:s,-DPERLDLL,-UPERLDLL,) $(OBJOUT_FLAG)$@ $(PDBOUT) -c perlmain.c
perlmainst.c : runperl.c
copy runperl.c perlmainst.c
-perlmainst$(o) : perlmainst.c
- $(CC) $(CFLAGS_O) $(OBJOUT_FLAG)$@ -c perlmainst.c
+perlmainst$(o) : $(CONFIGPM) perlmainst.c
+ $(CC) $(CFLAGS_O) $(OBJOUT_FLAG)$@ $(PDBOUT) -c perlmainst.c
-$(PERLEXE): $(PERLDLL) $(CONFIGPM) $(PERLEXE_OBJ) $(PERLEXE_RES)
+$(PERLEXE): $(CONFIGPM) $(PERLEXE_OBJ) $(PERLEXE_RES) $(PERLIMPLIB)
.IF "$(CCTYPE)" == "GCC"
$(LINK32) -mconsole -o $@ $(BLINK_FLAGS) \
$(PERLEXE_OBJ) $(PERLEXE_RES) $(PERLIMPLIB) $(LIBFILES)
@@ -1387,43 +1426,52 @@ $(PERLEXESTATIC): $(PERLSTATICLIB) $(CONFIGPM) $(PERLEXEST_OBJ) $(PERLEXE_RES)
$(EMBED_EXE_MANI)
.ENDIF
-MakePPPort: $(MINIPERL) $(CONFIGPM) Extensions_nonxs
- $(MINIPERL) -I..\lib ..\mkppport
-
#-------------------------------------------------------------------------------
# There's no direct way to mark a dependency on
# DynaLoader.pm, so this will have to do
Extensions : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) $(DYNALOADER)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic
+ if not exist $(COREDIR)\ppport.h rem. > $(COREDIR)\ppport.h
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic
Extensions_reonly : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) $(DYNALOADER)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic +re
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic +re
-Extensions_static : ..\make_ext.pl ..\lib\buildcustomize.pl list_static_libs.pl $(PERLDEP) $(CONFIGPM) Extensions_nonxs
+Extensions_static : ..\make_ext.pl ..\lib\buildcustomize.pl list_static_libs.pl $(CONFIGPM)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --static
+ if not exist $(COREDIR)\ppport.h rem. > $(COREDIR)\ppport.h
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --static
$(MINIPERL) -I..\lib list_static_libs.pl > Extensions_static
-Extensions_nonxs : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) ..\pod\perlfunc.pod
- $(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --nonxs
+Extensions_nonxs : ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM) ..\pod\perlfunc.pod
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --nonxs !libs
-$(DYNALOADER) : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) Extensions_nonxs
+#lib must be built, it can't be buildcustomize.pl-ed, and is required for XS building
+$(DYNALOADER) : ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --dynaloader
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(EXTDIR) --dir=$(DISTDIR) --dynaloader lib
Extensions_clean :
- -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=clean
+ -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=clean
Extensions_realclean :
- -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=realclean
+ -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=realclean
+
+# all PE files need to be built by the time this target runs, PP files can still
+# be running in parallel like UNIDATAFILES, this target a placeholder for the
+# future
+.IF "$(BUILD_STATIC)"=="define"
+rebasePE : Extensions $(PERLDLL) $(PERLEXE) $(GLOBEXE) $(PERLEXESTATIC)
+.ELSE
+rebasePE : Extensions $(PERLDLL) $(PERLEXE) $(GLOBEXE)
+.ENDIF
+ $(NOOP)
#-------------------------------------------------------------------------------
-doc: $(PERLEXE) ..\pod\perltoc.pod
+doc: $(PERLEXE) $(PERLDLL) ..\pod\perltoc.pod
$(PERLEXE) ..\installhtml --podroot=.. --htmldir=$(HTMLDIR) \
--podpath=pod:lib:utils --htmlroot="file://$(INST_HTML:s,:,|,)"\
--recurse
@@ -1433,8 +1481,8 @@ doc: $(PERLEXE) ..\pod\perltoc.pod
# Note that this next section is parsed (and regenerated) by pod/buildtoc
# so please check that script before making structural changes here
-utils: $(PERLEXE) ..\utils\Makefile
- cd ..\utils && $(MAKE) PERL=$(MINIPERL)
+utils: $(HAVEMINIPERL) ..\utils\Makefile
+ cd ..\utils && $(PLMAKE) PERL=$(MINIPERL)
copy ..\README.aix ..\pod\perlaix.pod
copy ..\README.amiga ..\pod\perlamiga.pod
copy ..\README.android ..\pod\perlandroid.pod
@@ -1469,11 +1517,11 @@ utils: $(PERLEXE) ..\utils\Makefile
copy ..\README.vos ..\pod\perlvos.pod
copy ..\README.win32 ..\pod\perlwin32.pod
copy ..\pod\perldelta.pod ..\pod\perl5220delta.pod
- $(PERLEXE) $(PL2BAT) $(UTILS)
+ $(MINIPERL) -I..\lib $(PL2BAT) $(UTILS)
$(MINIPERL) -I..\lib ..\autodoc.pl ..
$(MINIPERL) -I..\lib ..\pod\perlmodlib.PL -q ..
-..\pod\perltoc.pod: $(PERLEXE) Extensions Extensions_nonxs
+..\pod\perltoc.pod: $(PERLEXE) $(PERLDLL) Extensions Extensions_nonxs ..\pod\perluniprops.pod utils
$(PERLEXE) -f ..\pod\buildtoc -q
# Note that the pod cleanup in this next section is parsed (and regenerated
@@ -1610,11 +1658,11 @@ installhtml : doc
inst_lib : $(CONFIGPM)
$(RCOPY) ..\lib $(INST_LIB)\*.*
-$(UNIDATAFILES) ..\pod\perluniprops.pod .UPDATEALL : $(MINIPERL) $(CONFIGPM) ..\lib\unicore\mktables Extensions_nonxs
+$(UNIDATAFILES) ..\pod\perluniprops.pod .UPDATEALL : $(CONFIGPM) ..\lib\unicore\mktables
cd ..\lib\unicore && \
..\$(MINIPERL) -I.. mktables -P ..\..\pod -maketest -makelist -p
-minitest : .\config.h $(MINIPERL) ..\git_version.h $(GLOBEXE) $(CONFIGPM) $(UNIDATAFILES) $(TESTPREPGCC)
+minitest : .\config.h $(HAVEMINIPERL) ..\git_version.h $(GLOBEXE) $(CONFIGPM) $(UNIDATAFILES) $(TESTPREPGCC)
$(XCOPY) $(MINIPERL) ..\t\$(NULL)
if exist ..\t\perl.exe del /f ..\t\perl.exe
rename ..\t\miniperl.exe perl.exe
diff --git a/write_buildcustomize.pl b/write_buildcustomize.pl
index 5d819b5..1503018 100644
--- a/write_buildcustomize.pl
+++ b/write_buildcustomize.pl
@@ -41,8 +41,16 @@ my @toolchain = qw(cpan/AutoLoader/lib
dist/constant/lib
);
-# Used only in ExtUtils::Liblist::Kid::_win32_ext()
-push @toolchain, 'cpan/Text-ParseWords/lib' if $^O eq 'MSWin32';
+# Text-ParseWords used only in ExtUtils::Liblist::Kid::_win32_ext()
+# the rest are for XS building on Win32, since nonxs and xs build simultaneously
+# on Win32 if parallel building
+push @toolchain, qw(
+ cpan/Text-ParseWords/lib
+ dist/ExtUtils-ParseXS/lib
+ cpan/Getopt-Long/lib
+ cpan/parent/lib
+ cpan/ExtUtils-Constant/lib
+) if $^O eq 'MSWin32';
push @toolchain, 'ext/VMS-Filespec/lib' if $^O eq 'VMS';
unshift @INC, @toolchain;
--
1.7.9.msysgit.0
|
From @tonycozOn Mon May 11 14:29:06 2015, bulk88 wrote:
Time::HiRes isn't abandoned, just delayed. It's just: # DynaLoader.pm, so this will have to do Extensions_reonly : ..\make_ext.pl ..\lib\buildcustomize.pl -Extensions_static : ..\make_ext.pl ..\lib\buildcustomize.pl list_static_libs.pl $(CONFIGPM) @@ -1455,6 +1453,11 @@ Extensions_clean : +$(COREDIR)\ppport.h : makefile.mk
That might help.
Instead of hard coding, perhaps write an make_ext_mk.pl that generates Extensions: extensions.mk Extensions_nonxs: extensions.mk ... extensions.mk: makefile.mk withe Makefile.SH rules in extensions.mk Tony |
From @bulk88Adding compile timings for archive reasons, this is to change from alphabetic compile order of core intep .c files to something by time, so the longest to compile .c files are started first. NOTE ..\DynaLoader.o is running EUMM and make_ext.pl, it is not a simple call to the CC. Please ignore the timings for ..\DynaLoader.o/obj. Each line is the time of a recipe run (not a target run, a target consists of one or more recipes), the name of the line is the target name. VC7 build had -GL turned off, since -GL/LTCG skews build time by transferring nearly all of the compile time of each .c file into link time of perl522.dll and miniperl.exe, which is single threaded/single process. Yes LTCG harms build time in parallel mode, but a better binary in the end is worth far more than 10 wall seconds of CC compile time. A core win32 hacker (egh, me) who is doing high frequency rebuilds on the interp will know to turn off LTCG, and switch from -O2/-O1 to -Od/-O0, without turning on DEBUGGING, anyway. timings obtained by doing b88dmake -mr CCTYPE=MSVC7 ../perl522.dll > ../../vc.txt or b88dmake -mr ../perl522.dll > ../../gcc.txt Then processing that console log with my $f; then text sorting the output of that script in my word processor, which produced the 2 attached files. -- |
From @bulk886.06299996376038 ..\toke.o |
From @bulk883.78200006484985 ..\DynaLoader.obj |
From @bulk88On Sat May 16 12:18:09 2015, bulk88 wrote:
Adding more timings, these were done on a different, probably slower machine than the last set of timings. Includes times from VC 2013/12.0. -- |
From @bulk888.48699998855591 ..\toke.o |
From @bulk884.30599999427795 ..\toke.obj |
From @bulk884.1029999256134 ..\toke.obj |
From @tonycozOn Sun May 10 20:59:50 2015, bulk88 wrote:
Do you consider this complete at this point? I'd prefer not to have the modifications in cpan/ Tony |
From @bulk88On Thu Jun 11 17:33:37 2015, tonyc wrote:
No, I have to publish the version of the patch which reorders the core .c files to save ~ 10-15 seconds out of 1 minute for me, to build perl523.dll. I have to rethink a problem with how dmake picks what targets to build, its not exactly left side dep to right side dep but also "levels" on the tree. Basically I need to start static and dynaloader targets towards the beginning after miniperl is done building since they take quite long to build compared to the other .c'es, but static and dynaloader are 1 level away from core .c'es because static and dynaloader dep on CORE dir, so those 2 always run AFTER all .c files are done (and cores are NOT maxed out). If I make the .c files depend (makefile wise, not CC build wise) on CORE dir, static and dynaloader run first as I want, but "latency" wise, we are making the .c'es depend on something they dont need, delaying the start of .c building, but the time saved by starting dynaloader and static first along with regexp.c/fat .ces saves some seconds on "time until perl523.dll is built (no dyn XS/no non-XS)", so for core hacking putting the .c'es to dep on CORE dir saves time even though its insane that it does (bad dmake design). -- |
From @bulk88After sorting the .c'es by time (I am only moving the >1 second ones), here are the results on my 8 core with "dmake -P8 ../perl523.dll". VC with no -GL GCC So time sorting the .c files has very visible results. The order I decided is MICROCORE_SRC = \ utf8.o took 1.7 seconds to create as from the earlier list. At 1.6 seconds is win32.o, but I'd have break up the organization and meaning of MICROCORE_SRC macro to put win32.c in the middle of it (win32.c is in a different macro called WIN32_SRC). These numbers also mean, that the MAXIMUM penalty, and therefore best case scenario improvement, for not time sorting every last .c file, is 1.6 seconds. DynaLoader and Extensions_static deps take 4.0 and 2.2 seconds to build, and they are currently scheduled at the end due to a poor dmake parallel algo, after all .c files, so the 1.6 sec penalty is dwarfed by poor scheduling of DynaLoader and Extensions_static targets. I will not reorganize putting DynaLoader and Extensions_static first before core .c files are started since I have to make the core .c files depend on fake dependencies for them to have the same deps as DynaLoader and Extensions_static (core .c files dont need /lib/CORE headers, XS/EUMM makefiles do) and I'd rather work on the gmake makefile and see if gmake has the same poor scheduling as dmake before I try such things. Also putting DynaLoader and Extensions_static first only speeds up reaching ../perl523.dll target, reaching test/test-prep target means running Extensions which takes many minutes and makes the wall time to build ../perl523.dll on a multi core machine irrelevant since Extensions is always the last target to finish executing. I've attached the psuedo-branch which is the final version of the parallel patch. The psuedobranch can be benchmarked for the effect of alpha sorting between commit "WIP add parallel support for Win32 dmake building -- |
From @bulk880001-WIP-add-parallel-support-for-Win32-dmake-building.patchFrom 9c27c5488dee3363c59ca59fd5d52ee0637413a7 Mon Sep 17 00:00:00 2001
From: Daniel Dragan <bulk88@hotmail.com>
Date: Mon, 11 May 2015 16:28:02 -0400
Subject: [PATCH 1/5] WIP add parallel support for Win32 dmake building
-if building a 32 bit Perl, with a 64bit dmake, force
PROCESSOR_ARCHITECTURE to x86, otherwise the next couple macros will
try to build a 64 bit perl with 32 bit CCs
-PDBOUT is required to run multiple VC cl.exe processes, otherwise all
VC cl.exe processes will error out trying to lock and write to a
file called "vc*0.pdb", PDBOUT is empty for GCC builds since they dont
have PDB files
-to reduce excess IO calls checking for miniperl.exe plus remove a
"Found file corresponding to virtual target" warning that dmake emits,
make this makefile unaware that miniperl.exe exists. dmake has a very bad
exponential number of IO/stat() calls for every target that is yet
unbuilt, see procmon logs in [perl #123854], so instead of a stat on
../miniperl.exe, then ../lib/buildcustomize.pl, it will be just a stat on
../lib/buildcustomize.pl
-remove makefile awareness of ..\lib\Config_heavy.pl,
if ..\lib\Config_heavy.pl is ever updated, so is ..\lib\Config.pm
less IO calls for dmake, see also commit 962e59f394
-to break up the sequential nature of this makefile, allow (XS) Extensions
to build, before (AKA parallel with) perl5**.dll and perl.exe are built.
This is achieved by running makedef.pl very early, and generating
perl5**.lib/libperl5**.a from the def file, and NOT generating
perl5**.lib/libperl5**.a from perl5**.dll at link time of perl5**.dll.
The conquence of this is, declspec(dllexport) is now unusable, but exports
should be centrally managed anyways (embed.fnc/etc) so this isn't a big
issue.
-EUMM makefiles shouldn't be subject to parallelism, untested and disable
for now, plus creating PLMAKE allows "dmake -n" to work for diagnosing
this makefile
-slim down all target. Extensions* and UNIDATAFILES now know how to build
themselves, the parallel nature says you can't rely on left to right
execution of deps in a parent node to make a child (dep) node build
-miniperl.exe used to be unbuildable from a clean tree except from all
target, since miniperl.exe didn't depend on mini config.h. Also mini dir
can't be a target, since each .obj built will dirty the mini dir's time
stamp and infinite loop happens, instead use a .exists file
-dmake rescans for all outstanding targets, at each recipe line to run,
this early in the build process, there are an enormous amount of files to
test for, so the echos are very slow, 350ms each, so combine as many of
the lines of mini/.exists AKA mini config.h together as possible. ".IF"
can't be put inside "one line", so not all lines were merged. Shell "if"
could be used to further group the echos but this enough to make the pause
/cpu spining not really noticable. USE_CPLUSPLUS contains an unrolled line
(the #endif) on both sides. See also procmon logs in [perl #123854]
-perllib.obj/.o needs perllibst.h which is built by miniperl+a script,
perllibst.h target doesn't need any Extensions*, so perllib.obj is still
quick to build
-perldll.def doesn't need perllibst.h since makedef.pl uses
$Config{static_ext} to find boot xsubs to export, makedef.pl does not
read perllibst.h, remove perllibst.h for more parallelism/less things to
build before perldll.def runs, and therefore Extensions (XS) starts to
run quicker, and Extensions (XS) is the longest target to build
-perlmain and perlmainst .obj/.o needs full perl headers to compile, they
aren't like generate_uudmap.exe and perlglob.exe which are perlapi unaware
-perl.exe doesn't need perl5**.dll to build, just the imp lib to
perl5**.dll, perl.exe is in the same category as XS modules, more
parallelism
-ppport.h isn't needed in blead perl, since blead is the newest perl in the
world, this allows Extensions (XS) to run sooner, ppport.h is replaced by
a dummy file
-break up the dependencies of all the Extensions* targets, static
(just Win32CORE normally), dynamic XS and non-XS, these 3 run in parallel
now, non-XS doesn't need perl5**.lib/.a or any C headers, just PP
Config.pm
-DLL XS requires PP DynaLoader.pm for dl_findfile() otherwise
Mkbootstrap.pm fatally errors, Mkbootstrap.pm could be revised to not load
DynaLoader on Win32, since " if ($Config{'dlsrc'} =~ /^dl_dld/){" is
false, but this is the easier path right now
-DynaLoader requires module lib to build itself, but Extensions_nonxs
happens to not need mod lib, so move where mod lib is built
-in utils target, change it so it can run with miniperl, more parallelism,
pl2bat doesn't require full perl, the full perl stuff is from
commit 3fe9a6f19e from 5.003 and no ML archive is available to explain why
full perl was used instead of mini perl
-add 4 modules to buildcustomize so nonxs and xs build simultaneously
-remove ancient cruft from commit 26618a56da from 1997 from README.w32
dmake is automatically set inside CFG_VARS today. OSRELEASE is irrelavent
today, Perl doesn't use any of the defaults (like name of CC) from the
maketool.
-Time-HiRes has had a min ver of 5.6.0 since commit 90e44bf683 / release
1.9724 in 2011. dTHXR and aTHXR are for 5.005 threads compat but they are
pointless since there is usage of "unsafe" dTHX in other places in
Time-HiRes. Perl's headers don't define those 2, so they were defined to
>= 5.6.0 threads in ppport.h but a dummy ppport.h file is used, which
doesn't contain those defines to the new API, so remove usage of
pre-5.6.0 macros, this allows Time-HiRes to compile with the dummy
ppport.h with blead perl
-Reduce 21 calls of "cmd.exe /x/d/c cd" by miniperl to just 1 by saving and
reusing cwd. This reduced the amount of time to run
"..\miniperl.exe -I..\lib -f ..\write_buildcustomize.pl .." from 312 ms
to 62 ms elapsed time using timeit.exe for me.
---
Porting/Maintainers.pl | 2 +
README.win32 | 24 +--
cpan/Time-HiRes/HiRes.pm | 2 +-
cpan/Time-HiRes/HiRes.xs | 4 +-
t/porting/customized.dat | 1 +
win32/makefile.mk | 486 ++++++++++++++++++++++++++---------------------
write_buildcustomize.pl | 17 +-
7 files changed, 299 insertions(+), 237 deletions(-)
diff --git a/Porting/Maintainers.pl b/Porting/Maintainers.pl
index ac1e3c2..7de1d68 100755
--- a/Porting/Maintainers.pl
+++ b/Porting/Maintainers.pl
@@ -1216,6 +1216,8 @@ use File::Glob qw(:case);
'Time::HiRes' => {
'DISTRIBUTION' => 'ZEFRAM/Time-HiRes-1.9726.tar.gz',
'FILES' => q[cpan/Time-HiRes],
+ # CPAN release eventually
+ 'CUSTOMIZED' => [ 'HiRes.xs' ],
},
'Time::Local' => {
diff --git a/README.win32 b/README.win32
index ec29cfa..b9875e6 100644
--- a/README.win32
+++ b/README.win32
@@ -96,11 +96,13 @@ See L<Usage Hints for Perl on Windows> below for general hints about this.
=item Make
You need a "make" program to build the sources. If you are using
-Visual C++ or the Windows SDK tools, nmake will work. Builds using
-the gcc need dmake.
-
-dmake is a freely available make that has very nice macro features
-and parallelability.
+Visual C++ or the Windows SDK tools, you can use nmake supplied with Visual C++
+or Windows SDK. You may also use, for Visual C++ or Windows SDK, dmake instead
+of nmake. dmake is open source software, but is not included with Visual C++ or
+Windows SDK. If you want parallel building with Visual C++ or
+Windows SDK you must use dmake instead of nmake. Builds using gcc need dmake.
+nmake is not supported for gcc builds. gmake is not supported, but might be
+added in the future.
A port of dmake for Windows is available from:
@@ -135,13 +137,6 @@ console already set up for your target architecture (x86-32 or x86-64 or IA64).
With the newer compilers, you may also use the older batch files if you choose
so.
-You can also use dmake to build using Visual C++; provided, however,
-you set OSRELEASE to "microsft" (or whatever the directory name
-under which the Visual C dmake configuration lives) in your environment
-and edit win32/config.vc to change "make=nmake" into "make=dmake". The
-latter step is only essential if you want to use dmake as your default
-make for building extensions using MakeMaker.
-
=item Microsoft Visual C++ 2008-2013 Express Edition
These free versions of Visual C++ 2008-2013 Professional contain the same
@@ -400,6 +395,11 @@ perl523.dll at the perl toplevel, and various other extension dll's
under the lib\auto directory. If the build fails for any reason, make
sure you have done the previous steps correctly.
+To try dmake's parallel mode, type "dmake -P2", where 2, is the maximum number
+of parallel jobs you want to run. A number of things in the build process will
+run in parallel, but there are serialization points where you will see just 1
+CPU maxed out. This is normal.
+
If you are advanced enough with building C code, here is a suggestion to speed
up building perl, and the later C<make test>. Try to keep your PATH enviromental
variable with the least number of folders possible (remember to keep your C
diff --git a/cpan/Time-HiRes/HiRes.pm b/cpan/Time-HiRes/HiRes.pm
index cf64bc1..0ee2c62 100644
--- a/cpan/Time-HiRes/HiRes.pm
+++ b/cpan/Time-HiRes/HiRes.pm
@@ -23,7 +23,7 @@ our @EXPORT_OK = qw (usleep sleep ualarm alarm gettimeofday time tv_interval
stat lstat
);
-our $VERSION = '1.9726';
+our $VERSION = '1.9726_01';
our $XS_VERSION = $VERSION;
$VERSION = eval $VERSION;
diff --git a/cpan/Time-HiRes/HiRes.xs b/cpan/Time-HiRes/HiRes.xs
index 96640e9..9a852c4 100644
--- a/cpan/Time-HiRes/HiRes.xs
+++ b/cpan/Time-HiRes/HiRes.xs
@@ -731,7 +731,7 @@ myNVtime()
static void
hrstatns(UV *atime_nsec, UV *mtime_nsec, UV *ctime_nsec)
{
- dTHXR;
+ dTHX;
#if TIME_HIRES_STAT == 1
*atime_nsec = PL_statcache.st_atimespec.tv_nsec;
*mtime_nsec = PL_statcache.st_mtimespec.tv_nsec;
@@ -1284,7 +1284,7 @@ PROTOTYPE: ;$
fakeop.op_flags = GIMME_V == G_ARRAY ? OPf_WANT_LIST :
GIMME_V == G_SCALAR ? OPf_WANT_SCALAR : OPf_WANT_VOID;
PL_op = &fakeop;
- (void)fakeop.op_ppaddr(aTHXR);
+ (void)fakeop.op_ppaddr(aTHX);
SPAGAIN;
LEAVE;
nret = SP+1 - &ST(0);
diff --git a/t/porting/customized.dat b/t/porting/customized.dat
index 9e0bd1c..974bf57 100644
--- a/t/porting/customized.dat
+++ b/t/porting/customized.dat
@@ -50,6 +50,7 @@ Win32API::File cpan/Win32API-File/t/file.t 124e64aa77e755235eb297644a87fac5388d3
Win32API::File cpan/Win32API-File/t/tie.t 712ea7edd0cc805ce1c0b8172c01b03dd19b583d
Win32API::File cpan/Win32API-File/typemap 24bff088babeadac0873e8df390d1666d9d9db4a
autodie cpan/autodie/t/mkdir.t 9e70d2282a3cc7d76a78bf8144fccba20fb37dac
+Time::HiRes cpan/Time-HiRes/HiRes.xs 0a850b6dee1f2c60ade3d4c33fab7c69b02ddc45
podlators cpan/podlators/scripts/pod2man.PL f81acf53f3ff46cdcc5ebdd661c5d13eb35d20d6
podlators cpan/podlators/scripts/pod2text.PL b4693fcfe4a0a1b38a215cfb8985a65d5d025d69
version cpan/version/lib/version.pm d0923b895d57f1d669ae36fcf85c87b16db341d1
diff --git a/win32/makefile.mk b/win32/makefile.mk
index 07ba8b6..656522f 100644
--- a/win32/makefile.mk
+++ b/win32/makefile.mk
@@ -345,6 +345,10 @@ BUILDOPT += -DPERL_IMPLICIT_SYS
PROCESSOR_ARCHITECTURE *= x86
+.IF "$(WIN64)" == "undef"
+PROCESSOR_ARCHITECTURE = x86
+.ENDIF
+
.IF "$(WIN64)" == ""
# When we are running from a 32bit cmd.exe on AMD64 then
# PROCESSOR_ARCHITECTURE is set to x86 and PROCESSOR_ARCHITEW6432
@@ -508,6 +512,7 @@ LINK_FLAGS = $(LINK_DBG) -L"$(INST_COREDIR)" -L"$(CCLIBDIR)"
OBJOUT_FLAG = -o
EXEOUT_FLAG = -o
LIBOUT_FLAG =
+PDBOUT =
BUILDOPT += -fno-strict-aliasing -mms-bitfields
MINIBUILDOPT += -fno-strict-aliasing
@@ -653,11 +658,11 @@ CFLAGS = $(EXTRACFLAGS) $(INCLUDES) $(DEFINES) $(LOCDEFS) \
LINK_FLAGS = -nologo -nodefaultlib $(LINK_DBG) \
-libpath:"$(INST_COREDIR)" \
-machine:$(PROCESSOR_ARCHITECTURE)
-LIB_FLAGS = $(LIB_FLAGS) -nologo
+LIB_FLAGS += -nologo
OBJOUT_FLAG = -Fo
EXEOUT_FLAG = -Fe
LIBOUT_FLAG = /out:
-
+PDBOUT = -Fd$*.pdb
TESTPREPGCC =
.ENDIF
@@ -717,7 +722,7 @@ LKPOST = )
.SUFFIXES : .c .i $(o) .dll $(a) .exe .rc .res
.c$(o):
- $(CC) -c $(null,$(<:d) $(NULL) -I$(<:d)) $(CFLAGS_O) $(OBJOUT_FLAG)$@ $<
+ $(CC) -c $(null,$(<:d) $(NULL) -I$(<:d)) $(CFLAGS_O) $(OBJOUT_FLAG)$@ $(PDBOUT) $<
.c.i:
$(CC) -c $(null,$(<:d) $(NULL) -I$(<:d)) $(CFLAGS_O) -E $< >$@
@@ -744,14 +749,19 @@ $(o).dll:
#
# various targets
+
+#do not put $(MINIPERL) as a dep/prereq in a rule, instead put $(HAVEMINIPERL)
+#$(MINIPERL) is not a buildable target, use "dmake mp" if you want to just build
+#miniperl alone
MINIPERL = ..\miniperl.exe
+HAVEMINIPERL = ..\lib\buildcustomize.pl
MINIDIR = .\mini
PERLEXE = ..\perl.exe
WPERLEXE = ..\wperl.exe
PERLEXESTATIC = ..\perl-static.exe
STATICDIR = .\static.tmp
GLOBEXE = ..\perlglob.exe
-CONFIGPM = ..\lib\Config.pm ..\lib\Config_heavy.pl
+CONFIGPM = ..\lib\Config.pm
GENUUDMAP = ..\generate_uudmap.exe
.IF "$(BUILD_STATIC)" == "define" || "$(ALL_STATIC)" == "define"
PERLSTATIC = static
@@ -778,7 +788,7 @@ PERLDLL_RES =
# This used to be $(PERLEXE), but at worst it is the .dll that they depend
# on and really only the interface - i.e. the .def file used to export symbols
# from the .dll
-PERLDEP = perldll.def
+PERLDEP = $(PERLIMPLIB)
PL2BAT = bin\pl2bat.pl
@@ -834,9 +844,21 @@ INT64 = __int64
# makedef.pl must be updated if this changes, and this should normally
# only change when there is an incompatible revision of the public API.
PERLIMPLIB *= ..\perl523$(a)
+PERLEXPLIB *= ..\perl523.exp
PERLSTATICLIB *= ..\perl523s$(a)
PERLDLL = ..\perl523.dll
+#EUMM on Win32 isn't ready for parallel make, so only allow this file to be parallel
+#$(MAKE) will contain the -P that this makefile was called with, which is bad for
+#make_ext.pl since upto jobs*jobs processes will run instead of jobs
+#also any recipie containing $(MAKE) is special cased by dmake to execute recipes
+#containing $(MAKE) when "dmake -n" is executed, which causes recursive calls
+#to dmake, which means "dmake -n" is then broken as a diagnostic tool since
+#"dmake -n" will invoke all the make_ext.pl scripts build things instead of
+#showing what to build since $(MAKE) is an arg to make_ext.pl, not an invocation
+#of the dmake process
+PLMAKE = dmake
+
XCOPY = xcopy /f /r /i /d /y
RCOPY = xcopy /f /r /i /e /d /y
NOOP = @rem
@@ -995,7 +1017,7 @@ CFG_VARS = \
libperl=$(PERLIMPLIB:f) ~ \
libpth=$(CCLIBDIR);$(EXTRALIBDIRS) ~ \
libc=$(LIBC) ~ \
- make=dmake ~ \
+ make=$(PLMAKE) ~ \
_o=$(o) ~ \
obj_ext=$(o) ~ \
_a=$(a) ~ \
@@ -1017,9 +1039,7 @@ CFG_VARS = \
# Top targets
#
-all : CHECKDMAKE .\config.h ..\git_version.h $(GLOBEXE) $(MINIPERL) \
- $(CONFIGPM) $(UNIDATAFILES) MakePPPort \
- $(PERLEXE) Extensions Extensions_nonxs $(PERLSTATIC)
+all : CHECKDMAKE rebasePE $(UNIDATAFILES) Extensions_nonxs $(PERLSTATIC)
regnodes : ..\regnodes.h
@@ -1057,178 +1077,13 @@ perlglob$(o) : perlglob.c
config.w32 : $(CFGSH_TMPL)
copy $(CFGSH_TMPL) config.w32
-#
-# Copy the template config.h and set configurables at the end of it
-# as per the options chosen and compiler used.
-# Note: This config.h is only used to build miniperl.exe anyway, but
-# it's as well to have its options correct to be sure that it builds
-# and so that it's "-V" options are correct for use by makedef.pl. The
-# real config.h used to build perl.exe is generated from the top-level
-# config_h.SH by config_h.PL (run by miniperl.exe).
-#
-.\config.h : $(CFGH_TMPL) $(CORE_NOCFG_H)
- -del /f config.h
- copy $(CFGH_TMPL) config.h
- @echo.>>$@
- @echo #ifndef _config_h_footer_>>$@
- @echo #define _config_h_footer_>>$@
- @echo #undef Off_t>>$@
- @echo #undef LSEEKSIZE>>$@
- @echo #undef Off_t_size>>$@
- @echo #undef PTRSIZE>>$@
- @echo #undef SSize_t>>$@
- @echo #undef HAS_ATOLL>>$@
- @echo #undef HAS_STRTOLL>>$@
- @echo #undef HAS_STRTOULL>>$@
- @echo #undef Size_t_size>>$@
- @echo #undef IVTYPE>>$@
- @echo #undef UVTYPE>>$@
- @echo #undef IVSIZE>>$@
- @echo #undef UVSIZE>>$@
- @echo #undef NV_PRESERVES_UV>>$@
- @echo #undef NV_PRESERVES_UV_BITS>>$@
- @echo #undef IVdf>>$@
- @echo #undef UVuf>>$@
- @echo #undef UVof>>$@
- @echo #undef UVxf>>$@
- @echo #undef UVXf>>$@
- @echo #undef USE_64_BIT_INT>>$@
- @echo #undef Gconvert>>$@
- @echo #undef HAS_FREXPL>>$@
- @echo #undef HAS_ISNANL>>$@
- @echo #undef HAS_MODFL>>$@
- @echo #undef HAS_MODFL_PROTO>>$@
- @echo #undef HAS_SQRTL>>$@
- @echo #undef HAS_STRTOLD>>$@
- @echo #undef PERL_PRIfldbl>>$@
- @echo #undef PERL_PRIgldbl>>$@
- @echo #undef PERL_PRIeldbl>>$@
- @echo #undef PERL_SCNfldbl>>$@
- @echo #undef NVTYPE>>$@
- @echo #undef NVSIZE>>$@
- @echo #undef LONG_DOUBLESIZE>>$@
- @echo #undef NV_OVERFLOWS_INTEGERS_AT>>$@
- @echo #undef NVef>>$@
- @echo #undef NVff>>$@
- @echo #undef NVgf>>$@
- @echo #undef USE_LONG_DOUBLE>>$@
- @echo #undef USE_CPLUSPLUS>>$@
-.IF "$(USE_LARGE_FILES)"=="define"
- @echo #define Off_t $(INT64)>>$@
- @echo #define LSEEKSIZE ^8>>$@
- @echo #define Off_t_size ^8>>$@
-.ELSE
- @echo #define Off_t long>>$@
- @echo #define LSEEKSIZE ^4>>$@
- @echo #define Off_t_size ^4>>$@
-.ENDIF
-.IF "$(WIN64)"=="define"
- @echo #define PTRSIZE ^8>>$@
- @echo #define SSize_t $(INT64)>>$@
- @echo #define HAS_ATOLL>>$@
- @echo #define HAS_STRTOLL>>$@
- @echo #define HAS_STRTOULL>>$@
- @echo #define Size_t_size ^8>>$@
-.ELSE
- @echo #define PTRSIZE ^4>>$@
- @echo #define SSize_t int>>$@
- @echo #undef HAS_ATOLL>>$@
- @echo #undef HAS_STRTOLL>>$@
- @echo #undef HAS_STRTOULL>>$@
- @echo #define Size_t_size ^4>>$@
-.ENDIF
-.IF "$(USE_64_BIT_INT)"=="define"
- @echo #define IVTYPE $(INT64)>>$@
- @echo #define UVTYPE unsigned $(INT64)>>$@
- @echo #define IVSIZE ^8>>$@
- @echo #define UVSIZE ^8>>$@
-.IF "$(USE_LONG_DOUBLE)"=="define"
- @echo #define NV_PRESERVES_UV>>$@
- @echo #define NV_PRESERVES_UV_BITS 64>>$@
-.ELSE
- @echo #undef NV_PRESERVES_UV>>$@
- @echo #define NV_PRESERVES_UV_BITS 53>>$@
-.ENDIF
- @echo #define IVdf "I64d">>$@
- @echo #define UVuf "I64u">>$@
- @echo #define UVof "I64o">>$@
- @echo #define UVxf "I64x">>$@
- @echo #define UVXf "I64X">>$@
- @echo #define USE_64_BIT_INT>>$@
-.ELSE
- @echo #define IVTYPE long>>$@
- @echo #define UVTYPE unsigned long>>$@
- @echo #define IVSIZE ^4>>$@
- @echo #define UVSIZE ^4>>$@
- @echo #define NV_PRESERVES_UV>>$@
- @echo #define NV_PRESERVES_UV_BITS 32>>$@
- @echo #define IVdf "ld">>$@
- @echo #define UVuf "lu">>$@
- @echo #define UVof "lo">>$@
- @echo #define UVxf "lx">>$@
- @echo #define UVXf "lX">>$@
- @echo #undef USE_64_BIT_INT>>$@
-.ENDIF
-.IF "$(USE_LONG_DOUBLE)"=="define"
- @echo #define Gconvert(x,n,t,b) sprintf((b),"%.*""Lg",(n),(x))>>$@
- @echo #define HAS_FREXPL>>$@
- @echo #define HAS_ISNANL>>$@
- @echo #define HAS_MODFL>>$@
- @echo #define HAS_MODFL_PROTO>>$@
- @echo #define HAS_SQRTL>>$@
- @echo #define HAS_STRTOLD>>$@
- @echo #define PERL_PRIfldbl "Lf">>$@
- @echo #define PERL_PRIgldbl "Lg">>$@
- @echo #define PERL_PRIeldbl "Le">>$@
- @echo #define PERL_SCNfldbl "Lf">>$@
- @echo #define NVTYPE long double>>$@
-.IF "$(WIN64)"=="define"
- @echo #define NVSIZE ^16>>$@
- @echo #define LONG_DOUBLESIZE ^16>>$@
-.ELSE
- @echo #define NVSIZE ^12>>$@
- @echo #define LONG_DOUBLESIZE ^12>>$@
-.ENDIF
- @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>>$@
- @echo #define NVef "Le">>$@
- @echo #define NVff "Lf">>$@
- @echo #define NVgf "Lg">>$@
- @echo #define USE_LONG_DOUBLE>>$@
-.ELSE
- @echo #define Gconvert(x,n,t,b) sprintf((b),"%.*g",(n),(x))>>$@
- @echo #undef HAS_FREXPL>>$@
- @echo #undef HAS_ISNANL>>$@
- @echo #undef HAS_MODFL>>$@
- @echo #undef HAS_MODFL_PROTO>>$@
- @echo #undef HAS_SQRTL>>$@
- @echo #undef HAS_STRTOLD>>$@
- @echo #undef PERL_PRIfldbl>>$@
- @echo #undef PERL_PRIgldbl>>$@
- @echo #undef PERL_PRIeldbl>>$@
- @echo #undef PERL_SCNfldbl>>$@
- @echo #define NVTYPE double>>$@
- @echo #define NVSIZE ^8>>$@
- @echo #define LONG_DOUBLESIZE ^8>>$@
- @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>>$@
- @echo #define NVef "e">>$@
- @echo #define NVff "f">>$@
- @echo #define NVgf "g">>$@
- @echo #undef USE_LONG_DOUBLE>>$@
-.ENDIF
-.IF "$(USE_CPLUSPLUS)"=="define"
- @echo #define USE_CPLUSPLUS>>$@
-.ELSE
- @echo #undef USE_CPLUSPLUS>>$@
-.ENDIF
- @echo #endif>>$@
-
-..\git_version.h : $(MINIPERL) ..\make_patchnum.pl
+..\git_version.h : $(HAVEMINIPERL) ..\make_patchnum.pl
cd .. && miniperl -Ilib make_patchnum.pl
# make sure that we recompile perl.c if the git version changes
..\perl$(o) : ..\git_version.h
-..\config.sh : config.w32 $(MINIPERL) config_sh.PL FindExt.pm
+..\config.sh : config.w32 $(HAVEMINIPERL) config_sh.PL FindExt.pm
$(MINIPERL) -I..\lib config_sh.PL --cfgsh-option-file \
$(mktmp $(CFG_VARS)) config.w32 > ..\config.sh
@@ -1244,18 +1099,18 @@ regen_config_h:
-$(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)"
rename config.h $(CFGH_TMPL)
-$(CONFIGPM) : $(MINIPERL) ..\config.sh config_h.PL
+$(CONFIGPM): ..\config.sh config_h.PL
$(MINIPERL) -I..\lib ..\configpm --chdir=..
$(XCOPY) ..\*.h $(COREDIR)\*.*
$(XCOPY) *.h $(COREDIR)\*.*
$(RCOPY) include $(COREDIR)\*.*
$(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)" \
- || $(MAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)
+ || $(PLMAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)
-# See the comment in Makefile.SH explaining this seemingly cranky ordering
-$(MINIPERL) : ..\lib\buildcustomize.pl
+.\config.h : $(CONFIGPM)
-..\lib\buildcustomize.pl : $(MINIDIR) $(MINI_OBJ) $(CRTIPMLIBS) ..\write_buildcustomize.pl
+# See the comment in Makefile.SH explaining this seemingly cranky ordering
+..\lib\buildcustomize.pl : $(MINI_OBJ) ..\write_buildcustomize.pl
.IF "$(CCTYPE)" == "GCC"
$(LINK32) -v -mconsole -o $(MINIPERL) $(BLINK_FLAGS) \
$(mktmp $(LKPRE) $(MINI_OBJ) $(LIBFILES) $(LKPOST))
@@ -1266,31 +1121,202 @@ $(MINIPERL) : ..\lib\buildcustomize.pl
.ENDIF
$(MINIPERL) -I..\lib -f ..\write_buildcustomize.pl ..
-$(MINIDIR) :
+#convinence target, get a working miniperl
+mp : $(CONFIGPM)
+
+$(MINIDIR)\.exists : $(CFGH_TMPL)
if not exist "$(MINIDIR)" mkdir "$(MINIDIR)"
+#
+# Copy the template config.h and set configurables at the end of it
+# as per the options chosen and compiler used.
+# Note: This config.h is only used to build miniperl.exe anyway, but
+# it's as well to have its options correct to be sure that it builds
+# and so that it's "-V" options are correct for use by makedef.pl. The
+# real config.h used to build perl.exe is generated from the top-level
+# config_h.SH by config_h.PL (run by miniperl.exe).
+#
+# MINIDIR generates config.h so miniperl.exe is not rebuilt when the 2nd
+# config.h is generated in CONFIGPM target, see also the comments for $(MINI_OBJ).
+ -if exist config.h del /f config.h
+ copy $(CFGH_TMPL) config.h
+ @(echo.&& \
+ echo #ifndef _config_h_footer_&& \
+ echo #define _config_h_footer_&& \
+ echo #undef Off_t&& \
+ echo #undef LSEEKSIZE&& \
+ echo #undef Off_t_size&& \
+ echo #undef PTRSIZE&& \
+ echo #undef SSize_t&& \
+ echo #undef HAS_ATOLL&& \
+ echo #undef HAS_STRTOLL&& \
+ echo #undef HAS_STRTOULL&& \
+ echo #undef Size_t_size&& \
+ echo #undef IVTYPE&& \
+ echo #undef UVTYPE&& \
+ echo #undef IVSIZE&& \
+ echo #undef UVSIZE&& \
+ echo #undef NV_PRESERVES_UV&& \
+ echo #undef NV_PRESERVES_UV_BITS&& \
+ echo #undef IVdf&& \
+ echo #undef UVuf&& \
+ echo #undef UVof&& \
+ echo #undef UVxf&& \
+ echo #undef UVXf&& \
+ echo #undef USE_64_BIT_INT&& \
+ echo #undef Gconvert&& \
+ echo #undef HAS_FREXPL&& \
+ echo #undef HAS_ISNANL&& \
+ echo #undef HAS_MODFL&& \
+ echo #undef HAS_MODFL_PROTO&& \
+ echo #undef HAS_SQRTL&& \
+ echo #undef HAS_STRTOLD&& \
+ echo #undef PERL_PRIfldbl&& \
+ echo #undef PERL_PRIgldbl&& \
+ echo #undef PERL_PRIeldbl&& \
+ echo #undef PERL_SCNfldbl&& \
+ echo #undef NVTYPE&& \
+ echo #undef NVSIZE&& \
+ echo #undef LONG_DOUBLESIZE&& \
+ echo #undef NV_OVERFLOWS_INTEGERS_AT&& \
+ echo #undef NVef&& \
+ echo #undef NVff&& \
+ echo #undef NVgf&& \
+ echo #undef USE_LONG_DOUBLE&& \
+ echo #undef USE_CPLUSPLUS)>> config.h
+.IF "$(USE_LARGE_FILES)"=="define"
+ @(echo #define Off_t $(INT64)&& \
+ echo #define LSEEKSIZE ^8&& \
+ echo #define Off_t_size ^8)>> config.h
+.ELSE
+ @(echo #define Off_t long&& \
+ echo #define LSEEKSIZE ^4&& \
+ echo #define Off_t_size ^4)>> config.h
+.ENDIF
+.IF "$(WIN64)"=="define"
+ @(echo #define PTRSIZE ^8&& \
+ echo #define SSize_t $(INT64)&& \
+ echo #define HAS_ATOLL&& \
+ echo #define HAS_STRTOLL&& \
+ echo #define HAS_STRTOULL&& \
+ echo #define Size_t_size ^8)>> config.h
+.ELSE
+ @(echo #define PTRSIZE ^4&& \
+ echo #define SSize_t int&& \
+ echo #undef HAS_ATOLL&& \
+ echo #undef HAS_STRTOLL&& \
+ echo #undef HAS_STRTOULL&& \
+ echo #define Size_t_size ^4)>> config.h
+.ENDIF
+.IF "$(USE_64_BIT_INT)"=="define"
+ @(echo #define IVTYPE $(INT64)&& \
+ echo #define UVTYPE unsigned $(INT64)&& \
+ echo #define IVSIZE ^8&& \
+ echo #define UVSIZE ^8)>> config.h
+.IF "$(USE_LONG_DOUBLE)"=="define"
+ @(echo #define NV_PRESERVES_UV&& \
+ echo #define NV_PRESERVES_UV_BITS 64)>> config.h
+.ELSE
+ @(echo #undef NV_PRESERVES_UV&& \
+ echo #define NV_PRESERVES_UV_BITS 53)>> config.h
+.ENDIF
+ @(echo #define IVdf "I64d"&& \
+ echo #define UVuf "I64u"&& \
+ echo #define UVof "I64o"&& \
+ echo #define UVxf "I64x"&& \
+ echo #define UVXf "I64X"&& \
+ echo #define USE_64_BIT_INT)>> config.h
+.ELSE
+ @(echo #define IVTYPE long&& \
+ echo #define UVTYPE unsigned long&& \
+ echo #define IVSIZE ^4&& \
+ echo #define UVSIZE ^4&& \
+ echo #define NV_PRESERVES_UV&& \
+ echo #define NV_PRESERVES_UV_BITS 32&& \
+ echo #define IVdf "ld"&& \
+ echo #define UVuf "lu"&& \
+ echo #define UVof "lo"&& \
+ echo #define UVxf "lx"&& \
+ echo #define UVXf "lX"&& \
+ echo #undef USE_64_BIT_INT)>> config.h
+.ENDIF
+.IF "$(USE_LONG_DOUBLE)"=="define"
+ @(echo #define Gconvert^(x,n,t,b^) sprintf^(^(b^),"%.*""Lg",^(n^),^(x^)^)&& \
+ echo #define HAS_FREXPL&& \
+ echo #define HAS_ISNANL&& \
+ echo #define HAS_MODFL&& \
+ echo #define HAS_MODFL_PROTO&& \
+ echo #define HAS_SQRTL&& \
+ echo #define HAS_STRTOLD&& \
+ echo #define PERL_PRIfldbl "Lf"&& \
+ echo #define PERL_PRIgldbl "Lg"&& \
+ echo #define PERL_PRIeldbl "Le"&& \
+ echo #define PERL_SCNfldbl "Lf"&& \
+ echo #define NVTYPE long double)>> config.h
+.IF "$(WIN64)"=="define"
+ @(echo #define NVSIZE ^16&& \
+ echo #define LONG_DOUBLESIZE ^16)>> config.h
+.ELSE
+ @(echo #define NVSIZE ^12&& \
+ echo #define LONG_DOUBLESIZE ^12)>> config.h
+.ENDIF
+ @(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&& \
+ echo #define NVef "Le"&& \
+ echo #define NVff "Lf"&& \
+ echo #define NVgf "Lg"&& \
+ echo #define USE_LONG_DOUBLE)>> config.h
+.ELSE
+ @(echo #define Gconvert^(x,n,t,b^) sprintf^(^(b^),"%.*g",^(n^),^(x^)^)&& \
+ echo #undef HAS_FREXPL&& \
+ echo #undef HAS_ISNANL&& \
+ echo #undef HAS_MODFL&& \
+ echo #undef HAS_MODFL_PROTO&& \
+ echo #undef HAS_SQRTL&& \
+ echo #undef HAS_STRTOLD&& \
+ echo #undef PERL_PRIfldbl&& \
+ echo #undef PERL_PRIgldbl&& \
+ echo #undef PERL_PRIeldbl&& \
+ echo #undef PERL_SCNfldbl&& \
+ echo #define NVTYPE double&& \
+ echo #define NVSIZE ^8&& \
+ echo #define LONG_DOUBLESIZE ^8&& \
+ 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&& \
+ echo #define NVef "e"&& \
+ echo #define NVff "f"&& \
+ echo #define NVgf "g"&& \
+ echo #undef USE_LONG_DOUBLE)>> config.h
+.ENDIF
+.IF "$(USE_CPLUSPLUS)"=="define"
+ @(echo #define USE_CPLUSPLUS&& \
+ echo #endif)>> config.h
+.ELSE
+ @(echo #undef USE_CPLUSPLUS&& \
+ echo #endif)>> config.h
+.ENDIF
+#separate line since this is sentinal that this target is done
+ rem. > $(MINIDIR)\.exists
$(MINICORE_OBJ) : $(CORE_NOCFG_H)
- $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_EXTERNAL_GLOB -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ ..\$(*B).c
+ $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_EXTERNAL_GLOB -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ $(PDBOUT) ..\$(*B).c
$(MINIWIN32_OBJ) : $(CORE_NOCFG_H)
- $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ $(*B).c
+ $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ $(PDBOUT) $(*B).c
# -DPERL_IMPLICIT_SYS needs C++ for perllib.c
# rules wrapped in .IFs break Win9X build (we end up with unbalanced []s unless
# unless the .IF is true), so instead we use a .ELSE with the default.
# This is the only file that depends on perlhost.h, vmem.h, and vdir.h
-perllib$(o) : perllib.c .\perlhost.h .\vdir.h .\vmem.h
+perllib$(o) : perllib.c perllibst.h .\perlhost.h .\vdir.h .\vmem.h
.IF "$(USE_IMP_SYS)" == "define"
- $(CC) -c -I. $(CFLAGS_O) $(CXX_FLAG) $(OBJOUT_FLAG)$@ perllib.c
+ $(CC) -c -I. $(CFLAGS_O) $(CXX_FLAG) $(OBJOUT_FLAG)$@ $(PDBOUT) perllib.c
.ELSE
- $(CC) -c -I. $(CFLAGS_O) $(OBJOUT_FLAG)$@ perllib.c
+ $(CC) -c -I. $(CFLAGS_O) $(OBJOUT_FLAG)$@ $(PDBOUT) perllib.c
.ENDIF
# 1. we don't want to rebuild miniperl.exe when config.h changes
# 2. we don't want to rebuild miniperl.exe with non-default config.h
# 3. we can't have miniperl.exe depend on git_version.h, as miniperl creates it
-$(MINI_OBJ) : $(CORE_NOCFG_H)
+$(MINI_OBJ) : $(MINIDIR)\.exists $(CORE_NOCFG_H)
$(WIN32_OBJ) : $(CORE_H)
@@ -1298,12 +1324,26 @@ $(CORE_OBJ) : $(CORE_H)
$(DLL_OBJ) : $(CORE_H)
-perldll.def : $(MINIPERL) $(CONFIGPM) ..\embed.fnc ..\makedef.pl create_perllibst_h.pl
+
+perllibst.h : $(HAVEMINIPERL) $(CONFIGPM) create_perllibst_h.pl
$(MINIPERL) -I..\lib create_perllibst_h.pl
+
+perldll.def : $(HAVEMINIPERL) $(CONFIGPM) ..\embed.fnc ..\makedef.pl
$(MINIPERL) -I..\lib -w ..\makedef.pl PLATFORM=win32 $(OPTIMIZE) $(DEFINES) \
$(BUILDOPT) CCTYPE=$(CCTYPE) TARG_DIR=..\ > perldll.def
-$(PERLDLL): perldll.def $(PERLDLL_OBJ) $(PERLDLL_RES) Extensions_static
+$(PERLIMPLIB) : perldll.def
+.IF "$(CCTYPE)" == "GCC"
+ $(IMPLIB) -k -d perldll.def -l $(PERLIMPLIB)
+.ELSE #VC family
+ lib -def:perldll.def -machine:$(ARCHITECTURE) /OUT:$(PERLIMPLIB)
+.ENDIF
+ $(XCOPY) $(PERLIMPLIB) $(COREDIR)
+
+#PERLEXPLIB is built in PERLIMPLIB
+$(PERLEXPLIB): $(PERLIMPLIB)
+
+$(PERLDLL): $(PERLEXPLIB) $(PERLDLL_OBJ) $(PERLDLL_RES) Extensions_static
.IF "$(CCTYPE)" == "GCC"
$(LINK32) -mdll -o $@ -Wl,--base-file -Wl,perl.base $(BLINK_FLAGS) \
$(mktmp $(LKPRE) $(PERLDLL_OBJ) \
@@ -1319,13 +1359,12 @@ $(PERLDLL): perldll.def $(PERLDLL_OBJ) $(PERLDLL_RES) Extensions_static
$(shell @type Extensions_static) \
$(LIBFILES) perl.exp $(LKPOST))
.ELSE
- $(LINK32) -dll -def:perldll.def -out:$@ $(BLINK_FLAGS) \
+ $(LINK32) -dll -out:$@ $(BLINK_FLAGS) \
@Extensions_static \
@$(mktmp -base:0x28000000 $(DELAYLOAD) $(LIBFILES) \
- $(PERLDLL_RES) $(PERLDLL_OBJ))
+ $(PERLDLL_RES) $(PERLDLL_OBJ) $(PERLEXPLIB))
$(EMBED_DLL_MANI)
.ENDIF
- $(XCOPY) $(PERLIMPLIB) $(COREDIR)
$(PERLSTATICLIB): $(PERLDLL_OBJ) Extensions_static
.IF "$(CCTYPE)" == "GCC"
@@ -1365,16 +1404,16 @@ $(GENUUDMAP) : $(GENUUDMAP_OBJ)
perlmain.c : runperl.c
copy runperl.c perlmain.c
-perlmain$(o) : perlmain.c
- $(CC) $(CFLAGS_O:s,-DPERLDLL,-UPERLDLL,) $(OBJOUT_FLAG)$@ -c perlmain.c
+perlmain$(o) : $(CONFIGPM) perlmain.c
+ $(CC) $(CFLAGS_O:s,-DPERLDLL,-UPERLDLL,) $(OBJOUT_FLAG)$@ $(PDBOUT) -c perlmain.c
perlmainst.c : runperl.c
copy runperl.c perlmainst.c
-perlmainst$(o) : perlmainst.c
- $(CC) $(CFLAGS_O) $(OBJOUT_FLAG)$@ -c perlmainst.c
+perlmainst$(o) : $(CONFIGPM) perlmainst.c
+ $(CC) $(CFLAGS_O) $(OBJOUT_FLAG)$@ $(PDBOUT) -c perlmainst.c
-$(PERLEXE): $(PERLDLL) $(CONFIGPM) $(PERLEXE_OBJ) $(PERLEXE_RES)
+$(PERLEXE): $(CONFIGPM) $(PERLEXE_OBJ) $(PERLEXE_RES) $(PERLIMPLIB)
.IF "$(CCTYPE)" == "GCC"
$(LINK32) -mconsole -o $@ $(BLINK_FLAGS) \
$(PERLEXE_OBJ) $(PERLEXE_RES) $(PERLIMPLIB) $(LIBFILES)
@@ -1396,43 +1435,52 @@ $(PERLEXESTATIC): $(PERLSTATICLIB) $(CONFIGPM) $(PERLEXEST_OBJ) $(PERLEXE_RES)
$(EMBED_EXE_MANI)
.ENDIF
-MakePPPort: $(MINIPERL) $(CONFIGPM) Extensions_nonxs
- $(MINIPERL) -I..\lib ..\mkppport
-
#-------------------------------------------------------------------------------
# There's no direct way to mark a dependency on
# DynaLoader.pm, so this will have to do
Extensions : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) $(DYNALOADER)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic
+ if not exist $(COREDIR)\ppport.h rem. > $(COREDIR)\ppport.h
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic
Extensions_reonly : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) $(DYNALOADER)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic +re
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic +re
-Extensions_static : ..\make_ext.pl ..\lib\buildcustomize.pl list_static_libs.pl $(PERLDEP) $(CONFIGPM) Extensions_nonxs
+Extensions_static : ..\make_ext.pl ..\lib\buildcustomize.pl list_static_libs.pl $(CONFIGPM)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --static
+ if not exist $(COREDIR)\ppport.h rem. > $(COREDIR)\ppport.h
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --static
$(MINIPERL) -I..\lib list_static_libs.pl > Extensions_static
-Extensions_nonxs : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) ..\pod\perlfunc.pod
- $(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --nonxs
+Extensions_nonxs : ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM) ..\pod\perlfunc.pod
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --nonxs !libs
-$(DYNALOADER) : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) Extensions_nonxs
+#lib must be built, it can't be buildcustomize.pl-ed, and is required for XS building
+$(DYNALOADER) : ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --dynaloader
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(EXTDIR) --dir=$(DISTDIR) --dynaloader lib
Extensions_clean :
- -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=clean
+ -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=clean
Extensions_realclean :
- -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=realclean
+ -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=realclean
+
+# all PE files need to be built by the time this target runs, PP files can still
+# be running in parallel like UNIDATAFILES, this target a placeholder for the
+# future
+.IF "$(BUILD_STATIC)"=="define"
+rebasePE : Extensions $(PERLDLL) $(PERLEXE) $(GLOBEXE) $(PERLEXESTATIC)
+.ELSE
+rebasePE : Extensions $(PERLDLL) $(PERLEXE) $(GLOBEXE)
+.ENDIF
+ $(NOOP)
#-------------------------------------------------------------------------------
-doc: $(PERLEXE) ..\pod\perltoc.pod
+doc: $(PERLEXE) $(PERLDLL) ..\pod\perltoc.pod
$(PERLEXE) ..\installhtml --podroot=.. --htmldir=$(HTMLDIR) \
--podpath=pod:lib:utils --htmlroot="file://$(INST_HTML:s,:,|,)"\
--recurse
@@ -1442,8 +1490,8 @@ doc: $(PERLEXE) ..\pod\perltoc.pod
# Note that this next section is parsed (and regenerated) by pod/buildtoc
# so please check that script before making structural changes here
-utils: $(PERLEXE) ..\utils\Makefile
- cd ..\utils && $(MAKE) PERL=$(MINIPERL)
+utils: $(HAVEMINIPERL) ..\utils\Makefile
+ cd ..\utils && $(PLMAKE) PERL=$(MINIPERL)
copy ..\README.aix ..\pod\perlaix.pod
copy ..\README.amiga ..\pod\perlamiga.pod
copy ..\README.android ..\pod\perlandroid.pod
@@ -1478,11 +1526,11 @@ utils: $(PERLEXE) ..\utils\Makefile
copy ..\README.vos ..\pod\perlvos.pod
copy ..\README.win32 ..\pod\perlwin32.pod
copy ..\pod\perldelta.pod ..\pod\perl5230delta.pod
- $(PERLEXE) $(PL2BAT) $(UTILS)
+ $(MINIPERL) -I..\lib $(PL2BAT) $(UTILS)
$(MINIPERL) -I..\lib ..\autodoc.pl ..
$(MINIPERL) -I..\lib ..\pod\perlmodlib.PL -q ..
-..\pod\perltoc.pod: $(PERLEXE) Extensions Extensions_nonxs
+..\pod\perltoc.pod: $(PERLEXE) $(PERLDLL) Extensions Extensions_nonxs ..\pod\perluniprops.pod utils
$(PERLEXE) -f ..\pod\buildtoc -q
# Note that the pod cleanup in this next section is parsed (and regenerated
@@ -1619,11 +1667,11 @@ installhtml : doc
inst_lib : $(CONFIGPM)
$(RCOPY) ..\lib $(INST_LIB)\*.*
-$(UNIDATAFILES) ..\pod\perluniprops.pod .UPDATEALL : $(MINIPERL) $(CONFIGPM) ..\lib\unicore\mktables Extensions_nonxs
+$(UNIDATAFILES) ..\pod\perluniprops.pod .UPDATEALL : $(CONFIGPM) ..\lib\unicore\mktables
cd ..\lib\unicore && \
..\$(MINIPERL) -I.. mktables -P ..\..\pod -maketest -makelist -p
-minitest : .\config.h $(MINIPERL) ..\git_version.h $(GLOBEXE) $(CONFIGPM) $(UNIDATAFILES) $(TESTPREPGCC)
+minitest : .\config.h $(HAVEMINIPERL) ..\git_version.h $(GLOBEXE) $(CONFIGPM) $(UNIDATAFILES) $(TESTPREPGCC)
$(XCOPY) $(MINIPERL) ..\t\$(NULL)
if exist ..\t\perl.exe del /f ..\t\perl.exe
rename ..\t\miniperl.exe perl.exe
diff --git a/write_buildcustomize.pl b/write_buildcustomize.pl
index 5d819b5..d3bbd0f 100644
--- a/write_buildcustomize.pl
+++ b/write_buildcustomize.pl
@@ -41,12 +41,23 @@ my @toolchain = qw(cpan/AutoLoader/lib
dist/constant/lib
);
-# Used only in ExtUtils::Liblist::Kid::_win32_ext()
-push @toolchain, 'cpan/Text-ParseWords/lib' if $^O eq 'MSWin32';
+# Text-ParseWords used only in ExtUtils::Liblist::Kid::_win32_ext()
+# the rest are for XS building on Win32, since nonxs and xs build simultaneously
+# on Win32 if parallel building
+push @toolchain, qw(
+ cpan/Text-ParseWords/lib
+ dist/ExtUtils-ParseXS/lib
+ cpan/Getopt-Long/lib
+ cpan/parent/lib
+ cpan/ExtUtils-Constant/lib
+) if $^O eq 'MSWin32';
push @toolchain, 'ext/VMS-Filespec/lib' if $^O eq 'VMS';
unshift @INC, @toolchain;
require File::Spec::Functions;
+require Cwd;
+
+my $cwd = Cwd::getcwd();
# lib must be last, as the toolchain modules write themselves into it
# as they build, and it's important that @INC order ensures that the partially
@@ -54,7 +65,7 @@ require File::Spec::Functions;
my $inc = join ",\n ",
map { "q\0$_\0" }
- (map {File::Spec::Functions::rel2abs($_)} (
+ (map {File::Spec::Functions::rel2abs($_, $cwd)} (
# faster build on the non-parallel Win32 build process
$^O eq 'MSWin32' ? ('lib', @toolchain ) : (@toolchain, 'lib')
));
--
1.8.0.msysgit.0
|
From @bulk880002-coredir-parallelism.patchFrom 7d629bbeaa1c066a78cf4401b079aa7372fc9236 Mon Sep 17 00:00:00 2001
From: Daniel Dragan <bulk88@hotmail.com>
Date: Sun, 17 May 2015 14:18:06 -0400
Subject: [PATCH 2/5] coredir parallelism
-defer the mass copy of headers to COREDIR until XS build time
and dont use COREDIR for building miniperl interp or perl interp, more
thing to do in parallel this way and 1 less path to search by the CC
-config_h.PL requires config.h to be in COREDIR, this XCOPY in CONFIGPM
targ is where COREDIR is created if it doesnt exist already
-remove a bunch of XCOPY'es, copy the headers in 1 place only, and dont
copy them unless they change based on timestamps
-the DYNALOADER dep already contains
"..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM) $(HAVE_COREDIR)" dont
specify them again in Extensions and Extensions_reonly, this probably
reduces the size of dep graph in dmake, sincedmake explodes the graph and
checks the outline of the graph/tree very inefficiently in parallel mode
(architectural problem with dmake)
-undo Time::HiRes in-core patch per TonyC's 2 line ppport.h idea
-delete pdb files in root, otherwise switching VC version will make the
next cl.exe error out that it can't write to the pdb file due to version
numbers in the pdb file
-reorder core .c files in a blend of VC and GCC time order, this reduces
a 1:08 mins time to do "dmake -P9 ../perl522.dll" to 0:54 mins on 8 core
with GCC, see details in #123867
---
Porting/Maintainers.pl | 2 --
README.win32 | 11 +++++---
cpan/Time-HiRes/HiRes.pm | 2 +-
cpan/Time-HiRes/HiRes.xs | 4 +--
pod/perldelta.pod | 5 ++++
t/porting/customized.dat | 1 -
win32/makefile.mk | 72 +++++++++++++++++++++++++++---------------------
7 files changed, 55 insertions(+), 42 deletions(-)
diff --git a/Porting/Maintainers.pl b/Porting/Maintainers.pl
index 7de1d68..ac1e3c2 100755
--- a/Porting/Maintainers.pl
+++ b/Porting/Maintainers.pl
@@ -1216,8 +1216,6 @@ use File::Glob qw(:case);
'Time::HiRes' => {
'DISTRIBUTION' => 'ZEFRAM/Time-HiRes-1.9726.tar.gz',
'FILES' => q[cpan/Time-HiRes],
- # CPAN release eventually
- 'CUSTOMIZED' => [ 'HiRes.xs' ],
},
'Time::Local' => {
diff --git a/README.win32 b/README.win32
index b9875e6..13d2a79 100644
--- a/README.win32
+++ b/README.win32
@@ -98,11 +98,14 @@ See L<Usage Hints for Perl on Windows> below for general hints about this.
You need a "make" program to build the sources. If you are using
Visual C++ or the Windows SDK tools, you can use nmake supplied with Visual C++
or Windows SDK. You may also use, for Visual C++ or Windows SDK, dmake instead
-of nmake. dmake is open source software, but is not included with Visual C++ or
-Windows SDK. If you want parallel building with Visual C++ or
+of nmake. dmake is open source software, but is not included with Visual C++ or
+Windows SDK. If you want parallel building with Visual C++ or
Windows SDK you must use dmake instead of nmake. Builds using gcc need dmake.
-nmake is not supported for gcc builds. gmake is not supported, but might be
-added in the future.
+nmake is not supported for gcc builds. gmake is not supported, but might be
+added in the future. It is recommended to use dmake 4.13 or newer for parallel
+building. Older dmakes, in parallel mode, have very high CPU usage and pound
+the disk/filing system with duplicate I/O calls in an aggressive polling
+loop.
A port of dmake for Windows is available from:
diff --git a/cpan/Time-HiRes/HiRes.pm b/cpan/Time-HiRes/HiRes.pm
index 0ee2c62..cf64bc1 100644
--- a/cpan/Time-HiRes/HiRes.pm
+++ b/cpan/Time-HiRes/HiRes.pm
@@ -23,7 +23,7 @@ our @EXPORT_OK = qw (usleep sleep ualarm alarm gettimeofday time tv_interval
stat lstat
);
-our $VERSION = '1.9726_01';
+our $VERSION = '1.9726';
our $XS_VERSION = $VERSION;
$VERSION = eval $VERSION;
diff --git a/cpan/Time-HiRes/HiRes.xs b/cpan/Time-HiRes/HiRes.xs
index 9a852c4..96640e9 100644
--- a/cpan/Time-HiRes/HiRes.xs
+++ b/cpan/Time-HiRes/HiRes.xs
@@ -731,7 +731,7 @@ myNVtime()
static void
hrstatns(UV *atime_nsec, UV *mtime_nsec, UV *ctime_nsec)
{
- dTHX;
+ dTHXR;
#if TIME_HIRES_STAT == 1
*atime_nsec = PL_statcache.st_atimespec.tv_nsec;
*mtime_nsec = PL_statcache.st_mtimespec.tv_nsec;
@@ -1284,7 +1284,7 @@ PROTOTYPE: ;$
fakeop.op_flags = GIMME_V == G_ARRAY ? OPf_WANT_LIST :
GIMME_V == G_SCALAR ? OPf_WANT_SCALAR : OPf_WANT_VOID;
PL_op = &fakeop;
- (void)fakeop.op_ppaddr(aTHX);
+ (void)fakeop.op_ppaddr(aTHXR);
SPAGAIN;
LEAVE;
nret = SP+1 - &ST(0);
diff --git a/pod/perldelta.pod b/pod/perldelta.pod
index 2cb9d72..95a98b7 100644
--- a/pod/perldelta.pod
+++ b/pod/perldelta.pod
@@ -378,6 +378,11 @@ only execute on Vista and higher.
=item *
+Parallel building has been added to the dmake C<makefile.mk> makefile. All
+Win32 compilers are supported.
+
+=item *
+
You can now build perl with GNU Make and GCC. [perl #123440]
=item *
diff --git a/t/porting/customized.dat b/t/porting/customized.dat
index 974bf57..9e0bd1c 100644
--- a/t/porting/customized.dat
+++ b/t/porting/customized.dat
@@ -50,7 +50,6 @@ Win32API::File cpan/Win32API-File/t/file.t 124e64aa77e755235eb297644a87fac5388d3
Win32API::File cpan/Win32API-File/t/tie.t 712ea7edd0cc805ce1c0b8172c01b03dd19b583d
Win32API::File cpan/Win32API-File/typemap 24bff088babeadac0873e8df390d1666d9d9db4a
autodie cpan/autodie/t/mkdir.t 9e70d2282a3cc7d76a78bf8144fccba20fb37dac
-Time::HiRes cpan/Time-HiRes/HiRes.xs 0a850b6dee1f2c60ade3d4c33fab7c69b02ddc45
podlators cpan/podlators/scripts/pod2man.PL f81acf53f3ff46cdcc5ebdd661c5d13eb35d20d6
podlators cpan/podlators/scripts/pod2text.PL b4693fcfe4a0a1b38a215cfb8985a65d5d025d69
version cpan/version/lib/version.pm d0923b895d57f1d669ae36fcf85c87b16db341d1
diff --git a/win32/makefile.mk b/win32/makefile.mk
index 656522f..59c8819 100644
--- a/win32/makefile.mk
+++ b/win32/makefile.mk
@@ -472,7 +472,7 @@ a = .a
# Options
#
-INCLUDES = -I.\include -I. -I.. -I$(COREDIR)
+INCLUDES = -I.\include -I. -I..
DEFINES = -DWIN32
.IF "$(WIN64)" == "define"
DEFINES += -DWIN64 -DCONSERVATIVE
@@ -560,7 +560,7 @@ RSC = rc
# Options
#
-INCLUDES = -I$(COREDIR) -I.\include -I. -I..
+INCLUDES = -I.\include -I. -I..
#PCHFLAGS = -Fpc:\temp\vcmoduls.pch -YX
DEFINES = -DWIN32 -D_CONSOLE -DNO_STRICT
LOCDEFS = -DPERLDLL -DPERL_CORE
@@ -863,43 +863,45 @@ XCOPY = xcopy /f /r /i /d /y
RCOPY = xcopy /f /r /i /e /d /y
NOOP = @rem
+#first ones are arrange in compile time order for faster parallel building
+#see #123867 for details
MICROCORE_SRC = \
+ ..\toke.c \
+ ..\regcomp.c \
+ ..\regexec.c \
+ ..\op.c \
+ ..\sv.c \
+ ..\pp.c \
+ ..\pp_ctl.c \
+ ..\pp_sys.c \
+ ..\pp_pack.c \
+ ..\pp_hot.c \
+ ..\gv.c \
+ ..\perl.c \
+ ..\utf8.c \
+ ..\dump.c \
+ ..\hv.c \
..\av.c \
..\caretx.c \
..\deb.c \
..\doio.c \
..\doop.c \
- ..\dump.c \
..\globals.c \
- ..\gv.c \
..\mro_core.c \
- ..\hv.c \
..\locale.c \
..\keywords.c \
..\mathoms.c \
..\mg.c \
..\numeric.c \
- ..\op.c \
..\pad.c \
- ..\perl.c \
..\perlapi.c \
..\perly.c \
- ..\pp.c \
- ..\pp_ctl.c \
- ..\pp_hot.c \
- ..\pp_pack.c \
..\pp_sort.c \
- ..\pp_sys.c \
..\reentr.c \
- ..\regcomp.c \
- ..\regexec.c \
..\run.c \
..\scope.c \
- ..\sv.c \
..\taint.c \
- ..\toke.c \
..\universal.c \
- ..\utf8.c \
..\util.c
EXTRACORE_SRC += perllib.c
@@ -964,6 +966,10 @@ UUDMAP_H = ..\uudmap.h
BITCOUNT_H = ..\bitcount.h
MG_DATA_H = ..\mg_data.h
GENERATED_HEADERS = $(UUDMAP_H) $(BITCOUNT_H) $(MG_DATA_H)
+#a stub ppport.h must be generated so building XS modules, .c->.obj wise, will
+#work, so this target also represents creating the COREDIR and filling it
+HAVE_COREDIR = $(COREDIR)\ppport.h
+
MICROCORE_OBJ = $(MICROCORE_SRC:db:+$(o))
CORE_OBJ = $(MICROCORE_OBJ) $(EXTRACORE_SRC:db:+$(o))
@@ -1101,9 +1107,7 @@ regen_config_h:
$(CONFIGPM): ..\config.sh config_h.PL
$(MINIPERL) -I..\lib ..\configpm --chdir=..
- $(XCOPY) ..\*.h $(COREDIR)\*.*
- $(XCOPY) *.h $(COREDIR)\*.*
- $(RCOPY) include $(COREDIR)\*.*
+ $(XCOPY) config.h $(COREDIR)\*.*
$(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)" \
|| $(PLMAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)
@@ -1379,7 +1383,7 @@ $(PERLSTATICLIB): $(PERLDLL_OBJ) Extensions_static
$(LIB32) $(LIB_FLAGS) -out:$@ @Extensions_static \
@$(mktmp $(PERLDLL_OBJ))
.ENDIF
- $(XCOPY) $(PERLSTATICLIB) $(COREDIR)
+ $(XCOPY) $(PERLSTATICLIB) $(COREDIR)\$(NULL)
$(PERLEXE_RES): perlexe.rc $(PERLEXE_MANIFEST) $(PERLEXE_ICO)
@@ -1390,6 +1394,14 @@ $(UUDMAP_H) $(MG_DATA_H) : $(BITCOUNT_H)
$(BITCOUNT_H) : $(GENUUDMAP)
$(GENUUDMAP) $(GENERATED_HEADERS)
+#This generates a stub ppport.h & creates & fills /lib/CORE to allow for XS
+#building .c->.obj wise (linking is a different thing). This taget is AKA
+#$(HAVE_COREDIR). ppport.h can become a 0 byte file once core's Time::HiRes is
+#has the patch in CPAN #102799
+$(COREDIR)\ppport.h : $(CORE_H)
+ $(XCOPY) *.h $(COREDIR)\*.* && $(RCOPY) include $(COREDIR)\*.* && $(XCOPY) ..\*.h $(COREDIR)\*.*
+ @( echo #define aTHXR aTHX&& echo #define dTHXR dTHX) >$@
+
$(GENUUDMAP_OBJ) : ..\mg_raw.h
$(GENUUDMAP) : $(GENUUDMAP_OBJ)
@@ -1438,18 +1450,15 @@ $(PERLEXESTATIC): $(PERLSTATICLIB) $(CONFIGPM) $(PERLEXEST_OBJ) $(PERLEXE_RES)
#-------------------------------------------------------------------------------
# There's no direct way to mark a dependency on
# DynaLoader.pm, so this will have to do
-Extensions : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) $(DYNALOADER)
- $(XCOPY) ..\*.h $(COREDIR)\*.*
- if not exist $(COREDIR)\ppport.h rem. > $(COREDIR)\ppport.h
+
+#most of deps of this target are in DYNALOADER and therefore omitted here
+Extensions : $(PERLDEP) $(DYNALOADER)
$(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic
-Extensions_reonly : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) $(DYNALOADER)
- $(XCOPY) ..\*.h $(COREDIR)\*.*
+Extensions_reonly : $(PERLDEP) $(DYNALOADER)
$(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic +re
-Extensions_static : ..\make_ext.pl ..\lib\buildcustomize.pl list_static_libs.pl $(CONFIGPM)
- $(XCOPY) ..\*.h $(COREDIR)\*.*
- if not exist $(COREDIR)\ppport.h rem. > $(COREDIR)\ppport.h
+Extensions_static : ..\make_ext.pl ..\lib\buildcustomize.pl list_static_libs.pl $(CONFIGPM) $(HAVE_COREDIR)
$(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --static
$(MINIPERL) -I..\lib list_static_libs.pl > Extensions_static
@@ -1457,8 +1466,7 @@ Extensions_nonxs : ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM) ..\pod\pe
$(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --nonxs !libs
#lib must be built, it can't be buildcustomize.pl-ed, and is required for XS building
-$(DYNALOADER) : ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM)
- $(XCOPY) ..\*.h $(COREDIR)\*.*
+$(DYNALOADER) : ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM) $(HAVE_COREDIR)
$(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(EXTDIR) --dir=$(DISTDIR) --dynaloader lib
Extensions_clean :
@@ -1757,7 +1765,7 @@ _clean :
-@erase ..\*$(o) ..\*$(a) ..\*.exp *$(o) *$(a) *.exp *.res
-@erase ..\t\*.exe ..\t\*.dll ..\t\*.bat
-@erase *.ilk
- -@erase *.pdb
+ -@erase *.pdb ..\*.pdb
-@erase Extensions_static
--
1.8.0.msysgit.0
|
From @bulk880003-squash-double-dmake-run.patchFrom c09929acb70a27eb6213d0fd057a981844fdb7f8 Mon Sep 17 00:00:00 2001
From: Daniel Dragan <bulk88@hotmail.com>
Date: Tue, 23 Jun 2015 00:03:04 -0400
Subject: [PATCH 3/5] squash double dmake run
-in $(CONFIGPM) target, remove config_h.PL running dmake again to rebuild
$(CONFIGPM) target, configpm the script does not use config.h as input.
The $(CONFIGPM) target is a choke/serialization point for parallel
building, so it is high value to make it as fast as possible.
Maybe a long time ago, configpm read config.h but it doesn't anymore.
Nearly all the dynamic config vars are determined in config_sh.PL script
and ..\config.sh target. config_h.PL contains very little logic, and this
logic is only for config.h, and only when you want a var to be different
in config.h than it is in Config.pm/Config_heavy.pl. Putting a breakpoint
("system 'pause';") in config_h.PL, copying Config.pm/Config_heavy.pl to
".old" versions, continuing execution in config_h.PL, then diffing the
2 new Configs with the old 2 Configs before pre-config_h.PL and
"$(PLMAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)" shows no differece.
When dmake runs needlessly a 2nd time it emits a warning that nothing
changed. This is intentional, since configpm doesn't update the timestamps
/update the tiles if the Config files are identical to the old ones to
prevent mass clean+rebuild of all modules when nothing global changed.
dmake: Warning: -- Target [..\lib\Config.pm] was made but the time stamp
has not been updated.
---
win32/makefile.mk | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/win32/makefile.mk b/win32/makefile.mk
index 59c8819..221d066 100644
--- a/win32/makefile.mk
+++ b/win32/makefile.mk
@@ -1108,8 +1108,7 @@ regen_config_h:
$(CONFIGPM): ..\config.sh config_h.PL
$(MINIPERL) -I..\lib ..\configpm --chdir=..
$(XCOPY) config.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)" \
- || $(PLMAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)
+ -$(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)"
.\config.h : $(CONFIGPM)
--
1.8.0.msysgit.0
|
From @bulk880004-squash-collapse-3-shell-runs-of-xcopy-into-1-run-of-.patchFrom 548f756ed285fe08c918d8b31df38624a08bdd98 Mon Sep 17 00:00:00 2001
From: Daniel Dragan <bulk88@hotmail.com>
Date: Tue, 23 Jun 2015 01:26:41 -0400
Subject: [PATCH 4/5] squash collapse 3 shell runs of xcopy into 1 run of
shell -collapse 3 shell runs of xcopy into 1 run of
shell
"timeit cmd /c "cmd /c xcopy /f /r /i /d /y ..\perl.exe ..\t\ && cmd /c
xcopy /f /r /i /d /y ..\perl523.dll ..\t\
&& cmd /c xcopy /f /r /i /d /y ..\perlglob.exe ..\t\"" takes 140 ms
"timeit cmd /c "xcopy /f /r /i /d /y ..\perl.exe ..\t\
&& xcopy /f /r /i /d /y ..\perl523.dll ..\t\
&& xcopy /f /r /i /d /y ..\perlglob.exe ..\t\"" takes 78 ms on my machine
---
win32/makefile.mk | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/win32/makefile.mk b/win32/makefile.mk
index 221d066..8412f57 100644
--- a/win32/makefile.mk
+++ b/win32/makefile.mk
@@ -1687,9 +1687,8 @@ minitest : .\config.h $(HAVEMINIPERL) ..\git_version.h $(GLOBEXE) $(CONFIGPM) $(
cd ..\t && perl.exe TEST base/*.t comp/*.t cmd/*.t run/*.t io/*.t re/*.t opbasic/*.t op/*.t uni/*.t perf/*.t pragma/*.t
test-prep : all utils ..\pod\perltoc.pod $(TESTPREPGCC)
- $(XCOPY) $(PERLEXE) ..\t\$(NULL)
- $(XCOPY) $(PERLDLL) ..\t\$(NULL)
- $(XCOPY) $(GLOBEXE) ..\t\$(NULL)
+ $(XCOPY) $(PERLEXE) ..\t\$(NULL) && $(XCOPY) $(PERLDLL) ..\t\$(NULL) \
+ && $(XCOPY) $(GLOBEXE) ..\t\$(NULL)
# If building with gcc versions 4.x.x or greater, then
# the GCC helper DLL will also need copied to the test directory.
--
1.8.0.msysgit.0
|
From @bulk880005-squash-less-steps-build-generate_uudmap.exe.patchFrom 615b1addb3a6b2e6c7fe6e7185c7d2c1a0e846eb Mon Sep 17 00:00:00 2001
From: Daniel Dragan <bulk88@hotmail.com>
Date: Tue, 23 Jun 2015 12:06:21 -0400
Subject: [PATCH 5/5] squash less steps build generate_uudmap.exe -reduce
number of steps to build generate_uudmap.exe. Compiling
(140 ms on GCC 4.8.3) and linking (561 ms) is heavy
weight compared to running generate_uudmap.exe (31 ms)
and compiling globals.c (483 ms). dmake's algo for
doing parallel is poor. On the main parallel pass with
all the mini core .c files compiling ("MINI_OBJ"),
only generate_uudmap.o will be generated as part of
the chain of deps hanging off globals.o, after the 1st
tier of MINI_OBJ has compiled in parallel, dmake will
do another sweep of MINI_OBJ, this time it will find
generate_uudmap.exe node and run linking, at this 2nd
tier nothing ran except linking generate_uudmap. No
parallel anything. This is a chokepoint. Then dmake
does a 3rd sweep and runs the 3rd tier, which is run
generate_uudmap.exe, again nothing parallel happens
here. By combining compiling and linking in 1 target,
the time spent serially linking generate_uudmap.exe, is
moved into parallel time when the rest of MINI_OBJ
compiles. Also a little bit of CPU and IO is saved by
launching less processes (less cmd.exe shells, gcc/g++
process ran only once (gcc/g++ still run many
standalone procs internally but now only 1 gcc was
started not 2)). -suppress warnings from dmake with
.UPDATEALL, the 3 generated headers are made at the
same time in real life, in the makefile it was written
as if they weren't dmake: Warning:--Found file
corresponding to virtual target [..\uudmap.h]. dmake:
Warning:--Found file corresponding to virtual target
[..\mg_data.h]. -move generating the headers to the
target that generates generate_uudmap.exe, this moves
some serialization time, albeit small (30 ms) from
right before miniperl link, to parallel time during 1st
pass of MINI_OBJ
---
win32/makefile.mk | 23 ++++++++---------------
1 file changed, 8 insertions(+), 15 deletions(-)
diff --git a/win32/makefile.mk b/win32/makefile.mk
index 8412f57..8840a16 100644
--- a/win32/makefile.mk
+++ b/win32/makefile.mk
@@ -978,7 +978,6 @@ MINICORE_OBJ = $(MINIDIR)\{$(MICROCORE_OBJ:f) miniperlmain$(o) perlio$(o)}
MINIWIN32_OBJ = $(MINIDIR)\{$(WIN32_OBJ:f)}
MINI_OBJ = $(MINICORE_OBJ) $(MINIWIN32_OBJ)
DLL_OBJ = $(DYNALOADER)
-GENUUDMAP_OBJ = $(GENUUDMAP:db:+$(o))
PERLDLL_OBJ = $(CORE_OBJ)
PERLEXE_OBJ = perlmain$(o)
@@ -1388,9 +1387,14 @@ $(PERLEXE_RES): perlexe.rc $(PERLEXE_MANIFEST) $(PERLEXE_ICO)
$(MINIDIR)\globals$(o) : $(GENERATED_HEADERS)
-$(UUDMAP_H) $(MG_DATA_H) : $(BITCOUNT_H)
-
-$(BITCOUNT_H) : $(GENUUDMAP)
+$(GENUUDMAP) $(GENERATED_HEADERS) .UPDATEALL : ..\mg_raw.h
+.IF "$(CCTYPE)" == "GCC"
+ $(LINK32) $(CFLAGS_O) -o..\generate_uudmap.exe ..\generate_uudmap.c $(BLINK_FLAGS) \
+ $(mktmp $(LKPRE) $(LIBFILES) $(LKPOST))
+.ELSE
+ $(CC) $(CFLAGS_O) -Fe..\generate_uudmap.exe ..\generate_uudmap.c @$(mktmp -link $(LIBFILES)) -link $(BLINK_FLAGS)
+ $(EMBED_EXE_MANI:s/$@/..\generate_uudmap.exe/)
+.ENDIF
$(GENUUDMAP) $(GENERATED_HEADERS)
#This generates a stub ppport.h & creates & fills /lib/CORE to allow for XS
@@ -1401,17 +1405,6 @@ $(COREDIR)\ppport.h : $(CORE_H)
$(XCOPY) *.h $(COREDIR)\*.* && $(RCOPY) include $(COREDIR)\*.* && $(XCOPY) ..\*.h $(COREDIR)\*.*
@( echo #define aTHXR aTHX&& echo #define dTHXR dTHX) >$@
-$(GENUUDMAP_OBJ) : ..\mg_raw.h
-
-$(GENUUDMAP) : $(GENUUDMAP_OBJ)
-.IF "$(CCTYPE)" == "GCC"
- $(LINK32) -v -o $@ $(BLINK_FLAGS) \
- $(mktmp $(LKPRE) $(GENUUDMAP_OBJ) $(LIBFILES) $(LKPOST))
-.ELSE
- $(LINK32) -out:$@ $(BLINK_FLAGS) @$(mktmp $(LIBFILES) $(GENUUDMAP_OBJ))
- $(EMBED_EXE_MANI)
-.ENDIF
-
perlmain.c : runperl.c
copy runperl.c perlmain.c
--
1.8.0.msysgit.0
|
From @tonycozOn Tue Jun 23 17:01:43 2015, bulk88 wrote:
Unfortunately the build failed for me: 1 file(s) copied. I expect utils needs to depend on Extensions_nonxs, or a new directory needs to be Tony |
From @bulk88On Wed Jul 15 23:58:52 2015, tonyc wrote:
Getopt::Std is permanently installed in /lib, no buildcustomize, no Makefile.PL. http://perl5.git.perl.org/perl.git/blob/HEAD:/lib/Getopt/Std.pm pl2bat.pl is run as "..\miniperl.exe -I..\lib bin\pl2bat.pl", the -I..\lib means it sees root /lib. Putting BEGIN{ before "use Getopt::Std;" in pl2bat.pl gives me C:\perl521\srcnewb4opt\lib which looks sane for miniperl.
Is full perl somehow running pl2bat.pl? The top of pl2bat.pl has eval 'exec perl -x -S "$0" Rebased patch set on blead attached. Time::HiRes's abandonment still needs unresolved for the final single patch I create. my build log for "dmake utils CCTYPE=MSVC70" cl -c -nologo -GF -W3 -I.\include -I. -I.. -DWIN32 -D_CONSOLE -DNO_STRICT -DPERL C:\perl521\srcnewb4opt\win32>dmake utils CCTYPE=MSVC70 -- |
From @bulk880001-WIP-add-parallel-support-for-Win32-dmake-building.patchFrom 47ce66d9a9e6be0e867f08f031fe036cdc9497b7 Mon Sep 17 00:00:00 2001
From: Daniel Dragan <bulk88@hotmail.com>
Date: Mon, 11 May 2015 16:28:02 -0400
Subject: [PATCH 1/5] WIP add parallel support for Win32 dmake building
-if building a 32 bit Perl, with a 64bit dmake, force
PROCESSOR_ARCHITECTURE to x86, otherwise the next couple macros will
try to build a 64 bit perl with 32 bit CCs
-PDBOUT is required to run multiple VC cl.exe processes, otherwise all
VC cl.exe processes will error out trying to lock and write to a
file called "vc*0.pdb", PDBOUT is empty for GCC builds since they dont
have PDB files
-to reduce excess IO calls checking for miniperl.exe plus remove a
"Found file corresponding to virtual target" warning that dmake emits,
make this makefile unaware that miniperl.exe exists. dmake has a very bad
exponential number of IO/stat() calls for every target that is yet
unbuilt, see procmon logs in [perl #123854], so instead of a stat on
../miniperl.exe, then ../lib/buildcustomize.pl, it will be just a stat on
../lib/buildcustomize.pl
-remove makefile awareness of ..\lib\Config_heavy.pl,
if ..\lib\Config_heavy.pl is ever updated, so is ..\lib\Config.pm
less IO calls for dmake, see also commit 962e59f394
-to break up the sequential nature of this makefile, allow (XS) Extensions
to build, before (AKA parallel with) perl5**.dll and perl.exe are built.
This is achieved by running makedef.pl very early, and generating
perl5**.lib/libperl5**.a from the def file, and NOT generating
perl5**.lib/libperl5**.a from perl5**.dll at link time of perl5**.dll.
The conquence of this is, declspec(dllexport) is now unusable, but exports
should be centrally managed anyways (embed.fnc/etc) so this isn't a big
issue.
-EUMM makefiles shouldn't be subject to parallelism, untested and disable
for now, plus creating PLMAKE allows "dmake -n" to work for diagnosing
this makefile
-slim down all target. Extensions* and UNIDATAFILES now know how to build
themselves, the parallel nature says you can't rely on left to right
execution of deps in a parent node to make a child (dep) node build
-miniperl.exe used to be unbuildable from a clean tree except from all
target, since miniperl.exe didn't depend on mini config.h. Also mini dir
can't be a target, since each .obj built will dirty the mini dir's time
stamp and infinite loop happens, instead use a .exists file
-dmake rescans for all outstanding targets, at each recipe line to run,
this early in the build process, there are an enormous amount of files to
test for, so the echos are very slow, 350ms each, so combine as many of
the lines of mini/.exists AKA mini config.h together as possible. ".IF"
can't be put inside "one line", so not all lines were merged. Shell "if"
could be used to further group the echos but this enough to make the pause
/cpu spining not really noticable. USE_CPLUSPLUS contains an unrolled line
(the #endif) on both sides. See also procmon logs in [perl #123854]
-perllib.obj/.o needs perllibst.h which is built by miniperl+a script,
perllibst.h target doesn't need any Extensions*, so perllib.obj is still
quick to build
-perldll.def doesn't need perllibst.h since makedef.pl uses
$Config{static_ext} to find boot xsubs to export, makedef.pl does not
read perllibst.h, remove perllibst.h for more parallelism/less things to
build before perldll.def runs, and therefore Extensions (XS) starts to
run quicker, and Extensions (XS) is the longest target to build
-perlmain and perlmainst .obj/.o needs full perl headers to compile, they
aren't like generate_uudmap.exe and perlglob.exe which are perlapi unaware
-perl.exe doesn't need perl5**.dll to build, just the imp lib to
perl5**.dll, perl.exe is in the same category as XS modules, more
parallelism
-ppport.h isn't needed in blead perl, since blead is the newest perl in the
world, this allows Extensions (XS) to run sooner, ppport.h is replaced by
a dummy file
-break up the dependencies of all the Extensions* targets, static
(just Win32CORE normally), dynamic XS and non-XS, these 3 run in parallel
now, non-XS doesn't need perl5**.lib/.a or any C headers, just PP
Config.pm
-DLL XS requires PP DynaLoader.pm for dl_findfile() otherwise
Mkbootstrap.pm fatally errors, Mkbootstrap.pm could be revised to not load
DynaLoader on Win32, since " if ($Config{'dlsrc'} =~ /^dl_dld/){" is
false, but this is the easier path right now
-DynaLoader requires module lib to build itself, but Extensions_nonxs
happens to not need mod lib, so move where mod lib is built
-in utils target, change it so it can run with miniperl, more parallelism,
pl2bat doesn't require full perl, the full perl stuff is from
commit 3fe9a6f19e from 5.003 and no ML archive is available to explain why
full perl was used instead of mini perl
-add 4 modules to buildcustomize so nonxs and xs build simultaneously
-remove ancient cruft from commit 26618a56da from 1997 from README.w32
dmake is automatically set inside CFG_VARS today. OSRELEASE is irrelavent
today, Perl doesn't use any of the defaults (like name of CC) from the
maketool.
-Time-HiRes has had a min ver of 5.6.0 since commit 90e44bf683 / release
1.9724 in 2011. dTHXR and aTHXR are for 5.005 threads compat but they are
pointless since there is usage of "unsafe" dTHX in other places in
Time-HiRes. Perl's headers don't define those 2, so they were defined to
>= 5.6.0 threads in ppport.h but a dummy ppport.h file is used, which
doesn't contain those defines to the new API, so remove usage of
pre-5.6.0 macros, this allows Time-HiRes to compile with the dummy
ppport.h with blead perl
-Reduce 21 calls of "cmd.exe /x/d/c cd" by miniperl to just 1 by saving and
reusing cwd. This reduced the amount of time to run
"..\miniperl.exe -I..\lib -f ..\write_buildcustomize.pl .." from 312 ms
to 62 ms elapsed time using timeit.exe for me.
---
Porting/Maintainers.pl | 2 +
README.win32 | 24 ++--
cpan/Time-HiRes/HiRes.pm | 2 +-
cpan/Time-HiRes/HiRes.xs | 4 +-
t/porting/customized.dat | 1 +
win32/makefile.mk | 486 +++++++++++++++++++++++++---------------------
write_buildcustomize.pl | 17 ++-
7 files changed, 299 insertions(+), 237 deletions(-)
diff --git a/Porting/Maintainers.pl b/Porting/Maintainers.pl
index fe357c6..f9c5589 100755
--- a/Porting/Maintainers.pl
+++ b/Porting/Maintainers.pl
@@ -1218,6 +1218,8 @@ use File::Glob qw(:case);
'Time::HiRes' => {
'DISTRIBUTION' => 'ZEFRAM/Time-HiRes-1.9726.tar.gz',
'FILES' => q[cpan/Time-HiRes],
+ # CPAN release eventually
+ 'CUSTOMIZED' => [ 'HiRes.xs' ],
},
'Time::Local' => {
diff --git a/README.win32 b/README.win32
index ec29cfa..b9875e6 100644
--- a/README.win32
+++ b/README.win32
@@ -96,11 +96,13 @@ See L<Usage Hints for Perl on Windows> below for general hints about this.
=item Make
You need a "make" program to build the sources. If you are using
-Visual C++ or the Windows SDK tools, nmake will work. Builds using
-the gcc need dmake.
-
-dmake is a freely available make that has very nice macro features
-and parallelability.
+Visual C++ or the Windows SDK tools, you can use nmake supplied with Visual C++
+or Windows SDK. You may also use, for Visual C++ or Windows SDK, dmake instead
+of nmake. dmake is open source software, but is not included with Visual C++ or
+Windows SDK. If you want parallel building with Visual C++ or
+Windows SDK you must use dmake instead of nmake. Builds using gcc need dmake.
+nmake is not supported for gcc builds. gmake is not supported, but might be
+added in the future.
A port of dmake for Windows is available from:
@@ -135,13 +137,6 @@ console already set up for your target architecture (x86-32 or x86-64 or IA64).
With the newer compilers, you may also use the older batch files if you choose
so.
-You can also use dmake to build using Visual C++; provided, however,
-you set OSRELEASE to "microsft" (or whatever the directory name
-under which the Visual C dmake configuration lives) in your environment
-and edit win32/config.vc to change "make=nmake" into "make=dmake". The
-latter step is only essential if you want to use dmake as your default
-make for building extensions using MakeMaker.
-
=item Microsoft Visual C++ 2008-2013 Express Edition
These free versions of Visual C++ 2008-2013 Professional contain the same
@@ -400,6 +395,11 @@ perl523.dll at the perl toplevel, and various other extension dll's
under the lib\auto directory. If the build fails for any reason, make
sure you have done the previous steps correctly.
+To try dmake's parallel mode, type "dmake -P2", where 2, is the maximum number
+of parallel jobs you want to run. A number of things in the build process will
+run in parallel, but there are serialization points where you will see just 1
+CPU maxed out. This is normal.
+
If you are advanced enough with building C code, here is a suggestion to speed
up building perl, and the later C<make test>. Try to keep your PATH enviromental
variable with the least number of folders possible (remember to keep your C
diff --git a/cpan/Time-HiRes/HiRes.pm b/cpan/Time-HiRes/HiRes.pm
index cf64bc1..0ee2c62 100644
--- a/cpan/Time-HiRes/HiRes.pm
+++ b/cpan/Time-HiRes/HiRes.pm
@@ -23,7 +23,7 @@ our @EXPORT_OK = qw (usleep sleep ualarm alarm gettimeofday time tv_interval
stat lstat
);
-our $VERSION = '1.9726';
+our $VERSION = '1.9726_01';
our $XS_VERSION = $VERSION;
$VERSION = eval $VERSION;
diff --git a/cpan/Time-HiRes/HiRes.xs b/cpan/Time-HiRes/HiRes.xs
index 96640e9..9a852c4 100644
--- a/cpan/Time-HiRes/HiRes.xs
+++ b/cpan/Time-HiRes/HiRes.xs
@@ -731,7 +731,7 @@ myNVtime()
static void
hrstatns(UV *atime_nsec, UV *mtime_nsec, UV *ctime_nsec)
{
- dTHXR;
+ dTHX;
#if TIME_HIRES_STAT == 1
*atime_nsec = PL_statcache.st_atimespec.tv_nsec;
*mtime_nsec = PL_statcache.st_mtimespec.tv_nsec;
@@ -1284,7 +1284,7 @@ PROTOTYPE: ;$
fakeop.op_flags = GIMME_V == G_ARRAY ? OPf_WANT_LIST :
GIMME_V == G_SCALAR ? OPf_WANT_SCALAR : OPf_WANT_VOID;
PL_op = &fakeop;
- (void)fakeop.op_ppaddr(aTHXR);
+ (void)fakeop.op_ppaddr(aTHX);
SPAGAIN;
LEAVE;
nret = SP+1 - &ST(0);
diff --git a/t/porting/customized.dat b/t/porting/customized.dat
index ee65785..c3eeace 100644
--- a/t/porting/customized.dat
+++ b/t/porting/customized.dat
@@ -57,6 +57,7 @@ Win32API::File cpan/Win32API-File/t/file.t 124e64aa77e755235eb297644a87fac5388d3
Win32API::File cpan/Win32API-File/t/tie.t 712ea7edd0cc805ce1c0b8172c01b03dd19b583d
Win32API::File cpan/Win32API-File/typemap 24bff088babeadac0873e8df390d1666d9d9db4a
autodie cpan/autodie/t/mkdir.t 9e70d2282a3cc7d76a78bf8144fccba20fb37dac
+Time::HiRes cpan/Time-HiRes/HiRes.xs 0a850b6dee1f2c60ade3d4c33fab7c69b02ddc45
podlators cpan/podlators/scripts/pod2man.PL f81acf53f3ff46cdcc5ebdd661c5d13eb35d20d6
podlators cpan/podlators/scripts/pod2text.PL b4693fcfe4a0a1b38a215cfb8985a65d5d025d69
version cpan/version/lib/version.pm d0923b895d57f1d669ae36fcf85c87b16db341d1
diff --git a/win32/makefile.mk b/win32/makefile.mk
index 48f34bb..aa21094 100644
--- a/win32/makefile.mk
+++ b/win32/makefile.mk
@@ -345,6 +345,10 @@ BUILDOPT += -DPERL_IMPLICIT_SYS
PROCESSOR_ARCHITECTURE *= x86
+.IF "$(WIN64)" == "undef"
+PROCESSOR_ARCHITECTURE = x86
+.ENDIF
+
.IF "$(WIN64)" == ""
# When we are running from a 32bit cmd.exe on AMD64 then
# PROCESSOR_ARCHITECTURE is set to x86 and PROCESSOR_ARCHITEW6432
@@ -508,6 +512,7 @@ LINK_FLAGS = $(LINK_DBG) -L"$(INST_COREDIR)" -L"$(CCLIBDIR)"
OBJOUT_FLAG = -o
EXEOUT_FLAG = -o
LIBOUT_FLAG =
+PDBOUT =
BUILDOPT += -fno-strict-aliasing -mms-bitfields
MINIBUILDOPT += -fno-strict-aliasing
@@ -653,11 +658,11 @@ CFLAGS = $(EXTRACFLAGS) $(INCLUDES) $(DEFINES) $(LOCDEFS) \
LINK_FLAGS = -nologo -nodefaultlib $(LINK_DBG) \
-libpath:"$(INST_COREDIR)" \
-machine:$(PROCESSOR_ARCHITECTURE)
-LIB_FLAGS = $(LIB_FLAGS) -nologo
+LIB_FLAGS += -nologo
OBJOUT_FLAG = -Fo
EXEOUT_FLAG = -Fe
LIBOUT_FLAG = /out:
-
+PDBOUT = -Fd$*.pdb
TESTPREPGCC =
.ENDIF
@@ -717,7 +722,7 @@ LKPOST = )
.SUFFIXES : .c .i $(o) .dll $(a) .exe .rc .res
.c$(o):
- $(CC) -c $(null,$(<:d) $(NULL) -I$(<:d)) $(CFLAGS_O) $(OBJOUT_FLAG)$@ $<
+ $(CC) -c $(null,$(<:d) $(NULL) -I$(<:d)) $(CFLAGS_O) $(OBJOUT_FLAG)$@ $(PDBOUT) $<
.c.i:
$(CC) -c $(null,$(<:d) $(NULL) -I$(<:d)) $(CFLAGS_O) -E $< >$@
@@ -744,14 +749,19 @@ $(o).dll:
#
# various targets
+
+#do not put $(MINIPERL) as a dep/prereq in a rule, instead put $(HAVEMINIPERL)
+#$(MINIPERL) is not a buildable target, use "dmake mp" if you want to just build
+#miniperl alone
MINIPERL = ..\miniperl.exe
+HAVEMINIPERL = ..\lib\buildcustomize.pl
MINIDIR = .\mini
PERLEXE = ..\perl.exe
WPERLEXE = ..\wperl.exe
PERLEXESTATIC = ..\perl-static.exe
STATICDIR = .\static.tmp
GLOBEXE = ..\perlglob.exe
-CONFIGPM = ..\lib\Config.pm ..\lib\Config_heavy.pl
+CONFIGPM = ..\lib\Config.pm
GENUUDMAP = ..\generate_uudmap.exe
.IF "$(BUILD_STATIC)" == "define" || "$(ALL_STATIC)" == "define"
PERLSTATIC = static
@@ -778,7 +788,7 @@ PERLDLL_RES =
# This used to be $(PERLEXE), but at worst it is the .dll that they depend
# on and really only the interface - i.e. the .def file used to export symbols
# from the .dll
-PERLDEP = perldll.def
+PERLDEP = $(PERLIMPLIB)
PL2BAT = bin\pl2bat.pl
@@ -834,9 +844,21 @@ INT64 = __int64
# makedef.pl must be updated if this changes, and this should normally
# only change when there is an incompatible revision of the public API.
PERLIMPLIB *= ..\perl523$(a)
+PERLEXPLIB *= ..\perl523.exp
PERLSTATICLIB *= ..\perl523s$(a)
PERLDLL = ..\perl523.dll
+#EUMM on Win32 isn't ready for parallel make, so only allow this file to be parallel
+#$(MAKE) will contain the -P that this makefile was called with, which is bad for
+#make_ext.pl since upto jobs*jobs processes will run instead of jobs
+#also any recipie containing $(MAKE) is special cased by dmake to execute recipes
+#containing $(MAKE) when "dmake -n" is executed, which causes recursive calls
+#to dmake, which means "dmake -n" is then broken as a diagnostic tool since
+#"dmake -n" will invoke all the make_ext.pl scripts build things instead of
+#showing what to build since $(MAKE) is an arg to make_ext.pl, not an invocation
+#of the dmake process
+PLMAKE = dmake
+
XCOPY = xcopy /f /r /i /d /y
RCOPY = xcopy /f /r /i /e /d /y
NOOP = @rem
@@ -995,7 +1017,7 @@ CFG_VARS = \
libperl=$(PERLIMPLIB:f) ~ \
libpth=$(CCLIBDIR);$(EXTRALIBDIRS) ~ \
libc=$(LIBC) ~ \
- make=dmake ~ \
+ make=$(PLMAKE) ~ \
_o=$(o) ~ \
obj_ext=$(o) ~ \
_a=$(a) ~ \
@@ -1017,9 +1039,7 @@ CFG_VARS = \
# Top targets
#
-all : CHECKDMAKE .\config.h ..\git_version.h $(GLOBEXE) $(MINIPERL) \
- $(CONFIGPM) $(UNIDATAFILES) MakePPPort \
- $(PERLEXE) Extensions Extensions_nonxs $(PERLSTATIC)
+all : CHECKDMAKE rebasePE $(UNIDATAFILES) Extensions_nonxs $(PERLSTATIC)
regnodes : ..\regnodes.h
@@ -1057,178 +1077,13 @@ perlglob$(o) : perlglob.c
config.w32 : $(CFGSH_TMPL)
copy $(CFGSH_TMPL) config.w32
-#
-# Copy the template config.h and set configurables at the end of it
-# as per the options chosen and compiler used.
-# Note: This config.h is only used to build miniperl.exe anyway, but
-# it's as well to have its options correct to be sure that it builds
-# and so that it's "-V" options are correct for use by makedef.pl. The
-# real config.h used to build perl.exe is generated from the top-level
-# config_h.SH by config_h.PL (run by miniperl.exe).
-#
-.\config.h : $(CFGH_TMPL) $(CORE_NOCFG_H)
- -del /f config.h
- copy $(CFGH_TMPL) config.h
- @echo.>>$@
- @echo #ifndef _config_h_footer_>>$@
- @echo #define _config_h_footer_>>$@
- @echo #undef Off_t>>$@
- @echo #undef LSEEKSIZE>>$@
- @echo #undef Off_t_size>>$@
- @echo #undef PTRSIZE>>$@
- @echo #undef SSize_t>>$@
- @echo #undef HAS_ATOLL>>$@
- @echo #undef HAS_STRTOLL>>$@
- @echo #undef HAS_STRTOULL>>$@
- @echo #undef Size_t_size>>$@
- @echo #undef IVTYPE>>$@
- @echo #undef UVTYPE>>$@
- @echo #undef IVSIZE>>$@
- @echo #undef UVSIZE>>$@
- @echo #undef NV_PRESERVES_UV>>$@
- @echo #undef NV_PRESERVES_UV_BITS>>$@
- @echo #undef IVdf>>$@
- @echo #undef UVuf>>$@
- @echo #undef UVof>>$@
- @echo #undef UVxf>>$@
- @echo #undef UVXf>>$@
- @echo #undef USE_64_BIT_INT>>$@
- @echo #undef Gconvert>>$@
- @echo #undef HAS_FREXPL>>$@
- @echo #undef HAS_ISNANL>>$@
- @echo #undef HAS_MODFL>>$@
- @echo #undef HAS_MODFL_PROTO>>$@
- @echo #undef HAS_SQRTL>>$@
- @echo #undef HAS_STRTOLD>>$@
- @echo #undef PERL_PRIfldbl>>$@
- @echo #undef PERL_PRIgldbl>>$@
- @echo #undef PERL_PRIeldbl>>$@
- @echo #undef PERL_SCNfldbl>>$@
- @echo #undef NVTYPE>>$@
- @echo #undef NVSIZE>>$@
- @echo #undef LONG_DOUBLESIZE>>$@
- @echo #undef NV_OVERFLOWS_INTEGERS_AT>>$@
- @echo #undef NVef>>$@
- @echo #undef NVff>>$@
- @echo #undef NVgf>>$@
- @echo #undef USE_LONG_DOUBLE>>$@
- @echo #undef USE_CPLUSPLUS>>$@
-.IF "$(USE_LARGE_FILES)"=="define"
- @echo #define Off_t $(INT64)>>$@
- @echo #define LSEEKSIZE ^8>>$@
- @echo #define Off_t_size ^8>>$@
-.ELSE
- @echo #define Off_t long>>$@
- @echo #define LSEEKSIZE ^4>>$@
- @echo #define Off_t_size ^4>>$@
-.ENDIF
-.IF "$(WIN64)"=="define"
- @echo #define PTRSIZE ^8>>$@
- @echo #define SSize_t $(INT64)>>$@
- @echo #define HAS_ATOLL>>$@
- @echo #define HAS_STRTOLL>>$@
- @echo #define HAS_STRTOULL>>$@
- @echo #define Size_t_size ^8>>$@
-.ELSE
- @echo #define PTRSIZE ^4>>$@
- @echo #define SSize_t int>>$@
- @echo #undef HAS_ATOLL>>$@
- @echo #undef HAS_STRTOLL>>$@
- @echo #undef HAS_STRTOULL>>$@
- @echo #define Size_t_size ^4>>$@
-.ENDIF
-.IF "$(USE_64_BIT_INT)"=="define"
- @echo #define IVTYPE $(INT64)>>$@
- @echo #define UVTYPE unsigned $(INT64)>>$@
- @echo #define IVSIZE ^8>>$@
- @echo #define UVSIZE ^8>>$@
-.IF "$(USE_LONG_DOUBLE)"=="define"
- @echo #define NV_PRESERVES_UV>>$@
- @echo #define NV_PRESERVES_UV_BITS 64>>$@
-.ELSE
- @echo #undef NV_PRESERVES_UV>>$@
- @echo #define NV_PRESERVES_UV_BITS 53>>$@
-.ENDIF
- @echo #define IVdf "I64d">>$@
- @echo #define UVuf "I64u">>$@
- @echo #define UVof "I64o">>$@
- @echo #define UVxf "I64x">>$@
- @echo #define UVXf "I64X">>$@
- @echo #define USE_64_BIT_INT>>$@
-.ELSE
- @echo #define IVTYPE long>>$@
- @echo #define UVTYPE unsigned long>>$@
- @echo #define IVSIZE ^4>>$@
- @echo #define UVSIZE ^4>>$@
- @echo #define NV_PRESERVES_UV>>$@
- @echo #define NV_PRESERVES_UV_BITS 32>>$@
- @echo #define IVdf "ld">>$@
- @echo #define UVuf "lu">>$@
- @echo #define UVof "lo">>$@
- @echo #define UVxf "lx">>$@
- @echo #define UVXf "lX">>$@
- @echo #undef USE_64_BIT_INT>>$@
-.ENDIF
-.IF "$(USE_LONG_DOUBLE)"=="define"
- @echo #define Gconvert(x,n,t,b) sprintf((b),"%.*""Lg",(n),(x))>>$@
- @echo #define HAS_FREXPL>>$@
- @echo #define HAS_ISNANL>>$@
- @echo #define HAS_MODFL>>$@
- @echo #define HAS_MODFL_PROTO>>$@
- @echo #define HAS_SQRTL>>$@
- @echo #define HAS_STRTOLD>>$@
- @echo #define PERL_PRIfldbl "Lf">>$@
- @echo #define PERL_PRIgldbl "Lg">>$@
- @echo #define PERL_PRIeldbl "Le">>$@
- @echo #define PERL_SCNfldbl "Lf">>$@
- @echo #define NVTYPE long double>>$@
-.IF "$(WIN64)"=="define"
- @echo #define NVSIZE ^16>>$@
- @echo #define LONG_DOUBLESIZE ^16>>$@
-.ELSE
- @echo #define NVSIZE ^12>>$@
- @echo #define LONG_DOUBLESIZE ^12>>$@
-.ENDIF
- @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>>$@
- @echo #define NVef "Le">>$@
- @echo #define NVff "Lf">>$@
- @echo #define NVgf "Lg">>$@
- @echo #define USE_LONG_DOUBLE>>$@
-.ELSE
- @echo #define Gconvert(x,n,t,b) sprintf((b),"%.*g",(n),(x))>>$@
- @echo #undef HAS_FREXPL>>$@
- @echo #undef HAS_ISNANL>>$@
- @echo #undef HAS_MODFL>>$@
- @echo #undef HAS_MODFL_PROTO>>$@
- @echo #undef HAS_SQRTL>>$@
- @echo #undef HAS_STRTOLD>>$@
- @echo #undef PERL_PRIfldbl>>$@
- @echo #undef PERL_PRIgldbl>>$@
- @echo #undef PERL_PRIeldbl>>$@
- @echo #undef PERL_SCNfldbl>>$@
- @echo #define NVTYPE double>>$@
- @echo #define NVSIZE ^8>>$@
- @echo #define LONG_DOUBLESIZE ^8>>$@
- @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>>$@
- @echo #define NVef "e">>$@
- @echo #define NVff "f">>$@
- @echo #define NVgf "g">>$@
- @echo #undef USE_LONG_DOUBLE>>$@
-.ENDIF
-.IF "$(USE_CPLUSPLUS)"=="define"
- @echo #define USE_CPLUSPLUS>>$@
-.ELSE
- @echo #undef USE_CPLUSPLUS>>$@
-.ENDIF
- @echo #endif>>$@
-
-..\git_version.h : $(MINIPERL) ..\make_patchnum.pl
+..\git_version.h : $(HAVEMINIPERL) ..\make_patchnum.pl
cd .. && miniperl -Ilib make_patchnum.pl
# make sure that we recompile perl.c if the git version changes
..\perl$(o) : ..\git_version.h
-..\config.sh : config.w32 $(MINIPERL) config_sh.PL FindExt.pm
+..\config.sh : config.w32 $(HAVEMINIPERL) config_sh.PL FindExt.pm
$(MINIPERL) -I..\lib config_sh.PL --cfgsh-option-file \
$(mktmp $(CFG_VARS)) config.w32 > ..\config.sh
@@ -1244,18 +1099,18 @@ regen_config_h:
-$(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)"
rename config.h $(CFGH_TMPL)
-$(CONFIGPM) : $(MINIPERL) ..\config.sh config_h.PL
+$(CONFIGPM): ..\config.sh config_h.PL
$(MINIPERL) -I..\lib ..\configpm --chdir=..
$(XCOPY) ..\*.h $(COREDIR)\*.*
$(XCOPY) *.h $(COREDIR)\*.*
$(RCOPY) include $(COREDIR)\*.*
$(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)" \
- || $(MAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)
+ || $(PLMAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)
-# See the comment in Makefile.SH explaining this seemingly cranky ordering
-$(MINIPERL) : ..\lib\buildcustomize.pl
+.\config.h : $(CONFIGPM)
-..\lib\buildcustomize.pl : $(MINIDIR) $(MINI_OBJ) $(CRTIPMLIBS) ..\write_buildcustomize.pl
+# See the comment in Makefile.SH explaining this seemingly cranky ordering
+..\lib\buildcustomize.pl : $(MINI_OBJ) ..\write_buildcustomize.pl
.IF "$(CCTYPE)" == "GCC"
$(LINK32) -v -mconsole -o $(MINIPERL) $(BLINK_FLAGS) \
$(mktmp $(LKPRE) $(MINI_OBJ) $(LIBFILES) $(LKPOST))
@@ -1266,31 +1121,202 @@ $(MINIPERL) : ..\lib\buildcustomize.pl
.ENDIF
$(MINIPERL) -I..\lib -f ..\write_buildcustomize.pl ..
-$(MINIDIR) :
+#convinence target, get a working miniperl
+mp : $(CONFIGPM)
+
+$(MINIDIR)\.exists : $(CFGH_TMPL)
if not exist "$(MINIDIR)" mkdir "$(MINIDIR)"
+#
+# Copy the template config.h and set configurables at the end of it
+# as per the options chosen and compiler used.
+# Note: This config.h is only used to build miniperl.exe anyway, but
+# it's as well to have its options correct to be sure that it builds
+# and so that it's "-V" options are correct for use by makedef.pl. The
+# real config.h used to build perl.exe is generated from the top-level
+# config_h.SH by config_h.PL (run by miniperl.exe).
+#
+# MINIDIR generates config.h so miniperl.exe is not rebuilt when the 2nd
+# config.h is generated in CONFIGPM target, see also the comments for $(MINI_OBJ).
+ -if exist config.h del /f config.h
+ copy $(CFGH_TMPL) config.h
+ @(echo.&& \
+ echo #ifndef _config_h_footer_&& \
+ echo #define _config_h_footer_&& \
+ echo #undef Off_t&& \
+ echo #undef LSEEKSIZE&& \
+ echo #undef Off_t_size&& \
+ echo #undef PTRSIZE&& \
+ echo #undef SSize_t&& \
+ echo #undef HAS_ATOLL&& \
+ echo #undef HAS_STRTOLL&& \
+ echo #undef HAS_STRTOULL&& \
+ echo #undef Size_t_size&& \
+ echo #undef IVTYPE&& \
+ echo #undef UVTYPE&& \
+ echo #undef IVSIZE&& \
+ echo #undef UVSIZE&& \
+ echo #undef NV_PRESERVES_UV&& \
+ echo #undef NV_PRESERVES_UV_BITS&& \
+ echo #undef IVdf&& \
+ echo #undef UVuf&& \
+ echo #undef UVof&& \
+ echo #undef UVxf&& \
+ echo #undef UVXf&& \
+ echo #undef USE_64_BIT_INT&& \
+ echo #undef Gconvert&& \
+ echo #undef HAS_FREXPL&& \
+ echo #undef HAS_ISNANL&& \
+ echo #undef HAS_MODFL&& \
+ echo #undef HAS_MODFL_PROTO&& \
+ echo #undef HAS_SQRTL&& \
+ echo #undef HAS_STRTOLD&& \
+ echo #undef PERL_PRIfldbl&& \
+ echo #undef PERL_PRIgldbl&& \
+ echo #undef PERL_PRIeldbl&& \
+ echo #undef PERL_SCNfldbl&& \
+ echo #undef NVTYPE&& \
+ echo #undef NVSIZE&& \
+ echo #undef LONG_DOUBLESIZE&& \
+ echo #undef NV_OVERFLOWS_INTEGERS_AT&& \
+ echo #undef NVef&& \
+ echo #undef NVff&& \
+ echo #undef NVgf&& \
+ echo #undef USE_LONG_DOUBLE&& \
+ echo #undef USE_CPLUSPLUS)>> config.h
+.IF "$(USE_LARGE_FILES)"=="define"
+ @(echo #define Off_t $(INT64)&& \
+ echo #define LSEEKSIZE ^8&& \
+ echo #define Off_t_size ^8)>> config.h
+.ELSE
+ @(echo #define Off_t long&& \
+ echo #define LSEEKSIZE ^4&& \
+ echo #define Off_t_size ^4)>> config.h
+.ENDIF
+.IF "$(WIN64)"=="define"
+ @(echo #define PTRSIZE ^8&& \
+ echo #define SSize_t $(INT64)&& \
+ echo #define HAS_ATOLL&& \
+ echo #define HAS_STRTOLL&& \
+ echo #define HAS_STRTOULL&& \
+ echo #define Size_t_size ^8)>> config.h
+.ELSE
+ @(echo #define PTRSIZE ^4&& \
+ echo #define SSize_t int&& \
+ echo #undef HAS_ATOLL&& \
+ echo #undef HAS_STRTOLL&& \
+ echo #undef HAS_STRTOULL&& \
+ echo #define Size_t_size ^4)>> config.h
+.ENDIF
+.IF "$(USE_64_BIT_INT)"=="define"
+ @(echo #define IVTYPE $(INT64)&& \
+ echo #define UVTYPE unsigned $(INT64)&& \
+ echo #define IVSIZE ^8&& \
+ echo #define UVSIZE ^8)>> config.h
+.IF "$(USE_LONG_DOUBLE)"=="define"
+ @(echo #define NV_PRESERVES_UV&& \
+ echo #define NV_PRESERVES_UV_BITS 64)>> config.h
+.ELSE
+ @(echo #undef NV_PRESERVES_UV&& \
+ echo #define NV_PRESERVES_UV_BITS 53)>> config.h
+.ENDIF
+ @(echo #define IVdf "I64d"&& \
+ echo #define UVuf "I64u"&& \
+ echo #define UVof "I64o"&& \
+ echo #define UVxf "I64x"&& \
+ echo #define UVXf "I64X"&& \
+ echo #define USE_64_BIT_INT)>> config.h
+.ELSE
+ @(echo #define IVTYPE long&& \
+ echo #define UVTYPE unsigned long&& \
+ echo #define IVSIZE ^4&& \
+ echo #define UVSIZE ^4&& \
+ echo #define NV_PRESERVES_UV&& \
+ echo #define NV_PRESERVES_UV_BITS 32&& \
+ echo #define IVdf "ld"&& \
+ echo #define UVuf "lu"&& \
+ echo #define UVof "lo"&& \
+ echo #define UVxf "lx"&& \
+ echo #define UVXf "lX"&& \
+ echo #undef USE_64_BIT_INT)>> config.h
+.ENDIF
+.IF "$(USE_LONG_DOUBLE)"=="define"
+ @(echo #define Gconvert^(x,n,t,b^) sprintf^(^(b^),"%.*""Lg",^(n^),^(x^)^)&& \
+ echo #define HAS_FREXPL&& \
+ echo #define HAS_ISNANL&& \
+ echo #define HAS_MODFL&& \
+ echo #define HAS_MODFL_PROTO&& \
+ echo #define HAS_SQRTL&& \
+ echo #define HAS_STRTOLD&& \
+ echo #define PERL_PRIfldbl "Lf"&& \
+ echo #define PERL_PRIgldbl "Lg"&& \
+ echo #define PERL_PRIeldbl "Le"&& \
+ echo #define PERL_SCNfldbl "Lf"&& \
+ echo #define NVTYPE long double)>> config.h
+.IF "$(WIN64)"=="define"
+ @(echo #define NVSIZE ^16&& \
+ echo #define LONG_DOUBLESIZE ^16)>> config.h
+.ELSE
+ @(echo #define NVSIZE ^12&& \
+ echo #define LONG_DOUBLESIZE ^12)>> config.h
+.ENDIF
+ @(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&& \
+ echo #define NVef "Le"&& \
+ echo #define NVff "Lf"&& \
+ echo #define NVgf "Lg"&& \
+ echo #define USE_LONG_DOUBLE)>> config.h
+.ELSE
+ @(echo #define Gconvert^(x,n,t,b^) sprintf^(^(b^),"%.*g",^(n^),^(x^)^)&& \
+ echo #undef HAS_FREXPL&& \
+ echo #undef HAS_ISNANL&& \
+ echo #undef HAS_MODFL&& \
+ echo #undef HAS_MODFL_PROTO&& \
+ echo #undef HAS_SQRTL&& \
+ echo #undef HAS_STRTOLD&& \
+ echo #undef PERL_PRIfldbl&& \
+ echo #undef PERL_PRIgldbl&& \
+ echo #undef PERL_PRIeldbl&& \
+ echo #undef PERL_SCNfldbl&& \
+ echo #define NVTYPE double&& \
+ echo #define NVSIZE ^8&& \
+ echo #define LONG_DOUBLESIZE ^8&& \
+ 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&& \
+ echo #define NVef "e"&& \
+ echo #define NVff "f"&& \
+ echo #define NVgf "g"&& \
+ echo #undef USE_LONG_DOUBLE)>> config.h
+.ENDIF
+.IF "$(USE_CPLUSPLUS)"=="define"
+ @(echo #define USE_CPLUSPLUS&& \
+ echo #endif)>> config.h
+.ELSE
+ @(echo #undef USE_CPLUSPLUS&& \
+ echo #endif)>> config.h
+.ENDIF
+#separate line since this is sentinal that this target is done
+ rem. > $(MINIDIR)\.exists
$(MINICORE_OBJ) : $(CORE_NOCFG_H)
- $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_EXTERNAL_GLOB -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ ..\$(*B).c
+ $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_EXTERNAL_GLOB -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ $(PDBOUT) ..\$(*B).c
$(MINIWIN32_OBJ) : $(CORE_NOCFG_H)
- $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ $(*B).c
+ $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ $(PDBOUT) $(*B).c
# -DPERL_IMPLICIT_SYS needs C++ for perllib.c
# rules wrapped in .IFs break Win9X build (we end up with unbalanced []s unless
# unless the .IF is true), so instead we use a .ELSE with the default.
# This is the only file that depends on perlhost.h, vmem.h, and vdir.h
-perllib$(o) : perllib.c .\perlhost.h .\vdir.h .\vmem.h
+perllib$(o) : perllib.c perllibst.h .\perlhost.h .\vdir.h .\vmem.h
.IF "$(USE_IMP_SYS)" == "define"
- $(CC) -c -I. $(CFLAGS_O) $(CXX_FLAG) $(OBJOUT_FLAG)$@ perllib.c
+ $(CC) -c -I. $(CFLAGS_O) $(CXX_FLAG) $(OBJOUT_FLAG)$@ $(PDBOUT) perllib.c
.ELSE
- $(CC) -c -I. $(CFLAGS_O) $(OBJOUT_FLAG)$@ perllib.c
+ $(CC) -c -I. $(CFLAGS_O) $(OBJOUT_FLAG)$@ $(PDBOUT) perllib.c
.ENDIF
# 1. we don't want to rebuild miniperl.exe when config.h changes
# 2. we don't want to rebuild miniperl.exe with non-default config.h
# 3. we can't have miniperl.exe depend on git_version.h, as miniperl creates it
-$(MINI_OBJ) : $(CORE_NOCFG_H)
+$(MINI_OBJ) : $(MINIDIR)\.exists $(CORE_NOCFG_H)
$(WIN32_OBJ) : $(CORE_H)
@@ -1298,12 +1324,26 @@ $(CORE_OBJ) : $(CORE_H)
$(DLL_OBJ) : $(CORE_H)
-perldll.def : $(MINIPERL) $(CONFIGPM) ..\embed.fnc ..\makedef.pl create_perllibst_h.pl
+
+perllibst.h : $(HAVEMINIPERL) $(CONFIGPM) create_perllibst_h.pl
$(MINIPERL) -I..\lib create_perllibst_h.pl
+
+perldll.def : $(HAVEMINIPERL) $(CONFIGPM) ..\embed.fnc ..\makedef.pl
$(MINIPERL) -I..\lib -w ..\makedef.pl PLATFORM=win32 $(OPTIMIZE) $(DEFINES) \
$(BUILDOPT) CCTYPE=$(CCTYPE) TARG_DIR=..\ > perldll.def
-$(PERLDLL): perldll.def $(PERLDLL_OBJ) $(PERLDLL_RES) Extensions_static
+$(PERLIMPLIB) : perldll.def
+.IF "$(CCTYPE)" == "GCC"
+ $(IMPLIB) -k -d perldll.def -l $(PERLIMPLIB)
+.ELSE #VC family
+ lib -def:perldll.def -machine:$(ARCHITECTURE) /OUT:$(PERLIMPLIB)
+.ENDIF
+ $(XCOPY) $(PERLIMPLIB) $(COREDIR)
+
+#PERLEXPLIB is built in PERLIMPLIB
+$(PERLEXPLIB): $(PERLIMPLIB)
+
+$(PERLDLL): $(PERLEXPLIB) $(PERLDLL_OBJ) $(PERLDLL_RES) Extensions_static
.IF "$(CCTYPE)" == "GCC"
$(LINK32) -mdll -o $@ -Wl,--base-file -Wl,perl.base $(BLINK_FLAGS) \
$(mktmp $(LKPRE) $(PERLDLL_OBJ) \
@@ -1319,13 +1359,12 @@ $(PERLDLL): perldll.def $(PERLDLL_OBJ) $(PERLDLL_RES) Extensions_static
$(shell @type Extensions_static) \
$(LIBFILES) perl.exp $(LKPOST))
.ELSE
- $(LINK32) -dll -def:perldll.def -out:$@ $(BLINK_FLAGS) \
+ $(LINK32) -dll -out:$@ $(BLINK_FLAGS) \
@Extensions_static \
@$(mktmp -base:0x28000000 $(DELAYLOAD) $(LIBFILES) \
- $(PERLDLL_RES) $(PERLDLL_OBJ))
+ $(PERLDLL_RES) $(PERLDLL_OBJ) $(PERLEXPLIB))
$(EMBED_DLL_MANI)
.ENDIF
- $(XCOPY) $(PERLIMPLIB) $(COREDIR)
$(PERLSTATICLIB): $(PERLDLL_OBJ) Extensions_static
.IF "$(CCTYPE)" == "GCC"
@@ -1365,16 +1404,16 @@ $(GENUUDMAP) : $(GENUUDMAP_OBJ)
perlmain.c : runperl.c
copy runperl.c perlmain.c
-perlmain$(o) : perlmain.c
- $(CC) $(CFLAGS_O:s,-DPERLDLL,-UPERLDLL,) $(OBJOUT_FLAG)$@ -c perlmain.c
+perlmain$(o) : $(CONFIGPM) perlmain.c
+ $(CC) $(CFLAGS_O:s,-DPERLDLL,-UPERLDLL,) $(OBJOUT_FLAG)$@ $(PDBOUT) -c perlmain.c
perlmainst.c : runperl.c
copy runperl.c perlmainst.c
-perlmainst$(o) : perlmainst.c
- $(CC) $(CFLAGS_O) $(OBJOUT_FLAG)$@ -c perlmainst.c
+perlmainst$(o) : $(CONFIGPM) perlmainst.c
+ $(CC) $(CFLAGS_O) $(OBJOUT_FLAG)$@ $(PDBOUT) -c perlmainst.c
-$(PERLEXE): $(PERLDLL) $(CONFIGPM) $(PERLEXE_OBJ) $(PERLEXE_RES)
+$(PERLEXE): $(CONFIGPM) $(PERLEXE_OBJ) $(PERLEXE_RES) $(PERLIMPLIB)
.IF "$(CCTYPE)" == "GCC"
$(LINK32) -mconsole -o $@ $(BLINK_FLAGS) \
$(PERLEXE_OBJ) $(PERLEXE_RES) $(PERLIMPLIB) $(LIBFILES)
@@ -1396,43 +1435,52 @@ $(PERLEXESTATIC): $(PERLSTATICLIB) $(CONFIGPM) $(PERLEXEST_OBJ) $(PERLEXE_RES)
$(EMBED_EXE_MANI)
.ENDIF
-MakePPPort: $(MINIPERL) $(CONFIGPM) Extensions_nonxs
- $(MINIPERL) -I..\lib ..\mkppport
-
#-------------------------------------------------------------------------------
# There's no direct way to mark a dependency on
# DynaLoader.pm, so this will have to do
Extensions : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) $(DYNALOADER)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic
+ if not exist $(COREDIR)\ppport.h rem. > $(COREDIR)\ppport.h
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic
Extensions_reonly : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) $(DYNALOADER)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic +re
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic +re
-Extensions_static : ..\make_ext.pl ..\lib\buildcustomize.pl list_static_libs.pl $(PERLDEP) $(CONFIGPM) Extensions_nonxs
+Extensions_static : ..\make_ext.pl ..\lib\buildcustomize.pl list_static_libs.pl $(CONFIGPM)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --static
+ if not exist $(COREDIR)\ppport.h rem. > $(COREDIR)\ppport.h
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --static
$(MINIPERL) -I..\lib list_static_libs.pl > Extensions_static
-Extensions_nonxs : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) ..\pod\perlfunc.pod
- $(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --nonxs
+Extensions_nonxs : ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM) ..\pod\perlfunc.pod
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --nonxs !libs
-$(DYNALOADER) : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) Extensions_nonxs
+#lib must be built, it can't be buildcustomize.pl-ed, and is required for XS building
+$(DYNALOADER) : ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --dynaloader
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(EXTDIR) --dir=$(DISTDIR) --dynaloader lib
Extensions_clean :
- -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=clean
+ -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=clean
Extensions_realclean :
- -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=realclean
+ -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=realclean
+
+# all PE files need to be built by the time this target runs, PP files can still
+# be running in parallel like UNIDATAFILES, this target a placeholder for the
+# future
+.IF "$(BUILD_STATIC)"=="define"
+rebasePE : Extensions $(PERLDLL) $(PERLEXE) $(GLOBEXE) $(PERLEXESTATIC)
+.ELSE
+rebasePE : Extensions $(PERLDLL) $(PERLEXE) $(GLOBEXE)
+.ENDIF
+ $(NOOP)
#-------------------------------------------------------------------------------
-doc: $(PERLEXE) ..\pod\perltoc.pod
+doc: $(PERLEXE) $(PERLDLL) ..\pod\perltoc.pod
$(PERLEXE) ..\installhtml --podroot=.. --htmldir=$(HTMLDIR) \
--podpath=pod:lib:utils --htmlroot="file://$(INST_HTML:s,:,|,)"\
--recurse
@@ -1442,8 +1490,8 @@ doc: $(PERLEXE) ..\pod\perltoc.pod
# Note that this next section is parsed (and regenerated) by pod/buildtoc
# so please check that script before making structural changes here
-utils: $(PERLEXE) ..\utils\Makefile
- cd ..\utils && $(MAKE) PERL=$(MINIPERL)
+utils: $(HAVEMINIPERL) ..\utils\Makefile
+ cd ..\utils && $(PLMAKE) PERL=$(MINIPERL)
copy ..\README.aix ..\pod\perlaix.pod
copy ..\README.amiga ..\pod\perlamiga.pod
copy ..\README.android ..\pod\perlandroid.pod
@@ -1478,11 +1526,11 @@ utils: $(PERLEXE) ..\utils\Makefile
copy ..\README.vos ..\pod\perlvos.pod
copy ..\README.win32 ..\pod\perlwin32.pod
copy ..\pod\perldelta.pod ..\pod\perl5232delta.pod
- $(PERLEXE) $(PL2BAT) $(UTILS)
+ $(MINIPERL) -I..\lib $(PL2BAT) $(UTILS)
$(MINIPERL) -I..\lib ..\autodoc.pl ..
$(MINIPERL) -I..\lib ..\pod\perlmodlib.PL -q ..
-..\pod\perltoc.pod: $(PERLEXE) Extensions Extensions_nonxs
+..\pod\perltoc.pod: $(PERLEXE) $(PERLDLL) Extensions Extensions_nonxs ..\pod\perluniprops.pod utils
$(PERLEXE) -f ..\pod\buildtoc -q
# Note that the pod cleanup in this next section is parsed (and regenerated
@@ -1619,11 +1667,11 @@ installhtml : doc
inst_lib : $(CONFIGPM)
$(RCOPY) ..\lib $(INST_LIB)\*.*
-$(UNIDATAFILES) ..\pod\perluniprops.pod .UPDATEALL : $(MINIPERL) $(CONFIGPM) ..\lib\unicore\mktables Extensions_nonxs
+$(UNIDATAFILES) ..\pod\perluniprops.pod .UPDATEALL : $(CONFIGPM) ..\lib\unicore\mktables
cd ..\lib\unicore && \
..\$(MINIPERL) -I.. mktables -P ..\..\pod -maketest -makelist -p
-minitest : .\config.h $(MINIPERL) ..\git_version.h $(GLOBEXE) $(CONFIGPM) $(UNIDATAFILES) $(TESTPREPGCC)
+minitest : .\config.h $(HAVEMINIPERL) ..\git_version.h $(GLOBEXE) $(CONFIGPM) $(UNIDATAFILES) $(TESTPREPGCC)
$(XCOPY) $(MINIPERL) ..\t\$(NULL)
if exist ..\t\perl.exe del /f ..\t\perl.exe
rename ..\t\miniperl.exe perl.exe
diff --git a/write_buildcustomize.pl b/write_buildcustomize.pl
index 5d819b5..d3bbd0f 100644
--- a/write_buildcustomize.pl
+++ b/write_buildcustomize.pl
@@ -41,12 +41,23 @@ my @toolchain = qw(cpan/AutoLoader/lib
dist/constant/lib
);
-# Used only in ExtUtils::Liblist::Kid::_win32_ext()
-push @toolchain, 'cpan/Text-ParseWords/lib' if $^O eq 'MSWin32';
+# Text-ParseWords used only in ExtUtils::Liblist::Kid::_win32_ext()
+# the rest are for XS building on Win32, since nonxs and xs build simultaneously
+# on Win32 if parallel building
+push @toolchain, qw(
+ cpan/Text-ParseWords/lib
+ dist/ExtUtils-ParseXS/lib
+ cpan/Getopt-Long/lib
+ cpan/parent/lib
+ cpan/ExtUtils-Constant/lib
+) if $^O eq 'MSWin32';
push @toolchain, 'ext/VMS-Filespec/lib' if $^O eq 'VMS';
unshift @INC, @toolchain;
require File::Spec::Functions;
+require Cwd;
+
+my $cwd = Cwd::getcwd();
# lib must be last, as the toolchain modules write themselves into it
# as they build, and it's important that @INC order ensures that the partially
@@ -54,7 +65,7 @@ require File::Spec::Functions;
my $inc = join ",\n ",
map { "q\0$_\0" }
- (map {File::Spec::Functions::rel2abs($_)} (
+ (map {File::Spec::Functions::rel2abs($_, $cwd)} (
# faster build on the non-parallel Win32 build process
$^O eq 'MSWin32' ? ('lib', @toolchain ) : (@toolchain, 'lib')
));
--
1.7.9.msysgit.0
|
From @bulk880002-coredir-parallelism.patchFrom df63450553e8e6a8a27f417dfc8fe3e00350d647 Mon Sep 17 00:00:00 2001
From: Daniel Dragan <bulk88@hotmail.com>
Date: Sun, 17 May 2015 14:18:06 -0400
Subject: [PATCH 2/5] coredir parallelism
-defer the mass copy of headers to COREDIR until XS build time
and dont use COREDIR for building miniperl interp or perl interp, more
thing to do in parallel this way and 1 less path to search by the CC
-config_h.PL requires config.h to be in COREDIR, this XCOPY in CONFIGPM
targ is where COREDIR is created if it doesnt exist already
-remove a bunch of XCOPY'es, copy the headers in 1 place only, and dont
copy them unless they change based on timestamps
-the DYNALOADER dep already contains
"..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM) $(HAVE_COREDIR)" dont
specify them again in Extensions and Extensions_reonly, this probably
reduces the size of dep graph in dmake, sincedmake explodes the graph and
checks the outline of the graph/tree very inefficiently in parallel mode
(architectural problem with dmake)
-undo Time::HiRes in-core patch per TonyC's 2 line ppport.h idea
-delete pdb files in root, otherwise switching VC version will make the
next cl.exe error out that it can't write to the pdb file due to version
numbers in the pdb file
-reorder core .c files in a blend of VC and GCC time order, this reduces
a 1:08 mins time to do "dmake -P9 ../perl522.dll" to 0:54 mins on 8 core
with GCC, see details in #123867
---
Porting/Maintainers.pl | 2 -
README.win32 | 11 ++++--
cpan/Time-HiRes/HiRes.pm | 2 +-
cpan/Time-HiRes/HiRes.xs | 4 +-
pod/perldelta.pod | 11 ++++++-
t/porting/customized.dat | 1 -
win32/makefile.mk | 72 +++++++++++++++++++++++++--------------------
7 files changed, 59 insertions(+), 44 deletions(-)
diff --git a/Porting/Maintainers.pl b/Porting/Maintainers.pl
index f9c5589..fe357c6 100755
--- a/Porting/Maintainers.pl
+++ b/Porting/Maintainers.pl
@@ -1218,8 +1218,6 @@ use File::Glob qw(:case);
'Time::HiRes' => {
'DISTRIBUTION' => 'ZEFRAM/Time-HiRes-1.9726.tar.gz',
'FILES' => q[cpan/Time-HiRes],
- # CPAN release eventually
- 'CUSTOMIZED' => [ 'HiRes.xs' ],
},
'Time::Local' => {
diff --git a/README.win32 b/README.win32
index b9875e6..13d2a79 100644
--- a/README.win32
+++ b/README.win32
@@ -98,11 +98,14 @@ See L<Usage Hints for Perl on Windows> below for general hints about this.
You need a "make" program to build the sources. If you are using
Visual C++ or the Windows SDK tools, you can use nmake supplied with Visual C++
or Windows SDK. You may also use, for Visual C++ or Windows SDK, dmake instead
-of nmake. dmake is open source software, but is not included with Visual C++ or
-Windows SDK. If you want parallel building with Visual C++ or
+of nmake. dmake is open source software, but is not included with Visual C++ or
+Windows SDK. If you want parallel building with Visual C++ or
Windows SDK you must use dmake instead of nmake. Builds using gcc need dmake.
-nmake is not supported for gcc builds. gmake is not supported, but might be
-added in the future.
+nmake is not supported for gcc builds. gmake is not supported, but might be
+added in the future. It is recommended to use dmake 4.13 or newer for parallel
+building. Older dmakes, in parallel mode, have very high CPU usage and pound
+the disk/filing system with duplicate I/O calls in an aggressive polling
+loop.
A port of dmake for Windows is available from:
diff --git a/cpan/Time-HiRes/HiRes.pm b/cpan/Time-HiRes/HiRes.pm
index 0ee2c62..cf64bc1 100644
--- a/cpan/Time-HiRes/HiRes.pm
+++ b/cpan/Time-HiRes/HiRes.pm
@@ -23,7 +23,7 @@ our @EXPORT_OK = qw (usleep sleep ualarm alarm gettimeofday time tv_interval
stat lstat
);
-our $VERSION = '1.9726_01';
+our $VERSION = '1.9726';
our $XS_VERSION = $VERSION;
$VERSION = eval $VERSION;
diff --git a/cpan/Time-HiRes/HiRes.xs b/cpan/Time-HiRes/HiRes.xs
index 9a852c4..96640e9 100644
--- a/cpan/Time-HiRes/HiRes.xs
+++ b/cpan/Time-HiRes/HiRes.xs
@@ -731,7 +731,7 @@ myNVtime()
static void
hrstatns(UV *atime_nsec, UV *mtime_nsec, UV *ctime_nsec)
{
- dTHX;
+ dTHXR;
#if TIME_HIRES_STAT == 1
*atime_nsec = PL_statcache.st_atimespec.tv_nsec;
*mtime_nsec = PL_statcache.st_mtimespec.tv_nsec;
@@ -1284,7 +1284,7 @@ PROTOTYPE: ;$
fakeop.op_flags = GIMME_V == G_ARRAY ? OPf_WANT_LIST :
GIMME_V == G_SCALAR ? OPf_WANT_SCALAR : OPf_WANT_VOID;
PL_op = &fakeop;
- (void)fakeop.op_ppaddr(aTHX);
+ (void)fakeop.op_ppaddr(aTHXR);
SPAGAIN;
LEAVE;
nret = SP+1 - &ST(0);
diff --git a/pod/perldelta.pod b/pod/perldelta.pod
index 06f2ee2..f949597 100644
--- a/pod/perldelta.pod
+++ b/pod/perldelta.pod
@@ -305,9 +305,16 @@ L</Modules and Pragmata> section.
=over 4
-=item XXX-some-platform
+=item Win32
-XXX
+=over
+
+=item *
+
+Parallel building has been added to the dmake C<makefile.mk> makefile. All
+Win32 compilers are supported.
+
+=back
=back
diff --git a/t/porting/customized.dat b/t/porting/customized.dat
index c3eeace..ee65785 100644
--- a/t/porting/customized.dat
+++ b/t/porting/customized.dat
@@ -57,7 +57,6 @@ Win32API::File cpan/Win32API-File/t/file.t 124e64aa77e755235eb297644a87fac5388d3
Win32API::File cpan/Win32API-File/t/tie.t 712ea7edd0cc805ce1c0b8172c01b03dd19b583d
Win32API::File cpan/Win32API-File/typemap 24bff088babeadac0873e8df390d1666d9d9db4a
autodie cpan/autodie/t/mkdir.t 9e70d2282a3cc7d76a78bf8144fccba20fb37dac
-Time::HiRes cpan/Time-HiRes/HiRes.xs 0a850b6dee1f2c60ade3d4c33fab7c69b02ddc45
podlators cpan/podlators/scripts/pod2man.PL f81acf53f3ff46cdcc5ebdd661c5d13eb35d20d6
podlators cpan/podlators/scripts/pod2text.PL b4693fcfe4a0a1b38a215cfb8985a65d5d025d69
version cpan/version/lib/version.pm d0923b895d57f1d669ae36fcf85c87b16db341d1
diff --git a/win32/makefile.mk b/win32/makefile.mk
index aa21094..6b5298b 100644
--- a/win32/makefile.mk
+++ b/win32/makefile.mk
@@ -472,7 +472,7 @@ a = .a
# Options
#
-INCLUDES = -I.\include -I. -I.. -I$(COREDIR)
+INCLUDES = -I.\include -I. -I..
DEFINES = -DWIN32
.IF "$(WIN64)" == "define"
DEFINES += -DWIN64 -DCONSERVATIVE
@@ -560,7 +560,7 @@ RSC = rc
# Options
#
-INCLUDES = -I$(COREDIR) -I.\include -I. -I..
+INCLUDES = -I.\include -I. -I..
#PCHFLAGS = -Fpc:\temp\vcmoduls.pch -YX
DEFINES = -DWIN32 -D_CONSOLE -DNO_STRICT
LOCDEFS = -DPERLDLL -DPERL_CORE
@@ -863,43 +863,45 @@ XCOPY = xcopy /f /r /i /d /y
RCOPY = xcopy /f /r /i /e /d /y
NOOP = @rem
+#first ones are arrange in compile time order for faster parallel building
+#see #123867 for details
MICROCORE_SRC = \
+ ..\toke.c \
+ ..\regcomp.c \
+ ..\regexec.c \
+ ..\op.c \
+ ..\sv.c \
+ ..\pp.c \
+ ..\pp_ctl.c \
+ ..\pp_sys.c \
+ ..\pp_pack.c \
+ ..\pp_hot.c \
+ ..\gv.c \
+ ..\perl.c \
+ ..\utf8.c \
+ ..\dump.c \
+ ..\hv.c \
..\av.c \
..\caretx.c \
..\deb.c \
..\doio.c \
..\doop.c \
- ..\dump.c \
..\globals.c \
- ..\gv.c \
..\mro_core.c \
- ..\hv.c \
..\locale.c \
..\keywords.c \
..\mathoms.c \
..\mg.c \
..\numeric.c \
- ..\op.c \
..\pad.c \
- ..\perl.c \
..\perlapi.c \
..\perly.c \
- ..\pp.c \
- ..\pp_ctl.c \
- ..\pp_hot.c \
- ..\pp_pack.c \
..\pp_sort.c \
- ..\pp_sys.c \
..\reentr.c \
- ..\regcomp.c \
- ..\regexec.c \
..\run.c \
..\scope.c \
- ..\sv.c \
..\taint.c \
- ..\toke.c \
..\universal.c \
- ..\utf8.c \
..\util.c
EXTRACORE_SRC += perllib.c
@@ -964,6 +966,10 @@ UUDMAP_H = ..\uudmap.h
BITCOUNT_H = ..\bitcount.h
MG_DATA_H = ..\mg_data.h
GENERATED_HEADERS = $(UUDMAP_H) $(BITCOUNT_H) $(MG_DATA_H)
+#a stub ppport.h must be generated so building XS modules, .c->.obj wise, will
+#work, so this target also represents creating the COREDIR and filling it
+HAVE_COREDIR = $(COREDIR)\ppport.h
+
MICROCORE_OBJ = $(MICROCORE_SRC:db:+$(o))
CORE_OBJ = $(MICROCORE_OBJ) $(EXTRACORE_SRC:db:+$(o))
@@ -1101,9 +1107,7 @@ regen_config_h:
$(CONFIGPM): ..\config.sh config_h.PL
$(MINIPERL) -I..\lib ..\configpm --chdir=..
- $(XCOPY) ..\*.h $(COREDIR)\*.*
- $(XCOPY) *.h $(COREDIR)\*.*
- $(RCOPY) include $(COREDIR)\*.*
+ $(XCOPY) config.h $(COREDIR)\*.*
$(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)" \
|| $(PLMAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)
@@ -1379,7 +1383,7 @@ $(PERLSTATICLIB): $(PERLDLL_OBJ) Extensions_static
$(LIB32) $(LIB_FLAGS) -out:$@ @Extensions_static \
@$(mktmp $(PERLDLL_OBJ))
.ENDIF
- $(XCOPY) $(PERLSTATICLIB) $(COREDIR)
+ $(XCOPY) $(PERLSTATICLIB) $(COREDIR)\$(NULL)
$(PERLEXE_RES): perlexe.rc $(PERLEXE_MANIFEST) $(PERLEXE_ICO)
@@ -1390,6 +1394,14 @@ $(UUDMAP_H) $(MG_DATA_H) : $(BITCOUNT_H)
$(BITCOUNT_H) : $(GENUUDMAP)
$(GENUUDMAP) $(GENERATED_HEADERS)
+#This generates a stub ppport.h & creates & fills /lib/CORE to allow for XS
+#building .c->.obj wise (linking is a different thing). This taget is AKA
+#$(HAVE_COREDIR). ppport.h can become a 0 byte file once core's Time::HiRes is
+#has the patch in CPAN #102799
+$(COREDIR)\ppport.h : $(CORE_H)
+ $(XCOPY) *.h $(COREDIR)\*.* && $(RCOPY) include $(COREDIR)\*.* && $(XCOPY) ..\*.h $(COREDIR)\*.*
+ @( echo #define aTHXR aTHX&& echo #define dTHXR dTHX) >$@
+
$(GENUUDMAP_OBJ) : ..\mg_raw.h
$(GENUUDMAP) : $(GENUUDMAP_OBJ)
@@ -1438,18 +1450,15 @@ $(PERLEXESTATIC): $(PERLSTATICLIB) $(CONFIGPM) $(PERLEXEST_OBJ) $(PERLEXE_RES)
#-------------------------------------------------------------------------------
# There's no direct way to mark a dependency on
# DynaLoader.pm, so this will have to do
-Extensions : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) $(DYNALOADER)
- $(XCOPY) ..\*.h $(COREDIR)\*.*
- if not exist $(COREDIR)\ppport.h rem. > $(COREDIR)\ppport.h
+
+#most of deps of this target are in DYNALOADER and therefore omitted here
+Extensions : $(PERLDEP) $(DYNALOADER)
$(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic
-Extensions_reonly : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) $(DYNALOADER)
- $(XCOPY) ..\*.h $(COREDIR)\*.*
+Extensions_reonly : $(PERLDEP) $(DYNALOADER)
$(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic +re
-Extensions_static : ..\make_ext.pl ..\lib\buildcustomize.pl list_static_libs.pl $(CONFIGPM)
- $(XCOPY) ..\*.h $(COREDIR)\*.*
- if not exist $(COREDIR)\ppport.h rem. > $(COREDIR)\ppport.h
+Extensions_static : ..\make_ext.pl ..\lib\buildcustomize.pl list_static_libs.pl $(CONFIGPM) $(HAVE_COREDIR)
$(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --static
$(MINIPERL) -I..\lib list_static_libs.pl > Extensions_static
@@ -1457,8 +1466,7 @@ Extensions_nonxs : ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM) ..\pod\pe
$(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --nonxs !libs
#lib must be built, it can't be buildcustomize.pl-ed, and is required for XS building
-$(DYNALOADER) : ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM)
- $(XCOPY) ..\*.h $(COREDIR)\*.*
+$(DYNALOADER) : ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM) $(HAVE_COREDIR)
$(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(EXTDIR) --dir=$(DISTDIR) --dynaloader lib
Extensions_clean :
@@ -1757,7 +1765,7 @@ _clean :
-@erase ..\*$(o) ..\*$(a) ..\*.exp *$(o) *$(a) *.exp *.res
-@erase ..\t\*.exe ..\t\*.dll ..\t\*.bat
-@erase *.ilk
- -@erase *.pdb
+ -@erase *.pdb ..\*.pdb
-@erase Extensions_static
--
1.7.9.msysgit.0
|
From @bulk880003-squash-double-dmake-run.patchFrom f4278bb6664342bd031c2d30f9665f679995a2a0 Mon Sep 17 00:00:00 2001
From: Daniel Dragan <bulk88@hotmail.com>
Date: Tue, 23 Jun 2015 00:03:04 -0400
Subject: [PATCH 3/5] squash double dmake run
-in $(CONFIGPM) target, remove config_h.PL running dmake again to rebuild
$(CONFIGPM) target, configpm the script does not use config.h as input.
The $(CONFIGPM) target is a choke/serialization point for parallel
building, so it is high value to make it as fast as possible.
Maybe a long time ago, configpm read config.h but it doesn't anymore.
Nearly all the dynamic config vars are determined in config_sh.PL script
and ..\config.sh target. config_h.PL contains very little logic, and this
logic is only for config.h, and only when you want a var to be different
in config.h than it is in Config.pm/Config_heavy.pl. Putting a breakpoint
("system 'pause';") in config_h.PL, copying Config.pm/Config_heavy.pl to
".old" versions, continuing execution in config_h.PL, then diffing the
2 new Configs with the old 2 Configs before pre-config_h.PL and
"$(PLMAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)" shows no differece.
When dmake runs needlessly a 2nd time it emits a warning that nothing
changed. This is intentional, since configpm doesn't update the timestamps
/update the tiles if the Config files are identical to the old ones to
prevent mass clean+rebuild of all modules when nothing global changed.
dmake: Warning: -- Target [..\lib\Config.pm] was made but the time stamp
has not been updated.
---
win32/makefile.mk | 3 +--
1 files changed, 1 insertions(+), 2 deletions(-)
diff --git a/win32/makefile.mk b/win32/makefile.mk
index 6b5298b..bd086f4 100644
--- a/win32/makefile.mk
+++ b/win32/makefile.mk
@@ -1108,8 +1108,7 @@ regen_config_h:
$(CONFIGPM): ..\config.sh config_h.PL
$(MINIPERL) -I..\lib ..\configpm --chdir=..
$(XCOPY) config.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)" \
- || $(PLMAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)
+ -$(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)"
.\config.h : $(CONFIGPM)
--
1.7.9.msysgit.0
|
From @bulk880004-squash-collapse-3-shell-runs-of-xcopy-into-1-run-of-.patchFrom 40229f56e147834bda2f8f25bbb797b32527b041 Mon Sep 17 00:00:00 2001
From: Daniel Dragan <bulk88@hotmail.com>
Date: Tue, 23 Jun 2015 01:26:41 -0400
Subject: [PATCH 4/5] squash collapse 3 shell runs of xcopy into 1 run of
shell -collapse 3 shell runs of xcopy into 1 run of
shell
"timeit cmd /c "cmd /c xcopy /f /r /i /d /y ..\perl.exe ..\t\ && cmd /c
xcopy /f /r /i /d /y ..\perl523.dll ..\t\
&& cmd /c xcopy /f /r /i /d /y ..\perlglob.exe ..\t\"" takes 140 ms
"timeit cmd /c "xcopy /f /r /i /d /y ..\perl.exe ..\t\
&& xcopy /f /r /i /d /y ..\perl523.dll ..\t\
&& xcopy /f /r /i /d /y ..\perlglob.exe ..\t\"" takes 78 ms on my machine
---
win32/makefile.mk | 5 ++---
1 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/win32/makefile.mk b/win32/makefile.mk
index bd086f4..1bae9de 100644
--- a/win32/makefile.mk
+++ b/win32/makefile.mk
@@ -1687,9 +1687,8 @@ minitest : .\config.h $(HAVEMINIPERL) ..\git_version.h $(GLOBEXE) $(CONFIGPM) $(
cd ..\t && perl.exe TEST base/*.t comp/*.t cmd/*.t run/*.t io/*.t re/*.t opbasic/*.t op/*.t uni/*.t perf/*.t pragma/*.t
test-prep : all utils ..\pod\perltoc.pod $(TESTPREPGCC)
- $(XCOPY) $(PERLEXE) ..\t\$(NULL)
- $(XCOPY) $(PERLDLL) ..\t\$(NULL)
- $(XCOPY) $(GLOBEXE) ..\t\$(NULL)
+ $(XCOPY) $(PERLEXE) ..\t\$(NULL) && $(XCOPY) $(PERLDLL) ..\t\$(NULL) \
+ && $(XCOPY) $(GLOBEXE) ..\t\$(NULL)
# If building with gcc versions 4.x.x or greater, then
# the GCC helper DLL will also need copied to the test directory.
--
1.7.9.msysgit.0
|
From @bulk880005-squash-less-steps-build-generate_uudmap.exe.patchFrom 96157ef49ed5121b4c2a17abcd0068c0f2763667 Mon Sep 17 00:00:00 2001
From: Daniel Dragan <bulk88@hotmail.com>
Date: Tue, 23 Jun 2015 12:06:21 -0400
Subject: [PATCH 5/5] squash less steps build generate_uudmap.exe -reduce
number of steps to build generate_uudmap.exe. Compiling
(140 ms on GCC 4.8.3) and linking (561 ms) is heavy
weight compared to running generate_uudmap.exe (31 ms)
and compiling globals.c (483 ms). dmake's algo for
doing parallel is poor. On the main parallel pass with
all the mini core .c files compiling ("MINI_OBJ"),
only generate_uudmap.o will be generated as part of
the chain of deps hanging off globals.o, after the 1st
tier of MINI_OBJ has compiled in parallel, dmake will
do another sweep of MINI_OBJ, this time it will find
generate_uudmap.exe node and run linking, at this 2nd
tier nothing ran except linking generate_uudmap. No
parallel anything. This is a chokepoint. Then dmake
does a 3rd sweep and runs the 3rd tier, which is run
generate_uudmap.exe, again nothing parallel happens
here. By combining compiling and linking in 1 target,
the time spent serially linking generate_uudmap.exe, is
moved into parallel time when the rest of MINI_OBJ
compiles. Also a little bit of CPU and IO is saved by
launching less processes (less cmd.exe shells, gcc/g++
process ran only once (gcc/g++ still run many
standalone procs internally but now only 1 gcc was
started not 2)). -suppress warnings from dmake with
.UPDATEALL, the 3 generated headers are made at the
same time in real life, in the makefile it was written
as if they weren't dmake: Warning:--Found file
corresponding to virtual target [..\uudmap.h]. dmake:
Warning:--Found file corresponding to virtual target
[..\mg_data.h]. -move generating the headers to the
target that generates generate_uudmap.exe, this moves
some serialization time, albeit small (30 ms) from
right before miniperl link, to parallel time during 1st
pass of MINI_OBJ
---
win32/makefile.mk | 23 ++++++++---------------
1 files changed, 8 insertions(+), 15 deletions(-)
diff --git a/win32/makefile.mk b/win32/makefile.mk
index 1bae9de..fdc0d28 100644
--- a/win32/makefile.mk
+++ b/win32/makefile.mk
@@ -978,7 +978,6 @@ MINICORE_OBJ = $(MINIDIR)\{$(MICROCORE_OBJ:f) miniperlmain$(o) perlio$(o)}
MINIWIN32_OBJ = $(MINIDIR)\{$(WIN32_OBJ:f)}
MINI_OBJ = $(MINICORE_OBJ) $(MINIWIN32_OBJ)
DLL_OBJ = $(DYNALOADER)
-GENUUDMAP_OBJ = $(GENUUDMAP:db:+$(o))
PERLDLL_OBJ = $(CORE_OBJ)
PERLEXE_OBJ = perlmain$(o)
@@ -1388,9 +1387,14 @@ $(PERLEXE_RES): perlexe.rc $(PERLEXE_MANIFEST) $(PERLEXE_ICO)
$(MINIDIR)\globals$(o) : $(GENERATED_HEADERS)
-$(UUDMAP_H) $(MG_DATA_H) : $(BITCOUNT_H)
-
-$(BITCOUNT_H) : $(GENUUDMAP)
+$(GENUUDMAP) $(GENERATED_HEADERS) .UPDATEALL : ..\mg_raw.h
+.IF "$(CCTYPE)" == "GCC"
+ $(LINK32) $(CFLAGS_O) -o..\generate_uudmap.exe ..\generate_uudmap.c $(BLINK_FLAGS) \
+ $(mktmp $(LKPRE) $(LIBFILES) $(LKPOST))
+.ELSE
+ $(CC) $(CFLAGS_O) -Fe..\generate_uudmap.exe ..\generate_uudmap.c @$(mktmp -link $(LIBFILES)) -link $(BLINK_FLAGS)
+ $(EMBED_EXE_MANI:s/$@/..\generate_uudmap.exe/)
+.ENDIF
$(GENUUDMAP) $(GENERATED_HEADERS)
#This generates a stub ppport.h & creates & fills /lib/CORE to allow for XS
@@ -1401,17 +1405,6 @@ $(COREDIR)\ppport.h : $(CORE_H)
$(XCOPY) *.h $(COREDIR)\*.* && $(RCOPY) include $(COREDIR)\*.* && $(XCOPY) ..\*.h $(COREDIR)\*.*
@( echo #define aTHXR aTHX&& echo #define dTHXR dTHX) >$@
-$(GENUUDMAP_OBJ) : ..\mg_raw.h
-
-$(GENUUDMAP) : $(GENUUDMAP_OBJ)
-.IF "$(CCTYPE)" == "GCC"
- $(LINK32) -v -o $@ $(BLINK_FLAGS) \
- $(mktmp $(LKPRE) $(GENUUDMAP_OBJ) $(LIBFILES) $(LKPOST))
-.ELSE
- $(LINK32) -out:$@ $(BLINK_FLAGS) @$(mktmp $(LIBFILES) $(GENUUDMAP_OBJ))
- $(EMBED_EXE_MANI)
-.ENDIF
-
perlmain.c : runperl.c
copy runperl.c perlmain.c
--
1.7.9.msysgit.0
|
From @tonycozOn Wed Jul 22 00:48:19 2015, bulk88 wrote:
I suspect I messed up a merge conflict fix when rebasing on blead, and lost the -I..\lib - sorry for the false alarm. It works when I apply your latest patches. Tony |
From @bulk88Final patch set attached. I kept it as 3 commits so the commit messages can be traced back to the code changes, and the commit messages dont exceed a screenful. Since Time::HiRes is now core maintained ( https://github.com/rjbs/Time-HiRes/commits/master ), I am core patching it so there isn't any unfinished business patches that needs to be revisited later when a new Time::HiRes goes in core. Nobody is going to remember to remove the 5.005 threads ppport.h hack in win32/makefile.mk for T::H when a new T::H is imported. Also I fixed a problem where the dummy ppport.h wound up in the installed perl's CORE dir. The dummy ppport.h is now deleted from installed CORE dir in installbare target. I was afraid the dummy ppport.h may somehow prevent a real full size ppport.h from being picked up by the CC, I am not going to research the -I order of EUMM and MB, if that concern is real or not, but in any case, the dummy ppport.h trick shouldn't be visible in the installed perl, only the uninstalled perl during perl building. -- |
From @bulk880001-add-parallel-support-4-Win32-dmake-building-part-1.patchFrom 225c304f855b3a63cd5843d78d1f44e154866640 Mon Sep 17 00:00:00 2001
From: Daniel Dragan <bulk88@hotmail.com>
Date: Sat, 15 Aug 2015 16:03:49 -0400
Subject: [PATCH 1/3] add parallel support 4 Win32 dmake building part 1
-if building a 32 bit Perl, with a 64bit dmake, force
PROCESSOR_ARCHITECTURE to x86, otherwise the next couple macros will
try to build a 64 bit perl with 32 bit CCs
-PDBOUT is required to run multiple VC cl.exe processes, otherwise all
VC cl.exe processes will error out trying to lock and write to a
file called "vc*0.pdb", PDBOUT is empty for GCC builds since they dont
have PDB files
-to reduce excess IO calls checking for miniperl.exe plus remove a
"Found file corresponding to virtual target" warning that dmake emits,
make this makefile unaware that miniperl.exe exists. dmake has a very bad
exponential number of IO/stat() calls for every target that is yet
unbuilt, see procmon logs in [perl #123854], so instead of a stat on
../miniperl.exe, then ../lib/buildcustomize.pl, it will be just a stat on
../lib/buildcustomize.pl
-remove makefile awareness of ..\lib\Config_heavy.pl,
if ..\lib\Config_heavy.pl is ever updated, so is ..\lib\Config.pm
less IO calls for dmake, see also commit 962e59f394
-to break up the sequential nature of this makefile, allow (XS) Extensions
to build, before (AKA parallel with) perl5**.dll and perl.exe are built.
This is achieved by running makedef.pl very early, and generating
perl5**.lib/libperl5**.a from the def file, and NOT generating
perl5**.lib/libperl5**.a from perl5**.dll at link time of perl5**.dll.
The conquence of this is, declspec(dllexport) is now unusable, but exports
should be centrally managed anyways (embed.fnc/etc) so this isn't a big
issue.
-EUMM makefiles shouldn't be subject to parallelism, untested and disable
for now, plus creating PLMAKE allows "dmake -n" to work for diagnosing
this makefile
-slim down all target. Extensions* and UNIDATAFILES now know how to build
themselves, the parallel nature says you can't rely on left to right
execution of deps in a parent node to make a child (dep) node build
-miniperl.exe used to be unbuildable from a clean tree except from all
target, since miniperl.exe didn't depend on mini config.h. Also mini dir
can't be a target, since each .obj built will dirty the mini dir's time
stamp and infinite loop happens, instead use a .exists file
-dmake rescans for all outstanding targets, at each recipe line to run,
this early in the build process, there are an enormous amount of files to
test for, so the echos are very slow, 350ms each, so combine as many of
the lines of mini/.exists AKA mini config.h together as possible. ".IF"
can't be put inside "one line", so not all lines were merged. Shell "if"
could be used to further group the echos but this enough to make the pause
/cpu spining not really noticable. USE_CPLUSPLUS contains an unrolled line
(the #endif) on both sides. See also procmon logs in [perl #123854]
-perllib.obj/.o needs perllibst.h which is built by miniperl+a script,
perllibst.h target doesn't need any Extensions*, so perllib.obj is still
quick to build
-perldll.def doesn't need perllibst.h since makedef.pl uses
$Config{static_ext} to find boot xsubs to export, makedef.pl does not
read perllibst.h, remove perllibst.h for more parallelism/less things to
build before perldll.def runs, and therefore Extensions (XS) starts to
run quicker, and Extensions (XS) is the longest target to build
-perlmain and perlmainst .obj/.o needs full perl headers to compile, they
aren't like generate_uudmap.exe and perlglob.exe which are perlapi unaware
-perl.exe doesn't need perl5**.dll to build, just the imp lib to
perl5**.dll, perl.exe is in the same category as XS modules, more
parallelism
-ppport.h isn't needed in blead perl, since blead is the newest perl in the
world, this allows Extensions (XS) to run sooner, ppport.h is replaced by
a dummy empty file, delete ppport.h from final installed CORE dir during
installation so the dummy ppport.h doesn't wind up in installed perl and isnt
seen by CPAN XS modules during their building by the perl user after perl
was build and installed, note mkppport script and mkppport.lst are unused
in makefile.mk now
-break up the dependencies of all the Extensions* targets, static
(just Win32CORE normally), dynamic XS and non-XS, these 3 run in parallel
now, non-XS doesn't need perl5**.lib/.a or any C headers, just PP
Config.pm
-DLL XS requires PP DynaLoader.pm for dl_findfile() otherwise
Mkbootstrap.pm fatally errors, Mkbootstrap.pm could be revised to not load
DynaLoader on Win32, since " if ($Config{'dlsrc'} =~ /^dl_dld/){" is
false, but this is the easier path right now
-DynaLoader requires module lib to build itself, but Extensions_nonxs
happens to not need mod lib, so move where mod lib is built
-in utils target, change it so it can run with miniperl, more parallelism,
pl2bat doesn't require full perl, the full perl stuff is from
commit 3fe9a6f19e from 5.003 and no ML archive is available to explain why
full perl was used instead of mini perl
-add 4 modules to buildcustomize so nonxs and xs build simultaneously
-remove ancient cruft from commit 26618a56da from 1997 from README.w32
dmake is automatically set inside CFG_VARS today. OSRELEASE is irrelavent
today, Perl doesn't use any of the defaults (like name of CC) from the
maketool.
-Time-HiRes has had a min ver of 5.6.0 since commit 90e44bf683 / release
1.9724 in 2011. dTHXR and aTHXR are for 5.005 threads compat but they are
pointless since there is usage of "unsafe" dTHX in other places in
Time-HiRes. Perl's headers don't define those 2, so they were defined to
>= 5.6.0 threads in ppport.h but a dummy ppport.h file is used, which
doesn't contain those defines to the new API, so remove usage of
pre-5.6.0 macros, this allows Time-HiRes to compile with the dummy
ppport.h with blead perl
-Reduce 21 calls of "cmd.exe /x/d/c cd" by miniperl to just 1 by saving and
reusing cwd. This reduced the amount of time to run
"..\miniperl.exe -I..\lib -f ..\write_buildcustomize.pl .." from 312 ms
to 62 ms elapsed time using timeit.exe for me.
---
Porting/Maintainers.pl | 2 +
README.win32 | 27 ++--
cpan/Time-HiRes/HiRes.pm | 2 +-
cpan/Time-HiRes/HiRes.xs | 4 +-
mkppport | 3 +-
t/porting/customized.dat | 1 +
win32/makefile.mk | 487 +++++++++++++++++++++++++---------------------
write_buildcustomize.pl | 17 ++-
8 files changed, 305 insertions(+), 238 deletions(-)
diff --git a/Porting/Maintainers.pl b/Porting/Maintainers.pl
index ca0baa6..cedebf15 100755
--- a/Porting/Maintainers.pl
+++ b/Porting/Maintainers.pl
@@ -1218,6 +1218,8 @@ use File::Glob qw(:case);
'Time::HiRes' => {
'DISTRIBUTION' => 'ZEFRAM/Time-HiRes-1.9726.tar.gz',
'FILES' => q[cpan/Time-HiRes],
+ # CPAN release eventually
+ 'CUSTOMIZED' => [ 'HiRes.xs' ],
},
'Time::Local' => {
diff --git a/README.win32 b/README.win32
index ec29cfa..13d2a79 100644
--- a/README.win32
+++ b/README.win32
@@ -96,11 +96,16 @@ See L<Usage Hints for Perl on Windows> below for general hints about this.
=item Make
You need a "make" program to build the sources. If you are using
-Visual C++ or the Windows SDK tools, nmake will work. Builds using
-the gcc need dmake.
-
-dmake is a freely available make that has very nice macro features
-and parallelability.
+Visual C++ or the Windows SDK tools, you can use nmake supplied with Visual C++
+or Windows SDK. You may also use, for Visual C++ or Windows SDK, dmake instead
+of nmake. dmake is open source software, but is not included with Visual C++ or
+Windows SDK. If you want parallel building with Visual C++ or
+Windows SDK you must use dmake instead of nmake. Builds using gcc need dmake.
+nmake is not supported for gcc builds. gmake is not supported, but might be
+added in the future. It is recommended to use dmake 4.13 or newer for parallel
+building. Older dmakes, in parallel mode, have very high CPU usage and pound
+the disk/filing system with duplicate I/O calls in an aggressive polling
+loop.
A port of dmake for Windows is available from:
@@ -135,13 +140,6 @@ console already set up for your target architecture (x86-32 or x86-64 or IA64).
With the newer compilers, you may also use the older batch files if you choose
so.
-You can also use dmake to build using Visual C++; provided, however,
-you set OSRELEASE to "microsft" (or whatever the directory name
-under which the Visual C dmake configuration lives) in your environment
-and edit win32/config.vc to change "make=nmake" into "make=dmake". The
-latter step is only essential if you want to use dmake as your default
-make for building extensions using MakeMaker.
-
=item Microsoft Visual C++ 2008-2013 Express Edition
These free versions of Visual C++ 2008-2013 Professional contain the same
@@ -400,6 +398,11 @@ perl523.dll at the perl toplevel, and various other extension dll's
under the lib\auto directory. If the build fails for any reason, make
sure you have done the previous steps correctly.
+To try dmake's parallel mode, type "dmake -P2", where 2, is the maximum number
+of parallel jobs you want to run. A number of things in the build process will
+run in parallel, but there are serialization points where you will see just 1
+CPU maxed out. This is normal.
+
If you are advanced enough with building C code, here is a suggestion to speed
up building perl, and the later C<make test>. Try to keep your PATH enviromental
variable with the least number of folders possible (remember to keep your C
diff --git a/cpan/Time-HiRes/HiRes.pm b/cpan/Time-HiRes/HiRes.pm
index cf64bc1..0ee2c62 100644
--- a/cpan/Time-HiRes/HiRes.pm
+++ b/cpan/Time-HiRes/HiRes.pm
@@ -23,7 +23,7 @@ our @EXPORT_OK = qw (usleep sleep ualarm alarm gettimeofday time tv_interval
stat lstat
);
-our $VERSION = '1.9726';
+our $VERSION = '1.9726_01';
our $XS_VERSION = $VERSION;
$VERSION = eval $VERSION;
diff --git a/cpan/Time-HiRes/HiRes.xs b/cpan/Time-HiRes/HiRes.xs
index 96640e9..9a852c4 100644
--- a/cpan/Time-HiRes/HiRes.xs
+++ b/cpan/Time-HiRes/HiRes.xs
@@ -731,7 +731,7 @@ myNVtime()
static void
hrstatns(UV *atime_nsec, UV *mtime_nsec, UV *ctime_nsec)
{
- dTHXR;
+ dTHX;
#if TIME_HIRES_STAT == 1
*atime_nsec = PL_statcache.st_atimespec.tv_nsec;
*mtime_nsec = PL_statcache.st_mtimespec.tv_nsec;
@@ -1284,7 +1284,7 @@ PROTOTYPE: ;$
fakeop.op_flags = GIMME_V == G_ARRAY ? OPf_WANT_LIST :
GIMME_V == G_SCALAR ? OPf_WANT_SCALAR : OPf_WANT_VOID;
PL_op = &fakeop;
- (void)fakeop.op_ppaddr(aTHXR);
+ (void)fakeop.op_ppaddr(aTHX);
SPAGAIN;
LEAVE;
nret = SP+1 - &ST(0);
diff --git a/mkppport b/mkppport
index 55a74fa..9f4fd75 100644
--- a/mkppport
+++ b/mkppport
@@ -160,7 +160,8 @@ mkppport [B<--list>=I<file>] [B<--clean>]
B<mkppport> generates a I<ppport.h> file using Devel::PPPort
and distributes it to the various extension directories that
-need it to build.
+need it to build. On certain Win32 builds, this script is not
+used and an alternative mechanism is used to create I<ppport.h>.
=head1 OPTIONS
diff --git a/t/porting/customized.dat b/t/porting/customized.dat
index ee65785..c3eeace 100644
--- a/t/porting/customized.dat
+++ b/t/porting/customized.dat
@@ -57,6 +57,7 @@ Win32API::File cpan/Win32API-File/t/file.t 124e64aa77e755235eb297644a87fac5388d3
Win32API::File cpan/Win32API-File/t/tie.t 712ea7edd0cc805ce1c0b8172c01b03dd19b583d
Win32API::File cpan/Win32API-File/typemap 24bff088babeadac0873e8df390d1666d9d9db4a
autodie cpan/autodie/t/mkdir.t 9e70d2282a3cc7d76a78bf8144fccba20fb37dac
+Time::HiRes cpan/Time-HiRes/HiRes.xs 0a850b6dee1f2c60ade3d4c33fab7c69b02ddc45
podlators cpan/podlators/scripts/pod2man.PL f81acf53f3ff46cdcc5ebdd661c5d13eb35d20d6
podlators cpan/podlators/scripts/pod2text.PL b4693fcfe4a0a1b38a215cfb8985a65d5d025d69
version cpan/version/lib/version.pm d0923b895d57f1d669ae36fcf85c87b16db341d1
diff --git a/win32/makefile.mk b/win32/makefile.mk
index c74b5bb..13e7e57 100644
--- a/win32/makefile.mk
+++ b/win32/makefile.mk
@@ -345,6 +345,10 @@ BUILDOPT += -DPERL_IMPLICIT_SYS
PROCESSOR_ARCHITECTURE *= x86
+.IF "$(WIN64)" == "undef"
+PROCESSOR_ARCHITECTURE = x86
+.ENDIF
+
.IF "$(WIN64)" == ""
# When we are running from a 32bit cmd.exe on AMD64 then
# PROCESSOR_ARCHITECTURE is set to x86 and PROCESSOR_ARCHITEW6432
@@ -508,6 +512,7 @@ LINK_FLAGS = $(LINK_DBG) -L"$(INST_COREDIR)" -L"$(CCLIBDIR)"
OBJOUT_FLAG = -o
EXEOUT_FLAG = -o
LIBOUT_FLAG =
+PDBOUT =
BUILDOPT += -fno-strict-aliasing -mms-bitfields
MINIBUILDOPT += -fno-strict-aliasing
@@ -653,11 +658,11 @@ CFLAGS = $(EXTRACFLAGS) $(INCLUDES) $(DEFINES) $(LOCDEFS) \
LINK_FLAGS = -nologo -nodefaultlib $(LINK_DBG) \
-libpath:"$(INST_COREDIR)" \
-machine:$(PROCESSOR_ARCHITECTURE)
-LIB_FLAGS = $(LIB_FLAGS) -nologo
+LIB_FLAGS += -nologo
OBJOUT_FLAG = -Fo
EXEOUT_FLAG = -Fe
LIBOUT_FLAG = /out:
-
+PDBOUT = -Fd$*.pdb
TESTPREPGCC =
.ENDIF
@@ -717,7 +722,7 @@ LKPOST = )
.SUFFIXES : .c .i $(o) .dll $(a) .exe .rc .res
.c$(o):
- $(CC) -c $(null,$(<:d) $(NULL) -I$(<:d)) $(CFLAGS_O) $(OBJOUT_FLAG)$@ $<
+ $(CC) -c $(null,$(<:d) $(NULL) -I$(<:d)) $(CFLAGS_O) $(OBJOUT_FLAG)$@ $(PDBOUT) $<
.c.i:
$(CC) -c $(null,$(<:d) $(NULL) -I$(<:d)) $(CFLAGS_O) -E $< >$@
@@ -744,14 +749,19 @@ $(o).dll:
#
# various targets
+
+#do not put $(MINIPERL) as a dep/prereq in a rule, instead put $(HAVEMINIPERL)
+#$(MINIPERL) is not a buildable target, use "dmake mp" if you want to just build
+#miniperl alone
MINIPERL = ..\miniperl.exe
+HAVEMINIPERL = ..\lib\buildcustomize.pl
MINIDIR = .\mini
PERLEXE = ..\perl.exe
WPERLEXE = ..\wperl.exe
PERLEXESTATIC = ..\perl-static.exe
STATICDIR = .\static.tmp
GLOBEXE = ..\perlglob.exe
-CONFIGPM = ..\lib\Config.pm ..\lib\Config_heavy.pl
+CONFIGPM = ..\lib\Config.pm
GENUUDMAP = ..\generate_uudmap.exe
.IF "$(BUILD_STATIC)" == "define" || "$(ALL_STATIC)" == "define"
PERLSTATIC = static
@@ -778,7 +788,7 @@ PERLDLL_RES =
# This used to be $(PERLEXE), but at worst it is the .dll that they depend
# on and really only the interface - i.e. the .def file used to export symbols
# from the .dll
-PERLDEP = perldll.def
+PERLDEP = $(PERLIMPLIB)
PL2BAT = bin\pl2bat.pl
@@ -834,9 +844,21 @@ INT64 = __int64
# makedef.pl must be updated if this changes, and this should normally
# only change when there is an incompatible revision of the public API.
PERLIMPLIB *= ..\perl523$(a)
+PERLEXPLIB *= ..\perl523.exp
PERLSTATICLIB *= ..\perl523s$(a)
PERLDLL = ..\perl523.dll
+#EUMM on Win32 isn't ready for parallel make, so only allow this file to be parallel
+#$(MAKE) will contain the -P that this makefile was called with, which is bad for
+#make_ext.pl since upto jobs*jobs processes will run instead of jobs
+#also any recipie containing $(MAKE) is special cased by dmake to execute recipes
+#containing $(MAKE) when "dmake -n" is executed, which causes recursive calls
+#to dmake, which means "dmake -n" is then broken as a diagnostic tool since
+#"dmake -n" will invoke all the make_ext.pl scripts build things instead of
+#showing what to build since $(MAKE) is an arg to make_ext.pl, not an invocation
+#of the dmake process
+PLMAKE = dmake
+
XCOPY = xcopy /f /r /i /d /y
RCOPY = xcopy /f /r /i /e /d /y
NOOP = @rem
@@ -997,7 +1019,7 @@ CFG_VARS = \
libperl=$(PERLIMPLIB:f) ~ \
libpth=$(CCLIBDIR);$(EXTRALIBDIRS) ~ \
libc=$(LIBC) ~ \
- make=dmake ~ \
+ make=$(PLMAKE) ~ \
_o=$(o) ~ \
obj_ext=$(o) ~ \
_a=$(a) ~ \
@@ -1019,9 +1041,7 @@ CFG_VARS = \
# Top targets
#
-all : CHECKDMAKE .\config.h ..\git_version.h $(GLOBEXE) $(MINIPERL) \
- $(CONFIGPM) $(UNIDATAFILES) MakePPPort \
- $(PERLEXE) Extensions Extensions_nonxs $(PERLSTATIC)
+all : CHECKDMAKE rebasePE $(UNIDATAFILES) Extensions_nonxs $(PERLSTATIC)
regnodes : ..\regnodes.h
@@ -1059,178 +1079,13 @@ perlglob$(o) : perlglob.c
config.w32 : $(CFGSH_TMPL)
copy $(CFGSH_TMPL) config.w32
-#
-# Copy the template config.h and set configurables at the end of it
-# as per the options chosen and compiler used.
-# Note: This config.h is only used to build miniperl.exe anyway, but
-# it's as well to have its options correct to be sure that it builds
-# and so that it's "-V" options are correct for use by makedef.pl. The
-# real config.h used to build perl.exe is generated from the top-level
-# config_h.SH by config_h.PL (run by miniperl.exe).
-#
-.\config.h : $(CFGH_TMPL) $(CORE_NOCFG_H)
- -del /f config.h
- copy $(CFGH_TMPL) config.h
- @echo.>>$@
- @echo #ifndef _config_h_footer_>>$@
- @echo #define _config_h_footer_>>$@
- @echo #undef Off_t>>$@
- @echo #undef LSEEKSIZE>>$@
- @echo #undef Off_t_size>>$@
- @echo #undef PTRSIZE>>$@
- @echo #undef SSize_t>>$@
- @echo #undef HAS_ATOLL>>$@
- @echo #undef HAS_STRTOLL>>$@
- @echo #undef HAS_STRTOULL>>$@
- @echo #undef Size_t_size>>$@
- @echo #undef IVTYPE>>$@
- @echo #undef UVTYPE>>$@
- @echo #undef IVSIZE>>$@
- @echo #undef UVSIZE>>$@
- @echo #undef NV_PRESERVES_UV>>$@
- @echo #undef NV_PRESERVES_UV_BITS>>$@
- @echo #undef IVdf>>$@
- @echo #undef UVuf>>$@
- @echo #undef UVof>>$@
- @echo #undef UVxf>>$@
- @echo #undef UVXf>>$@
- @echo #undef USE_64_BIT_INT>>$@
- @echo #undef Gconvert>>$@
- @echo #undef HAS_FREXPL>>$@
- @echo #undef HAS_ISNANL>>$@
- @echo #undef HAS_MODFL>>$@
- @echo #undef HAS_MODFL_PROTO>>$@
- @echo #undef HAS_SQRTL>>$@
- @echo #undef HAS_STRTOLD>>$@
- @echo #undef PERL_PRIfldbl>>$@
- @echo #undef PERL_PRIgldbl>>$@
- @echo #undef PERL_PRIeldbl>>$@
- @echo #undef PERL_SCNfldbl>>$@
- @echo #undef NVTYPE>>$@
- @echo #undef NVSIZE>>$@
- @echo #undef LONG_DOUBLESIZE>>$@
- @echo #undef NV_OVERFLOWS_INTEGERS_AT>>$@
- @echo #undef NVef>>$@
- @echo #undef NVff>>$@
- @echo #undef NVgf>>$@
- @echo #undef USE_LONG_DOUBLE>>$@
- @echo #undef USE_CPLUSPLUS>>$@
-.IF "$(USE_LARGE_FILES)"=="define"
- @echo #define Off_t $(INT64)>>$@
- @echo #define LSEEKSIZE ^8>>$@
- @echo #define Off_t_size ^8>>$@
-.ELSE
- @echo #define Off_t long>>$@
- @echo #define LSEEKSIZE ^4>>$@
- @echo #define Off_t_size ^4>>$@
-.ENDIF
-.IF "$(WIN64)"=="define"
- @echo #define PTRSIZE ^8>>$@
- @echo #define SSize_t $(INT64)>>$@
- @echo #define HAS_ATOLL>>$@
- @echo #define HAS_STRTOLL>>$@
- @echo #define HAS_STRTOULL>>$@
- @echo #define Size_t_size ^8>>$@
-.ELSE
- @echo #define PTRSIZE ^4>>$@
- @echo #define SSize_t int>>$@
- @echo #undef HAS_ATOLL>>$@
- @echo #undef HAS_STRTOLL>>$@
- @echo #undef HAS_STRTOULL>>$@
- @echo #define Size_t_size ^4>>$@
-.ENDIF
-.IF "$(USE_64_BIT_INT)"=="define"
- @echo #define IVTYPE $(INT64)>>$@
- @echo #define UVTYPE unsigned $(INT64)>>$@
- @echo #define IVSIZE ^8>>$@
- @echo #define UVSIZE ^8>>$@
-.IF "$(USE_LONG_DOUBLE)"=="define"
- @echo #define NV_PRESERVES_UV>>$@
- @echo #define NV_PRESERVES_UV_BITS 64>>$@
-.ELSE
- @echo #undef NV_PRESERVES_UV>>$@
- @echo #define NV_PRESERVES_UV_BITS 53>>$@
-.ENDIF
- @echo #define IVdf "I64d">>$@
- @echo #define UVuf "I64u">>$@
- @echo #define UVof "I64o">>$@
- @echo #define UVxf "I64x">>$@
- @echo #define UVXf "I64X">>$@
- @echo #define USE_64_BIT_INT>>$@
-.ELSE
- @echo #define IVTYPE long>>$@
- @echo #define UVTYPE unsigned long>>$@
- @echo #define IVSIZE ^4>>$@
- @echo #define UVSIZE ^4>>$@
- @echo #define NV_PRESERVES_UV>>$@
- @echo #define NV_PRESERVES_UV_BITS 32>>$@
- @echo #define IVdf "ld">>$@
- @echo #define UVuf "lu">>$@
- @echo #define UVof "lo">>$@
- @echo #define UVxf "lx">>$@
- @echo #define UVXf "lX">>$@
- @echo #undef USE_64_BIT_INT>>$@
-.ENDIF
-.IF "$(USE_LONG_DOUBLE)"=="define"
- @echo #define Gconvert(x,n,t,b) sprintf((b),"%.*""Lg",(n),(x))>>$@
- @echo #define HAS_FREXPL>>$@
- @echo #define HAS_ISNANL>>$@
- @echo #define HAS_MODFL>>$@
- @echo #define HAS_MODFL_PROTO>>$@
- @echo #define HAS_SQRTL>>$@
- @echo #define HAS_STRTOLD>>$@
- @echo #define PERL_PRIfldbl "Lf">>$@
- @echo #define PERL_PRIgldbl "Lg">>$@
- @echo #define PERL_PRIeldbl "Le">>$@
- @echo #define PERL_SCNfldbl "Lf">>$@
- @echo #define NVTYPE long double>>$@
-.IF "$(WIN64)"=="define"
- @echo #define NVSIZE ^16>>$@
- @echo #define LONG_DOUBLESIZE ^16>>$@
-.ELSE
- @echo #define NVSIZE ^12>>$@
- @echo #define LONG_DOUBLESIZE ^12>>$@
-.ENDIF
- @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>>$@
- @echo #define NVef "Le">>$@
- @echo #define NVff "Lf">>$@
- @echo #define NVgf "Lg">>$@
- @echo #define USE_LONG_DOUBLE>>$@
-.ELSE
- @echo #define Gconvert(x,n,t,b) sprintf((b),"%.*g",(n),(x))>>$@
- @echo #undef HAS_FREXPL>>$@
- @echo #undef HAS_ISNANL>>$@
- @echo #undef HAS_MODFL>>$@
- @echo #undef HAS_MODFL_PROTO>>$@
- @echo #undef HAS_SQRTL>>$@
- @echo #undef HAS_STRTOLD>>$@
- @echo #undef PERL_PRIfldbl>>$@
- @echo #undef PERL_PRIgldbl>>$@
- @echo #undef PERL_PRIeldbl>>$@
- @echo #undef PERL_SCNfldbl>>$@
- @echo #define NVTYPE double>>$@
- @echo #define NVSIZE ^8>>$@
- @echo #define LONG_DOUBLESIZE ^8>>$@
- @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>>$@
- @echo #define NVef "e">>$@
- @echo #define NVff "f">>$@
- @echo #define NVgf "g">>$@
- @echo #undef USE_LONG_DOUBLE>>$@
-.ENDIF
-.IF "$(USE_CPLUSPLUS)"=="define"
- @echo #define USE_CPLUSPLUS>>$@
-.ELSE
- @echo #undef USE_CPLUSPLUS>>$@
-.ENDIF
- @echo #endif>>$@
-
-..\git_version.h : $(MINIPERL) ..\make_patchnum.pl
+..\git_version.h : $(HAVEMINIPERL) ..\make_patchnum.pl
cd .. && miniperl -Ilib make_patchnum.pl
# make sure that we recompile perl.c if the git version changes
..\perl$(o) : ..\git_version.h
-..\config.sh : config.w32 $(MINIPERL) config_sh.PL FindExt.pm
+..\config.sh : config.w32 $(HAVEMINIPERL) config_sh.PL FindExt.pm
$(MINIPERL) -I..\lib config_sh.PL --cfgsh-option-file \
$(mktmp $(CFG_VARS)) config.w32 > ..\config.sh
@@ -1246,18 +1101,18 @@ regen_config_h:
-$(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)"
rename config.h $(CFGH_TMPL)
-$(CONFIGPM) : $(MINIPERL) ..\config.sh config_h.PL
+$(CONFIGPM): ..\config.sh config_h.PL
$(MINIPERL) -I..\lib ..\configpm --chdir=..
$(XCOPY) ..\*.h $(COREDIR)\*.*
$(XCOPY) *.h $(COREDIR)\*.*
$(RCOPY) include $(COREDIR)\*.*
$(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)" \
- || $(MAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)
+ || $(PLMAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)
-# See the comment in Makefile.SH explaining this seemingly cranky ordering
-$(MINIPERL) : ..\lib\buildcustomize.pl
+.\config.h : $(CONFIGPM)
-..\lib\buildcustomize.pl : $(MINIDIR) $(MINI_OBJ) $(CRTIPMLIBS) ..\write_buildcustomize.pl
+# See the comment in Makefile.SH explaining this seemingly cranky ordering
+..\lib\buildcustomize.pl : $(MINI_OBJ) ..\write_buildcustomize.pl
.IF "$(CCTYPE)" == "GCC"
$(LINK32) -v -mconsole -o $(MINIPERL) $(BLINK_FLAGS) \
$(mktmp $(LKPRE) $(MINI_OBJ) $(LIBFILES) $(LKPOST))
@@ -1268,31 +1123,202 @@ $(MINIPERL) : ..\lib\buildcustomize.pl
.ENDIF
$(MINIPERL) -I..\lib -f ..\write_buildcustomize.pl ..
-$(MINIDIR) :
+#convinence target, get a working miniperl
+mp : $(CONFIGPM)
+
+$(MINIDIR)\.exists : $(CFGH_TMPL)
if not exist "$(MINIDIR)" mkdir "$(MINIDIR)"
+#
+# Copy the template config.h and set configurables at the end of it
+# as per the options chosen and compiler used.
+# Note: This config.h is only used to build miniperl.exe anyway, but
+# it's as well to have its options correct to be sure that it builds
+# and so that it's "-V" options are correct for use by makedef.pl. The
+# real config.h used to build perl.exe is generated from the top-level
+# config_h.SH by config_h.PL (run by miniperl.exe).
+#
+# MINIDIR generates config.h so miniperl.exe is not rebuilt when the 2nd
+# config.h is generated in CONFIGPM target, see also the comments for $(MINI_OBJ).
+ -if exist config.h del /f config.h
+ copy $(CFGH_TMPL) config.h
+ @(echo.&& \
+ echo #ifndef _config_h_footer_&& \
+ echo #define _config_h_footer_&& \
+ echo #undef Off_t&& \
+ echo #undef LSEEKSIZE&& \
+ echo #undef Off_t_size&& \
+ echo #undef PTRSIZE&& \
+ echo #undef SSize_t&& \
+ echo #undef HAS_ATOLL&& \
+ echo #undef HAS_STRTOLL&& \
+ echo #undef HAS_STRTOULL&& \
+ echo #undef Size_t_size&& \
+ echo #undef IVTYPE&& \
+ echo #undef UVTYPE&& \
+ echo #undef IVSIZE&& \
+ echo #undef UVSIZE&& \
+ echo #undef NV_PRESERVES_UV&& \
+ echo #undef NV_PRESERVES_UV_BITS&& \
+ echo #undef IVdf&& \
+ echo #undef UVuf&& \
+ echo #undef UVof&& \
+ echo #undef UVxf&& \
+ echo #undef UVXf&& \
+ echo #undef USE_64_BIT_INT&& \
+ echo #undef Gconvert&& \
+ echo #undef HAS_FREXPL&& \
+ echo #undef HAS_ISNANL&& \
+ echo #undef HAS_MODFL&& \
+ echo #undef HAS_MODFL_PROTO&& \
+ echo #undef HAS_SQRTL&& \
+ echo #undef HAS_STRTOLD&& \
+ echo #undef PERL_PRIfldbl&& \
+ echo #undef PERL_PRIgldbl&& \
+ echo #undef PERL_PRIeldbl&& \
+ echo #undef PERL_SCNfldbl&& \
+ echo #undef NVTYPE&& \
+ echo #undef NVSIZE&& \
+ echo #undef LONG_DOUBLESIZE&& \
+ echo #undef NV_OVERFLOWS_INTEGERS_AT&& \
+ echo #undef NVef&& \
+ echo #undef NVff&& \
+ echo #undef NVgf&& \
+ echo #undef USE_LONG_DOUBLE&& \
+ echo #undef USE_CPLUSPLUS)>> config.h
+.IF "$(USE_LARGE_FILES)"=="define"
+ @(echo #define Off_t $(INT64)&& \
+ echo #define LSEEKSIZE ^8&& \
+ echo #define Off_t_size ^8)>> config.h
+.ELSE
+ @(echo #define Off_t long&& \
+ echo #define LSEEKSIZE ^4&& \
+ echo #define Off_t_size ^4)>> config.h
+.ENDIF
+.IF "$(WIN64)"=="define"
+ @(echo #define PTRSIZE ^8&& \
+ echo #define SSize_t $(INT64)&& \
+ echo #define HAS_ATOLL&& \
+ echo #define HAS_STRTOLL&& \
+ echo #define HAS_STRTOULL&& \
+ echo #define Size_t_size ^8)>> config.h
+.ELSE
+ @(echo #define PTRSIZE ^4&& \
+ echo #define SSize_t int&& \
+ echo #undef HAS_ATOLL&& \
+ echo #undef HAS_STRTOLL&& \
+ echo #undef HAS_STRTOULL&& \
+ echo #define Size_t_size ^4)>> config.h
+.ENDIF
+.IF "$(USE_64_BIT_INT)"=="define"
+ @(echo #define IVTYPE $(INT64)&& \
+ echo #define UVTYPE unsigned $(INT64)&& \
+ echo #define IVSIZE ^8&& \
+ echo #define UVSIZE ^8)>> config.h
+.IF "$(USE_LONG_DOUBLE)"=="define"
+ @(echo #define NV_PRESERVES_UV&& \
+ echo #define NV_PRESERVES_UV_BITS 64)>> config.h
+.ELSE
+ @(echo #undef NV_PRESERVES_UV&& \
+ echo #define NV_PRESERVES_UV_BITS 53)>> config.h
+.ENDIF
+ @(echo #define IVdf "I64d"&& \
+ echo #define UVuf "I64u"&& \
+ echo #define UVof "I64o"&& \
+ echo #define UVxf "I64x"&& \
+ echo #define UVXf "I64X"&& \
+ echo #define USE_64_BIT_INT)>> config.h
+.ELSE
+ @(echo #define IVTYPE long&& \
+ echo #define UVTYPE unsigned long&& \
+ echo #define IVSIZE ^4&& \
+ echo #define UVSIZE ^4&& \
+ echo #define NV_PRESERVES_UV&& \
+ echo #define NV_PRESERVES_UV_BITS 32&& \
+ echo #define IVdf "ld"&& \
+ echo #define UVuf "lu"&& \
+ echo #define UVof "lo"&& \
+ echo #define UVxf "lx"&& \
+ echo #define UVXf "lX"&& \
+ echo #undef USE_64_BIT_INT)>> config.h
+.ENDIF
+.IF "$(USE_LONG_DOUBLE)"=="define"
+ @(echo #define Gconvert^(x,n,t,b^) sprintf^(^(b^),"%.*""Lg",^(n^),^(x^)^)&& \
+ echo #define HAS_FREXPL&& \
+ echo #define HAS_ISNANL&& \
+ echo #define HAS_MODFL&& \
+ echo #define HAS_MODFL_PROTO&& \
+ echo #define HAS_SQRTL&& \
+ echo #define HAS_STRTOLD&& \
+ echo #define PERL_PRIfldbl "Lf"&& \
+ echo #define PERL_PRIgldbl "Lg"&& \
+ echo #define PERL_PRIeldbl "Le"&& \
+ echo #define PERL_SCNfldbl "Lf"&& \
+ echo #define NVTYPE long double)>> config.h
+.IF "$(WIN64)"=="define"
+ @(echo #define NVSIZE ^16&& \
+ echo #define LONG_DOUBLESIZE ^16)>> config.h
+.ELSE
+ @(echo #define NVSIZE ^12&& \
+ echo #define LONG_DOUBLESIZE ^12)>> config.h
+.ENDIF
+ @(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&& \
+ echo #define NVef "Le"&& \
+ echo #define NVff "Lf"&& \
+ echo #define NVgf "Lg"&& \
+ echo #define USE_LONG_DOUBLE)>> config.h
+.ELSE
+ @(echo #define Gconvert^(x,n,t,b^) sprintf^(^(b^),"%.*g",^(n^),^(x^)^)&& \
+ echo #undef HAS_FREXPL&& \
+ echo #undef HAS_ISNANL&& \
+ echo #undef HAS_MODFL&& \
+ echo #undef HAS_MODFL_PROTO&& \
+ echo #undef HAS_SQRTL&& \
+ echo #undef HAS_STRTOLD&& \
+ echo #undef PERL_PRIfldbl&& \
+ echo #undef PERL_PRIgldbl&& \
+ echo #undef PERL_PRIeldbl&& \
+ echo #undef PERL_SCNfldbl&& \
+ echo #define NVTYPE double&& \
+ echo #define NVSIZE ^8&& \
+ echo #define LONG_DOUBLESIZE ^8&& \
+ 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&& \
+ echo #define NVef "e"&& \
+ echo #define NVff "f"&& \
+ echo #define NVgf "g"&& \
+ echo #undef USE_LONG_DOUBLE)>> config.h
+.ENDIF
+.IF "$(USE_CPLUSPLUS)"=="define"
+ @(echo #define USE_CPLUSPLUS&& \
+ echo #endif)>> config.h
+.ELSE
+ @(echo #undef USE_CPLUSPLUS&& \
+ echo #endif)>> config.h
+.ENDIF
+#separate line since this is sentinal that this target is done
+ rem. > $(MINIDIR)\.exists
$(MINICORE_OBJ) : $(CORE_NOCFG_H)
- $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_EXTERNAL_GLOB -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ ..\$(*B).c
+ $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_EXTERNAL_GLOB -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ $(PDBOUT) ..\$(*B).c
$(MINIWIN32_OBJ) : $(CORE_NOCFG_H)
- $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ $(*B).c
+ $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ $(PDBOUT) $(*B).c
# -DPERL_IMPLICIT_SYS needs C++ for perllib.c
# rules wrapped in .IFs break Win9X build (we end up with unbalanced []s unless
# unless the .IF is true), so instead we use a .ELSE with the default.
# This is the only file that depends on perlhost.h, vmem.h, and vdir.h
-perllib$(o) : perllib.c .\perlhost.h .\vdir.h .\vmem.h
+perllib$(o) : perllib.c perllibst.h .\perlhost.h .\vdir.h .\vmem.h
.IF "$(USE_IMP_SYS)" == "define"
- $(CC) -c -I. $(CFLAGS_O) $(CXX_FLAG) $(OBJOUT_FLAG)$@ perllib.c
+ $(CC) -c -I. $(CFLAGS_O) $(CXX_FLAG) $(OBJOUT_FLAG)$@ $(PDBOUT) perllib.c
.ELSE
- $(CC) -c -I. $(CFLAGS_O) $(OBJOUT_FLAG)$@ perllib.c
+ $(CC) -c -I. $(CFLAGS_O) $(OBJOUT_FLAG)$@ $(PDBOUT) perllib.c
.ENDIF
# 1. we don't want to rebuild miniperl.exe when config.h changes
# 2. we don't want to rebuild miniperl.exe with non-default config.h
# 3. we can't have miniperl.exe depend on git_version.h, as miniperl creates it
-$(MINI_OBJ) : $(CORE_NOCFG_H)
+$(MINI_OBJ) : $(MINIDIR)\.exists $(CORE_NOCFG_H)
$(WIN32_OBJ) : $(CORE_H)
@@ -1300,12 +1326,26 @@ $(CORE_OBJ) : $(CORE_H)
$(DLL_OBJ) : $(CORE_H)
-perldll.def : $(MINIPERL) $(CONFIGPM) ..\embed.fnc ..\makedef.pl create_perllibst_h.pl
+
+perllibst.h : $(HAVEMINIPERL) $(CONFIGPM) create_perllibst_h.pl
$(MINIPERL) -I..\lib create_perllibst_h.pl
+
+perldll.def : $(HAVEMINIPERL) $(CONFIGPM) ..\embed.fnc ..\makedef.pl
$(MINIPERL) -I..\lib -w ..\makedef.pl PLATFORM=win32 $(OPTIMIZE) $(DEFINES) \
$(BUILDOPT) CCTYPE=$(CCTYPE) TARG_DIR=..\ > perldll.def
-$(PERLDLL): perldll.def $(PERLDLL_OBJ) $(PERLDLL_RES) Extensions_static
+$(PERLIMPLIB) : perldll.def
+.IF "$(CCTYPE)" == "GCC"
+ $(IMPLIB) -k -d perldll.def -l $(PERLIMPLIB)
+.ELSE #VC family
+ lib -def:perldll.def -machine:$(ARCHITECTURE) /OUT:$(PERLIMPLIB)
+.ENDIF
+ $(XCOPY) $(PERLIMPLIB) $(COREDIR)
+
+#PERLEXPLIB is built in PERLIMPLIB
+$(PERLEXPLIB): $(PERLIMPLIB)
+
+$(PERLDLL): $(PERLEXPLIB) $(PERLDLL_OBJ) $(PERLDLL_RES) Extensions_static
.IF "$(CCTYPE)" == "GCC"
$(LINK32) -mdll -o $@ -Wl,--base-file -Wl,perl.base $(BLINK_FLAGS) \
$(mktmp $(LKPRE) $(PERLDLL_OBJ) \
@@ -1321,13 +1361,12 @@ $(PERLDLL): perldll.def $(PERLDLL_OBJ) $(PERLDLL_RES) Extensions_static
$(shell @type Extensions_static) \
$(LIBFILES) perl.exp $(LKPOST))
.ELSE
- $(LINK32) -dll -def:perldll.def -out:$@ $(BLINK_FLAGS) \
+ $(LINK32) -dll -out:$@ $(BLINK_FLAGS) \
@Extensions_static \
@$(mktmp -base:0x28000000 $(DELAYLOAD) $(LIBFILES) \
- $(PERLDLL_RES) $(PERLDLL_OBJ))
+ $(PERLDLL_RES) $(PERLDLL_OBJ) $(PERLEXPLIB))
$(EMBED_DLL_MANI)
.ENDIF
- $(XCOPY) $(PERLIMPLIB) $(COREDIR)
$(PERLSTATICLIB): $(PERLDLL_OBJ) Extensions_static
.IF "$(CCTYPE)" == "GCC"
@@ -1367,16 +1406,16 @@ $(GENUUDMAP) : $(GENUUDMAP_OBJ)
perlmain.c : runperl.c
copy runperl.c perlmain.c
-perlmain$(o) : perlmain.c
- $(CC) $(CFLAGS_O:s,-DPERLDLL,-UPERLDLL,) $(OBJOUT_FLAG)$@ -c perlmain.c
+perlmain$(o) : $(CONFIGPM) perlmain.c
+ $(CC) $(CFLAGS_O:s,-DPERLDLL,-UPERLDLL,) $(OBJOUT_FLAG)$@ $(PDBOUT) -c perlmain.c
perlmainst.c : runperl.c
copy runperl.c perlmainst.c
-perlmainst$(o) : perlmainst.c
- $(CC) $(CFLAGS_O) $(OBJOUT_FLAG)$@ -c perlmainst.c
+perlmainst$(o) : $(CONFIGPM) perlmainst.c
+ $(CC) $(CFLAGS_O) $(OBJOUT_FLAG)$@ $(PDBOUT) -c perlmainst.c
-$(PERLEXE): $(PERLDLL) $(CONFIGPM) $(PERLEXE_OBJ) $(PERLEXE_RES)
+$(PERLEXE): $(CONFIGPM) $(PERLEXE_OBJ) $(PERLEXE_RES) $(PERLIMPLIB)
.IF "$(CCTYPE)" == "GCC"
$(LINK32) -mconsole -o $@ $(BLINK_FLAGS) \
$(PERLEXE_OBJ) $(PERLEXE_RES) $(PERLIMPLIB) $(LIBFILES)
@@ -1398,43 +1437,52 @@ $(PERLEXESTATIC): $(PERLSTATICLIB) $(CONFIGPM) $(PERLEXEST_OBJ) $(PERLEXE_RES)
$(EMBED_EXE_MANI)
.ENDIF
-MakePPPort: $(MINIPERL) $(CONFIGPM) Extensions_nonxs
- $(MINIPERL) -I..\lib ..\mkppport
-
#-------------------------------------------------------------------------------
# There's no direct way to mark a dependency on
# DynaLoader.pm, so this will have to do
Extensions : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) $(DYNALOADER)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic
+ if not exist $(COREDIR)\ppport.h rem. > $(COREDIR)\ppport.h
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic
Extensions_reonly : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) $(DYNALOADER)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic +re
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic +re
-Extensions_static : ..\make_ext.pl ..\lib\buildcustomize.pl list_static_libs.pl $(PERLDEP) $(CONFIGPM) Extensions_nonxs
+Extensions_static : ..\make_ext.pl ..\lib\buildcustomize.pl list_static_libs.pl $(CONFIGPM)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --static
+ if not exist $(COREDIR)\ppport.h rem. > $(COREDIR)\ppport.h
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --static
$(MINIPERL) -I..\lib list_static_libs.pl > Extensions_static
-Extensions_nonxs : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) ..\pod\perlfunc.pod
- $(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --nonxs
+Extensions_nonxs : ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM) ..\pod\perlfunc.pod
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --nonxs !libs
-$(DYNALOADER) : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) Extensions_nonxs
+#lib must be built, it can't be buildcustomize.pl-ed, and is required for XS building
+$(DYNALOADER) : ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --dynaloader
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(EXTDIR) --dir=$(DISTDIR) --dynaloader lib
Extensions_clean :
- -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=clean
+ -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=clean
Extensions_realclean :
- -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=realclean
+ -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=realclean
+
+# all PE files need to be built by the time this target runs, PP files can still
+# be running in parallel like UNIDATAFILES, this target a placeholder for the
+# future
+.IF "$(BUILD_STATIC)"=="define"
+rebasePE : Extensions $(PERLDLL) $(PERLEXE) $(GLOBEXE) $(PERLEXESTATIC)
+.ELSE
+rebasePE : Extensions $(PERLDLL) $(PERLEXE) $(GLOBEXE)
+.ENDIF
+ $(NOOP)
#-------------------------------------------------------------------------------
-doc: $(PERLEXE) ..\pod\perltoc.pod
+doc: $(PERLEXE) $(PERLDLL) ..\pod\perltoc.pod
$(PERLEXE) ..\installhtml --podroot=.. --htmldir=$(HTMLDIR) \
--podpath=pod:lib:utils --htmlroot="file://$(INST_HTML:s,:,|,)"\
--recurse
@@ -1444,8 +1492,8 @@ doc: $(PERLEXE) ..\pod\perltoc.pod
# Note that this next section is parsed (and regenerated) by pod/buildtoc
# so please check that script before making structural changes here
-utils: $(PERLEXE) ..\utils\Makefile
- cd ..\utils && $(MAKE) PERL=$(MINIPERL)
+utils: $(HAVEMINIPERL) ..\utils\Makefile
+ cd ..\utils && $(PLMAKE) PERL=$(MINIPERL)
copy ..\README.aix ..\pod\perlaix.pod
copy ..\README.amiga ..\pod\perlamiga.pod
copy ..\README.android ..\pod\perlandroid.pod
@@ -1480,11 +1528,11 @@ utils: $(PERLEXE) ..\utils\Makefile
copy ..\README.vos ..\pod\perlvos.pod
copy ..\README.win32 ..\pod\perlwin32.pod
copy ..\pod\perldelta.pod ..\pod\perl5232delta.pod
- $(PERLEXE) $(PL2BAT) $(UTILS)
+ $(MINIPERL) -I..\lib $(PL2BAT) $(UTILS)
$(MINIPERL) -I..\lib ..\autodoc.pl ..
$(MINIPERL) -I..\lib ..\pod\perlmodlib.PL -q ..
-..\pod\perltoc.pod: $(PERLEXE) Extensions Extensions_nonxs
+..\pod\perltoc.pod: $(PERLEXE) $(PERLDLL) Extensions Extensions_nonxs ..\pod\perluniprops.pod utils
$(PERLEXE) -f ..\pod\buildtoc -q
# Note that the pod cleanup in this next section is parsed (and regenerated
@@ -1609,6 +1657,7 @@ install : all installbare installhtml
installbare : utils ..\pod\perltoc.pod
$(PERLEXE) ..\installperl
+ attrib -r $(INST_COREDIR)\ppport.h && del $(INST_COREDIR)\ppport.h
if exist $(WPERLEXE) $(XCOPY) $(WPERLEXE) $(INST_BIN)\*.*
if exist $(PERLEXESTATIC) $(XCOPY) $(PERLEXESTATIC) $(INST_BIN)\*.*
$(XCOPY) $(GLOBEXE) $(INST_BIN)\*.*
@@ -1621,11 +1670,11 @@ installhtml : doc
inst_lib : $(CONFIGPM)
$(RCOPY) ..\lib $(INST_LIB)\*.*
-$(UNIDATAFILES) ..\pod\perluniprops.pod .UPDATEALL : $(MINIPERL) $(CONFIGPM) ..\lib\unicore\mktables Extensions_nonxs
+$(UNIDATAFILES) ..\pod\perluniprops.pod .UPDATEALL : $(CONFIGPM) ..\lib\unicore\mktables
cd ..\lib\unicore && \
..\$(MINIPERL) -I.. mktables -P ..\..\pod -maketest -makelist -p
-minitest : .\config.h $(MINIPERL) ..\git_version.h $(GLOBEXE) $(CONFIGPM) $(UNIDATAFILES) $(TESTPREPGCC)
+minitest : .\config.h $(HAVEMINIPERL) ..\git_version.h $(GLOBEXE) $(CONFIGPM) $(UNIDATAFILES) $(TESTPREPGCC)
$(XCOPY) $(MINIPERL) ..\t\$(NULL)
if exist ..\t\perl.exe del /f ..\t\perl.exe
rename ..\t\miniperl.exe perl.exe
diff --git a/write_buildcustomize.pl b/write_buildcustomize.pl
index 5d819b5..d3bbd0f 100644
--- a/write_buildcustomize.pl
+++ b/write_buildcustomize.pl
@@ -41,12 +41,23 @@ my @toolchain = qw(cpan/AutoLoader/lib
dist/constant/lib
);
-# Used only in ExtUtils::Liblist::Kid::_win32_ext()
-push @toolchain, 'cpan/Text-ParseWords/lib' if $^O eq 'MSWin32';
+# Text-ParseWords used only in ExtUtils::Liblist::Kid::_win32_ext()
+# the rest are for XS building on Win32, since nonxs and xs build simultaneously
+# on Win32 if parallel building
+push @toolchain, qw(
+ cpan/Text-ParseWords/lib
+ dist/ExtUtils-ParseXS/lib
+ cpan/Getopt-Long/lib
+ cpan/parent/lib
+ cpan/ExtUtils-Constant/lib
+) if $^O eq 'MSWin32';
push @toolchain, 'ext/VMS-Filespec/lib' if $^O eq 'VMS';
unshift @INC, @toolchain;
require File::Spec::Functions;
+require Cwd;
+
+my $cwd = Cwd::getcwd();
# lib must be last, as the toolchain modules write themselves into it
# as they build, and it's important that @INC order ensures that the partially
@@ -54,7 +65,7 @@ require File::Spec::Functions;
my $inc = join ",\n ",
map { "q\0$_\0" }
- (map {File::Spec::Functions::rel2abs($_)} (
+ (map {File::Spec::Functions::rel2abs($_, $cwd)} (
# faster build on the non-parallel Win32 build process
$^O eq 'MSWin32' ? ('lib', @toolchain ) : (@toolchain, 'lib')
));
--
1.7.9.msysgit.0
|
From @bulk880002-add-parallel-support-4-Win32-dmake-COREDIR-paralleli.patchFrom 327e169d000c16db8b24b4244591162735537e97 Mon Sep 17 00:00:00 2001
From: Daniel Dragan <bulk88@hotmail.com>
Date: Sat, 15 Aug 2015 05:24:06 -0400
Subject: [PATCH 2/3] add parallel support 4 Win32 dmake-COREDIR parallelism
part 2
-defer the mass copy of headers to COREDIR until XS build time
and dont use COREDIR for building miniperl interp or perl interp, more
thing to do in parallel this way and 1 less path to search by the CC
-config_h.PL requires config.h to be in COREDIR, this XCOPY in CONFIGPM
targ is where COREDIR is created if it doesnt exist already
-remove a bunch of XCOPY'es, copy the headers in 1 place only, and dont
copy them unless they change based on timestamps
-the DYNALOADER dep already contains
"..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM) $(HAVE_COREDIR)" dont
specify them again in Extensions and Extensions_reonly, this probably
reduces the size of dep graph in dmake, since dmake explodes the graph and
checks the outline of the graph/tree very inefficiently in parallel mode
(architectural problem with dmake)
-delete pdb files in root, otherwise switching VC version will make the
next cl.exe error out that it can't write to the pdb file due to version
numbers in the pdb file
-reorder core .c files in a blend of VC and GCC time order, this reduces
a 1:08 mins time to do "dmake -P9 ../perl522.dll" to 0:54 mins on 8 core
with GCC, see details in #123867
---
pod/perldelta.pod | 11 ++++++-
win32/makefile.mk | 71 +++++++++++++++++++++++++++++------------------------
2 files changed, 48 insertions(+), 34 deletions(-)
diff --git a/pod/perldelta.pod b/pod/perldelta.pod
index 8ae82cf..1e676b0 100644
--- a/pod/perldelta.pod
+++ b/pod/perldelta.pod
@@ -322,9 +322,16 @@ L</Modules and Pragmata> section.
=over 4
-=item XXX-some-platform
+=item Win32
-XXX
+=over
+
+=item *
+
+Parallel building has been added to the dmake C<makefile.mk> makefile. All
+Win32 compilers are supported.
+
+=back
=back
diff --git a/win32/makefile.mk b/win32/makefile.mk
index 13e7e57..0d3869f 100644
--- a/win32/makefile.mk
+++ b/win32/makefile.mk
@@ -472,7 +472,7 @@ a = .a
# Options
#
-INCLUDES = -I.\include -I. -I.. -I$(COREDIR)
+INCLUDES = -I.\include -I. -I..
DEFINES = -DWIN32
.IF "$(WIN64)" == "define"
DEFINES += -DWIN64 -DCONSERVATIVE
@@ -560,7 +560,7 @@ RSC = rc
# Options
#
-INCLUDES = -I$(COREDIR) -I.\include -I. -I..
+INCLUDES = -I.\include -I. -I..
#PCHFLAGS = -Fpc:\temp\vcmoduls.pch -YX
DEFINES = -DWIN32 -D_CONSOLE -DNO_STRICT
LOCDEFS = -DPERLDLL -DPERL_CORE
@@ -863,45 +863,47 @@ XCOPY = xcopy /f /r /i /d /y
RCOPY = xcopy /f /r /i /e /d /y
NOOP = @rem
+#first ones are arrange in compile time order for faster parallel building
+#see #123867 for details
MICROCORE_SRC = \
+ ..\toke.c \
+ ..\regcomp.c \
+ ..\regexec.c \
+ ..\op.c \
+ ..\sv.c \
+ ..\pp.c \
+ ..\pp_ctl.c \
+ ..\pp_sys.c \
+ ..\pp_pack.c \
+ ..\pp_hot.c \
+ ..\gv.c \
+ ..\perl.c \
+ ..\utf8.c \
+ ..\dump.c \
+ ..\hv.c \
..\av.c \
..\caretx.c \
..\deb.c \
..\doio.c \
..\doop.c \
..\dquote.c \
- ..\dump.c \
..\globals.c \
- ..\gv.c \
..\mro_core.c \
- ..\hv.c \
..\locale.c \
..\keywords.c \
..\mathoms.c \
..\mg.c \
..\numeric.c \
- ..\op.c \
..\pad.c \
- ..\perl.c \
..\perlapi.c \
..\perly.c \
- ..\pp.c \
- ..\pp_ctl.c \
- ..\pp_hot.c \
- ..\pp_pack.c \
..\pp_sort.c \
- ..\pp_sys.c \
..\reentr.c \
- ..\regcomp.c \
- ..\regexec.c \
..\run.c \
..\scope.c \
- ..\sv.c \
..\taint.c \
..\time64.c \
- ..\toke.c \
..\universal.c \
- ..\utf8.c \
..\util.c
EXTRACORE_SRC += perllib.c
@@ -966,6 +968,10 @@ UUDMAP_H = ..\uudmap.h
BITCOUNT_H = ..\bitcount.h
MG_DATA_H = ..\mg_data.h
GENERATED_HEADERS = $(UUDMAP_H) $(BITCOUNT_H) $(MG_DATA_H)
+#a stub ppport.h must be generated so building XS modules, .c->.obj wise, will
+#work, so this target also represents creating the COREDIR and filling it
+HAVE_COREDIR = $(COREDIR)\ppport.h
+
MICROCORE_OBJ = $(MICROCORE_SRC:db:+$(o))
CORE_OBJ = $(MICROCORE_OBJ) $(EXTRACORE_SRC:db:+$(o))
@@ -1103,9 +1109,7 @@ regen_config_h:
$(CONFIGPM): ..\config.sh config_h.PL
$(MINIPERL) -I..\lib ..\configpm --chdir=..
- $(XCOPY) ..\*.h $(COREDIR)\*.*
- $(XCOPY) *.h $(COREDIR)\*.*
- $(RCOPY) include $(COREDIR)\*.*
+ $(XCOPY) config.h $(COREDIR)\*.*
$(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)" \
|| $(PLMAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)
@@ -1381,7 +1385,7 @@ $(PERLSTATICLIB): $(PERLDLL_OBJ) Extensions_static
$(LIB32) $(LIB_FLAGS) -out:$@ @Extensions_static \
@$(mktmp $(PERLDLL_OBJ))
.ENDIF
- $(XCOPY) $(PERLSTATICLIB) $(COREDIR)
+ $(XCOPY) $(PERLSTATICLIB) $(COREDIR)\$(NULL)
$(PERLEXE_RES): perlexe.rc $(PERLEXE_MANIFEST) $(PERLEXE_ICO)
@@ -1392,6 +1396,13 @@ $(UUDMAP_H) $(MG_DATA_H) : $(BITCOUNT_H)
$(BITCOUNT_H) : $(GENUUDMAP)
$(GENUUDMAP) $(GENERATED_HEADERS)
+#This generates a stub ppport.h & creates & fills /lib/CORE to allow for XS
+#building .c->.obj wise (linking is a different thing). This taget is AKA
+#$(HAVE_COREDIR).
+$(COREDIR)\ppport.h : $(CORE_H)
+ $(XCOPY) *.h $(COREDIR)\*.* && $(RCOPY) include $(COREDIR)\*.* && $(XCOPY) ..\*.h $(COREDIR)\*.*
+ rem. > $@
+
$(GENUUDMAP_OBJ) : ..\mg_raw.h
$(GENUUDMAP) : $(GENUUDMAP_OBJ)
@@ -1440,18 +1451,15 @@ $(PERLEXESTATIC): $(PERLSTATICLIB) $(CONFIGPM) $(PERLEXEST_OBJ) $(PERLEXE_RES)
#-------------------------------------------------------------------------------
# There's no direct way to mark a dependency on
# DynaLoader.pm, so this will have to do
-Extensions : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) $(DYNALOADER)
- $(XCOPY) ..\*.h $(COREDIR)\*.*
- if not exist $(COREDIR)\ppport.h rem. > $(COREDIR)\ppport.h
+
+#most of deps of this target are in DYNALOADER and therefore omitted here
+Extensions : $(PERLDEP) $(DYNALOADER)
$(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic
-Extensions_reonly : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) $(DYNALOADER)
- $(XCOPY) ..\*.h $(COREDIR)\*.*
+Extensions_reonly : $(PERLDEP) $(DYNALOADER)
$(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic +re
-Extensions_static : ..\make_ext.pl ..\lib\buildcustomize.pl list_static_libs.pl $(CONFIGPM)
- $(XCOPY) ..\*.h $(COREDIR)\*.*
- if not exist $(COREDIR)\ppport.h rem. > $(COREDIR)\ppport.h
+Extensions_static : ..\make_ext.pl ..\lib\buildcustomize.pl list_static_libs.pl $(CONFIGPM) $(HAVE_COREDIR)
$(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --static
$(MINIPERL) -I..\lib list_static_libs.pl > Extensions_static
@@ -1459,8 +1467,7 @@ Extensions_nonxs : ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM) ..\pod\pe
$(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --nonxs !libs
#lib must be built, it can't be buildcustomize.pl-ed, and is required for XS building
-$(DYNALOADER) : ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM)
- $(XCOPY) ..\*.h $(COREDIR)\*.*
+$(DYNALOADER) : ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM) $(HAVE_COREDIR)
$(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(EXTDIR) --dir=$(DISTDIR) --dynaloader lib
Extensions_clean :
@@ -1760,7 +1767,7 @@ _clean :
-@erase ..\*$(o) ..\*$(a) ..\*.exp *$(o) *$(a) *.exp *.res
-@erase ..\t\*.exe ..\t\*.dll ..\t\*.bat
-@erase *.ilk
- -@erase *.pdb
+ -@erase *.pdb ..\*.pdb
-@erase Extensions_static
--
1.7.9.msysgit.0
|
From @bulk880003-add-parallel-support-4-Win32-dmake-uudmap-no-2nd-run.patchFrom cdbc9465c8c7c0aa3d02b363ae87b57460535fea Mon Sep 17 00:00:00 2001
From: Daniel Dragan <bulk88@hotmail.com>
Date: Sat, 15 Aug 2015 05:39:55 -0400
Subject: [PATCH 3/3] add parallel support 4 Win32 dmake-uudmap+no 2nd run of
config_h.PL part 3
-in $(CONFIGPM) target, remove config_h.PL running dmake again to rebuild
$(CONFIGPM) target, configpm the script does not use config.h as input.
The $(CONFIGPM) target is a choke/serialization point for parallel
building, so it is high value to make it as fast as possible.
Maybe a long time ago, configpm read config.h but it doesn't anymore.
Nearly all the dynamic config vars are determined in config_sh.PL script
and ..\config.sh target. config_h.PL contains very little logic, and this
logic is only for config.h, and only when you want a var to be different
in config.h than it is in Config.pm/Config_heavy.pl. Putting a breakpoint
("system 'pause';") in config_h.PL, copying Config.pm/Config_heavy.pl to
".old" versions, continuing execution in config_h.PL, then diffing the
2 new Configs with the old 2 Configs before pre-config_h.PL and
"$(PLMAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)" shows no differece.
When dmake runs needlessly a 2nd time it emits a warning that nothing
changed. This is intentional, since configpm doesn't update the timestamps
/update the files if the Config files are identical to the old ones to
prevent mass clean+rebuild of all modules when nothing global changed.
dmake: Warning: -- Target [..\lib\Config.pm] was made but the time stamp
has not been updated.
-reduce number of steps to build generate_uudmap.exe.
Compiling (140 ms on GCC 4.8.3) and linking (561 ms) is heavy weight
compared to running generate_uudmap.exe (31 ms) and compiling globals.c
(483 ms). dmake's algo for doing parallel is poor. On the main parallel
pass with all the mini core .c files compiling ("MINI_OBJ"),
only generate_uudmap.o will be generated as part of the chain of deps
hanging off globals.o, after the 1st tier of MINI_OBJ has compiled in
parallel, dmake will do another sweep of MINI_OBJ, this time it will find
generate_uudmap.exe node and run linking, at this 2nd tier nothing ran
except linking generate_uudmap. No parallel anything. This is a
chokepoint. Then dmake does a 3rd sweep and runs the 3rd tier, which is
run generate_uudmap.exe, again nothing parallel happens here. By
combining compiling and linking in 1 target, the time spent serially
linking generate_uudmap.exe, is moved into parallel time when the rest of
MINI_OBJ compiles. Also a little bit of CPU and IO is saved by launching
less processes (less cmd.exe shells, gcc/g++ process ran only once
(gcc/g++ still run many standalone procs internally but now only 1 gcc
was started not 2)).
-suppress warnings from dmake with .UPDATEALL, the 3 generated headers
are made at the same time in real life, in the makefile it was written
as if they weren't
dmake: Warning:--Found file corresponding to virtual target [..\uudmap.h].
dmake: Warning:--Found file corresponding to virtual target [..\mg_data.h].
-move generating the headers to the target that generates
generate_uudmap.exe, this moves some serialization time, albeit small
(30 ms) from right before miniperl link, to parallel time during 1st
pass of MINI_OBJ
-collapse 3 shell runs of xcopy into 1 run of shell
"timeit cmd /c "cmd /c xcopy /f /r /i /d /y ..\perl.exe ..\t\ && cmd /c
xcopy /f /r /i /d /y ..\perl523.dll ..\t\
&& cmd /c xcopy /f /r /i /d /y ..\perlglob.exe ..\t\"" takes 140 ms
"timeit cmd /c "xcopy /f /r /i /d /y ..\perl.exe ..\t\
&& xcopy /f /r /i /d /y ..\perl523.dll ..\t\
&& xcopy /f /r /i /d /y ..\perlglob.exe ..\t\"" takes 78 ms on my machine
---
win32/makefile.mk | 31 +++++++++++--------------------
1 files changed, 11 insertions(+), 20 deletions(-)
diff --git a/win32/makefile.mk b/win32/makefile.mk
index 0d3869f..188a6f9 100644
--- a/win32/makefile.mk
+++ b/win32/makefile.mk
@@ -980,7 +980,6 @@ MINICORE_OBJ = $(MINIDIR)\{$(MICROCORE_OBJ:f) miniperlmain$(o) perlio$(o)}
MINIWIN32_OBJ = $(MINIDIR)\{$(WIN32_OBJ:f)}
MINI_OBJ = $(MINICORE_OBJ) $(MINIWIN32_OBJ)
DLL_OBJ = $(DYNALOADER)
-GENUUDMAP_OBJ = $(GENUUDMAP:db:+$(o))
PERLDLL_OBJ = $(CORE_OBJ)
PERLEXE_OBJ = perlmain$(o)
@@ -1110,8 +1109,7 @@ regen_config_h:
$(CONFIGPM): ..\config.sh config_h.PL
$(MINIPERL) -I..\lib ..\configpm --chdir=..
$(XCOPY) config.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)" \
- || $(PLMAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)
+ -$(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)"
.\config.h : $(CONFIGPM)
@@ -1391,9 +1389,14 @@ $(PERLEXE_RES): perlexe.rc $(PERLEXE_MANIFEST) $(PERLEXE_ICO)
$(MINIDIR)\globals$(o) : $(GENERATED_HEADERS)
-$(UUDMAP_H) $(MG_DATA_H) : $(BITCOUNT_H)
-
-$(BITCOUNT_H) : $(GENUUDMAP)
+$(GENUUDMAP) $(GENERATED_HEADERS) .UPDATEALL : ..\mg_raw.h
+.IF "$(CCTYPE)" == "GCC"
+ $(LINK32) $(CFLAGS_O) -o..\generate_uudmap.exe ..\generate_uudmap.c $(BLINK_FLAGS) \
+ $(mktmp $(LKPRE) $(LIBFILES) $(LKPOST))
+.ELSE
+ $(CC) $(CFLAGS_O) -Fe..\generate_uudmap.exe ..\generate_uudmap.c @$(mktmp -link $(LIBFILES)) -link $(BLINK_FLAGS)
+ $(EMBED_EXE_MANI:s/$@/..\generate_uudmap.exe/)
+.ENDIF
$(GENUUDMAP) $(GENERATED_HEADERS)
#This generates a stub ppport.h & creates & fills /lib/CORE to allow for XS
@@ -1403,17 +1406,6 @@ $(COREDIR)\ppport.h : $(CORE_H)
$(XCOPY) *.h $(COREDIR)\*.* && $(RCOPY) include $(COREDIR)\*.* && $(XCOPY) ..\*.h $(COREDIR)\*.*
rem. > $@
-$(GENUUDMAP_OBJ) : ..\mg_raw.h
-
-$(GENUUDMAP) : $(GENUUDMAP_OBJ)
-.IF "$(CCTYPE)" == "GCC"
- $(LINK32) -v -o $@ $(BLINK_FLAGS) \
- $(mktmp $(LKPRE) $(GENUUDMAP_OBJ) $(LIBFILES) $(LKPOST))
-.ELSE
- $(LINK32) -out:$@ $(BLINK_FLAGS) @$(mktmp $(LIBFILES) $(GENUUDMAP_OBJ))
- $(EMBED_EXE_MANI)
-.ENDIF
-
perlmain.c : runperl.c
copy runperl.c perlmain.c
@@ -1690,9 +1682,8 @@ minitest : .\config.h $(HAVEMINIPERL) ..\git_version.h $(GLOBEXE) $(CONFIGPM) $(
cd ..\t && perl.exe TEST base/*.t comp/*.t cmd/*.t run/*.t io/*.t re/*.t opbasic/*.t op/*.t uni/*.t perf/*.t pragma/*.t
test-prep : all utils ..\pod\perltoc.pod $(TESTPREPGCC)
- $(XCOPY) $(PERLEXE) ..\t\$(NULL)
- $(XCOPY) $(PERLDLL) ..\t\$(NULL)
- $(XCOPY) $(GLOBEXE) ..\t\$(NULL)
+ $(XCOPY) $(PERLEXE) ..\t\$(NULL) && $(XCOPY) $(PERLDLL) ..\t\$(NULL) \
+ && $(XCOPY) $(GLOBEXE) ..\t\$(NULL)
# If building with gcc versions 4.x.x or greater, then
# the GCC helper DLL will also need copied to the test directory.
--
1.7.9.msysgit.0
|
From @tonycozOn Sat Aug 15 13:10:45 2015, bulk88 wrote:
As discussed in IRC, Time::HiRes isn't upstream blead, so this can't be applied as is. Tony |
From @bulk88On Sun Aug 16 21:28:10 2015, tonyc wrote:
rebased+time hires patch removed -- |
From @bulk880001-add-parallel-support-4-Win32-dmake-building-part-1.patchFrom 362607c0d6d9e365bf7907e7ce1259faebe512bf Mon Sep 17 00:00:00 2001
From: Daniel Dragan <bulk88@hotmail.com>
Date: Sat, 15 Aug 2015 16:03:49 -0400
Subject: [PATCH 1/3] add parallel support 4 Win32 dmake building part 1
-if building a 32 bit Perl, with a 64bit dmake, force
PROCESSOR_ARCHITECTURE to x86, otherwise the next couple macros will
try to build a 64 bit perl with 32 bit CCs
-PDBOUT is required to run multiple VC cl.exe processes, otherwise all
VC cl.exe processes will error out trying to lock and write to a
file called "vc*0.pdb", PDBOUT is empty for GCC builds since they dont
have PDB files
-to reduce excess IO calls checking for miniperl.exe plus remove a
"Found file corresponding to virtual target" warning that dmake emits,
make this makefile unaware that miniperl.exe exists. dmake has a very bad
exponential number of IO/stat() calls for every target that is yet
unbuilt, see procmon logs in [perl #123854], so instead of a stat on
../miniperl.exe, then ../lib/buildcustomize.pl, it will be just a stat on
../lib/buildcustomize.pl
-remove makefile awareness of ..\lib\Config_heavy.pl,
if ..\lib\Config_heavy.pl is ever updated, so is ..\lib\Config.pm
less IO calls for dmake, see also commit 962e59f394
-to break up the sequential nature of this makefile, allow (XS) Extensions
to build, before (AKA parallel with) perl5**.dll and perl.exe are built.
This is achieved by running makedef.pl very early, and generating
perl5**.lib/libperl5**.a from the def file, and NOT generating
perl5**.lib/libperl5**.a from perl5**.dll at link time of perl5**.dll.
The conquence of this is, declspec(dllexport) is now unusable, but exports
should be centrally managed anyways (embed.fnc/etc) so this isn't a big
issue.
-EUMM makefiles shouldn't be subject to parallelism, untested and disable
for now, plus creating PLMAKE allows "dmake -n" to work for diagnosing
this makefile
-slim down all target. Extensions* and UNIDATAFILES now know how to build
themselves, the parallel nature says you can't rely on left to right
execution of deps in a parent node to make a child (dep) node build
-miniperl.exe used to be unbuildable from a clean tree except from all
target, since miniperl.exe didn't depend on mini config.h. Also mini dir
can't be a target, since each .obj built will dirty the mini dir's time
stamp and infinite loop happens, instead use a .exists file
-dmake rescans for all outstanding targets, at each recipe line to run,
this early in the build process, there are an enormous amount of files to
test for, so the echos are very slow, 350ms each, so combine as many of
the lines of mini/.exists AKA mini config.h together as possible. ".IF"
can't be put inside "one line", so not all lines were merged. Shell "if"
could be used to further group the echos but this enough to make the pause
/cpu spining not really noticable. USE_CPLUSPLUS contains an unrolled line
(the #endif) on both sides. See also procmon logs in [perl #123854]
-perllib.obj/.o needs perllibst.h which is built by miniperl+a script,
perllibst.h target doesn't need any Extensions*, so perllib.obj is still
quick to build
-perldll.def doesn't need perllibst.h since makedef.pl uses
$Config{static_ext} to find boot xsubs to export, makedef.pl does not
read perllibst.h, remove perllibst.h for more parallelism/less things to
build before perldll.def runs, and therefore Extensions (XS) starts to
run quicker, and Extensions (XS) is the longest target to build
-perlmain and perlmainst .obj/.o needs full perl headers to compile, they
aren't like generate_uudmap.exe and perlglob.exe which are perlapi unaware
-perl.exe doesn't need perl5**.dll to build, just the imp lib to
perl5**.dll, perl.exe is in the same category as XS modules, more
parallelism
-ppport.h isn't needed in blead perl, since blead is the newest perl in the
world, this allows Extensions (XS) to run sooner, ppport.h is replaced by
a dummy empty file, delete ppport.h from final installed CORE dir during
installation so the dummy ppport.h doesn't wind up in installed perl and isnt
seen by CPAN XS modules during their building by the perl user after perl
was build and installed, note mkppport script and mkppport.lst are unused
in makefile.mk now
-break up the dependencies of all the Extensions* targets, static
(just Win32CORE normally), dynamic XS and non-XS, these 3 run in parallel
now, non-XS doesn't need perl5**.lib/.a or any C headers, just PP
Config.pm
-DLL XS requires PP DynaLoader.pm for dl_findfile() otherwise
Mkbootstrap.pm fatally errors, Mkbootstrap.pm could be revised to not load
DynaLoader on Win32, since " if ($Config{'dlsrc'} =~ /^dl_dld/){" is
false, but this is the easier path right now
-DynaLoader requires module lib to build itself, but Extensions_nonxs
happens to not need mod lib, so move where mod lib is built
-in utils target, change it so it can run with miniperl, more parallelism,
pl2bat doesn't require full perl, the full perl stuff is from
commit 3fe9a6f19e from 5.003 and no ML archive is available to explain why
full perl was used instead of mini perl
-add 4 modules to buildcustomize so nonxs and xs build simultaneously
-remove ancient cruft from commit 26618a56da from 1997 from README.w32
dmake is automatically set inside CFG_VARS today. OSRELEASE is irrelavent
today, Perl doesn't use any of the defaults (like name of CC) from the
maketool.
-Reduce 21 calls of "cmd.exe /x/d/c cd" by miniperl to just 1 by saving and
reusing cwd. This reduced the amount of time to run
"..\miniperl.exe -I..\lib -f ..\write_buildcustomize.pl .." from 312 ms
to 62 ms elapsed time using timeit.exe for me.
---
README.win32 | 27 ++--
mkppport | 3 +-
win32/makefile.mk | 487 ++++++++++++++++++++++++++---------------------
write_buildcustomize.pl | 17 ++-
4 files changed, 299 insertions(+), 235 deletions(-)
diff --git a/README.win32 b/README.win32
index b4a07a6..a471ecd 100644
--- a/README.win32
+++ b/README.win32
@@ -96,11 +96,16 @@ See L<Usage Hints for Perl on Windows> below for general hints about this.
=item Make
You need a "make" program to build the sources. If you are using
-Visual C++ or the Windows SDK tools, nmake will work. Builds using
-the gcc need dmake.
-
-dmake is a freely available make that has very nice macro features
-and parallelability.
+Visual C++ or the Windows SDK tools, you can use nmake supplied with Visual C++
+or Windows SDK. You may also use, for Visual C++ or Windows SDK, dmake instead
+of nmake. dmake is open source software, but is not included with Visual C++ or
+Windows SDK. If you want parallel building with Visual C++ or
+Windows SDK you must use dmake instead of nmake. Builds using gcc need dmake.
+nmake is not supported for gcc builds. gmake is not supported, but might be
+added in the future. It is recommended to use dmake 4.13 or newer for parallel
+building. Older dmakes, in parallel mode, have very high CPU usage and pound
+the disk/filing system with duplicate I/O calls in an aggressive polling
+loop.
A port of dmake for Windows is available from:
@@ -135,13 +140,6 @@ console already set up for your target architecture (x86-32 or x86-64 or IA64).
With the newer compilers, you may also use the older batch files if you choose
so.
-You can also use dmake to build using Visual C++; provided, however,
-you set OSRELEASE to "microsft" (or whatever the directory name
-under which the Visual C dmake configuration lives) in your environment
-and edit win32/config.vc to change "make=nmake" into "make=dmake". The
-latter step is only essential if you want to use dmake as your default
-make for building extensions using MakeMaker.
-
=item Microsoft Visual C++ 2008-2013 Express Edition
These free versions of Visual C++ 2008-2013 Professional contain the same
@@ -400,6 +398,11 @@ perl523.dll at the perl toplevel, and various other extension dll's
under the lib\auto directory. If the build fails for any reason, make
sure you have done the previous steps correctly.
+To try dmake's parallel mode, type "dmake -P2", where 2, is the maximum number
+of parallel jobs you want to run. A number of things in the build process will
+run in parallel, but there are serialization points where you will see just 1
+CPU maxed out. This is normal.
+
If you are advanced enough with building C code, here is a suggestion to speed
up building perl, and the later C<make test>. Try to keep your PATH enviromental
variable with the least number of folders possible (remember to keep your C
diff --git a/mkppport b/mkppport
index 55a74fa..9f4fd75 100644
--- a/mkppport
+++ b/mkppport
@@ -160,7 +160,8 @@ mkppport [B<--list>=I<file>] [B<--clean>]
B<mkppport> generates a I<ppport.h> file using Devel::PPPort
and distributes it to the various extension directories that
-need it to build.
+need it to build. On certain Win32 builds, this script is not
+used and an alternative mechanism is used to create I<ppport.h>.
=head1 OPTIONS
diff --git a/win32/makefile.mk b/win32/makefile.mk
index 361384d..c2f97bf 100644
--- a/win32/makefile.mk
+++ b/win32/makefile.mk
@@ -345,6 +345,10 @@ BUILDOPT += -DPERL_IMPLICIT_SYS
PROCESSOR_ARCHITECTURE *= x86
+.IF "$(WIN64)" == "undef"
+PROCESSOR_ARCHITECTURE = x86
+.ENDIF
+
.IF "$(WIN64)" == ""
# When we are running from a 32bit cmd.exe on AMD64 then
# PROCESSOR_ARCHITECTURE is set to x86 and PROCESSOR_ARCHITEW6432
@@ -508,6 +512,7 @@ LINK_FLAGS = $(LINK_DBG) -L"$(INST_COREDIR)" -L"$(CCLIBDIR)"
OBJOUT_FLAG = -o
EXEOUT_FLAG = -o
LIBOUT_FLAG =
+PDBOUT =
BUILDOPT += -fno-strict-aliasing -mms-bitfields
MINIBUILDOPT += -fno-strict-aliasing
@@ -653,11 +658,11 @@ CFLAGS = $(EXTRACFLAGS) $(INCLUDES) $(DEFINES) $(LOCDEFS) \
LINK_FLAGS = -nologo -nodefaultlib $(LINK_DBG) \
-libpath:"$(INST_COREDIR)" \
-machine:$(PROCESSOR_ARCHITECTURE)
-LIB_FLAGS = $(LIB_FLAGS) -nologo
+LIB_FLAGS += -nologo
OBJOUT_FLAG = -Fo
EXEOUT_FLAG = -Fe
LIBOUT_FLAG = /out:
-
+PDBOUT = -Fd$*.pdb
TESTPREPGCC =
.ENDIF
@@ -717,7 +722,7 @@ LKPOST = )
.SUFFIXES : .c .i $(o) .dll $(a) .exe .rc .res
.c$(o):
- $(CC) -c $(null,$(<:d) $(NULL) -I$(<:d)) $(CFLAGS_O) $(OBJOUT_FLAG)$@ $<
+ $(CC) -c $(null,$(<:d) $(NULL) -I$(<:d)) $(CFLAGS_O) $(OBJOUT_FLAG)$@ $(PDBOUT) $<
.c.i:
$(CC) -c $(null,$(<:d) $(NULL) -I$(<:d)) $(CFLAGS_O) -E $< >$@
@@ -744,14 +749,19 @@ $(o).dll:
#
# various targets
+
+#do not put $(MINIPERL) as a dep/prereq in a rule, instead put $(HAVEMINIPERL)
+#$(MINIPERL) is not a buildable target, use "dmake mp" if you want to just build
+#miniperl alone
MINIPERL = ..\miniperl.exe
+HAVEMINIPERL = ..\lib\buildcustomize.pl
MINIDIR = .\mini
PERLEXE = ..\perl.exe
WPERLEXE = ..\wperl.exe
PERLEXESTATIC = ..\perl-static.exe
STATICDIR = .\static.tmp
GLOBEXE = ..\perlglob.exe
-CONFIGPM = ..\lib\Config.pm ..\lib\Config_heavy.pl
+CONFIGPM = ..\lib\Config.pm
GENUUDMAP = ..\generate_uudmap.exe
.IF "$(BUILD_STATIC)" == "define" || "$(ALL_STATIC)" == "define"
PERLSTATIC = static
@@ -778,7 +788,7 @@ PERLDLL_RES =
# This used to be $(PERLEXE), but at worst it is the .dll that they depend
# on and really only the interface - i.e. the .def file used to export symbols
# from the .dll
-PERLDEP = perldll.def
+PERLDEP = $(PERLIMPLIB)
PL2BAT = bin\pl2bat.pl
@@ -834,9 +844,21 @@ INT64 = __int64
# makedef.pl must be updated if this changes, and this should normally
# only change when there is an incompatible revision of the public API.
PERLIMPLIB *= ..\perl523$(a)
+PERLEXPLIB *= ..\perl523.exp
PERLSTATICLIB *= ..\perl523s$(a)
PERLDLL = ..\perl523.dll
+#EUMM on Win32 isn't ready for parallel make, so only allow this file to be parallel
+#$(MAKE) will contain the -P that this makefile was called with, which is bad for
+#make_ext.pl since upto jobs*jobs processes will run instead of jobs
+#also any recipie containing $(MAKE) is special cased by dmake to execute recipes
+#containing $(MAKE) when "dmake -n" is executed, which causes recursive calls
+#to dmake, which means "dmake -n" is then broken as a diagnostic tool since
+#"dmake -n" will invoke all the make_ext.pl scripts build things instead of
+#showing what to build since $(MAKE) is an arg to make_ext.pl, not an invocation
+#of the dmake process
+PLMAKE = dmake
+
XCOPY = xcopy /f /r /i /d /y
RCOPY = xcopy /f /r /i /e /d /y
NOOP = @rem
@@ -997,7 +1019,7 @@ CFG_VARS = \
libperl=$(PERLIMPLIB:f) ~ \
libpth=$(CCLIBDIR);$(EXTRALIBDIRS) ~ \
libc=$(LIBC) ~ \
- make=dmake ~ \
+ make=$(PLMAKE) ~ \
_o=$(o) ~ \
obj_ext=$(o) ~ \
_a=$(a) ~ \
@@ -1019,9 +1041,7 @@ CFG_VARS = \
# Top targets
#
-all : CHECKDMAKE .\config.h ..\git_version.h $(GLOBEXE) $(MINIPERL) \
- $(CONFIGPM) $(UNIDATAFILES) MakePPPort \
- $(PERLEXE) Extensions Extensions_nonxs $(PERLSTATIC)
+all : CHECKDMAKE rebasePE $(UNIDATAFILES) Extensions_nonxs $(PERLSTATIC)
regnodes : ..\regnodes.h
@@ -1059,178 +1079,13 @@ perlglob$(o) : perlglob.c
config.w32 : $(CFGSH_TMPL)
copy $(CFGSH_TMPL) config.w32
-#
-# Copy the template config.h and set configurables at the end of it
-# as per the options chosen and compiler used.
-# Note: This config.h is only used to build miniperl.exe anyway, but
-# it's as well to have its options correct to be sure that it builds
-# and so that it's "-V" options are correct for use by makedef.pl. The
-# real config.h used to build perl.exe is generated from the top-level
-# config_h.SH by config_h.PL (run by miniperl.exe).
-#
-.\config.h : $(CFGH_TMPL) $(CORE_NOCFG_H)
- -del /f config.h
- copy $(CFGH_TMPL) config.h
- @echo.>>$@
- @echo #ifndef _config_h_footer_>>$@
- @echo #define _config_h_footer_>>$@
- @echo #undef Off_t>>$@
- @echo #undef LSEEKSIZE>>$@
- @echo #undef Off_t_size>>$@
- @echo #undef PTRSIZE>>$@
- @echo #undef SSize_t>>$@
- @echo #undef HAS_ATOLL>>$@
- @echo #undef HAS_STRTOLL>>$@
- @echo #undef HAS_STRTOULL>>$@
- @echo #undef Size_t_size>>$@
- @echo #undef IVTYPE>>$@
- @echo #undef UVTYPE>>$@
- @echo #undef IVSIZE>>$@
- @echo #undef UVSIZE>>$@
- @echo #undef NV_PRESERVES_UV>>$@
- @echo #undef NV_PRESERVES_UV_BITS>>$@
- @echo #undef IVdf>>$@
- @echo #undef UVuf>>$@
- @echo #undef UVof>>$@
- @echo #undef UVxf>>$@
- @echo #undef UVXf>>$@
- @echo #undef USE_64_BIT_INT>>$@
- @echo #undef Gconvert>>$@
- @echo #undef HAS_FREXPL>>$@
- @echo #undef HAS_ISNANL>>$@
- @echo #undef HAS_MODFL>>$@
- @echo #undef HAS_MODFL_PROTO>>$@
- @echo #undef HAS_SQRTL>>$@
- @echo #undef HAS_STRTOLD>>$@
- @echo #undef PERL_PRIfldbl>>$@
- @echo #undef PERL_PRIgldbl>>$@
- @echo #undef PERL_PRIeldbl>>$@
- @echo #undef PERL_SCNfldbl>>$@
- @echo #undef NVTYPE>>$@
- @echo #undef NVSIZE>>$@
- @echo #undef LONG_DOUBLESIZE>>$@
- @echo #undef NV_OVERFLOWS_INTEGERS_AT>>$@
- @echo #undef NVef>>$@
- @echo #undef NVff>>$@
- @echo #undef NVgf>>$@
- @echo #undef USE_LONG_DOUBLE>>$@
- @echo #undef USE_CPLUSPLUS>>$@
-.IF "$(USE_LARGE_FILES)"=="define"
- @echo #define Off_t $(INT64)>>$@
- @echo #define LSEEKSIZE ^8>>$@
- @echo #define Off_t_size ^8>>$@
-.ELSE
- @echo #define Off_t long>>$@
- @echo #define LSEEKSIZE ^4>>$@
- @echo #define Off_t_size ^4>>$@
-.ENDIF
-.IF "$(WIN64)"=="define"
- @echo #define PTRSIZE ^8>>$@
- @echo #define SSize_t $(INT64)>>$@
- @echo #define HAS_ATOLL>>$@
- @echo #define HAS_STRTOLL>>$@
- @echo #define HAS_STRTOULL>>$@
- @echo #define Size_t_size ^8>>$@
-.ELSE
- @echo #define PTRSIZE ^4>>$@
- @echo #define SSize_t int>>$@
- @echo #undef HAS_ATOLL>>$@
- @echo #undef HAS_STRTOLL>>$@
- @echo #undef HAS_STRTOULL>>$@
- @echo #define Size_t_size ^4>>$@
-.ENDIF
-.IF "$(USE_64_BIT_INT)"=="define"
- @echo #define IVTYPE $(INT64)>>$@
- @echo #define UVTYPE unsigned $(INT64)>>$@
- @echo #define IVSIZE ^8>>$@
- @echo #define UVSIZE ^8>>$@
-.IF "$(USE_LONG_DOUBLE)"=="define"
- @echo #define NV_PRESERVES_UV>>$@
- @echo #define NV_PRESERVES_UV_BITS 64>>$@
-.ELSE
- @echo #undef NV_PRESERVES_UV>>$@
- @echo #define NV_PRESERVES_UV_BITS 53>>$@
-.ENDIF
- @echo #define IVdf "I64d">>$@
- @echo #define UVuf "I64u">>$@
- @echo #define UVof "I64o">>$@
- @echo #define UVxf "I64x">>$@
- @echo #define UVXf "I64X">>$@
- @echo #define USE_64_BIT_INT>>$@
-.ELSE
- @echo #define IVTYPE long>>$@
- @echo #define UVTYPE unsigned long>>$@
- @echo #define IVSIZE ^4>>$@
- @echo #define UVSIZE ^4>>$@
- @echo #define NV_PRESERVES_UV>>$@
- @echo #define NV_PRESERVES_UV_BITS 32>>$@
- @echo #define IVdf "ld">>$@
- @echo #define UVuf "lu">>$@
- @echo #define UVof "lo">>$@
- @echo #define UVxf "lx">>$@
- @echo #define UVXf "lX">>$@
- @echo #undef USE_64_BIT_INT>>$@
-.ENDIF
-.IF "$(USE_LONG_DOUBLE)"=="define"
- @echo #define Gconvert(x,n,t,b) sprintf((b),"%.*""Lg",(n),(x))>>$@
- @echo #define HAS_FREXPL>>$@
- @echo #define HAS_ISNANL>>$@
- @echo #define HAS_MODFL>>$@
- @echo #define HAS_MODFL_PROTO>>$@
- @echo #define HAS_SQRTL>>$@
- @echo #define HAS_STRTOLD>>$@
- @echo #define PERL_PRIfldbl "Lf">>$@
- @echo #define PERL_PRIgldbl "Lg">>$@
- @echo #define PERL_PRIeldbl "Le">>$@
- @echo #define PERL_SCNfldbl "Lf">>$@
- @echo #define NVTYPE long double>>$@
-.IF "$(WIN64)"=="define"
- @echo #define NVSIZE ^16>>$@
- @echo #define LONG_DOUBLESIZE ^16>>$@
-.ELSE
- @echo #define NVSIZE ^12>>$@
- @echo #define LONG_DOUBLESIZE ^12>>$@
-.ENDIF
- @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>>$@
- @echo #define NVef "Le">>$@
- @echo #define NVff "Lf">>$@
- @echo #define NVgf "Lg">>$@
- @echo #define USE_LONG_DOUBLE>>$@
-.ELSE
- @echo #define Gconvert(x,n,t,b) sprintf((b),"%.*g",(n),(x))>>$@
- @echo #undef HAS_FREXPL>>$@
- @echo #undef HAS_ISNANL>>$@
- @echo #undef HAS_MODFL>>$@
- @echo #undef HAS_MODFL_PROTO>>$@
- @echo #undef HAS_SQRTL>>$@
- @echo #undef HAS_STRTOLD>>$@
- @echo #undef PERL_PRIfldbl>>$@
- @echo #undef PERL_PRIgldbl>>$@
- @echo #undef PERL_PRIeldbl>>$@
- @echo #undef PERL_SCNfldbl>>$@
- @echo #define NVTYPE double>>$@
- @echo #define NVSIZE ^8>>$@
- @echo #define LONG_DOUBLESIZE ^8>>$@
- @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>>$@
- @echo #define NVef "e">>$@
- @echo #define NVff "f">>$@
- @echo #define NVgf "g">>$@
- @echo #undef USE_LONG_DOUBLE>>$@
-.ENDIF
-.IF "$(USE_CPLUSPLUS)"=="define"
- @echo #define USE_CPLUSPLUS>>$@
-.ELSE
- @echo #undef USE_CPLUSPLUS>>$@
-.ENDIF
- @echo #endif>>$@
-
-..\git_version.h : $(MINIPERL) ..\make_patchnum.pl
+..\git_version.h : $(HAVEMINIPERL) ..\make_patchnum.pl
cd .. && miniperl -Ilib make_patchnum.pl
# make sure that we recompile perl.c if the git version changes
..\perl$(o) : ..\git_version.h
-..\config.sh : config.w32 $(MINIPERL) config_sh.PL FindExt.pm
+..\config.sh : config.w32 $(HAVEMINIPERL) config_sh.PL FindExt.pm
$(MINIPERL) -I..\lib config_sh.PL --cfgsh-option-file \
$(mktmp $(CFG_VARS)) config.w32 > ..\config.sh
@@ -1246,18 +1101,18 @@ regen_config_h:
-$(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)"
rename config.h $(CFGH_TMPL)
-$(CONFIGPM) : $(MINIPERL) ..\config.sh config_h.PL
+$(CONFIGPM): ..\config.sh config_h.PL
$(MINIPERL) -I..\lib ..\configpm --chdir=..
$(XCOPY) ..\*.h $(COREDIR)\*.*
$(XCOPY) *.h $(COREDIR)\*.*
$(RCOPY) include $(COREDIR)\*.*
$(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)" \
- || $(MAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)
+ || $(PLMAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)
-# See the comment in Makefile.SH explaining this seemingly cranky ordering
-$(MINIPERL) : ..\lib\buildcustomize.pl
+.\config.h : $(CONFIGPM)
-..\lib\buildcustomize.pl : $(MINIDIR) $(MINI_OBJ) $(CRTIPMLIBS) ..\write_buildcustomize.pl
+# See the comment in Makefile.SH explaining this seemingly cranky ordering
+..\lib\buildcustomize.pl : $(MINI_OBJ) ..\write_buildcustomize.pl
.IF "$(CCTYPE)" == "GCC"
$(LINK32) -v -mconsole -o $(MINIPERL) $(BLINK_FLAGS) \
$(mktmp $(LKPRE) $(MINI_OBJ) $(LIBFILES) $(LKPOST))
@@ -1268,31 +1123,202 @@ $(MINIPERL) : ..\lib\buildcustomize.pl
.ENDIF
$(MINIPERL) -I..\lib -f ..\write_buildcustomize.pl ..
-$(MINIDIR) :
+#convinence target, get a working miniperl
+mp : $(CONFIGPM)
+
+$(MINIDIR)\.exists : $(CFGH_TMPL)
if not exist "$(MINIDIR)" mkdir "$(MINIDIR)"
+#
+# Copy the template config.h and set configurables at the end of it
+# as per the options chosen and compiler used.
+# Note: This config.h is only used to build miniperl.exe anyway, but
+# it's as well to have its options correct to be sure that it builds
+# and so that it's "-V" options are correct for use by makedef.pl. The
+# real config.h used to build perl.exe is generated from the top-level
+# config_h.SH by config_h.PL (run by miniperl.exe).
+#
+# MINIDIR generates config.h so miniperl.exe is not rebuilt when the 2nd
+# config.h is generated in CONFIGPM target, see also the comments for $(MINI_OBJ).
+ -if exist config.h del /f config.h
+ copy $(CFGH_TMPL) config.h
+ @(echo.&& \
+ echo #ifndef _config_h_footer_&& \
+ echo #define _config_h_footer_&& \
+ echo #undef Off_t&& \
+ echo #undef LSEEKSIZE&& \
+ echo #undef Off_t_size&& \
+ echo #undef PTRSIZE&& \
+ echo #undef SSize_t&& \
+ echo #undef HAS_ATOLL&& \
+ echo #undef HAS_STRTOLL&& \
+ echo #undef HAS_STRTOULL&& \
+ echo #undef Size_t_size&& \
+ echo #undef IVTYPE&& \
+ echo #undef UVTYPE&& \
+ echo #undef IVSIZE&& \
+ echo #undef UVSIZE&& \
+ echo #undef NV_PRESERVES_UV&& \
+ echo #undef NV_PRESERVES_UV_BITS&& \
+ echo #undef IVdf&& \
+ echo #undef UVuf&& \
+ echo #undef UVof&& \
+ echo #undef UVxf&& \
+ echo #undef UVXf&& \
+ echo #undef USE_64_BIT_INT&& \
+ echo #undef Gconvert&& \
+ echo #undef HAS_FREXPL&& \
+ echo #undef HAS_ISNANL&& \
+ echo #undef HAS_MODFL&& \
+ echo #undef HAS_MODFL_PROTO&& \
+ echo #undef HAS_SQRTL&& \
+ echo #undef HAS_STRTOLD&& \
+ echo #undef PERL_PRIfldbl&& \
+ echo #undef PERL_PRIgldbl&& \
+ echo #undef PERL_PRIeldbl&& \
+ echo #undef PERL_SCNfldbl&& \
+ echo #undef NVTYPE&& \
+ echo #undef NVSIZE&& \
+ echo #undef LONG_DOUBLESIZE&& \
+ echo #undef NV_OVERFLOWS_INTEGERS_AT&& \
+ echo #undef NVef&& \
+ echo #undef NVff&& \
+ echo #undef NVgf&& \
+ echo #undef USE_LONG_DOUBLE&& \
+ echo #undef USE_CPLUSPLUS)>> config.h
+.IF "$(USE_LARGE_FILES)"=="define"
+ @(echo #define Off_t $(INT64)&& \
+ echo #define LSEEKSIZE ^8&& \
+ echo #define Off_t_size ^8)>> config.h
+.ELSE
+ @(echo #define Off_t long&& \
+ echo #define LSEEKSIZE ^4&& \
+ echo #define Off_t_size ^4)>> config.h
+.ENDIF
+.IF "$(WIN64)"=="define"
+ @(echo #define PTRSIZE ^8&& \
+ echo #define SSize_t $(INT64)&& \
+ echo #define HAS_ATOLL&& \
+ echo #define HAS_STRTOLL&& \
+ echo #define HAS_STRTOULL&& \
+ echo #define Size_t_size ^8)>> config.h
+.ELSE
+ @(echo #define PTRSIZE ^4&& \
+ echo #define SSize_t int&& \
+ echo #undef HAS_ATOLL&& \
+ echo #undef HAS_STRTOLL&& \
+ echo #undef HAS_STRTOULL&& \
+ echo #define Size_t_size ^4)>> config.h
+.ENDIF
+.IF "$(USE_64_BIT_INT)"=="define"
+ @(echo #define IVTYPE $(INT64)&& \
+ echo #define UVTYPE unsigned $(INT64)&& \
+ echo #define IVSIZE ^8&& \
+ echo #define UVSIZE ^8)>> config.h
+.IF "$(USE_LONG_DOUBLE)"=="define"
+ @(echo #define NV_PRESERVES_UV&& \
+ echo #define NV_PRESERVES_UV_BITS 64)>> config.h
+.ELSE
+ @(echo #undef NV_PRESERVES_UV&& \
+ echo #define NV_PRESERVES_UV_BITS 53)>> config.h
+.ENDIF
+ @(echo #define IVdf "I64d"&& \
+ echo #define UVuf "I64u"&& \
+ echo #define UVof "I64o"&& \
+ echo #define UVxf "I64x"&& \
+ echo #define UVXf "I64X"&& \
+ echo #define USE_64_BIT_INT)>> config.h
+.ELSE
+ @(echo #define IVTYPE long&& \
+ echo #define UVTYPE unsigned long&& \
+ echo #define IVSIZE ^4&& \
+ echo #define UVSIZE ^4&& \
+ echo #define NV_PRESERVES_UV&& \
+ echo #define NV_PRESERVES_UV_BITS 32&& \
+ echo #define IVdf "ld"&& \
+ echo #define UVuf "lu"&& \
+ echo #define UVof "lo"&& \
+ echo #define UVxf "lx"&& \
+ echo #define UVXf "lX"&& \
+ echo #undef USE_64_BIT_INT)>> config.h
+.ENDIF
+.IF "$(USE_LONG_DOUBLE)"=="define"
+ @(echo #define Gconvert^(x,n,t,b^) sprintf^(^(b^),"%.*""Lg",^(n^),^(x^)^)&& \
+ echo #define HAS_FREXPL&& \
+ echo #define HAS_ISNANL&& \
+ echo #define HAS_MODFL&& \
+ echo #define HAS_MODFL_PROTO&& \
+ echo #define HAS_SQRTL&& \
+ echo #define HAS_STRTOLD&& \
+ echo #define PERL_PRIfldbl "Lf"&& \
+ echo #define PERL_PRIgldbl "Lg"&& \
+ echo #define PERL_PRIeldbl "Le"&& \
+ echo #define PERL_SCNfldbl "Lf"&& \
+ echo #define NVTYPE long double)>> config.h
+.IF "$(WIN64)"=="define"
+ @(echo #define NVSIZE ^16&& \
+ echo #define LONG_DOUBLESIZE ^16)>> config.h
+.ELSE
+ @(echo #define NVSIZE ^12&& \
+ echo #define LONG_DOUBLESIZE ^12)>> config.h
+.ENDIF
+ @(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&& \
+ echo #define NVef "Le"&& \
+ echo #define NVff "Lf"&& \
+ echo #define NVgf "Lg"&& \
+ echo #define USE_LONG_DOUBLE)>> config.h
+.ELSE
+ @(echo #define Gconvert^(x,n,t,b^) sprintf^(^(b^),"%.*g",^(n^),^(x^)^)&& \
+ echo #undef HAS_FREXPL&& \
+ echo #undef HAS_ISNANL&& \
+ echo #undef HAS_MODFL&& \
+ echo #undef HAS_MODFL_PROTO&& \
+ echo #undef HAS_SQRTL&& \
+ echo #undef HAS_STRTOLD&& \
+ echo #undef PERL_PRIfldbl&& \
+ echo #undef PERL_PRIgldbl&& \
+ echo #undef PERL_PRIeldbl&& \
+ echo #undef PERL_SCNfldbl&& \
+ echo #define NVTYPE double&& \
+ echo #define NVSIZE ^8&& \
+ echo #define LONG_DOUBLESIZE ^8&& \
+ 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&& \
+ echo #define NVef "e"&& \
+ echo #define NVff "f"&& \
+ echo #define NVgf "g"&& \
+ echo #undef USE_LONG_DOUBLE)>> config.h
+.ENDIF
+.IF "$(USE_CPLUSPLUS)"=="define"
+ @(echo #define USE_CPLUSPLUS&& \
+ echo #endif)>> config.h
+.ELSE
+ @(echo #undef USE_CPLUSPLUS&& \
+ echo #endif)>> config.h
+.ENDIF
+#separate line since this is sentinal that this target is done
+ rem. > $(MINIDIR)\.exists
$(MINICORE_OBJ) : $(CORE_NOCFG_H)
- $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_EXTERNAL_GLOB -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ ..\$(*B).c
+ $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_EXTERNAL_GLOB -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ $(PDBOUT) ..\$(*B).c
$(MINIWIN32_OBJ) : $(CORE_NOCFG_H)
- $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ $(*B).c
+ $(CC) -c $(CFLAGS) $(MINIBUILDOPT) -DPERL_IS_MINIPERL $(OBJOUT_FLAG)$@ $(PDBOUT) $(*B).c
# -DPERL_IMPLICIT_SYS needs C++ for perllib.c
# rules wrapped in .IFs break Win9X build (we end up with unbalanced []s unless
# unless the .IF is true), so instead we use a .ELSE with the default.
# This is the only file that depends on perlhost.h, vmem.h, and vdir.h
-perllib$(o) : perllib.c .\perlhost.h .\vdir.h .\vmem.h
+perllib$(o) : perllib.c perllibst.h .\perlhost.h .\vdir.h .\vmem.h
.IF "$(USE_IMP_SYS)" == "define"
- $(CC) -c -I. $(CFLAGS_O) $(CXX_FLAG) $(OBJOUT_FLAG)$@ perllib.c
+ $(CC) -c -I. $(CFLAGS_O) $(CXX_FLAG) $(OBJOUT_FLAG)$@ $(PDBOUT) perllib.c
.ELSE
- $(CC) -c -I. $(CFLAGS_O) $(OBJOUT_FLAG)$@ perllib.c
+ $(CC) -c -I. $(CFLAGS_O) $(OBJOUT_FLAG)$@ $(PDBOUT) perllib.c
.ENDIF
# 1. we don't want to rebuild miniperl.exe when config.h changes
# 2. we don't want to rebuild miniperl.exe with non-default config.h
# 3. we can't have miniperl.exe depend on git_version.h, as miniperl creates it
-$(MINI_OBJ) : $(CORE_NOCFG_H)
+$(MINI_OBJ) : $(MINIDIR)\.exists $(CORE_NOCFG_H)
$(WIN32_OBJ) : $(CORE_H)
@@ -1300,12 +1326,26 @@ $(CORE_OBJ) : $(CORE_H)
$(DLL_OBJ) : $(CORE_H)
-perldll.def : $(MINIPERL) $(CONFIGPM) ..\embed.fnc ..\makedef.pl create_perllibst_h.pl
+
+perllibst.h : $(HAVEMINIPERL) $(CONFIGPM) create_perllibst_h.pl
$(MINIPERL) -I..\lib create_perllibst_h.pl
+
+perldll.def : $(HAVEMINIPERL) $(CONFIGPM) ..\embed.fnc ..\makedef.pl
$(MINIPERL) -I..\lib -w ..\makedef.pl PLATFORM=win32 $(OPTIMIZE) $(DEFINES) \
$(BUILDOPT) CCTYPE=$(CCTYPE) TARG_DIR=..\ > perldll.def
-$(PERLDLL): perldll.def $(PERLDLL_OBJ) $(PERLDLL_RES) Extensions_static
+$(PERLIMPLIB) : perldll.def
+.IF "$(CCTYPE)" == "GCC"
+ $(IMPLIB) -k -d perldll.def -l $(PERLIMPLIB)
+.ELSE #VC family
+ lib -def:perldll.def -machine:$(ARCHITECTURE) /OUT:$(PERLIMPLIB)
+.ENDIF
+ $(XCOPY) $(PERLIMPLIB) $(COREDIR)
+
+#PERLEXPLIB is built in PERLIMPLIB
+$(PERLEXPLIB): $(PERLIMPLIB)
+
+$(PERLDLL): $(PERLEXPLIB) $(PERLDLL_OBJ) $(PERLDLL_RES) Extensions_static
.IF "$(CCTYPE)" == "GCC"
$(LINK32) -mdll -o $@ -Wl,--base-file -Wl,perl.base $(BLINK_FLAGS) \
$(mktmp $(LKPRE) $(PERLDLL_OBJ) \
@@ -1321,13 +1361,12 @@ $(PERLDLL): perldll.def $(PERLDLL_OBJ) $(PERLDLL_RES) Extensions_static
$(shell @type Extensions_static) \
$(LIBFILES) perl.exp $(LKPOST))
.ELSE
- $(LINK32) -dll -def:perldll.def -out:$@ $(BLINK_FLAGS) \
+ $(LINK32) -dll -out:$@ $(BLINK_FLAGS) \
@Extensions_static \
@$(mktmp -base:0x28000000 $(DELAYLOAD) $(LIBFILES) \
- $(PERLDLL_RES) $(PERLDLL_OBJ))
+ $(PERLDLL_RES) $(PERLDLL_OBJ) $(PERLEXPLIB))
$(EMBED_DLL_MANI)
.ENDIF
- $(XCOPY) $(PERLIMPLIB) $(COREDIR)
$(PERLSTATICLIB): $(PERLDLL_OBJ) Extensions_static
.IF "$(CCTYPE)" == "GCC"
@@ -1367,16 +1406,16 @@ $(GENUUDMAP) : $(GENUUDMAP_OBJ)
perlmain.c : runperl.c
copy runperl.c perlmain.c
-perlmain$(o) : perlmain.c
- $(CC) $(CFLAGS_O:s,-DPERLDLL,-UPERLDLL,) $(OBJOUT_FLAG)$@ -c perlmain.c
+perlmain$(o) : $(CONFIGPM) perlmain.c
+ $(CC) $(CFLAGS_O:s,-DPERLDLL,-UPERLDLL,) $(OBJOUT_FLAG)$@ $(PDBOUT) -c perlmain.c
perlmainst.c : runperl.c
copy runperl.c perlmainst.c
-perlmainst$(o) : perlmainst.c
- $(CC) $(CFLAGS_O) $(OBJOUT_FLAG)$@ -c perlmainst.c
+perlmainst$(o) : $(CONFIGPM) perlmainst.c
+ $(CC) $(CFLAGS_O) $(OBJOUT_FLAG)$@ $(PDBOUT) -c perlmainst.c
-$(PERLEXE): $(PERLDLL) $(CONFIGPM) $(PERLEXE_OBJ) $(PERLEXE_RES)
+$(PERLEXE): $(CONFIGPM) $(PERLEXE_OBJ) $(PERLEXE_RES) $(PERLIMPLIB)
.IF "$(CCTYPE)" == "GCC"
$(LINK32) -mconsole -o $@ $(BLINK_FLAGS) \
$(PERLEXE_OBJ) $(PERLEXE_RES) $(PERLIMPLIB) $(LIBFILES)
@@ -1398,43 +1437,52 @@ $(PERLEXESTATIC): $(PERLSTATICLIB) $(CONFIGPM) $(PERLEXEST_OBJ) $(PERLEXE_RES)
$(EMBED_EXE_MANI)
.ENDIF
-MakePPPort: $(MINIPERL) $(CONFIGPM) Extensions_nonxs
- $(MINIPERL) -I..\lib ..\mkppport
-
#-------------------------------------------------------------------------------
# There's no direct way to mark a dependency on
# DynaLoader.pm, so this will have to do
Extensions : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) $(DYNALOADER)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic
+ if not exist $(COREDIR)\ppport.h rem. > $(COREDIR)\ppport.h
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic
Extensions_reonly : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) $(DYNALOADER)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic +re
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic +re
-Extensions_static : ..\make_ext.pl ..\lib\buildcustomize.pl list_static_libs.pl $(PERLDEP) $(CONFIGPM) Extensions_nonxs
+Extensions_static : ..\make_ext.pl ..\lib\buildcustomize.pl list_static_libs.pl $(CONFIGPM)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --static
+ if not exist $(COREDIR)\ppport.h rem. > $(COREDIR)\ppport.h
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --static
$(MINIPERL) -I..\lib list_static_libs.pl > Extensions_static
-Extensions_nonxs : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) ..\pod\perlfunc.pod
- $(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --nonxs
+Extensions_nonxs : ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM) ..\pod\perlfunc.pod
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --nonxs !libs
-$(DYNALOADER) : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) Extensions_nonxs
+#lib must be built, it can't be buildcustomize.pl-ed, and is required for XS building
+$(DYNALOADER) : ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM)
$(XCOPY) ..\*.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --dynaloader
+ $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(EXTDIR) --dir=$(DISTDIR) --dynaloader lib
Extensions_clean :
- -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=clean
+ -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=clean
Extensions_realclean :
- -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=realclean
+ -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=realclean
+
+# all PE files need to be built by the time this target runs, PP files can still
+# be running in parallel like UNIDATAFILES, this target a placeholder for the
+# future
+.IF "$(BUILD_STATIC)"=="define"
+rebasePE : Extensions $(PERLDLL) $(PERLEXE) $(GLOBEXE) $(PERLEXESTATIC)
+.ELSE
+rebasePE : Extensions $(PERLDLL) $(PERLEXE) $(GLOBEXE)
+.ENDIF
+ $(NOOP)
#-------------------------------------------------------------------------------
-doc: $(PERLEXE) ..\pod\perltoc.pod
+doc: $(PERLEXE) $(PERLDLL) ..\pod\perltoc.pod
$(PERLEXE) ..\installhtml --podroot=.. --htmldir=$(HTMLDIR) \
--podpath=pod:lib:utils --htmlroot="file://$(INST_HTML:s,:,|,)"\
--recurse
@@ -1444,8 +1492,8 @@ doc: $(PERLEXE) ..\pod\perltoc.pod
# Note that this next section is parsed (and regenerated) by pod/buildtoc
# so please check that script before making structural changes here
-utils: $(PERLEXE) ..\utils\Makefile
- cd ..\utils && $(MAKE) PERL=$(MINIPERL)
+utils: $(HAVEMINIPERL) ..\utils\Makefile
+ cd ..\utils && $(PLMAKE) PERL=$(MINIPERL)
copy ..\README.aix ..\pod\perlaix.pod
copy ..\README.amiga ..\pod\perlamiga.pod
copy ..\README.android ..\pod\perlandroid.pod
@@ -1480,11 +1528,11 @@ utils: $(PERLEXE) ..\utils\Makefile
copy ..\README.vos ..\pod\perlvos.pod
copy ..\README.win32 ..\pod\perlwin32.pod
copy ..\pod\perldelta.pod ..\pod\perl5233delta.pod
- $(PERLEXE) $(PL2BAT) $(UTILS)
+ $(MINIPERL) -I..\lib $(PL2BAT) $(UTILS)
$(MINIPERL) -I..\lib ..\autodoc.pl ..
$(MINIPERL) -I..\lib ..\pod\perlmodlib.PL -q ..
-..\pod\perltoc.pod: $(PERLEXE) Extensions Extensions_nonxs
+..\pod\perltoc.pod: $(PERLEXE) $(PERLDLL) Extensions Extensions_nonxs ..\pod\perluniprops.pod utils
$(PERLEXE) -f ..\pod\buildtoc -q
# Note that the pod cleanup in this next section is parsed (and regenerated
@@ -1609,6 +1657,7 @@ install : all installbare installhtml
installbare : utils ..\pod\perltoc.pod
$(PERLEXE) ..\installperl
+ attrib -r $(INST_COREDIR)\ppport.h && del $(INST_COREDIR)\ppport.h
if exist $(WPERLEXE) $(XCOPY) $(WPERLEXE) $(INST_BIN)\*.*
if exist $(PERLEXESTATIC) $(XCOPY) $(PERLEXESTATIC) $(INST_BIN)\*.*
$(XCOPY) $(GLOBEXE) $(INST_BIN)\*.*
@@ -1621,11 +1670,11 @@ installhtml : doc
inst_lib : $(CONFIGPM)
$(RCOPY) ..\lib $(INST_LIB)\*.*
-$(UNIDATAFILES) ..\pod\perluniprops.pod .UPDATEALL : $(MINIPERL) $(CONFIGPM) ..\lib\unicore\mktables Extensions_nonxs
+$(UNIDATAFILES) ..\pod\perluniprops.pod .UPDATEALL : $(CONFIGPM) ..\lib\unicore\mktables
cd ..\lib\unicore && \
..\$(MINIPERL) -I.. mktables -P ..\..\pod -maketest -makelist -p
-minitest : .\config.h $(MINIPERL) ..\git_version.h $(GLOBEXE) $(CONFIGPM) $(UNIDATAFILES) $(TESTPREPGCC)
+minitest : .\config.h $(HAVEMINIPERL) ..\git_version.h $(GLOBEXE) $(CONFIGPM) $(UNIDATAFILES) $(TESTPREPGCC)
$(XCOPY) $(MINIPERL) ..\t\$(NULL)
if exist ..\t\perl.exe del /f ..\t\perl.exe
rename ..\t\miniperl.exe perl.exe
diff --git a/write_buildcustomize.pl b/write_buildcustomize.pl
index 5d819b5..d3bbd0f 100644
--- a/write_buildcustomize.pl
+++ b/write_buildcustomize.pl
@@ -41,12 +41,23 @@ my @toolchain = qw(cpan/AutoLoader/lib
dist/constant/lib
);
-# Used only in ExtUtils::Liblist::Kid::_win32_ext()
-push @toolchain, 'cpan/Text-ParseWords/lib' if $^O eq 'MSWin32';
+# Text-ParseWords used only in ExtUtils::Liblist::Kid::_win32_ext()
+# the rest are for XS building on Win32, since nonxs and xs build simultaneously
+# on Win32 if parallel building
+push @toolchain, qw(
+ cpan/Text-ParseWords/lib
+ dist/ExtUtils-ParseXS/lib
+ cpan/Getopt-Long/lib
+ cpan/parent/lib
+ cpan/ExtUtils-Constant/lib
+) if $^O eq 'MSWin32';
push @toolchain, 'ext/VMS-Filespec/lib' if $^O eq 'VMS';
unshift @INC, @toolchain;
require File::Spec::Functions;
+require Cwd;
+
+my $cwd = Cwd::getcwd();
# lib must be last, as the toolchain modules write themselves into it
# as they build, and it's important that @INC order ensures that the partially
@@ -54,7 +65,7 @@ require File::Spec::Functions;
my $inc = join ",\n ",
map { "q\0$_\0" }
- (map {File::Spec::Functions::rel2abs($_)} (
+ (map {File::Spec::Functions::rel2abs($_, $cwd)} (
# faster build on the non-parallel Win32 build process
$^O eq 'MSWin32' ? ('lib', @toolchain ) : (@toolchain, 'lib')
));
--
1.7.9.msysgit.0
|
From @bulk880002-add-parallel-support-4-Win32-dmake-COREDIR-paralleli.patchFrom e4233e627e94e13b0b9532aec9570a9c39a6b4b7 Mon Sep 17 00:00:00 2001
From: Daniel Dragan <bulk88@hotmail.com>
Date: Sat, 15 Aug 2015 05:24:06 -0400
Subject: [PATCH 2/3] add parallel support 4 Win32 dmake-COREDIR parallelism
part 2
-defer the mass copy of headers to COREDIR until XS build time
and dont use COREDIR for building miniperl interp or perl interp, more
thing to do in parallel this way and 1 less path to search by the CC
-config_h.PL requires config.h to be in COREDIR, this XCOPY in CONFIGPM
targ is where COREDIR is created if it doesnt exist already
-remove a bunch of XCOPY'es, copy the headers in 1 place only, and dont
copy them unless they change based on timestamps
-the DYNALOADER dep already contains
"..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM) $(HAVE_COREDIR)" dont
specify them again in Extensions and Extensions_reonly, this probably
reduces the size of dep graph in dmake, since dmake explodes the graph and
checks the outline of the graph/tree very inefficiently in parallel mode
(architectural problem with dmake)
-delete pdb files in root, otherwise switching VC version will make the
next cl.exe error out that it can't write to the pdb file due to version
numbers in the pdb file
-reorder core .c files in a blend of VC and GCC time order, this reduces
a 1:08 mins time to do "dmake -P9 ../perl522.dll" to 0:54 mins on 8 core
with GCC, see details in #123867
---
pod/perldelta.pod | 11 ++++++++
win32/makefile.mk | 71 +++++++++++++++++++++++++++++------------------------
2 files changed, 50 insertions(+), 32 deletions(-)
diff --git a/pod/perldelta.pod b/pod/perldelta.pod
index 7ce0d38..e4389c3 100644
--- a/pod/perldelta.pod
+++ b/pod/perldelta.pod
@@ -320,6 +320,17 @@ Comparing two strings that were both encoded in UTF-8 (or more
precisely, UTF-EBCDIC) did not work properly until now. Since C<sort()>
uses C<cmp()>, this fixes that as well.
+=item Win32
+
+=over
+
+=item *
+
+Parallel building has been added to the dmake C<makefile.mk> makefile. All
+Win32 compilers are supported.
+
+=back
+
=back
=head1 Internal Changes
diff --git a/win32/makefile.mk b/win32/makefile.mk
index c2f97bf..2eaec25 100644
--- a/win32/makefile.mk
+++ b/win32/makefile.mk
@@ -472,7 +472,7 @@ a = .a
# Options
#
-INCLUDES = -I.\include -I. -I.. -I$(COREDIR)
+INCLUDES = -I.\include -I. -I..
DEFINES = -DWIN32
.IF "$(WIN64)" == "define"
DEFINES += -DWIN64 -DCONSERVATIVE
@@ -560,7 +560,7 @@ RSC = rc
# Options
#
-INCLUDES = -I$(COREDIR) -I.\include -I. -I..
+INCLUDES = -I.\include -I. -I..
#PCHFLAGS = -Fpc:\temp\vcmoduls.pch -YX
DEFINES = -DWIN32 -D_CONSOLE -DNO_STRICT
LOCDEFS = -DPERLDLL -DPERL_CORE
@@ -863,45 +863,47 @@ XCOPY = xcopy /f /r /i /d /y
RCOPY = xcopy /f /r /i /e /d /y
NOOP = @rem
+#first ones are arrange in compile time order for faster parallel building
+#see #123867 for details
MICROCORE_SRC = \
+ ..\toke.c \
+ ..\regcomp.c \
+ ..\regexec.c \
+ ..\op.c \
+ ..\sv.c \
+ ..\pp.c \
+ ..\pp_ctl.c \
+ ..\pp_sys.c \
+ ..\pp_pack.c \
+ ..\pp_hot.c \
+ ..\gv.c \
+ ..\perl.c \
+ ..\utf8.c \
+ ..\dump.c \
+ ..\hv.c \
..\av.c \
..\caretx.c \
..\deb.c \
..\doio.c \
..\doop.c \
..\dquote.c \
- ..\dump.c \
..\globals.c \
- ..\gv.c \
..\mro_core.c \
- ..\hv.c \
..\locale.c \
..\keywords.c \
..\mathoms.c \
..\mg.c \
..\numeric.c \
- ..\op.c \
..\pad.c \
- ..\perl.c \
..\perlapi.c \
..\perly.c \
- ..\pp.c \
- ..\pp_ctl.c \
- ..\pp_hot.c \
- ..\pp_pack.c \
..\pp_sort.c \
- ..\pp_sys.c \
..\reentr.c \
- ..\regcomp.c \
- ..\regexec.c \
..\run.c \
..\scope.c \
- ..\sv.c \
..\taint.c \
..\time64.c \
- ..\toke.c \
..\universal.c \
- ..\utf8.c \
..\util.c
EXTRACORE_SRC += perllib.c
@@ -966,6 +968,10 @@ UUDMAP_H = ..\uudmap.h
BITCOUNT_H = ..\bitcount.h
MG_DATA_H = ..\mg_data.h
GENERATED_HEADERS = $(UUDMAP_H) $(BITCOUNT_H) $(MG_DATA_H)
+#a stub ppport.h must be generated so building XS modules, .c->.obj wise, will
+#work, so this target also represents creating the COREDIR and filling it
+HAVE_COREDIR = $(COREDIR)\ppport.h
+
MICROCORE_OBJ = $(MICROCORE_SRC:db:+$(o))
CORE_OBJ = $(MICROCORE_OBJ) $(EXTRACORE_SRC:db:+$(o))
@@ -1103,9 +1109,7 @@ regen_config_h:
$(CONFIGPM): ..\config.sh config_h.PL
$(MINIPERL) -I..\lib ..\configpm --chdir=..
- $(XCOPY) ..\*.h $(COREDIR)\*.*
- $(XCOPY) *.h $(COREDIR)\*.*
- $(RCOPY) include $(COREDIR)\*.*
+ $(XCOPY) config.h $(COREDIR)\*.*
$(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)" \
|| $(PLMAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)
@@ -1381,7 +1385,7 @@ $(PERLSTATICLIB): $(PERLDLL_OBJ) Extensions_static
$(LIB32) $(LIB_FLAGS) -out:$@ @Extensions_static \
@$(mktmp $(PERLDLL_OBJ))
.ENDIF
- $(XCOPY) $(PERLSTATICLIB) $(COREDIR)
+ $(XCOPY) $(PERLSTATICLIB) $(COREDIR)\$(NULL)
$(PERLEXE_RES): perlexe.rc $(PERLEXE_MANIFEST) $(PERLEXE_ICO)
@@ -1392,6 +1396,13 @@ $(UUDMAP_H) $(MG_DATA_H) : $(BITCOUNT_H)
$(BITCOUNT_H) : $(GENUUDMAP)
$(GENUUDMAP) $(GENERATED_HEADERS)
+#This generates a stub ppport.h & creates & fills /lib/CORE to allow for XS
+#building .c->.obj wise (linking is a different thing). This taget is AKA
+#$(HAVE_COREDIR).
+$(COREDIR)\ppport.h : $(CORE_H)
+ $(XCOPY) *.h $(COREDIR)\*.* && $(RCOPY) include $(COREDIR)\*.* && $(XCOPY) ..\*.h $(COREDIR)\*.*
+ rem. > $@
+
$(GENUUDMAP_OBJ) : ..\mg_raw.h
$(GENUUDMAP) : $(GENUUDMAP_OBJ)
@@ -1440,18 +1451,15 @@ $(PERLEXESTATIC): $(PERLSTATICLIB) $(CONFIGPM) $(PERLEXEST_OBJ) $(PERLEXE_RES)
#-------------------------------------------------------------------------------
# There's no direct way to mark a dependency on
# DynaLoader.pm, so this will have to do
-Extensions : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) $(DYNALOADER)
- $(XCOPY) ..\*.h $(COREDIR)\*.*
- if not exist $(COREDIR)\ppport.h rem. > $(COREDIR)\ppport.h
+
+#most of deps of this target are in DYNALOADER and therefore omitted here
+Extensions : $(PERLDEP) $(DYNALOADER)
$(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic
-Extensions_reonly : ..\make_ext.pl ..\lib\buildcustomize.pl $(PERLDEP) $(CONFIGPM) $(DYNALOADER)
- $(XCOPY) ..\*.h $(COREDIR)\*.*
+Extensions_reonly : $(PERLDEP) $(DYNALOADER)
$(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --dynamic +re
-Extensions_static : ..\make_ext.pl ..\lib\buildcustomize.pl list_static_libs.pl $(CONFIGPM)
- $(XCOPY) ..\*.h $(COREDIR)\*.*
- if not exist $(COREDIR)\ppport.h rem. > $(COREDIR)\ppport.h
+Extensions_static : ..\make_ext.pl ..\lib\buildcustomize.pl list_static_libs.pl $(CONFIGPM) $(HAVE_COREDIR)
$(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --static
$(MINIPERL) -I..\lib list_static_libs.pl > Extensions_static
@@ -1459,8 +1467,7 @@ Extensions_nonxs : ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM) ..\pod\pe
$(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --nonxs !libs
#lib must be built, it can't be buildcustomize.pl-ed, and is required for XS building
-$(DYNALOADER) : ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM)
- $(XCOPY) ..\*.h $(COREDIR)\*.*
+$(DYNALOADER) : ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM) $(HAVE_COREDIR)
$(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(EXTDIR) --dir=$(DISTDIR) --dynaloader lib
Extensions_clean :
@@ -1760,7 +1767,7 @@ _clean :
-@erase ..\*$(o) ..\*$(a) ..\*.exp *$(o) *$(a) *.exp *.res
-@erase ..\t\*.exe ..\t\*.dll ..\t\*.bat
-@erase *.ilk
- -@erase *.pdb
+ -@erase *.pdb ..\*.pdb
-@erase Extensions_static
--
1.7.9.msysgit.0
|
From @bulk880003-add-parallel-support-4-Win32-dmake-uudmap-no-2nd-run.patchFrom 70a12f1d9a67e47e203b2341548aa1a15dfef9d3 Mon Sep 17 00:00:00 2001
From: Daniel Dragan <bulk88@hotmail.com>
Date: Sat, 15 Aug 2015 05:39:55 -0400
Subject: [PATCH 3/3] add parallel support 4 Win32 dmake-uudmap+no 2nd run of
config_h.PL part 3
-in $(CONFIGPM) target, remove config_h.PL running dmake again to rebuild
$(CONFIGPM) target, configpm the script does not use config.h as input.
The $(CONFIGPM) target is a choke/serialization point for parallel
building, so it is high value to make it as fast as possible.
Maybe a long time ago, configpm read config.h but it doesn't anymore.
Nearly all the dynamic config vars are determined in config_sh.PL script
and ..\config.sh target. config_h.PL contains very little logic, and this
logic is only for config.h, and only when you want a var to be different
in config.h than it is in Config.pm/Config_heavy.pl. Putting a breakpoint
("system 'pause';") in config_h.PL, copying Config.pm/Config_heavy.pl to
".old" versions, continuing execution in config_h.PL, then diffing the
2 new Configs with the old 2 Configs before pre-config_h.PL and
"$(PLMAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)" shows no differece.
When dmake runs needlessly a 2nd time it emits a warning that nothing
changed. This is intentional, since configpm doesn't update the timestamps
/update the files if the Config files are identical to the old ones to
prevent mass clean+rebuild of all modules when nothing global changed.
dmake: Warning: -- Target [..\lib\Config.pm] was made but the time stamp
has not been updated.
-reduce number of steps to build generate_uudmap.exe.
Compiling (140 ms on GCC 4.8.3) and linking (561 ms) is heavy weight
compared to running generate_uudmap.exe (31 ms) and compiling globals.c
(483 ms). dmake's algo for doing parallel is poor. On the main parallel
pass with all the mini core .c files compiling ("MINI_OBJ"),
only generate_uudmap.o will be generated as part of the chain of deps
hanging off globals.o, after the 1st tier of MINI_OBJ has compiled in
parallel, dmake will do another sweep of MINI_OBJ, this time it will find
generate_uudmap.exe node and run linking, at this 2nd tier nothing ran
except linking generate_uudmap. No parallel anything. This is a
chokepoint. Then dmake does a 3rd sweep and runs the 3rd tier, which is
run generate_uudmap.exe, again nothing parallel happens here. By
combining compiling and linking in 1 target, the time spent serially
linking generate_uudmap.exe, is moved into parallel time when the rest of
MINI_OBJ compiles. Also a little bit of CPU and IO is saved by launching
less processes (less cmd.exe shells, gcc/g++ process ran only once
(gcc/g++ still run many standalone procs internally but now only 1 gcc
was started not 2)).
-suppress warnings from dmake with .UPDATEALL, the 3 generated headers
are made at the same time in real life, in the makefile it was written
as if they weren't
dmake: Warning:--Found file corresponding to virtual target [..\uudmap.h].
dmake: Warning:--Found file corresponding to virtual target [..\mg_data.h].
-move generating the headers to the target that generates
generate_uudmap.exe, this moves some serialization time, albeit small
(30 ms) from right before miniperl link, to parallel time during 1st
pass of MINI_OBJ
-collapse 3 shell runs of xcopy into 1 run of shell
"timeit cmd /c "cmd /c xcopy /f /r /i /d /y ..\perl.exe ..\t\ && cmd /c
xcopy /f /r /i /d /y ..\perl523.dll ..\t\
&& cmd /c xcopy /f /r /i /d /y ..\perlglob.exe ..\t\"" takes 140 ms
"timeit cmd /c "xcopy /f /r /i /d /y ..\perl.exe ..\t\
&& xcopy /f /r /i /d /y ..\perl523.dll ..\t\
&& xcopy /f /r /i /d /y ..\perlglob.exe ..\t\"" takes 78 ms on my machine
---
win32/makefile.mk | 31 +++++++++++--------------------
1 files changed, 11 insertions(+), 20 deletions(-)
diff --git a/win32/makefile.mk b/win32/makefile.mk
index 2eaec25..6288ead 100644
--- a/win32/makefile.mk
+++ b/win32/makefile.mk
@@ -980,7 +980,6 @@ MINICORE_OBJ = $(MINIDIR)\{$(MICROCORE_OBJ:f) miniperlmain$(o) perlio$(o)}
MINIWIN32_OBJ = $(MINIDIR)\{$(WIN32_OBJ:f)}
MINI_OBJ = $(MINICORE_OBJ) $(MINIWIN32_OBJ)
DLL_OBJ = $(DYNALOADER)
-GENUUDMAP_OBJ = $(GENUUDMAP:db:+$(o))
PERLDLL_OBJ = $(CORE_OBJ)
PERLEXE_OBJ = perlmain$(o)
@@ -1110,8 +1109,7 @@ regen_config_h:
$(CONFIGPM): ..\config.sh config_h.PL
$(MINIPERL) -I..\lib ..\configpm --chdir=..
$(XCOPY) config.h $(COREDIR)\*.*
- $(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)" \
- || $(PLMAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)
+ -$(MINIPERL) -I..\lib config_h.PL "ARCHPREFIX=$(ARCHPREFIX)"
.\config.h : $(CONFIGPM)
@@ -1391,9 +1389,14 @@ $(PERLEXE_RES): perlexe.rc $(PERLEXE_MANIFEST) $(PERLEXE_ICO)
$(MINIDIR)\globals$(o) : $(GENERATED_HEADERS)
-$(UUDMAP_H) $(MG_DATA_H) : $(BITCOUNT_H)
-
-$(BITCOUNT_H) : $(GENUUDMAP)
+$(GENUUDMAP) $(GENERATED_HEADERS) .UPDATEALL : ..\mg_raw.h
+.IF "$(CCTYPE)" == "GCC"
+ $(LINK32) $(CFLAGS_O) -o..\generate_uudmap.exe ..\generate_uudmap.c $(BLINK_FLAGS) \
+ $(mktmp $(LKPRE) $(LIBFILES) $(LKPOST))
+.ELSE
+ $(CC) $(CFLAGS_O) -Fe..\generate_uudmap.exe ..\generate_uudmap.c @$(mktmp -link $(LIBFILES)) -link $(BLINK_FLAGS)
+ $(EMBED_EXE_MANI:s/$@/..\generate_uudmap.exe/)
+.ENDIF
$(GENUUDMAP) $(GENERATED_HEADERS)
#This generates a stub ppport.h & creates & fills /lib/CORE to allow for XS
@@ -1403,17 +1406,6 @@ $(COREDIR)\ppport.h : $(CORE_H)
$(XCOPY) *.h $(COREDIR)\*.* && $(RCOPY) include $(COREDIR)\*.* && $(XCOPY) ..\*.h $(COREDIR)\*.*
rem. > $@
-$(GENUUDMAP_OBJ) : ..\mg_raw.h
-
-$(GENUUDMAP) : $(GENUUDMAP_OBJ)
-.IF "$(CCTYPE)" == "GCC"
- $(LINK32) -v -o $@ $(BLINK_FLAGS) \
- $(mktmp $(LKPRE) $(GENUUDMAP_OBJ) $(LIBFILES) $(LKPOST))
-.ELSE
- $(LINK32) -out:$@ $(BLINK_FLAGS) @$(mktmp $(LIBFILES) $(GENUUDMAP_OBJ))
- $(EMBED_EXE_MANI)
-.ENDIF
-
perlmain.c : runperl.c
copy runperl.c perlmain.c
@@ -1690,9 +1682,8 @@ minitest : .\config.h $(HAVEMINIPERL) ..\git_version.h $(GLOBEXE) $(CONFIGPM) $(
cd ..\t && perl.exe TEST base/*.t comp/*.t cmd/*.t run/*.t io/*.t re/*.t opbasic/*.t op/*.t uni/*.t perf/*.t pragma/*.t
test-prep : all utils ..\pod\perltoc.pod $(TESTPREPGCC)
- $(XCOPY) $(PERLEXE) ..\t\$(NULL)
- $(XCOPY) $(PERLDLL) ..\t\$(NULL)
- $(XCOPY) $(GLOBEXE) ..\t\$(NULL)
+ $(XCOPY) $(PERLEXE) ..\t\$(NULL) && $(XCOPY) $(PERLDLL) ..\t\$(NULL) \
+ && $(XCOPY) $(GLOBEXE) ..\t\$(NULL)
# If building with gcc versions 4.x.x or greater, then
# the GCC helper DLL will also need copied to the test directory.
--
1.7.9.msysgit.0
|
From @tonycozOn Thu Sep 03 22:35:03 2015, bulk88 wrote:
Thanks, applied as 3bdc51a, d89ea36 and c2c7bda. Thanks for all the effort you've put into this. Tony |
@tonycoz - Status changed from 'open' to 'resolved' |
Migrated from rt.perl.org#123867 (status was 'resolved')
Searchable as RT123867$
The text was updated successfully, but these errors were encountered: