This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
add parallel support 4 Win32 dmake-uudmap+no 2nd run of config_h.PL part 3
authorDaniel Dragan <bulk88@hotmail.com>
Sat, 15 Aug 2015 09:39:55 +0000 (05:39 -0400)
committerTony Cook <tony@develop-help.com>
Mon, 7 Sep 2015 01:23:57 +0000 (11:23 +1000)
-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

index 9feb8e2..2749d6b 100644 (file)
@@ -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
 
@@ -1691,9 +1683,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.