2
0
Эх сурвалжийг харах

I think pdeploy is now fully working for windows

rdb 16 жил өмнө
parent
commit
2ff1e3221a

+ 35 - 32
direct/src/p3d/DeploymentTools.py

@@ -32,12 +32,13 @@ class Standalone:
         else:
         else:
             hostDir = Filename(Filename.getTempDirectory(), 'pdeploy/')
             hostDir = Filename(Filename.getTempDirectory(), 'pdeploy/')
             hostDir.makeDir()
             hostDir.makeDir()
-            self.host = HostInfo("http://runtime.panda3d.org", hostDir = hostDir, asMirror = True)
+            self.host = HostInfo("http://runtime.panda3d.org", hostDir = hostDir, asMirror = False, perPlatform = True)
         
         
         self.http = HTTPClient.getGlobalPtr()
         self.http = HTTPClient.getGlobalPtr()
-        if not self.host.downloadContentsFile(self.http):
-            Standalone.notify.error("couldn't read host")
-            return False
+        if not self.host.readContentsFile():
+            if not self.host.downloadContentsFile(self.http):
+                Standalone.notify.error("couldn't read host")
+                return False
     
     
     def buildAll(self, outputDir = "."):
     def buildAll(self, outputDir = "."):
         """ Builds standalone executables for every known platform,
         """ Builds standalone executables for every known platform,
@@ -47,7 +48,7 @@ class Standalone:
         for package in self.host.getPackages(name = "p3dembed"):
         for package in self.host.getPackages(name = "p3dembed"):
             platforms.add(package.platform)
             platforms.add(package.platform)
         if len(platforms) == 0:
         if len(platforms) == 0:
-            Standalone.notify.error("No platforms found to build for!")
+            Standalone.notify.warning("No platforms found to build for!")
         
         
         outputDir = Filename(outputDir + "/")
         outputDir = Filename(outputDir + "/")
         outputDir.makeDir()
         outputDir.makeDir()
@@ -66,10 +67,10 @@ class Standalone:
             platform = PandaSystem.getPlatform()
             platform = PandaSystem.getPlatform()
         for package in self.host.getPackages(name = "p3dembed", platform = platform):
         for package in self.host.getPackages(name = "p3dembed", platform = platform):
             if not package.downloadDescFile(self.http):
             if not package.downloadDescFile(self.http):
-                Standalone.notify.error("  -> %s failed for platform %s" % (package.packageName, package.platform))
+                Standalone.notify.warning("  -> %s failed for platform %s" % (package.packageName, package.platform))
                 continue
                 continue
             if not package.downloadPackage(self.http):
             if not package.downloadPackage(self.http):
-                Standalone.notify.error("  -> %s failed for platform %s" % (package.packageName, package.platform))
+                Standalone.notify.warning("  -> %s failed for platform %s" % (package.packageName, package.platform))
                 continue
                 continue
             
             
             # Figure out where p3dembed might be now.
             # Figure out where p3dembed might be now.
@@ -78,11 +79,8 @@ class Standalone:
             else:
             else:
                 p3dembed = Filename(self.host.hostDir, "p3dembed/%s/p3dembed" % package.platform)
                 p3dembed = Filename(self.host.hostDir, "p3dembed/%s/p3dembed" % package.platform)
             
             
-            # We allow p3dembed to be pzipped.
-            if Filename(p3dembed + ".pz").exists():
-                p3dembed = Filename(p3dembed + ".pz")
             if not p3dembed.exists():
             if not p3dembed.exists():
-                Standalone.notify.error("  -> %s failed for platform %s" % (package.packageName, package.platform))
+                Standalone.notify.warning("  -> %s failed for platform %s" % (package.packageName, package.platform))
                 continue
                 continue
             
             
             return self.embed(output, p3dembed)
             return self.embed(output, p3dembed)
@@ -128,24 +126,28 @@ class Standalone:
     def getExtraFiles(self, platform):
     def getExtraFiles(self, platform):
         """ Returns a list of extra files that will need to be included
         """ Returns a list of extra files that will need to be included
         with the standalone executable in order for it to run, such as
         with the standalone executable in order for it to run, such as
