Browse Source

* Attempt at making a Panda3D.app application bundle for the runtime on OSX
* Don't link python into panda3d.exe - link pystub instead
* Invoke ppackage.py with -OO, depending on optimize mode
* Don't attempt to pzip the models if compiled without zlib

rdb 16 years ago
parent
commit
f176b9fd1d
2 changed files with 66 additions and 19 deletions
  1. 65 19
      makepanda/makepanda.py
  2. 1 0
      makepanda/makepandacore.py

+ 65 - 19
makepanda/makepanda.py

@@ -904,7 +904,10 @@ def FreezePy(target, inputs, opts):
 def Package(target, inputs, opts):
     assert len(inputs) == 1
     # Invoke the ppackage script.
-    command = SDK["PYTHONEXEC"] + " direct/src/p3d/ppackage.py"
+    command = SDK["PYTHONEXEC"]
+    if (GetOptimizeOption(opts) >= 4):
+        command += " -OO"
+    command += " direct/src/p3d/ppackage.py"
     command += " -i \"" + GetOutputDir() + "/stage\""
     command += " " + inputs[0]
     oscmd(command)
@@ -915,7 +918,7 @@ def Package(target, inputs, opts):
 #
 ##########################################################################################
 
-def CompileBundle(target, inputs, opts):
+def CompileBundle(target, inputs, opts, exe):
     if (sys.platform != "darwin"): return
     plist = None
     resources = []
@@ -924,9 +927,9 @@ def CompileBundle(target, inputs, opts):
         if (i.endswith(".plist")):
             if (plist != None): exit("Only one plist file can be used when creating a bundle!")
             plist = i
-        elif (i.endswith(".rsrc")):
+        elif (i.endswith(".rsrc") or i.endswith(".icns")):
             resources.append(i)
-        elif (GetOrigExt(i) == ".obj"):
+        elif (GetOrigExt(i) == ".obj" or GetOrigExt(i) in SUFFIX_LIB or GetOrigExt(i) in SUFFIX_DLL):
             objects.append(i)
         else:
             exit("Don't know how to bundle file %s" % i)
@@ -938,7 +941,10 @@ def CompileBundle(target, inputs, opts):
     oscmd("rm -rf %s" % target)
     oscmd("mkdir -p %s/Contents/MacOS/" % target)
     oscmd("mkdir -p %s/Contents/Resources/" % target)
-    SetOrigExt("%s/Contents/MacOS/%s" % (target, bundleName), ".dll")
+    if target.endswith(".app"):
+        SetOrigExt("%s/Contents/MacOS/%s" % (target, bundleName), ".exe")
+    else:
+        SetOrigExt("%s/Contents/MacOS/%s" % (target, bundleName), ".dll")
     CompileLink("%s/Contents/MacOS/%s" % (target, bundleName), objects, opts + ["BUNDLE"])
     oscmd("cp %s %s/Contents/Info.plist" % (plist, target))
     for r in resources:
@@ -1007,6 +1013,9 @@ def CompileAnything(target, inputs, opts, progress = None):
     elif (origsuffix==".plugin"):
         ProgressOutput(progress, "Building plugin bundle", target)
         return CompileBundle(target, inputs, opts)
+    elif (origsuffix==".app"):
+        ProgressOutput(progress, "Building application bundle", target)
+        return CompileBundle(target, inputs, opts)
     elif (origsuffix==".pz"):
         ProgressOutput(progress, "Compressing", target)
         return CompileEggPZ(target, infile, opts)
@@ -1854,6 +1863,14 @@ TargetAdd('libp3pystub.dll', input='pystub_pystub.obj')
 TargetAdd('libp3pystub.dll', input='libp3dtool.dll')
 TargetAdd('libp3pystub.dll', opts=['ADVAPI'])
 
