open_toontown_panda3d/direct/src/p3d/ppackage.py

215 lines
7.5 KiB
Python
Executable File

#! /usr/bin/env python
usageText = """
This script can be used to produce a Panda3D downloadable "package",
which may contain arbitrary files--for instance, Python code, bam
files, and/or compiled DLL's--and which may be downloaded by
application code to extend an application at runtime.
In addition to packages, this script can also be used to build
standalone p3d applications, that is, packaged Python code in a p3d
file, for execution by the Panda3D plugin or runtime. (But also see
packp3d, which is designed to be a simpler interface for building
applications.)
This script is actually a wrapper around Panda's Packager.py, which
can be invoked directly by Python code that requires a programmatic
interface to building packages.
Usage:
%(prog)s [opts] package.pdef [packageName1 .. packageNameN]
Parameters:
package.pdef
The config file that describes the contents of the package file(s)
to be built, in excruciating detail. See the Panda3D manual for
the syntax of this file.
packageName1 .. packageNameN
Specify the names of the package(s) you wish to build out of the
package.pdef file. This allows you to build only a subset of the
packages defined in this file. If you omit these parameters, all
packages are built.
Options:
-i install_dir
The full path to a local directory to copy the
ready-to-be-published files into. This directory structure may
contain multiple different packages from multiple different
invocations of this script. It is the user's responsibility to
copy this directory structure to a server, which will have the
URL specified by the packager.setHost() call appearing within the
pdef file.
-p
Automatically build patches against previous versions after
generating the results. Patches are difference files that users
can download when updating a package, in lieu of redownloading
the whole package; this happens automatically if patches are
present. You should generally build patches when you are
committing to a final, public-facing release. Patches are
usually a good idea, but generating a patch for each internal
test build may needlessly generate a lot of small, inefficient
patch files instead of a few larger ones. You can also generate
patches after the fact, by running ppatcher on the install
directory.
-s search_dir
Additional directories to search for previously-built packages.
This option may be repeated as necessary. These directories may
also be specified with the pdef-path Config.prc variable.
-S file.crt[,chain.crt[,file.key[,\"password\"]]]
Signs any resulting p3d file(s) with the indicated certificate.
You may specify the signing certificate, the optional
authorization chain, and the private key in three different
files, or they may all be combined in the first file. If the
private key is encrypted, the password will be required to
decrypt it.
-D
Sets the allow_python_dev flag in any applications built with
this command. This enables additional runtime debug operations,
particularly the -i option to the panda3d command, which enables
a live Python prompt within the application's environment.
Setting this flag may be useful to develop an application
initially, but should not be set on an application intended for
deployment.
-u
On the Mac OSX platform, this means that Panda was built with
universal binaries, and the package should be built that way as
well (that is, a version of the the package should be created for
each supported architecture). On other platforms, this option
does nothing. This is therefore safe to apply in all cases, if
you wish to take advantage of universal binaries. This is
equivalent to "-P osx_ppc -P osx_i386" on Mac platforms.
-P platform
Specify the platform to masquerade as. The default is whatever
platform Panda has been built for. You can use this on Mac OSX
in order to build packages for an alternate architecture if you
have built Panda with universal binaries; you may repeat this
option for each architecture you wish to support. For other
platforms, it is probably a mistake to set this. However, see
the option -u.
-R sysroot
Specify the sysroot that these files were compiled against. This
will shadow the system shared libraries, so that alternate
versions are used instead of the system versions. If any program
references a library, say /usr/lib/libfoo.so, and
/sysroot/usr/lib/libfoo.so exists instead, that file will be used
instead of the system library. This is particularly useful for
cross-compilation. At the moment, this is supported only on OSX.
-h
Display this help
"""
import sys
import getopt
import os
from direct.p3d import Packager
from pandac.PandaModules import *
def usage(code, msg = ''):
print >> sys.stderr, usageText % {'prog' : os.path.split(sys.argv[0])[1]}
print >> sys.stderr, msg
sys.exit(code)
installDir = None
buildPatches = False
installSearch = []
signParams = []
allowPythonDev = False
universalBinaries = False
systemRoot = None
platforms = []
try:
opts, args = getopt.getopt(sys.argv[1:], 'i:ps:S:DuP:R:h')
except getopt.error, msg:
usage(1, msg)
for opt, arg in opts:
if opt == '-i':
installDir = Filename.fromOsSpecific(arg)
elif opt == '-p':
buildPatches = True
elif opt == '-s':
installSearch.appendDirectory(Filename.fromOsSpecific(arg))
elif opt == '-S':
tokens = arg.split(',')
while len(tokens) < 4:
tokens.append('')
certificate, chain, pkey, password = tokens[:4]
signParams.append((certificate, chain, pkey, password))
elif opt == '-D':
allowPythonDev = True
elif opt == '-u':
universalBinaries = True
elif opt == '-P':
platforms.append(arg)
elif opt == '-R':
systemRoot = arg
elif opt == '-h':
usage(0)
else:
print 'illegal option: ' + arg
sys.exit(1)
if not args:
usage(0)
packageDef = Filename.fromOsSpecific(args[0])
packageNames = None
if len(args) > 1:
packageNames = args[1:]
if not installDir:
print '\nYou must name the target install directory with the -i parameter.\n'
sys.exit(1)
if universalBinaries:
if platforms:
print '\nYou may not specify both -u and -P.\n'
sys.exit(1)
if PandaSystem.getPlatform().startswith('osx_'):
# Maybe soon we'll add osx_x86_64 to this default list.
platforms = ['osx_i386', 'osx_ppc']
if not platforms:
platforms = [PandaSystem.getPlatform()]
for platform in platforms:
packager = Packager.Packager(platform = platform)
packager.installDir = installDir
packager.installSearch = [installDir] + installSearch + packager.installSearch
packager.signParams = signParams
packager.allowPythonDev = allowPythonDev
packager.systemRoot = systemRoot
try:
packager.setup()
packages = packager.readPackageDef(packageDef, packageNames = packageNames)
packager.close()
if buildPatches:
packager.buildPatches(packages)
except Packager.PackagerError:
# Just print the error message and exit gracefully.
inst = sys.exc_info()[1]
print inst.args[0]
#raise
sys.exit(1)
# An explicit call to exit() is required to exit the program, when
# this module is packaged in a p3d file.
sys.exit(0)