From 9e02be04316972ee31eebe89a4d4945c014b509a Mon Sep 17 00:00:00 2001 From: Zhao Huang Date: Fri, 23 Dec 2011 07:37:17 +0000 Subject: [PATCH] Add support for the Intel compiler on win systems, and a switch --MSVC_Intel to enable it. --- makepanda/makepanda.py | 370 ++++++++++++++++++++++++++++------------- 1 file changed, 257 insertions(+), 113 deletions(-) diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index 51d04eefd3..00f2154342 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -27,7 +27,7 @@ import sys ## jGenPyCode tries to get the directory for Direct from the sys.path. This only works if you ## have installed the sdk using a installer. This would not work if the installer was -## never used and everything was grabbed into a virign environment using cvs. +## never used and everything was grabbed into a virgin environment using cvs. sys.path.append( os.getcwd() ) import __builtin__ @@ -62,9 +62,10 @@ COREAPI_VERSION=None PLUGIN_VERSION=None OSXTARGET=None HOST_URL="https://runtime.panda3d.org/" -global STRDXSDKVERSION, STRMSPLATFORMVERSION +global STRDXSDKVERSION, STRMSPLATFORMVERSION, BOOUSEINTELCOMPILER STRDXSDKVERSION = 'default' STRMSPLATFORMVERSION = 'default' +BOOUSEINTELCOMPILER = False if "MACOSX_DEPLOYMENT_TARGET" in os.environ: OSXTARGET=os.environ["MACOSX_DEPLOYMENT_TARGET"] @@ -140,6 +141,10 @@ def usage(problem): print " --everything (enable every third-party lib)" print " --dxSdk=X (specify version of Dx9 SDK to use: jun2010, aug2009, mar2009, aug2006)" print " --MSPlatSdk=X (specify MSPlatSdk to use: win71, win61, win60A, winserver2003r2" + print " --MSVC_Intel (experimental setting to use an intel compiler instead of MSVC. win-only" + print " Novice users of this option should only use it inconjunction with the latest SDKs" + print " and have installed Intell Parallel Studios 2011 SP1. Use of the directcam and vision modules" + print " will require additional modifications to the build system." print "" print "The simplest way to compile panda is to just type:" print "" @@ -151,13 +156,13 @@ def parseopts(args): global INSTALLER,RTDIST,RUNTIME,GENMAN,DISTRIBUTOR,VERSION global COMPRESSOR,THREADCOUNT,OSXTARGET,HOST_URL global DEBVERSION,RPMRELEASE,P3DSUFFIX - global STRDXSDKVERSION, STRMSPLATFORMVERSION + global STRDXSDKVERSION, STRMSPLATFORMVERSION, BOOUSEINTELCOMPILER longopts = [ "help","distributor=","verbose","runtime","osxtarget=", "optimize=","everything","nothing","installer","rtdist","nocolor", "version=","lzma","no-python","threads=","outputdir=","override=", "static","host=","debversion=","rpmrelease=","p3dsuffix=", - "dxSdk=", "MSPlatSdk="] + "dxSdk=", "MSPlatSdk=", "MSVC_Intel"] anything = 0 optimize = "" for pkg in PkgListGet(): longopts.append("no-"+pkg.lower()) @@ -202,6 +207,7 @@ def parseopts(args): if STRMSPLATFORMVERSION == '': print "No MS Platform SDK version specified. Using 'default' MS Platform SDK search" STRMSPLATFORMVERSION = 'default' + elif (option=="--MSVC_Intel"): BOOUSEINTELCOMPILER = True else: for pkg in PkgListGet(): if (option=="--use-"+pkg.lower()): @@ -800,45 +806,138 @@ def BracketNameWithQuotes(name): def CompileCxx(obj,src,opts): ipath = GetListOption(opts, "DIR:") if (COMPILER=="MSVC"): - cmd = "cl " - if (is_64): - cmd += "/favor:blend " - cmd += "/wd4996 /wd4275 /wd4267 /wd4101 /wd4273 " + if not BOOUSEINTELCOMPILER: + cmd = "cl " + if (is_64): + cmd += "/favor:blend " + cmd += "/wd4996 /wd4275 /wd4267 /wd4101 /wd4273 " - # Enables Windows 7 mode if SDK is detected. - # But only if it is Windows 7 (0x601) and not e. g. Vista (0x600) - if (STRMSPLATFORMVERSION not in ['winserver2003r2', 'win60A']): - platsdk = GetRegistryKey("SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v7.1", "InstallationFolder") - winver = sys.getwindowsversion() - if platsdk and os.path.isdir(platsdk) and winver[0] >= 6 and winver[1] >= 1: - cmd += "/DPANDA_WIN7 /DWINVER=0x601 " + # Enables Windows 7 mode if SDK is detected. + # But only if it is Windows 7 (0x601) and not e. g. Vista (0x600) + if (STRMSPLATFORMVERSION not in ['winserver2003r2', 'win60A']): + platsdk = GetRegistryKey("SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v7.1", "InstallationFolder") + winver = sys.getwindowsversion() + if platsdk and os.path.isdir(platsdk) and winver[0] >= 6 and winver[1] >= 1: + cmd += "/DPANDA_WIN7 /DWINVER=0x601 " - cmd += "/Fo" + obj + " /nologo /c" - if (not is_64): - cmd += " /arch:SSE2" - for x in ipath: cmd += " /I" + x - for (opt,dir) in INCDIRECTORIES: - if (opt=="ALWAYS") or (opt in opts): cmd += " /I" + BracketNameWithQuotes(dir) - for (opt,var,val) in DEFSYMBOLS: - if (opt=="ALWAYS") or (opt in opts): cmd += " /D" + var + "=" + val - if (opts.count('NOFLOATWARN')): cmd += ' /wd4244 /wd4305' - if (opts.count('MSFORSCOPE')): cmd += ' /Zc:forScope-' - optlevel = GetOptimizeOption(opts) - if (optlevel==1): cmd += " /MDd /Zi /RTCs /GS" - if (optlevel==2): cmd += " /MDd /Zi" - if (optlevel==3): cmd += " /MD /Zi /O2 /Ob2 /Oi /Ot /fp:fast /DFORCE_INLINING" - if (optlevel==4): - cmd += " /MD /Zi /Ox /Ob2 /Oi /Ot /fp:fast /DFORCE_INLINING /DNDEBUG /GL" - cmd += " /Oy" # jcr add - cmd += " /Zp16" # jcr add # Is this necessary with /Ox? + cmd += "/Fo" + obj + " /nologo /c" + if (not is_64): + cmd += " /arch:SSE2" + for x in ipath: cmd += " /I" + x + for (opt,dir) in INCDIRECTORIES: + if (opt=="ALWAYS") or (opt in opts): cmd += " /I" + BracketNameWithQuotes(dir) + for (opt,var,val) in DEFSYMBOLS: + if (opt=="ALWAYS") or (opt in opts): cmd += " /D" + var + "=" + val + if (opts.count('NOFLOATWARN')): cmd += ' /wd4244 /wd4305' + if (opts.count('MSFORSCOPE')): cmd += ' /Zc:forScope-' + optlevel = GetOptimizeOption(opts) + if (optlevel==1): cmd += " /MDd /Zi /RTCs /GS" + if (optlevel==2): cmd += " /MDd /Zi" + if (optlevel==3): cmd += " /MD /Zi /O2 /Ob2 /Oi /Ot /fp:fast /DFORCE_INLINING" + if (optlevel==4): + cmd += " /MD /Zi /Ox /Ob2 /Oi /Ot /fp:fast /DFORCE_INLINING /DNDEBUG /GL" + cmd += " /Oy" # jcr add + cmd += " /Zp16" # jcr add # Is this necessary with /Ox? - cmd += " /Fd" + os.path.splitext(obj)[0] + ".pdb" - building = GetValueOption(opts, "BUILDING:") - if (building): cmd += " /DBUILDING_" + building - if ("BIGOBJ" in opts) or (is_64): - cmd += " /bigobj" - cmd += " /EHa /Zm300 /DWIN32_VC /DWIN32 /W3 " + BracketNameWithQuotes(src) - oscmd(cmd) + cmd += " /Fd" + os.path.splitext(obj)[0] + ".pdb" + building = GetValueOption(opts, "BUILDING:") + if (building): cmd += " /DBUILDING_" + building + if ("BIGOBJ" in opts) or (is_64): + cmd += " /bigobj" + cmd += " /EHa /Zm300 /DWIN32_VC /DWIN32 /W3 " + BracketNameWithQuotes(src) + oscmd(cmd) + else: + cmd = "icl " + if (is_64): + cmd += "/favor:blend " + cmd += "/wd4996 /wd4275 /wd4267 /wd4101 /wd4273 " + + # Enables Windows 7 mode if SDK is detected. + # But only if it is Windows 7 (0x601) and not e. g. Vista (0x600) + if (STRMSPLATFORMVERSION not in ['winserver2003r2', 'win60A']): + platsdk = GetRegistryKey("SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v7.1", "InstallationFolder") + winver = sys.getwindowsversion() + if platsdk and os.path.isdir(platsdk) and winver[0] >= 6 and winver[1] >= 1: + cmd += "/DPANDA_WIN7 /DWINVER=0x601 " + + cmd += "/Fo" + obj + " /c" + for x in ipath: cmd += " /I" + x + for (opt,dir) in INCDIRECTORIES: + if (opt=="ALWAYS") or (opt in opts): cmd += " /I" + BracketNameWithQuotes(dir) + for (opt,var,val) in DEFSYMBOLS: + if (opt=="ALWAYS") or (opt in opts): cmd += " /D" + var + "=" + val + if (opts.count('NOFLOATWARN')): cmd += ' /wd4244 /wd4305' + if (opts.count('MSFORSCOPE')): cmd += ' /Zc:forScope-' + optlevel = GetOptimizeOption(opts) + if (optlevel==1): cmd += " /MDd /Zi /RTCs /GS" + if (optlevel==2): cmd += " /MDd /Zi /arch:SSE3" + # core changes from jean-claude (dec 2011) + # ---------------------------------------- + # performance will be seeked at level 3 & 4 + # ----------------------------------------- + if (optlevel==3): + cmd += " /MD /Zi /O2 /Oi /Ot /arch:SSE3" + cmd += " /Ob0" + cmd += " /Qipo-" # beware of IPO !!! + ## Lesson learned: Don't use /GL flag -> end result is MESSY + ## ---------------------------------------------------------------- + ## if (optlevel==4): cmd += " /MD /Zi /O3 /Oi /Ot /arch:SSE3 /Yc /DNDEBUG" + if (optlevel==4): + cmd += " /MD /Zi /O3 /Oi /Ot /Ob0 /Yc /DNDEBUG" # /Ob0 a ete rajoute en cours de route a 47% + # cmd += " /MD /Zi /Ox /Oi /Ot /Ob0 /Yc /DNDEBUG" # /Ob0 a ete rajoute en cours de route a 47% test Ox + + # cmd += " /Qipo-" + # cmd += " /Qip" # optimization mono file + cmd += " /Qipo" # optimization multi file + + # for 3 & 4 optimization levels + # ----------------------------- + if (optlevel>=3): + cmd += " /fp:fast=2" + cmd += " /Qftz" + cmd += " /Qfp-speculation:fast" + cmd += " /Qopt-matmul" # needs /O2 + cmd += " /Qprec-div-" + cmd += " /Qsimd" + + cmd += " /QxHost" # compile for target host + cmd += " /Quse-intel-optimized-headers" # use intel optimized headers + cmd += " /Qparallel" # enable parallelization + cmd += " /Qvc9" # for Microsoft Visual C++ 2008 + + # cmd += " /Qopt-report:2 /Qopt-report-phase:hlo /Qopt-report-phase:hpo" # some optimization reports + + ## PCH files coexistence: the /Qpchi option causes the Intel C++ Compiler to name its + ## PCH files with a .pchi filename suffix and reduce build time. + ## The /Qpchi option is on by default but interferes with Microsoft libs; so use /Qpchi- to turn it off. + cmd += " /Qpchi-" # keep it this way! + + ## Inlining seems to be an issue here ! + ## ------------------------------------ + ## so don't use cmd += " /DFORCE_INLINING" (need to check why with Panda developpers!) + ## Inline expansion /Ob1 : Allow functions marked inline to be inline. + ## Inline any /Ob2 : Inline functions deemed appropriate by compiler. + + ## Ctor displacement /vd0 : Disable constructor displacement. + ## Choose this option only if no class constructors or destructors call virtual functions. + ## Use /vd1 (default) to enable. Alternate: #pragma vtordisp + + ## Best case ptrs /vmb : Use best case "pointer to class member" representation. + ## Use this option if you always define a class before you declare a pointer to a member of the class. + ## The compiler will issue an error if it encounters a pointer declaration before the class is defined. + ## Alternate: #pragma pointers_to_members + + cmd += " /Fd" + os.path.splitext(obj)[0] + ".pdb" + building = GetValueOption(opts, "BUILDING:") + if (building): cmd += " /DBUILDING_" + building + if ("BIGOBJ" in opts) or (is_64): + cmd += " /bigobj" + + # level of warnings + cmd += " /EHa /Zm300 /DWIN32_VC /DWIN32 /W3 " + BracketNameWithQuotes(src) + # cmd += " /EHa /Zm300 /DWIN32_VC /DWIN32 /W4 " + BracketNameWithQuotes(src) + # cmd += " /EHa /Zm300 /DWIN32_VC /DWIN32 /Wall " + BracketNameWithQuotes(src) + oscmd(cmd) if (COMPILER=="LINUX"): cc = os.environ.get('CC', 'gcc') cxx = os.environ.get('CXX', 'g++') @@ -998,12 +1097,25 @@ def CompileImod(wobj, wsrc, opts): def CompileLib(lib, obj, opts): if (COMPILER=="MSVC"): - cmd = 'link /lib /nologo ' - if (is_64): - cmd += "/MACHINE:X64 " - cmd += '/OUT:' + BracketNameWithQuotes(lib) - for x in obj: cmd += ' ' + BracketNameWithQuotes(x) - oscmd(cmd) + if not BOOUSEINTELCOMPILER: + #Use MSVC Linker + cmd = 'link /lib /nologo ' + if (is_64): + cmd += "/MACHINE:X64 " + cmd += '/OUT:' + BracketNameWithQuotes(lib) + for x in obj: cmd += ' ' + BracketNameWithQuotes(x) + oscmd(cmd) + else: + # Choose Intel linker; from Jean-Claude + cmd = 'xilink /verbose:lib /lib ' + if (is_64): + cmd += "/MACHINE:X64 " + cmd += '/OUT:' + BracketNameWithQuotes(lib) + for x in obj: cmd += ' ' + BracketNameWithQuotes(x) + cmd += ' /LIBPATH:"C:\Program Files (x86)\Intel\Composer XE 2011 SP1\ipp\lib\ia32"' + cmd += ' /LIBPATH:"C:\Program Files (x86)\Intel\Composer XE 2011 SP1\TBB\Lib\ia32\vc9"' + cmd += ' /LIBPATH:"C:\Program Files (x86)\Intel\Composer XE 2011 SP1\compiler\lib\ia32"' + oscmd(cmd) if (COMPILER=="LINUX"): if sys.platform == 'darwin': cmd = 'libtool -static -o ' + BracketNameWithQuotes(lib) @@ -1014,22 +1126,6 @@ def CompileLib(lib, obj, opts): oscmd("ranlib " + BracketNameWithQuotes(lib)) -######################################################################## -## -## CompileLink implicitly checks whether or not a file like libpanda.lib exists -## This is not explicitly checked stated in the dependency, but is necessary on windows to link in a dll -## -######################################################################## - -def CompileLink_DoesImplicitLibExist(dll, obj, opts): - for x in obj: - if (x.endswith(".dll")): - baseStr = GetOutputDir() + '/lib/' + os.path.splitext(os.path.basename(x))[0] + ".lib" - strFullPath = os.path.join( os.getcwd(), baseStr ) - if not os.path.exists( strFullPath ): - return False - return True - ######################################################################## ## ## CompileLink @@ -1038,53 +1134,105 @@ def CompileLink_DoesImplicitLibExist(dll, obj, opts): def CompileLink(dll, obj, opts): if (COMPILER=="MSVC"): - cmd = "link /nologo" - if (is_64): - cmd += " /MACHINE:X64" - if ("MFC" not in opts): - cmd += " /NOD:MFC90.LIB /NOD:MFC80.LIB /NOD:LIBCMT" - cmd += " /NOD:LIBCI.LIB /DEBUG" - cmd += " /nod:libc /nod:libcmtd /nod:atlthunk /nod:atls" - if (GetOrigExt(dll) != ".exe"): cmd += " /DLL" - optlevel = GetOptimizeOption(opts) - if (optlevel==1): cmd += " /MAP /MAPINFO:EXPORTS /NOD:MSVCRT.LIB /NOD:MSVCPRT.LIB /NOD:MSVCIRT.LIB" - if (optlevel==2): cmd += " /MAP:NUL /NOD:MSVCRT.LIB /NOD:MSVCPRT.LIB /NOD:MSVCIRT.LIB" - if (optlevel==3): cmd += " /MAP:NUL /NOD:MSVCRTD.LIB /NOD:MSVCPRTD.LIB /NOD:MSVCIRTD.LIB" - if (optlevel==4): cmd += " /MAP:NUL /LTCG /NOD:MSVCRTD.LIB /NOD:MSVCPRTD.LIB /NOD:MSVCIRTD.LIB" - if ("MFC" in opts): - if (optlevel<=2): cmd += " /NOD:MSVCRTD.LIB mfcs90d.lib MSVCRTD.lib" - else: cmd += " /NOD:MSVCRT.LIB mfcs90.lib MSVCRT.lib" - cmd += " /FIXED:NO /OPT:REF /STACK:4194304 /INCREMENTAL:NO " - cmd += ' /OUT:' + BracketNameWithQuotes(dll) - subsystem = GetValueOption(opts, "SUBSYSTEM:") - if (subsystem): cmd += " /SUBSYSTEM:" + subsystem - if (dll.endswith(".dll")): - cmd += ' /IMPLIB:' + GetOutputDir() + '/lib/'+os.path.splitext(os.path.basename(dll))[0]+".lib" - for (opt, dir) in LIBDIRECTORIES: - if (opt=="ALWAYS") or (opt in opts): cmd += ' /LIBPATH:' + BracketNameWithQuotes(dir) - for x in obj: - if (x.endswith(".dll")): - cmd += ' ' + GetOutputDir() + '/lib/' + os.path.splitext(os.path.basename(x))[0] + ".lib" - elif (x.endswith(".lib")): - dname = os.path.splitext(dll)[0]+".dll" - if (GetOrigExt(x) != ".ilb" and os.path.exists(GetOutputDir()+"/bin/" + os.path.splitext(os.path.basename(x))[0] + ".dll")): - exit("Error: in makepanda, specify "+dname+", not "+x) - cmd += ' ' + BracketNameWithQuotes(x) - elif (x.endswith(".def")): - cmd += ' /DEF:' + BracketNameWithQuotes(x) - elif (x.endswith(".dat")): - pass - else: cmd += ' ' + BracketNameWithQuotes(x) - if (GetOrigExt(dll)==".exe" and "NOICON" not in opts): - cmd += " " + GetOutputDir() + "/tmp/pandaIcon.res" - for (opt, name) in LIBNAMES: - if (opt=="ALWAYS") or (opt in opts): cmd += " " + BracketNameWithQuotes(name) - oscmd(cmd) - SetVC90CRTVersion(dll+".manifest") - mtcmd = "mt -manifest " + dll + ".manifest -outputresource:" + dll - if (dll.endswith(".exe")==0): mtcmd = mtcmd + ";2" - else: mtcmd = mtcmd + ";1" - oscmd(mtcmd, ignoreError=True) # HACK: For some reason, mt sometimes gives a non-zero return value, even when it works + if not BOOUSEINTELCOMPILER: + cmd = "link /nologo" + if (is_64): + cmd += " /MACHINE:X64" + if ("MFC" not in opts): + cmd += " /NOD:MFC90.LIB /NOD:MFC80.LIB /NOD:LIBCMT" + cmd += " /NOD:LIBCI.LIB /DEBUG" + cmd += " /nod:libc /nod:libcmtd /nod:atlthunk /nod:atls" + if (GetOrigExt(dll) != ".exe"): cmd += " /DLL" + optlevel = GetOptimizeOption(opts) + if (optlevel==1): cmd += " /MAP /MAPINFO:EXPORTS /NOD:MSVCRT.LIB /NOD:MSVCPRT.LIB /NOD:MSVCIRT.LIB" + if (optlevel==2): cmd += " /MAP:NUL /NOD:MSVCRT.LIB /NOD:MSVCPRT.LIB /NOD:MSVCIRT.LIB" + if (optlevel==3): cmd += " /MAP:NUL /NOD:MSVCRTD.LIB /NOD:MSVCPRTD.LIB /NOD:MSVCIRTD.LIB" + if (optlevel==4): cmd += " /MAP:NUL /LTCG /NOD:MSVCRTD.LIB /NOD:MSVCPRTD.LIB /NOD:MSVCIRTD.LIB" + if ("MFC" in opts): + if (optlevel<=2): cmd += " /NOD:MSVCRTD.LIB mfcs90d.lib MSVCRTD.lib" + else: cmd += " /NOD:MSVCRT.LIB mfcs90.lib MSVCRT.lib" + cmd += " /FIXED:NO /OPT:REF /STACK:4194304 /INCREMENTAL:NO " + cmd += ' /OUT:' + BracketNameWithQuotes(dll) + subsystem = GetValueOption(opts, "SUBSYSTEM:") + if (subsystem): cmd += " /SUBSYSTEM:" + subsystem + if (dll.endswith(".dll")): + cmd += ' /IMPLIB:' + GetOutputDir() + '/lib/'+os.path.splitext(os.path.basename(dll))[0]+".lib" + for (opt, dir) in LIBDIRECTORIES: + if (opt=="ALWAYS") or (opt in opts): cmd += ' /LIBPATH:' + BracketNameWithQuotes(dir) + for x in obj: + if (x.endswith(".dll")): + cmd += ' ' + GetOutputDir() + '/lib/' + os.path.splitext(os.path.basename(x))[0] + ".lib" + elif (x.endswith(".lib")): + dname = os.path.splitext(dll)[0]+".dll" + if (GetOrigExt(x) != ".ilb" and os.path.exists(GetOutputDir()+"/bin/" + os.path.splitext(os.path.basename(x))[0] + ".dll")): + exit("Error: in makepanda, specify "+dname+", not "+x) + cmd += ' ' + BracketNameWithQuotes(x) + elif (x.endswith(".def")): + cmd += ' /DEF:' + BracketNameWithQuotes(x) + elif (x.endswith(".dat")): + pass + else: cmd += ' ' + BracketNameWithQuotes(x) + if (GetOrigExt(dll)==".exe" and "NOICON" not in opts): + cmd += " " + GetOutputDir() + "/tmp/pandaIcon.res" + for (opt, name) in LIBNAMES: + if (opt=="ALWAYS") or (opt in opts): cmd += " " + BracketNameWithQuotes(name) + oscmd(cmd) + SetVC90CRTVersion(dll+".manifest") + mtcmd = "mt -manifest " + dll + ".manifest -outputresource:" + dll + if (dll.endswith(".exe")==0): mtcmd = mtcmd + ";2" + else: mtcmd = mtcmd + ";1" + oscmd(mtcmd, ignoreError=True) # HACK: For some reason, mt sometimes gives a non-zero return value, even when it works + else: + cmd = "xilink /verbose:lib" + if (is_64): + cmd += " /MACHINE:X64" + if ("MFC" not in opts): + cmd += " /NOD:MFC90.LIB /NOD:MFC80.LIB /NOD:LIBCMT" + cmd += " /NOD:LIBCI.LIB /DEBUG" + cmd += " /nod:libc /nod:libcmtd /nod:atlthunk /nod:atls" + cmd += ' /LIBPATH:"C:\Program Files (x86)\Intel\Composer XE 2011 SP1\ipp\lib\ia32"' + cmd += ' /LIBPATH:"C:\Program Files (x86)\Intel\Composer XE 2011 SP1\TBB\Lib\ia32\vc9"' + cmd += ' /LIBPATH:"C:\Program Files (x86)\Intel\Composer XE 2011 SP1\compiler\lib\ia32"' + if (GetOrigExt(dll) != ".exe"): cmd += " /DLL" + optlevel = GetOptimizeOption(opts) + if (optlevel==1): cmd += " /MAP /MAPINFO:EXPORTS /NOD:MSVCRT.LIB /NOD:MSVCPRT.LIB /NOD:MSVCIRT.LIB" + if (optlevel==2): cmd += " /MAP:NUL /NOD:MSVCRT.LIB /NOD:MSVCPRT.LIB /NOD:MSVCIRT.LIB" + if (optlevel==3): cmd += " /MAP:NUL /NOD:MSVCRTD.LIB /NOD:MSVCPRTD.LIB /NOD:MSVCIRTD.LIB" + if (optlevel==4): cmd += " /MAP:NUL /LTCG /NOD:MSVCRTD.LIB /NOD:MSVCPRTD.LIB /NOD:MSVCIRTD.LIB" + if ("MFC" in opts): + if (optlevel<=2): cmd += " /NOD:MSVCRTD.LIB mfcs90d.lib MSVCRTD.lib" + else: cmd += " /NOD:MSVCRT.LIB mfcs90.lib MSVCRT.lib" + cmd += " /FIXED:NO /OPT:REF /STACK:4194304 /INCREMENTAL:NO " + cmd += ' /OUT:' + BracketNameWithQuotes(dll) + subsystem = GetValueOption(opts, "SUBSYSTEM:") + if (subsystem): cmd += " /SUBSYSTEM:" + subsystem + if (dll.endswith(".dll")): + cmd += ' /IMPLIB:' + GetOutputDir() + '/lib/'+os.path.splitext(os.path.basename(dll))[0]+".lib" + for (opt, dir) in LIBDIRECTORIES: + if (opt=="ALWAYS") or (opt in opts): cmd += ' /LIBPATH:' + BracketNameWithQuotes(dir) + for x in obj: + if (x.endswith(".dll")): + cmd += ' ' + GetOutputDir() + '/lib/' + os.path.splitext(os.path.basename(x))[0] + ".lib" + elif (x.endswith(".lib")): + dname = os.path.splitext(dll)[0]+".dll" + if (GetOrigExt(x) != ".ilb" and os.path.exists(GetOutputDir()+"/bin/" + os.path.splitext(os.path.basename(x))[0] + ".dll")): + exit("Error: in makepanda, specify "+dname+", not "+x) + cmd += ' ' + BracketNameWithQuotes(x) + elif (x.endswith(".def")): + cmd += ' /DEF:' + BracketNameWithQuotes(x) + elif (x.endswith(".dat")): + pass + else: cmd += ' ' + BracketNameWithQuotes(x) + if (GetOrigExt(dll)==".exe" and "NOICON" not in opts): + cmd += " " + GetOutputDir() + "/tmp/pandaIcon.res" + for (opt, name) in LIBNAMES: + if (opt=="ALWAYS") or (opt in opts): cmd += " " + BracketNameWithQuotes(name) + oscmd(cmd) + SetVC90CRTVersion(dll+".manifest") + mtcmd = "mt -manifest " + dll + ".manifest -outputresource:" + dll + if (dll.endswith(".exe")==0): mtcmd = mtcmd + ";2" + else: mtcmd = mtcmd + ";1" + oscmd(mtcmd, ignoreError=True) # HACK: For some reason, mt sometimes gives a non-zero return value, even when it works if (COMPILER=="LINUX"): cxx = os.environ.get('CXX', 'g++') if (GetOrigExt(dll)==".exe"): cmd = cxx + ' -o ' + dll + ' -L' + GetOutputDir() + '/lib -L' + GetOutputDir() + '/tmp -L/usr/X11R6/lib' @@ -1535,9 +1683,6 @@ DTOOL_CONFIG=[ ("GLOBAL_OPERATOR_NEW_EXCEPTIONS", 'UNDEF', '1'), ("HAVE_EIGEN", 'UNDEF', 'UNDEF'), ("LINMATH_ALIGN", '1', '1'), - ("MEMORY_HOOK_DO_ALIGN", 'UNDEF', 'UNDEF'), - ("USE_MEMORY_DLMALLOC", 'UNDEF', 'UNDEF'), - ("USE_MEMORY_PTMALLOC2", 'UNDEF', 'UNDEF'), ("HAVE_ZLIB", 'UNDEF', 'UNDEF'), ("HAVE_PNG", 'UNDEF', 'UNDEF'), ("HAVE_JPEG", 'UNDEF', 'UNDEF'), @@ -5238,7 +5383,6 @@ def ParallelMake(tasklist): th.start() # Feed tasks to the workers. tasksqueued = 0 - booStopParallel = False while (1): if (tasksqueued < THREADCOUNT): extras = []