+if (RUNTIME):
+  pref = ""
+  if (sys.platform.startswith("win")): pref = "static_"
+  TargetAdd(pref+'pystub_pystub.obj', opts=OPTS, input='pystub.cxx')
+  TargetAdd('libp3pystub_s.ilb', input=pref+'pystub_pystub.obj')
+  TargetAdd('libp3pystub_s.ilb', input='libp3dtool.dll')
+  TargetAdd('libp3pystub_s.ilb', opts=['ADVAPI'])
+
 #
 # DIRECTORY: dtool/src/interrogate/
 #
@@ -3247,14 +3264,40 @@ if (RUNTIME and PkgSkip("NPAPI")==0):
 if (RUNTIME):
   OPTS=['DIR:direct/src/plugin_standalone', 'PLUGIN', 'LINK_ALL_STATIC', 'TINYXML', 'OPENSSL']
   TargetAdd('plugin_standalone_panda3d.obj', opts=OPTS, input='panda3d.cxx')
-  TargetAdd('panda3d.exe', input='plugin_standalone_panda3d.obj')
-  TargetAdd('panda3d.exe', input='plugin_common.obj')
-  if (sys.platform == "darwin"):
-    TargetAdd('panda3d.exe', input='plugin_find_root_dir_assist.obj')
-  TargetAdd('panda3d.exe', input='libpandaexpress_s.ilb')
-  TargetAdd('panda3d.exe', input='libp3dtoolconfig_s.ilb')
-  TargetAdd('panda3d.exe', input='libp3dtool_s.ilb')
-  TargetAdd('panda3d.exe', opts=['PYTHON', 'TINYXML', 'OPENSSL', 'ZLIB', 'WINGDI', 'WINUSER', 'WINSHELL', 'ADVAPI', 'WINSOCK2', 'WINOLE', 'CARBON'])
+  if (sys.platform != "darwin"):
+    TargetAdd('plugin_standalone_panda3dMain.obj', opts=OPTS, input='panda3dMain.cxx')
+    TargetAdd('panda3d.exe', input='plugin_standalone_panda3d.obj')
+    TargetAdd('panda3d.exe', input='plugin_standalone_panda3dMain.obj')
+    TargetAdd('panda3d.exe', input='plugin_common.obj')
+    TargetAdd('panda3d.exe', input='libpandaexpress_s.ilb')
+    TargetAdd('panda3d.exe', input='libp3dtoolconfig_s.ilb')
+    TargetAdd('panda3d.exe', input='libp3dtool_s.ilb')
+    TargetAdd('panda3d.exe', input='libp3pystub_s.ilb')
+    TargetAdd('panda3d.exe', opts=['TINYXML', 'OPENSSL', 'ZLIB', 'WINGDI', 'WINUSER', 'WINSHELL', 'ADVAPI', 'WINSOCK2', 'WINOLE', 'CARBON'])
+  else:
+    TargetAdd('plugin_standalone_panda3dMac.obj', opts=OPTS, input='panda3dMac.cxx')
+    TargetAdd('Panda3D.app', input='plugin_standalone_panda3d.obj')
+    TargetAdd('Panda3D.app', input='plugin_standalone_panda3dMac.obj')
+    TargetAdd('Panda3D.app', input='plugin_common.obj')
+    TargetAdd('Panda3D.app', input='plugin_find_root_dir_assist.obj')
+    TargetAdd('Panda3D.app', input='libpandaexpress_s.ilb')
+    TargetAdd('Panda3D.app', input='libp3dtoolconfig_s.ilb')
+    TargetAdd('Panda3D.app', input='libp3dtool_s.ilb')
+    TargetAdd('Panda3D.app', input='libp3pystub_s.ilb')
+    TargetAdd('Panda3D.app', input='panda3d_mac.plist')
+    TargetAdd('Panda3D.app', input='models/plugin_images/panda3d.icns')
+    TargetAdd('Panda3D.app', opts=['TINYXML', 'OPENSSL', 'ZLIB', 'WINGDI', 'WINUSER', 'WINSHELL', 'ADVAPI', 'WINSOCK2', 'WINOLE', 'CARBON'])
+  
+  if (sys.platform.startswith("win")):
+    TargetAdd('plugin_standalone_panda3dWinMain.obj', opts=OPTS, input='panda3dWinMain.cxx')
+    TargetAdd('panda3dw.exe', input='plugin_standalone_panda3dWinMain.obj')
+    TargetAdd('panda3dw.exe', input='plugin_standalone_panda3d.obj')
+    TargetAdd('panda3dw.exe', input='plugin_common.obj')
+    TargetAdd('panda3dw.exe', input='libpandaexpress_s.ilb')
+    TargetAdd('panda3dw.exe', input='libp3dtoolconfig_s.ilb')
+    TargetAdd('panda3dw.exe', input='libp3dtool_s.ilb')
+    TargetAdd('panda3dw.exe', input='libp3pystub_s.ilb')
+    TargetAdd('panda3dw.exe', opts=['TINYXML', 'OPENSSL', 'ZLIB', 'WINGDI', 'WINUSER', 'WINSHELL', 'ADVAPI', 'WINSOCK2', 'WINOLE', 'CARBON'])
 
 #
 # DIRECTORY: pandatool/src/pandatoolbase/