-        dependent libraries. The returned paths will be absolute. """
+        dependent libraries. The returned paths are full absolute paths. """
         
         
-        for package in self.host.getPackages(name = "p3dembed", platform = platform):
-            if not package.downloadDescFile(self.http):
-                Standalone.notify.error("  -> %s failed for platform %s" % (package.packageName, package.platform))
-                continue
-            if not package.downloadPackage(self.http):
-                Standalone.notify.error("  -> %s failed for platform %s" % (package.packageName, package.platform))
-                continue
-            
-            directory = Filename(self.host.hostDir, "p3dembed/%s/p3dembed.exe" % package.platform)
-            directory.makeAbsolute()
-            filelist = []
-            for f in glob.glob(os.path.join(directory.toOsSpecific(), "*")):
-                if not f.endswith("p3dembed") and not f.endswith("p3dembed.exe"):
-                    filelist.append(Filename.fromOsSpecific(f))
-            return filelist
-        return []
+        package = self.host.getPackages(name = "p3dembed", platform = platform)[0]
+        
+        if not package.downloadDescFile(self.http):
+            Standalone.notify.warning("  -> %s failed for platform %s" % (package.packageName, package.platform))
+            return []
+        if not package.downloadPackage(self.http):
+            Standalone.notify.warning("  -> %s failed for platform %s" % (package.packageName, package.platform))
+            return []
+        
+        filenames = []
+        for e in package.extracts:
+            if e.basename not in ["p3dembed", "p3dembed.exe"]:
+                filename = Filename(package.getPackageDir(), e.filename)
+                filename.makeAbsolute()
+                if filename.exists():
+                    filenames.append(filename)
+                else:
+                    Standalone.notify.error("%s mentioned in xml, but does not exist" % e.filename)
+        
+        return filenames
 
 
 class Installer:
 class Installer:
     """ This class creates a (graphical) installer from a given .p3d file. """
     """ This class creates a (graphical) installer from a given .p3d file. """
@@ -169,7 +171,7 @@ class Installer:
         for package in self.standalone.host.getPackages(name = "p3dembed"):
         for package in self.standalone.host.getPackages(name = "p3dembed"):
             platforms.add(package.platform)
             platforms.add(package.platform)
         if len(platforms) == 0:
         if len(platforms) == 0:
-            Installer.notify.error("No platforms found to build for!")
+            Installer.notify.warning("No platforms found to build for!")
         
         
         outputDir = Filename(outputDir + "/")
         outputDir = Filename(outputDir + "/")
         outputDir.makeDir()
         outputDir.makeDir()
@@ -335,7 +337,7 @@ class Installer:
                     makensis = os.path.join(p, "makensis")
                     makensis = os.path.join(p, "makensis")
         
         
         if makensis == None:
         if makensis == None:
-            Installer.notify.error("Makensis utility not found, no Windows installer will be built!")
+            Installer.notify.warning("Makensis utility not found, no Windows installer will be built!")
             return
             return
         
         
         output = Filename(output)
         output = Filename(output)
@@ -343,6 +345,7 @@ class Installer:
             output = Filename(output, "%s %s.exe" % (self.fullname, self.version))
             output = Filename(output, "%s %s.exe" % (self.fullname, self.version))
         Installer.notify.info("Creating %s..." % output)
         Installer.notify.info("Creating %s..." % output)
         output.makeAbsolute()
         output.makeAbsolute()
+        extrafiles = self.standalone.getExtraFiles(platform)
 
 
         exefile = Filename(Filename.getTempDirectory(), self.shortname + ".exe")
         exefile = Filename(Filename.getTempDirectory(), self.shortname + ".exe")
         exefile.unlink()
         exefile.unlink()
@@ -393,7 +396,7 @@ class Installer:
         nsi.write('Section "" SecCore\n')
         nsi.write('Section "" SecCore\n')
         nsi.write('  SetOutPath "$INSTDIR"\n')
         nsi.write('  SetOutPath "$INSTDIR"\n')
         nsi.write('  File "%s"\n' % exefile.toOsSpecific())
         nsi.write('  File "%s"\n' % exefile.toOsSpecific())
-        for f in self.standalone.getExtraFiles(platform):
+        for f in extrafiles:
             nsi.write('  File "%s"\n' % f.toOsSpecific())
             nsi.write('  File "%s"\n' % f.toOsSpecific())
         nsi.write('  WriteUninstaller "$INSTDIR\Uninstall.exe"\n')
         nsi.write('  WriteUninstaller "$INSTDIR\Uninstall.exe"\n')
         nsi.write('  ; Start menu items\n')
         nsi.write('  ; Start menu items\n')
@@ -406,7 +409,7 @@ class Installer:
         # This section defines the uninstaller.
         # This section defines the uninstaller.
         nsi.write('Section Uninstall\n')
         nsi.write('Section Uninstall\n')
         nsi.write('  Delete "$INSTDIR\%s.exe"\n' % self.shortname)
         nsi.write('  Delete "$INSTDIR\%s.exe"\n' % self.shortname)
-        for f in self.standalone.getExtraFiles(platform):
+        for f in extrafiles:
             nsi.write('  Delete "%s"\n' % f.getBasename())
             nsi.write('  Delete "%s"\n' % f.getBasename())
         nsi.write('  Delete "$INSTDIR\Uninstall.exe"\n')
         nsi.write('  Delete "$INSTDIR\Uninstall.exe"\n')
         nsi.write('  RMDir "$INSTDIR"\n')
         nsi.write('  RMDir "$INSTDIR"\n')