minor friendliness

This commit is contained in:
David Rose 2009-08-23 23:21:48 +00:00
parent 3f5fd50c16
commit f94479e13b
3 changed files with 122 additions and 94 deletions

View File

@ -1792,9 +1792,9 @@ class Packager:
for keyword, value in kw.items():
self.currentPackage.configs[keyword] = value
def do_require(self, packageName, version = None, host = None):
""" Indicates a dependency on the named package, supplied as
a name.
def do_require(self, *args, **kw):
""" Indicates a dependency on the named package(s), supplied
as a name.
Attempts to install this package will implicitly install the
named package also. Files already included in the named
@ -1803,16 +1803,29 @@ class Packager:
if not self.currentPackage:
raise OutsideOfPackageError
version = kw.get('version', None)
host = kw.get('host', None)
for key in ['version', 'host']:
if key in kw:
del kw['version']
if kw:
message = "do_require() got an unexpected keyword argument '%s'" % (kw.keys()[0])
raise TypeError, message
for packageName in args:
# A special case when requiring the "panda3d" package. We
# supply the version number what we've been compiled with as a
# default.
pversion = version
phost = host
if packageName == 'panda3d':
if version is None:
version = PandaSystem.getPackageVersionString()
if host is None:
host = PandaSystem.getPackageHostUrl()
if pversion is None:
pversion = PandaSystem.getPackageVersionString()
if phost is None:
phost = PandaSystem.getPackageHostUrl()
package = self.findPackage(packageName, version = version, host = host,
package = self.findPackage(packageName, version = pversion, host = phost,
requires = self.currentPackage.requires)
if not package:
message = 'Unknown package %s, version "%s"' % (packageName, version)
@ -1842,21 +1855,32 @@ class Packager:
self.currentPackage.requirePackage(package)
def do_module(self, moduleName, newName = None):
""" Adds the indicated Python module to the current package. """
def do_module(self, *args):
""" Adds the indicated Python module(s) to the current package. """
if not self.currentPackage:
raise OutsideOfPackageError
for moduleName in args:
self.currentPackage.freezer.addModule(moduleName)
def do_renameModule(self, moduleName, newName):
""" Adds the indicated Python module to the current package,
renaming to a new name. """
if not self.currentPackage:
raise OutsideOfPackageError
self.currentPackage.freezer.addModule(moduleName, newName = newName)
def do_excludeModule(self, moduleName, forbid = False):
def do_excludeModule(self, *args):
""" Marks the indicated Python module as not to be included. """
if not self.currentPackage:
raise OutsideOfPackageError
self.currentPackage.freezer.excludeModule(moduleName, forbid = forbid)
for moduleName in args:
self.currentPackage.freezer.excludeModule(moduleName)
def do_mainModule(self, moduleName, newName = None, filename = None):
""" Names the indicated module as the "main" module of the
@ -1934,16 +1958,24 @@ class Packager:
freezer.reset()
package.mainModule = None
def do_file(self, filename, text = None, newNameOrDir = None,
def do_file(self, *args, **kw):
""" Adds the indicated file or files to the current package.
See addFiles(). """
self.addFiles(args, **kw)
def addFiles(self, filenames, text = None, newNameOrDir = None,
extract = None, executable = None, deleteTemp = False,
literal = False):
""" Adds the indicated arbitrary file to the current package.
The file is placed in the named directory, or the toplevel
""" Adds the indicated arbitrary files to the current package.
filenames is a list of Filename or string objects, and each
may include shell globbing characters.
Each file is placed in the named directory, or the toplevel
directory if no directory is specified.
The filename may include shell globbing characters.
Certain special behavior is invoked based on the filename
extension. For instance, .py files may be automatically
compiled and stored as Python modules.
@ -1981,10 +2013,14 @@ class Packager:
if not self.currentPackage:
raise OutsideOfPackageError
files = []
explicit = True
for filename in filenames:
filename = Filename(filename)
if literal:
files = [filename.toOsSpecific()]
thisFiles = [filename.toOsSpecific()]
else:
ext = filename.getExtension()
@ -1998,11 +2034,13 @@ class Packager:
if newExt is not None:
filename.setExtension(newExt)
files = glob.glob(filename.toOsSpecific())
if not files:
files = [filename.toOsSpecific()]
thisFiles = glob.glob(filename.toOsSpecific())
if not thisFiles:
thisFiles = [filename.toOsSpecific()]
explicit = (len(files) == 1)
if len(thisFiles) > 1:
explicit = False
files += thisFiles
newName = None
prefix = ''
@ -2017,8 +2055,11 @@ class Packager:
raise PackagerError, message
if text:
if len(files) != 1:
message = 'Cannot install text to multiple files'
raise PackagerError, message
if not newName:
newName = filename.cStr()
newName = str(filenames[0])
tempFile = Filename.temporary('', self.currentPackage.packageName)
temp = open(tempFile.toOsSpecific(), 'w')

View File

@ -14,7 +14,6 @@
class panda3d(package):
# The core Panda3D package. Contains Python and most of the graphics
# code in Panda3D.
@ -26,26 +25,26 @@ class panda3d(package):
# These are additional Python modules that are needed by most Panda3D
# applications. It doesn't matter too much if we miss one or two
# here, since any module('imported by any of this code will')
# here, since any module imported by any of this code will
# automatically be included as well, and we end up with a pretty
# complete list that way.
module('direct.directbase.DirectStart')
module('direct.showbase.*')
module('direct.actor.Actor')
module('direct.fsm.FSM')
module('direct.interval.IntervalGlobal')
module('direct.particles.ParticleEffect')
module('direct.directutil.Mopath')
module('direct.directbase.DirectStart',
'direct.showbase.*',
'direct.actor.Actor',
'direct.fsm.FSM',
'direct.interval.IntervalGlobal',
'direct.particles.ParticleEffect',
'direct.directutil.Mopath')
# Exclude these GUI toolkits; they're big, and many applications don't
# use them. We define them as separate, optional packages, below.
excludeModule('wx')
excludeModule('direct.showbase.WxGlobal')
excludeModule('wx',
'direct.showbase.WxGlobal')
excludeModule('Tkinter')
excludeModule('direct.showbase.TkGlobal')
excludeModule('direct.tkpanels')
excludeModule('direct.tkwidgets')
excludeModule('Tkinter',
'direct.showbase.TkGlobal',
'direct.tkpanels',
'direct.tkwidgets')
# Bind all of the above Python code into a frozen DLL. This makes the
# Python code available when the DLL is imported. It is actually
@ -69,11 +68,9 @@ class panda3d(package):
# that are also needed, but aren't referenced by any code. Again,
# note that the .dll extension is automatically replaced with the
# platform-specific extension for an executable.
file('libpandagl.dll')
file('libpandagl.dll', 'libtinydisplay.dll')
if platform.startswith('win'):
file('libpandadx8.dll')
file('libpandadx9.dll')
file('libtinydisplay.dll')
file('libpandadx8.dll', 'libpandadx9.dll')
# A basic config file is needed to lay some some fundamental runtime
# variables.
@ -97,7 +94,6 @@ default-model-extension .bam
class egg(package):
# This package contains the code for reading and operating on egg
# files. Since the Packager automatically converts egg files to bam
# files, this is not needed for most Panda3D applications.
@ -116,47 +112,41 @@ class wx(package):
config(display_name = "wxPython GUI Toolkit")
require('panda3d')
module('direct.showbase.WxGlobal')
module('wx')
module('wx.*')
module('direct.showbase.WxGlobal', 'wx', 'wx.*')
class tk(package):
config(display_name = "Tk GUI Toolkit")
require('panda3d')
module('Tkinter')
module('direct.showbase.TkGlobal')
module('direct.tkpanels')
module('direct.tkwidgets')
module('Tkinter',
'direct.showbase.TkGlobal',
'direct.tkpanels',
'direct.tkwidgets')
class packp3d(p3d):
# This application is a command-line convenience for building a p3d
# application out of a directory hierarchy on disk. We build it here
# into its own p3d application, to allow end-users to easily build p3d
# applications using the appropriate version of Python and Panda for
# the targeted runtime.
config(display_name = "Panda3D Application Packer")
config(full_disk_access = True)
config(hidden = True)
require('panda3d')
require('egg')
config(display_name = "Panda3D Application Packer",
full_disk_access = True,
hidden = True)
require('panda3d', 'egg')
mainModule('direct.p3d.packp3d')
class ppackage(p3d):
# As above, a packaging utility. This is the fully-general ppackage
# utility, which reads pdef files (like this one!) and creates one or
# more packages or p3d applications.
config(display_name = "Panda3D General Package Utility")
config(full_disk_access = True)
config(hidden = True)
require('panda3d')
require('egg')
config(display_name = "Panda3D General Package Utility",
full_disk_access = True,
hidden = True)
require('panda3d', 'egg')
mainModule('direct.p3d.ppackage')

View File

@ -34,6 +34,9 @@ startupModules = [
'org',
]
# These are missing modules that we've reported already this session.
reportedMissing = {}
# Our own Python source trees to watch out for.
sourceTrees = ['direct']
@ -791,19 +794,13 @@ class Freezer:
continue
prefix = origName.split('.')[0]
if prefix not in sourceTrees:
# If it's in not one of our standard source trees, assume
# it's some wacky system file we don't need.
print "ignoring missing %s" % (origName)
continue
if origName not in reportedMissing:
missing.append(origName)
reportedMissing[origName] = True
if missing:
error = "There are some missing modules: %r" % missing
print error
print "previous = %s" % (self.previousModules,)
raise StandardError, error
missing.sort()
print "There are some missing modules: %r" % missing
def __loadModule(self, mdef):
""" Adds the indicated module to the modulefinder. """