mirror of
https://github.com/panda3d/panda3d.git
synced 2025-09-30 16:58:40 -04:00
Add useful pdeploy script that can easily deploy any app to cdrom, web, or create installers for all platforms
This commit is contained in:
parent
154812d25a
commit
4a39c66fff
@ -19,10 +19,11 @@ class InstallerMaker:
|
||||
self.shortname = shortname
|
||||
self.fullname = fullname
|
||||
self.version = str(version)
|
||||
# All paths given must be OS-specific!
|
||||
self.p3dfile = p3dfile
|
||||
self.licensename = ""
|
||||
self.licensefile = ""
|
||||
# All paths given must be a Filename instance!
|
||||
assert isinstance(p3dfile, Filename)
|
||||
self.p3dfile = p3dfile
|
||||
self.licensefile = Filename()
|
||||
|
||||
def build(self):
|
||||
""" Creates the installer. Call this after you have set all the parameters. """
|
||||
@ -48,15 +49,16 @@ class InstallerMaker:
|
||||
controlfile.close()
|
||||
os.makedirs(os.path.join(tempdir, "usr", "bin"))
|
||||
os.makedirs(os.path.join(tempdir, "usr", "share", "games", self.shortname))
|
||||
if self.licensefile != "":
|
||||
if not self.licensefile.empty():
|
||||
os.makedirs(os.path.join(tempdir, "usr", "share", "doc", self.shortname))
|
||||
launcherfile = open(os.path.join(tempdir, "usr", "bin", self.shortname), "w")
|
||||
launcherfile.write("#!/bin/sh\n")
|
||||
launcherfile.write("/usr/bin/panda3d /usr/share/games/%s/data.p3d\n" % self.shortname)
|
||||
launcherfile.write("/usr/bin/env panda3d /usr/share/games/%s/data.p3d\n" % self.shortname)
|
||||
launcherfile.close()
|
||||
shutil.copyfile(self.p3dfile, os.path.join(tempdir, "usr", "share", "games", self.shortname, "data.p3d"))
|
||||
if self.licensefile != "":
|
||||
shutil.copyfile(self.licensefile, os.path.join(tempdir, "usr", "share", "doc", self.shortname, "copyright"))
|
||||
os.chmod(os.path.join(tempdir, "usr", "bin", self.shortname), 0755)
|
||||
shutil.copyfile(self.p3dfile.toOsSpecific(), os.path.join(tempdir, "usr", "share", "games", self.shortname, "data.p3d"))
|
||||
if not self.licensefile.empty():
|
||||
shutil.copyfile(self.licensefile.toOsSpecific(), os.path.join(tempdir, "usr", "share", "doc", self.shortname, "copyright"))
|
||||
|
||||
# Create a control.tar.gz file in memory
|
||||
controltargz = CachedFile()
|
||||
@ -139,8 +141,8 @@ class InstallerMaker:
|
||||
nsi.write('\n')
|
||||
nsi.write('Var StartMenuFolder\n')
|
||||
nsi.write('!insertmacro MUI_PAGE_WELCOME\n')
|
||||
if self.licensefile != "":
|
||||
nsi.write('!insertmacro MUI_PAGE_LICENSE "%s"\n' % self.licensefile)
|
||||
if not self.licensefile.empty():
|
||||
nsi.write('!insertmacro MUI_PAGE_LICENSE "%s"\n' % self.licensefile.toOsSpecific())
|
||||
nsi.write('!insertmacro MUI_PAGE_DIRECTORY\n')
|
||||
nsi.write('!insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder\n')
|
||||
nsi.write('!insertmacro MUI_PAGE_INSTFILES\n')
|
||||
|
138
direct/src/p3d/pdeploy.py
Normal file
138
direct/src/p3d/pdeploy.py
Normal file
@ -0,0 +1,138 @@
|
||||
#! /usr/bin/env python
|
||||
|
||||
"""
|
||||
|
||||
This command will help you to distribute your Panda game, consisting
|
||||
of a .p3d file, into an installable package or an HTML webpage.
|
||||
|
||||
Usage:
|
||||
|
||||
%s [opts] app.p3d installer|web
|
||||
|
||||
Modes:
|
||||
|
||||
installer
|
||||
In this mode, installable packages will be created for as many
|
||||
platforms as possible. To create Windows installers on
|
||||
non-Windows platforms, you need to have the "makensis" utility
|
||||
on your system PATH environment variable.
|
||||
|
||||
web
|
||||
An HTML webpage will be generated that can be used to view
|
||||
the provided p3d file in a browser.
|
||||
|
||||
Options:
|
||||
|
||||
-v version_number
|
||||
This should define the version number of your application
|
||||
or game. In some deploy modes, this argument is required.
|
||||
This should only contain alphanumeric characters, dots and
|
||||
dashes, as the result of the deployment may be in valid
|
||||
on some platforms otherwise.
|
||||
|
||||
-n your_app
|
||||
Short, lowercase name of the application or game. Can only
|
||||
contain alphanumeric characters, underscore or dash. This
|
||||
name will also define the output file(s) of the process.
|
||||
If omitted, the basename of the p3d file is used.
|
||||
|
||||
-N "Your Application"
|
||||
Full name of the application or game. This one will be used
|
||||
to display to the end-user.
|
||||
If omitted, the short name is used.
|
||||
|
||||
-l "License Name"
|
||||
Specifies the name of the software license that the game
|
||||
or application is licensed under.
|
||||
|
||||
-L licensefile.txt
|
||||
This should point to a file that contains the full text
|
||||
describing the software license that the game or application
|
||||
is licensed under.
|
||||
|
||||
"""
|
||||
|
||||
DEPLOY_MODES = ["installer", "web"]
|
||||
|
||||
import sys
|
||||
import os
|
||||
import getopt
|
||||
from direct.p3d import InstallerMaker
|
||||
from pandac.PandaModules import Filename
|
||||
|
||||
class ArgumentError(StandardError):
|
||||
pass
|
||||
|
||||
def deployApp(args):
|
||||
opts, args = getopt.getopt(args, 'l:L:n:N:v:h')
|
||||
|
||||
version = ""
|
||||
shortname = ""
|
||||
fullname = ""
|
||||
licensename = ""
|
||||
licensefile = Filename()
|
||||
|
||||
for option, value in opts:
|
||||
if option == '-v':
|
||||
version = value.strip()
|
||||
if option == '-n':
|
||||
shortname = value.strip()
|
||||
elif option == '-L':
|
||||
fullname = value.strip()
|
||||
if option == '-l':
|
||||
licensename = value
|
||||
elif option == '-L':
|
||||
licensefile = Filename.fromOsSpecific(value)
|
||||
elif option == '-h':
|
||||
print __doc__ % (os.path.split(sys.argv[0])[1])
|
||||
sys.exit(1)
|
||||
|
||||
if not args or len(args) < 2:
|
||||
raise ArgumentError, "No target app and/or deploy type specified. Use:\n%s app.p3d %s" % (os.path.split(sys.argv[0])[1], '|'.join(DEPLOY_MODES))
|
||||
|
||||
if len(args) > 2:
|
||||
raise ArgumentError, "Too many arguments."
|
||||
|
||||
appFilename = Filename.fromOsSpecific(args[0])
|
||||
if appFilename.getExtension().lower() != 'p3d':
|
||||
raise ArgumentError, 'Application filename must end in ".p3d".'
|
||||
|
||||
deploy_mode = args[1].lower()
|
||||
if deploy_mode not in DEPLOY_MODES:
|
||||
raise ArgumentError, 'Invalid deploy type, must be one of "%s".' % '", "'.join(DEPLOY_MODES)
|
||||
|
||||
if shortname.lower() != shortname or ' ' in shortname:
|
||||
raise ArgumentError, 'Provided short name should be lowercase, and may not contain spaces!'
|
||||
|
||||
if shortname == '':
|
||||
shortname = appFilename.getBasenameWoExtension()
|
||||
|
||||
if fullname == '':
|
||||
fullname = shortname
|
||||
|
||||
if version == '' and deploy_mode == 'installer':
|
||||
raise ArgumentError, 'A version number is required in "installer" mode!'
|
||||
|
||||
try:
|
||||
if deploy_mode == 'installer':
|
||||
im = InstallerMaker.InstallerMaker(shortname, fullname, appFilename, version)
|
||||
im.licensename = licensename
|
||||
im.licensefile = licensefile
|
||||
im.build()
|
||||
elif deploy_mode == 'web':
|
||||
raise NotImplementedError, 'The "web" mode is yet implemented.'
|
||||
|
||||
except: raise
|
||||
#except InstallerMaker.InstallerMakerError:
|
||||
# # Just print the error message and exit gracefully.
|
||||
# inst = sys.exc_info()[1]
|
||||
# print inst.args[0]
|
||||
# sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
deployApp(sys.argv[1:])
|
||||
except ArgumentError, e:
|
||||
print e.args[0]
|
||||
sys.exit(1)
|
||||
|
Loading…
x
Reference in New Issue
Block a user