Win32 parallel build fixes C++
authorDaniel Dragan <bulk88@hotmail.com>
Tue, 27 Oct 2015 16:07:51 +0000 (12:07 -0400)
committerTony Cook <tony@develop-help.com>
Tue, 27 Oct 2015 23:34:53 +0000 (10:34 +1100)
commit1545a17946a06cf70b111af74a1786ae29fa7652
tree47b6573f1dd3d765f4f079ed3acd061ae8335be1
parentce9582afa265ba88092dee4d095faf7450deb501
Win32 parallel build fixes C++

-dmake's parallel scheduler is poor and has problems finding work to run
 leading to idle cores, see note in commit c2c7bda088 about
 generate_uudmap.exe target so compile+link perlglob.exe in 1 process run
-remove whitespace from LIBFILES as much as possible while keeping some
 prettyness in the makefile. This is so the console isn't flooded as much
 with a wall of text as before.
-although perlglob.exe is very small (1 main func, that is it),
 add $(OPTIMIZE), it previously wasnt CC optimized at all
-when -xc++ flag is used (USE_CPLUSPLUS=define), the command options
 file is compiled like C code and syntax errors, use -x to reset file type
 to nothing/auto

g++ -xc++ -I.\include -I. -I.. -DWIN32 -DPERLDLL -DPERL_CORE -s -O2  -DPERL_TEXT
MODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -fwrapv -fno-strict-ali
asing -mms-bitfields -o..\generate_uudmap.exe ..\generate_uudmap.c  -s -L"c:\per
l\lib\CORE" -L"C:\MinGW\lib" \
            C:\Users\Owner\AppData\Local\Temp\mk10
C:\Users\Owner\AppData\Local\Temp\mk10:1:7: error: expected constructor, destruc
tor, or type conversion before '(' token
 INPUT (  -lmoldname -lkernel32 -luser32 -lgdi32 -lwinspool  -lcomdlg32 -ladvapi
32 -lshell32 -lole32 -loleaut32 -lnetapi32  -luuid -lws2_32 -lmpr -lwinmm -lvers
ion -lodbc32 -lodbccp32 -lcomctl32 )
       ^
dmake:  Error code 129, while making '..\bitcount.h'

-since makefile.mk does not create perl523.lib during link time of
 perl523.dll anymore, to allow parallelism the interface (def file and
 .exp/.lib files) between libperl and XS modules is created before libperl
 and XS modules are every created, this allows the 2 to build in parallel
 and not be dependent on each other. This caused a link failure where an
 XS module wanted a C++ mangled perl data symbol, while the def/lib file
 only had the extern "C", C named data symbol (unless you take
 extraordinary measures, the def/lib file is always extern "C" even if
 the symbol is mangled inside C/C++ lang world and for static linking
 purpose), so make all data symbols EXTERN_C, not extern, in the headers

link -out:..\..\lib\auto\PerlIO\encoding\encoding.dll -dll -nologo -nodefaultlib
 -debug -opt:ref,icf -ltcg              -libpath:"c:\perl\lib\CORE"
-machine:x86 "/manifestdependency:type='Win32' name='Microsoft.Windows.Common-Co
ntrols' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144cc
f1df' language='*'" -subsystem:console,"5.01" encoding.obj   "..\..\lib\CORE\per
l523.lib" oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.l
ib advapi32.lib shell32.lib ole32.lib oleaut32.lib netapi32.lib uuid.lib ws2_32.
lib mpr.lib winmm.lib version.lib odbc32.lib odbccp32.lib comctl32.lib msvcrt.li
b -def:encoding.def
   Creating library ..\..\lib\auto\PerlIO\encoding\encoding.lib and object ..\..
\lib\auto\PerlIO\encoding\encoding.exp
encoding.obj : error LNK2001: unresolved external symbol "__declspec(dllimport)
struct _PerlIO_funcs const PerlIO_perlio" (__imp_?PerlIO_perlio@@3U_PerlIO_funcs
@@B)
..\..\lib\auto\PerlIO\encoding\encoding.dll : fatal error LNK1120: 1 unresolved
externals
dmake:  Error code 224, while making '..\..\lib\auto\PerlIO\encoding\encoding.dl
l'
-------------------------------------------------------------------------
link -dll -out:..\perl523.dll  -nologo -nodefaultlib -debug -opt:ref,icf -ltcg
        -libpath:"c:\perl\lib\CORE"             -machine:x86 "/manifestdependenc
y:type='Win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' proces
sorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'" -subsystem:c
onsole,"5.01" \
            @Extensions_static \
            @C:\Users\Owner\AppData\Local\Temp\mk11
perl523.exp : error LNK2001: unresolved external symbol _PL_interp_size
perl523.exp : error LNK2001: unresolved external symbol _PL_interp_size_5_18_0
perl523.exp : error LNK2001: unresolved external symbol _PerlIO_pending
perl523.exp : error LNK2001: unresolved external symbol _PerlIO_perlio
..\perl523.dll : fatal error LNK1120: 4 unresolved externals
dmake:  Error code 224, while making '..\perl523.dll'

With this commit, "dmake all" VC C++ build succeeds to the end, G++ build
won't build until 1 other issue is fixed, I fixed that issue for testing
but it is not in this patch, so only that issue remains preventing a G++
build from running to the end.
EXTERN.h
INTERN.h
win32/makefile.mk