@@ -4079,16 +4122,19 @@ if (not RUNTIME):
       model_extensions.append("*.flt")
 
   for model in GetDirectoryContents("dmodels/src/misc", model_extensions):
-      eggpz = model[:-4] + ".egg.pz"
-      TargetAdd(GetOutputDir()+"/models/misc/"+eggpz, input="dmodels/src/misc/"+model)
+      if (PkgSkip("ZLIB")==0): newname = model[:-4] + ".egg.pz"
+      else: newname = model[:-4] + ".egg"
+      TargetAdd(GetOutputDir()+"/models/misc/"+newname, input="dmodels/src/misc/"+model)
 
   for model in GetDirectoryContents("dmodels/src/gui", model_extensions):
-      eggpz = model[:-4] + ".egg.pz"
-      TargetAdd(GetOutputDir()+"/models/gui/"+eggpz, input="dmodels/src/gui/"+model)
+      if (PkgSkip("ZLIB")==0): newname = model[:-4] + ".egg.pz"
+      else: newname = model[:-4] + ".egg"
+      TargetAdd(GetOutputDir()+"/models/gui/"+newname, input="dmodels/src/gui/"+model)
 
   for model in GetDirectoryContents("models", model_extensions):
-      eggpz = model[:-4] + ".egg.pz"
-      TargetAdd(GetOutputDir()+"/models/"+eggpz, input="models/"+model)
+      if (PkgSkip("ZLIB")==0): newname = model[:-4] + ".egg.pz"
+      else: newname = model[:-4] + ".egg"
+      TargetAdd(GetOutputDir()+"/models/"+newname, input="models/"+model)
 
   CopyAllFiles(GetOutputDir()+"/models/audio/sfx/",  "dmodels/src/audio/sfx/", ".wav")
   CopyAllFiles(GetOutputDir()+"/models/icons/",      "dmodels/src/icons/",     ".gif")

+ 1 - 0
makepanda/makepandacore.py

@@ -1582,6 +1582,7 @@ def CalcLocation(fn, ipath):
         if (fn.endswith(".dat")):   return OUTPUTDIR+"/tmp/"+fn
         if (fn.endswith(".rsrc")):  return OUTPUTDIR+"/tmp/"+fn
         if (fn.endswith(".plugin")):return OUTPUTDIR+"/plugins/"+fn
+        if (fn.endswith(".app")):   return OUTPUTDIR+"/"+fn
         if (fn.endswith(".in")):    return OUTPUTDIR+"/pandac/input/"+fn
     else:
         if (fn.endswith(".obj")): return OUTPUTDIR+"/tmp/"+fn[:-4]+".o"