Updated Installer builder scripts and such for OS X

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@25219 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
2004-01-17 23:20:49 +00:00
parent 9ee7c8d670
commit 46456f618c
13 changed files with 899 additions and 1056 deletions

View File

@@ -1 +0,0 @@
.DS_Store

View File

@@ -1,3 +0,0 @@
This is a set of build scripts and such for MacPython-OSX 2.3 that I
will use until there are standard distributions from Jack.

View File

@@ -1,129 +0,0 @@
#!/bin/sh -e
#----------------------------------------------------------------------
# Build MacPython 2.3 and make an Installer package of it
# TODO: Parameterize the versions, builddirs, etc...
# Script configs
PYVERSION=2.3a2
PYVER=2.3
BUILDNUM=3
DOCLEANUP=no
PROGDIR="`dirname \"$0\"`"
TMPDIR=/tmp/_py
#TMPDIR=/projects/_py
BUILDROOT=$TMPDIR/build
INSTALLROOT=$TMPDIR/install
DMGDIR=$TMPDIR/dmg
RESOURCEDIR=$PROGDIR/resources
DESTDIR=/projects/wx/wxPython/dist
PYTHONSRC=/projects/Python-$PYVERSION
WASTEDIR=/projects/waste
# Setup
mkdir -p $BUILDROOT
mkdir -p $INSTALLROOT
rm -rf $DMGDIR
mkdir -p $DMGDIR/root
# Configure and build Python
pushd $BUILDROOT
# Check if we should build and install the docs, but only if it
# doesn't appear to be done already. TODO: fix this path to be version independent
if [ ! -e "build/temp.darwin-6.3-Power Macintosh-2.3/build-html/build-html idx" ]; then
read -p "Build the Python docs? (y/N)? " builddocs
fi
# If the filesystem is case-sensitive then "python" will be built, but
# some parts of the install expect "python.exe which is what is built
# on a case-insensitive filesystem. Make a link just in case it is
# needed.
if [ ! -e python.exe ]; then
ln -s python python.exe
fi
# Make a link to the waste dir so that lib can be found. This allows
# the PythonIDE to be built
if [ ! -e waste ]; then
ln -s $WASTEDIR waste
fi
$PYTHONSRC/configure --enable-framework=$INSTALLROOT/Library/Frameworks LDFLAGS=-Wl,-x
make
make frameworkinstall
if [ "$builddocs" = "y" -o "$builddocs" = "Y" ]; then
./python.exe $PYTHONSRC/Mac/OSX/setupDocs.py build
echo ""
read -p "When the help indexer is done press Enter..." ans
./python.exe $PYTHONSRC/Mac/OSX/setupDocs.py install \
--prefix=$INSTALLROOT/Library/Frameworks/Python.framework/Versions/$PYVER
fi
popd
# Make the Installer package:
# First, remove the unix tools as their paths will be wrong. We'll recreate
# them in the postinstall.
rm -r $INSTALLROOT/usr
# Next, remove the .pyc/.pyo files
python $PROGDIR/../zappycfiles.py $INSTALLROOT/Library/Frameworks/Python.framework/Versions/$PYVER/lib/python$PYVER
# Make the welcome message
cat > $RESOURCEDIR/Welcome.txt <<EOF
Welcome!
This program will install Python $PYVERSION for Mac OS X as a Framework.
Build number: $BUILDNUM
Build date: `date`
EOF
# fix a bug in the IDLE install
IDLERES=$INSTALLROOT/Applications/MacPython-2.3/IDLE.app/Contents/Resources
mv $IDLERES/idlelib/idle $IDLERES
# Finally, build the package...
rm -rf MacPython-OSX.pkg
python $PROGDIR/../buildpkg.py \
--Title=MacPython-OSX \
--Version=$PYVERSION-$BUILDNUM \
--Description="Python $PYVERSION for Mac OS X, framework based" \
--NeedsAuthorization="YES" \
--Relocatable="NO" \
--InstallOnly="YES" \
$INSTALLROOT \
$RESOURCEDIR
## --RootVolumeOnly="YES" \
# ...and then make a disk image containing the package.
mv MacPython-OSX.pkg $DMGDIR/root
$PROGDIR/../makedmg $DMGDIR/root $DMGDIR MacPython-OSX-$PYVERSION-$BUILDNUM
echo Moving $DMGDIR/MacPython-OSX-$PYVERSION-$BUILDNUM to $DESTDIR
mv $DMGDIR/MacPython-OSX-$PYVERSION-$BUILDNUM.dmg $DESTDIR
# Cleanup build/install dirs
if [ $DOCLEANUP = yes ]; then
echo "Cleaning up..."
rm -rf $BUILDROOT
rm -rf $INSTALLROOT
rm -rf $DMGDIR
else
echo "Cleanup is disabled. You should remove these dirs when done:"
echo " $BUILDROOT"
echo " $INSTALLROOT"
echo " $DMGDIR"
fi

View File

@@ -1,6 +0,0 @@
Welcome!
This program will install Python 2.3a2 for Mac OS X as a Framework.
Build number: 3
Build date: Thu Mar 20 18:54:52 PST 2003

View File

@@ -1,67 +0,0 @@
#!/bin/sh
#----------------------------------------------------------------------
# Create the unix tools and compile the .py files after Python has been
# installed.
#----------------------------------------------------------------------
PYVER=2.3
PKG=$1
DEST=$2
# if destination is / then use usr/local/bin, otherwise just bin
if [ "$DEST" = "/" ]; then
TOOLDIR=/usr/local/bin
DEST=
else
TOOLDIR=$DEST/bin
fi
# Make sure the dir exists
mkdir -p $TOOLDIR
# Make some links to the python executable
if [ -e $TOOLDIR/python$PYVER ]; then
rm $TOOLDIR/python$PYVER
fi
ln -fs $DEST/Library/Frameworks/Python.framework/Versions/$PYVER/bin/python $TOOLDIR/python$PYVER
if [ -e $TOOLDIR/python ]; then
rm $TOOLDIR/python
fi
ln -fs python$PYVER $TOOLDIR/python
# make the pythonw script
cat > $TOOLDIR/pythonw <<EOF
#!/bin/sh
exec "$DEST/Library/Frameworks/Python.framework/Versions/$PYVER/Resources/Python.app/Contents/MacOS/python" "\$@"
EOF
chmod +x $TOOLDIR/pythonw
# Compile the .py files in the Python library to .pyc's and then .pyo's
$TOOLDIR/python -Wi -tt \
$DEST/Library/Frameworks/Python.framework/Versions/$PYVER/lib/python$PYVER/compileall.py \
-x badsyntax -x site-packages $DEST/Library/Frameworks/Python.framework/Versions/$PYVER/lib/python$PYVER
$TOOLDIR/python -Wi -tt -O \
$DEST/Library/Frameworks/Python.framework/Versions/$PYVER/lib/python$PYVER/compileall.py \
-x badsyntax -x site-packages $DEST/Library/Frameworks/Python.framework/Versions/$PYVER/lib/python$PYVER
# Make the site-packages and other dirs writable by the admin.
for d in $DEST/Library/Frameworks/Python.framework/Versions/$PYVER/lib/python$PYVER/site-packages \
$DEST/Library/Frameworks/Python.framework/Versions/$PYVER/bin \
$DEST/Applications/MacPython-$PYVER; do
chgrp -R admin $d
chmod -R g+w $d
done
# The link in the app bundles needs updated.
for app in BuildApplet IDLE PackageManager PythonIDE; do
ln -s $DEST/Library/Frameworks/Python.framework/Versions/$PYVER/Resources/Python.app/Contents/MacOS/python \
$DEST/Applications/MacPython-$PYVER/$app.app/Contents/MacOS
done

View File

@@ -60,7 +60,6 @@ Title
Version Version
Description Description
DefaultLocation DefaultLocation
Diskname
DeleteWarning DeleteWarning
NeedsAuthorization NeedsAuthorization
DisableStop DisableStop
@@ -71,6 +70,10 @@ Required
InstallOnly InstallOnly
RequiresReboot RequiresReboot
RootVolumeOnly RootVolumeOnly
LongFilenames
LibrarySubdirectory
AllowBackRev
OverwritePermissions
InstallFat\ InstallFat\
""" """
@@ -138,7 +141,6 @@ class PackageMaker:
'Version': None, 'Version': None,
'Description': '', 'Description': '',
'DefaultLocation': '/', 'DefaultLocation': '/',
'Diskname': '(null)',
'DeleteWarning': '', 'DeleteWarning': '',
'NeedsAuthorization': 'NO', 'NeedsAuthorization': 'NO',
'DisableStop': 'NO', 'DisableStop': 'NO',
@@ -149,7 +151,12 @@ class PackageMaker:
'InstallOnly': 'NO', 'InstallOnly': 'NO',
'RequiresReboot': 'NO', 'RequiresReboot': 'NO',
'RootVolumeOnly' : 'NO', 'RootVolumeOnly' : 'NO',
'InstallFat': 'NO'} 'InstallFat': 'NO',
'LongFilenames': 'YES',
'LibrarySubdirectory': 'Standard',
'AllowBackRev': 'YES',
'OverwritePermissions': 'NO',
}
def __init__(self, title, version, desc): def __init__(self, title, version, desc):
@@ -201,6 +208,7 @@ class PackageMaker:
self._addArchive() self._addArchive()
self._addResources() self._addResources()
self._addSizes() self._addSizes()
self._addLoc()
def _makeFolders(self): def _makeFolders(self):
@@ -223,6 +231,7 @@ class PackageMaker:
info = "" info = ""
for f in string.split(PKG_INFO_FIELDS, "\n"): for f in string.split(PKG_INFO_FIELDS, "\n"):
if self.packageInfo.has_key(f):
info = info + "%s %%(%s)s\n" % (f, f) info = info + "%s %%(%s)s\n" % (f, f)
info = info % self.packageInfo info = info % self.packageInfo
base = self.packageInfo["Title"] + ".info" base = self.packageInfo["Title"] + ".info"
@@ -351,6 +360,11 @@ class PackageMaker:
format = "NumFiles %d\nInstalledSize %d\nCompressedSize %d\n" format = "NumFiles %d\nInstalledSize %d\nCompressedSize %d\n"
f.write(format % (numFiles, installedSize, zippedSize)) f.write(format % (numFiles, installedSize, zippedSize))
def _addLoc(self):
"Write .loc file."
base = self.packageInfo["Title"] + ".loc"
f = open(join(self.packageResourceFolder, base), "w")
f.write('/')
# Shortcut function interface # Shortcut function interface

View File

@@ -54,13 +54,13 @@ class Defaults:
def _getDefaults(cls): def _getDefaults(cls):
defaults = {} defaults = {}
for base in cls.__bases__:
if hasattr(base, "_getDefaults"):
defaults.update(base._getDefaults())
for name, value in cls.__dict__.items(): for name, value in cls.__dict__.items():
if name[0] != "_" and not isinstance(value, if name[0] != "_" and not isinstance(value,
(function, classmethod)): (function, classmethod)):
defaults[name] = deepcopy(value) defaults[name] = deepcopy(value)
for base in cls.__bases__:
if hasattr(base, "_getDefaults"):
defaults.update(base._getDefaults())
return defaults return defaults
_getDefaults = classmethod(_getDefaults) _getDefaults = classmethod(_getDefaults)
@@ -87,6 +87,9 @@ class BundleBuilder(Defaults):
# The creator code of the bundle. # The creator code of the bundle.
creator = None creator = None
# the CFBundleIdentifier (this is used for the preferences file name)
bundle_id = None
# List of files that have to be copied to <bundle>/Contents/Resources. # List of files that have to be copied to <bundle>/Contents/Resources.
resources = [] resources = []
@@ -126,7 +129,9 @@ class BundleBuilder(Defaults):
else: else:
self.creator = "????" self.creator = "????"
plist.CFBundleSignature = self.creator plist.CFBundleSignature = self.creator
if not hasattr(plist, "CFBundleIdentifier"): if self.bundle_id:
plist.CFBundleIdentifier = self.bundle_id
elif not hasattr(plist, "CFBundleIdentifier"):
plist.CFBundleIdentifier = self.name plist.CFBundleIdentifier = self.name
def build(self): def build(self):
@@ -217,6 +222,7 @@ USE_ZIPIMPORT = "zipimport" in sys.builtin_module_names
# all the cruft of the real site.py. # all the cruft of the real site.py.
SITE_PY = """\ SITE_PY = """\
import sys import sys
if not %(semi_standalone)s:
del sys.path[1:] # sys.path[0] is Contents/Resources/ del sys.path[1:] # sys.path[0] is Contents/Resources/
""" """
@@ -229,8 +235,6 @@ if USE_ZIPIMPORT:
path = fullname.replace(".", os.sep) + PYC_EXT path = fullname.replace(".", os.sep) + PYC_EXT
return path, MAGIC + '\0\0\0\0' + marshal.dumps(code) return path, MAGIC + '\0\0\0\0' + marshal.dumps(code)
SITE_CO = compile(SITE_PY, "<-bundlebuilder.py->", "exec")
# #
# Extension modules can't be in the modules zip archive, so a placeholder # Extension modules can't be in the modules zip archive, so a placeholder
# is added instead, that loads the extension from a specified location. # is added instead, that loads the extension from a specified location.
@@ -279,10 +283,18 @@ libdir = os.path.join(os.path.dirname(execdir), "Frameworks")
mainprogram = os.path.join(resdir, "%(mainprogram)s") mainprogram = os.path.join(resdir, "%(mainprogram)s")
sys.argv.insert(1, mainprogram) sys.argv.insert(1, mainprogram)
if %(standalone)s or %(semi_standalone)s:
os.environ["PYTHONPATH"] = resdir os.environ["PYTHONPATH"] = resdir
%(pythonhome)s if %(standalone)s:
os.environ["PYTHONHOME"] = resdir
else:
pypath = os.getenv("PYTHONPATH", "")
if pypath:
pypath = ":" + pypath
os.environ["PYTHONPATH"] = resdir + pypath
os.environ["PYTHONEXECUTABLE"] = executable os.environ["PYTHONEXECUTABLE"] = executable
os.environ["DYLD_LIBRARY_PATH"] = libdir os.environ["DYLD_LIBRARY_PATH"] = libdir
os.environ["DYLD_FRAMEWORK_PATH"] = libdir
os.execve(executable, sys.argv, os.environ) os.execve(executable, sys.argv, os.environ)
""" """
@@ -297,6 +309,25 @@ argvemulator.ArgvCollector().mainloop()
execfile(os.path.join(os.path.split(__file__)[0], "%(realmainprogram)s")) execfile(os.path.join(os.path.split(__file__)[0], "%(realmainprogram)s"))
""" """
#
# When building a standalone app with Python.framework, we need to copy
# a subset from Python.framework to the bundle. The following list
# specifies exactly what items we'll copy.
#
PYTHONFRAMEWORKGOODIES = [
"Python", # the Python core library
"Resources/English.lproj",
"Resources/Info.plist",
"Resources/version.plist",
]
def isFramework():
return sys.exec_prefix.find("Python.framework") > 0
LIB = os.path.join(sys.prefix, "lib", "python" + sys.version[:3])
SITE_PACKAGES = os.path.join(LIB, "site-packages")
class AppBuilder(BundleBuilder): class AppBuilder(BundleBuilder):
@@ -331,6 +362,12 @@ class AppBuilder(BundleBuilder):
# If True, build standalone app. # If True, build standalone app.
standalone = 0 standalone = 0
# If True, build semi-standalone app (only includes third-party modules).
semi_standalone = 0
# If set, use this for #! lines in stead of sys.executable
python = None
# If True, add a real main program that emulates sys.argv before calling # If True, add a real main program that emulates sys.argv before calling
# mainprogram # mainprogram
argv_emulation = 0 argv_emulation = 0
@@ -346,7 +383,7 @@ class AppBuilder(BundleBuilder):
# Include these packages. # Include these packages.
includePackages = [] includePackages = []
# Strip binaries. # Strip binaries from debug info.
strip = 0 strip = 0
# Found Python modules: [(name, codeobject, ispkg), ...] # Found Python modules: [(name, codeobject, ispkg), ...]
@@ -356,11 +393,9 @@ class AppBuilder(BundleBuilder):
missingModules = [] missingModules = []
maybeMissingModules = [] maybeMissingModules = []
# List of all binaries (executables or shared libs), for stripping purposes
binaries = []
def setup(self): def setup(self):
if self.standalone and self.mainprogram is None: if ((self.standalone or self.semi_standalone)
and self.mainprogram is None):
raise BundleBuilderError, ("must specify 'mainprogram' when " raise BundleBuilderError, ("must specify 'mainprogram' when "
"building a standalone application.") "building a standalone application.")
if self.mainprogram is None and self.executable is None: if self.mainprogram is None and self.executable is None:
@@ -379,8 +414,11 @@ class AppBuilder(BundleBuilder):
self.name += ".app" self.name += ".app"
if self.executable is None: if self.executable is None:
if not self.standalone: if not self.standalone and not isFramework():
self.symlink_exec = 1 self.symlink_exec = 1
if self.python:
self.executable = self.python
else:
self.executable = sys.executable self.executable = sys.executable
if self.nibname: if self.nibname:
@@ -388,11 +426,14 @@ class AppBuilder(BundleBuilder):
if not hasattr(self.plist, "NSPrincipalClass"): if not hasattr(self.plist, "NSPrincipalClass"):
self.plist.NSPrincipalClass = "NSApplication" self.plist.NSPrincipalClass = "NSApplication"
if self.standalone and isFramework():
self.addPythonFramework()
BundleBuilder.setup(self) BundleBuilder.setup(self)
self.plist.CFBundleExecutable = self.name self.plist.CFBundleExecutable = self.name
if self.standalone: if self.standalone or self.semi_standalone:
self.findDependencies() self.findDependencies()
def preProcess(self): def preProcess(self):
@@ -405,7 +446,6 @@ class AppBuilder(BundleBuilder):
execpath = pathjoin(self.execdir, execname) execpath = pathjoin(self.execdir, execname)
if not self.symlink_exec: if not self.symlink_exec:
self.files.append((self.executable, execpath)) self.files.append((self.executable, execpath))
self.binaries.append(execpath)
self.execpath = execpath self.execpath = execpath
if self.mainprogram is not None: if self.mainprogram is not None:
@@ -422,7 +462,7 @@ class AppBuilder(BundleBuilder):
mainprogrampath = pathjoin(resdirpath, mainprogram) mainprogrampath = pathjoin(resdirpath, mainprogram)
makedirs(resdirpath) makedirs(resdirpath)
open(mainprogrampath, "w").write(ARGV_EMULATOR % locals()) open(mainprogrampath, "w").write(ARGV_EMULATOR % locals())
if self.standalone: if self.standalone or self.semi_standalone:
self.includeModules.append("argvemulator") self.includeModules.append("argvemulator")
self.includeModules.append("os") self.includeModules.append("os")
if not self.plist.has_key("CFBundleDocumentTypes"): if not self.plist.has_key("CFBundleDocumentTypes"):
@@ -437,16 +477,16 @@ class AppBuilder(BundleBuilder):
execdir = pathjoin(self.bundlepath, self.execdir) execdir = pathjoin(self.bundlepath, self.execdir)
bootstrappath = pathjoin(execdir, self.name) bootstrappath = pathjoin(execdir, self.name)
makedirs(execdir) makedirs(execdir)
if self.standalone: if self.standalone or self.semi_standalone:
# XXX we're screwed when the end user has deleted # XXX we're screwed when the end user has deleted
# /usr/bin/python # /usr/bin/python
hashbang = "/usr/bin/python" hashbang = "/usr/bin/python"
pythonhome = 'os.environ["PYTHONHOME"] = resdir' elif self.python:
hashbang = self.python
else: else:
hashbang = sys.executable hashbang = os.path.realpath(sys.executable)
while os.path.islink(hashbang): standalone = self.standalone
hashbang = os.readlink(hashbang) semi_standalone = self.semi_standalone
pythonhome = ''
open(bootstrappath, "w").write(BOOTSTRAP_SCRIPT % locals()) open(bootstrappath, "w").write(BOOTSTRAP_SCRIPT % locals())
os.chmod(bootstrappath, 0775) os.chmod(bootstrappath, 0775)
@@ -456,7 +496,7 @@ class AppBuilder(BundleBuilder):
self.files.append((self.iconfile, pathjoin(resdir, iconbase))) self.files.append((self.iconfile, pathjoin(resdir, iconbase)))
def postProcess(self): def postProcess(self):
if self.standalone: if self.standalone or self.semi_standalone:
self.addPythonModules() self.addPythonModules()
if self.strip and not self.symlink: if self.strip and not self.symlink:
self.stripBinaries() self.stripBinaries()
@@ -471,6 +511,31 @@ class AppBuilder(BundleBuilder):
if self.missingModules or self.maybeMissingModules: if self.missingModules or self.maybeMissingModules:
self.reportMissing() self.reportMissing()
def addPythonFramework(self):
# If we're building a standalone app with Python.framework,
# include a minimal subset of Python.framework, *unless*
# Python.framework was specified manually in self.libs.
for lib in self.libs:
if os.path.basename(lib) == "Python.framework":
# a Python.framework was specified as a library
return
frameworkpath = sys.exec_prefix[:sys.exec_prefix.find(
"Python.framework") + len("Python.framework")]
version = sys.version[:3]
frameworkpath = pathjoin(frameworkpath, "Versions", version)
destbase = pathjoin("Contents", "Frameworks", "Python.framework",
"Versions", version)
for item in PYTHONFRAMEWORKGOODIES:
src = pathjoin(frameworkpath, item)
dst = pathjoin(destbase, item)
self.files.append((src, dst))
def _getSiteCode(self):
return compile(SITE_PY % {"semi_standalone": self.semi_standalone},
"<-bundlebuilder.py->", "exec")
def addPythonModules(self): def addPythonModules(self):
self.message("Adding Python modules", 1) self.message("Adding Python modules", 1)
@@ -488,7 +553,7 @@ class AppBuilder(BundleBuilder):
# add site.pyc # add site.pyc
sitepath = pathjoin(self.bundlepath, "Contents", "Resources", sitepath = pathjoin(self.bundlepath, "Contents", "Resources",
"site" + PYC_EXT) "site" + PYC_EXT)
writePyc(SITE_CO, sitepath) writePyc(self._getSiteCode(), sitepath)
else: else:
# Create individual .pyc files. # Create individual .pyc files.
for name, code, ispkg in self.pymodules: for name, code, ispkg in self.pymodules:
@@ -511,12 +576,30 @@ class AppBuilder(BundleBuilder):
self.message("Error: can't strip binaries: no strip program at " self.message("Error: can't strip binaries: no strip program at "
"%s" % STRIP_EXEC, 0) "%s" % STRIP_EXEC, 0)
else: else:
import stat
self.message("Stripping binaries", 1) self.message("Stripping binaries", 1)
for relpath in self.binaries: def walk(top):
for name in os.listdir(top):
path = pathjoin(top, name)
if os.path.islink(path):
continue
if os.path.isdir(path):
walk(path)
else:
mod = os.stat(path)[stat.ST_MODE]
if not (mod & 0100):
continue
relpath = path[len(self.bundlepath):]
self.message("Stripping %s" % relpath, 2) self.message("Stripping %s" % relpath, 2)
abspath = pathjoin(self.bundlepath, relpath) inf, outf = os.popen4("%s -S \"%s\"" %
assert not os.path.islink(abspath) (STRIP_EXEC, path))
rv = os.system("%s -S \"%s\"" % (STRIP_EXEC, abspath)) output = outf.read().strip()
if output:
# usually not a real problem, like when we're
# trying to strip a script
self.message("Problem stripping %s:" % relpath, 3)
self.message(output, 3)
walk(self.bundlepath)
def findDependencies(self): def findDependencies(self):
self.message("Finding module dependencies", 1) self.message("Finding module dependencies", 1)
@@ -527,8 +610,8 @@ class AppBuilder(BundleBuilder):
mf.import_hook("zlib") mf.import_hook("zlib")
# manually add our own site.py # manually add our own site.py
site = mf.add_module("site") site = mf.add_module("site")
site.__code__ = SITE_CO site.__code__ = self._getSiteCode()
mf.scan_code(SITE_CO, site) mf.scan_code(site.__code__, site)
# warnings.py gets imported implicitly from C # warnings.py gets imported implicitly from C
mf.import_hook("warnings") mf.import_hook("warnings")
@@ -546,24 +629,28 @@ class AppBuilder(BundleBuilder):
modules = mf.modules.items() modules = mf.modules.items()
modules.sort() modules.sort()
for name, mod in modules: for name, mod in modules:
if mod.__file__ and mod.__code__ is None:
# C extension
path = mod.__file__ path = mod.__file__
if path and self.semi_standalone:
# skip the standard library
if path.startswith(LIB) and not path.startswith(SITE_PACKAGES):
continue
if path and mod.__code__ is None:
# C extension
filename = os.path.basename(path) filename = os.path.basename(path)
pathitems = name.split(".")[:-1] + [filename]
dstpath = pathjoin(*pathitems)
if USE_ZIPIMPORT: if USE_ZIPIMPORT:
if name != "zlib":
# neatly pack all extension modules in a subdirectory,
# except zlib, since it's neccesary for bootstrapping.
dstpath = pathjoin("ExtensionModules", dstpath)
# Python modules are stored in a Zip archive, but put # Python modules are stored in a Zip archive, but put
# extensions in Contents/Resources/.a and add a tiny "loader" # extensions in Contents/Resources/. Add a tiny "loader"
# program in the Zip archive. Due to Thomas Heller. # program in the Zip archive. Due to Thomas Heller.
dstpath = pathjoin("Contents", "Resources", filename) source = EXT_LOADER % {"name": name, "filename": dstpath}
source = EXT_LOADER % {"name": name, "filename": filename}
code = compile(source, "<dynloader for %s>" % name, "exec") code = compile(source, "<dynloader for %s>" % name, "exec")
mod.__code__ = code mod.__code__ = code
else: self.files.append((path, pathjoin("Contents", "Resources", dstpath)))
# just copy the file
dstpath = name.split(".")[:-1] + [filename]
dstpath = pathjoin("Contents", "Resources", *dstpath)
self.files.append((path, dstpath))
self.binaries.append(dstpath)
if mod.__code__ is not None: if mod.__code__ is not None:
ispkg = mod.__path__ is not None ispkg = mod.__path__ is not None
if not USE_ZIPIMPORT or name != "site": if not USE_ZIPIMPORT or name != "site":
@@ -607,7 +694,7 @@ class AppBuilder(BundleBuilder):
# XXX something decent # XXX something decent
import pprint import pprint
pprint.pprint(self.__dict__) pprint.pprint(self.__dict__)
if self.standalone: if self.standalone or self.semi_standalone:
self.reportMissing() self.reportMissing()
# #
@@ -647,7 +734,7 @@ def copy(src, dst, mkdirs=0):
if mkdirs: if mkdirs:
makedirs(os.path.dirname(dst)) makedirs(os.path.dirname(dst))
if os.path.isdir(src): if os.path.isdir(src):
shutil.copytree(src, dst) shutil.copytree(src, dst, symlinks=1)
else: else:
shutil.copy2(src, dst) shutil.copy2(src, dst)
@@ -704,15 +791,22 @@ Options:
-c, --creator=CCCC 4-char creator code (default: '????') -c, --creator=CCCC 4-char creator code (default: '????')
--iconfile=FILE filename of the icon (an .icns file) to be used --iconfile=FILE filename of the icon (an .icns file) to be used
as the Finder icon as the Finder icon
--bundle-id=ID the CFBundleIdentifier, in reverse-dns format
(eg. org.python.BuildApplet; this is used for
the preferences file name)
-l, --link symlink files/folder instead of copying them -l, --link symlink files/folder instead of copying them
--link-exec symlink the executable instead of copying it --link-exec symlink the executable instead of copying it
--standalone build a standalone application, which is fully --standalone build a standalone application, which is fully
independent of a Python installation independent of a Python installation
--semi-standalone build a standalone application, which depends on
an installed Python, yet includes all third-party
modules.
--python=FILE Python to use in #! line in stead of current Python
--lib=FILE shared library or framework to be copied into --lib=FILE shared library or framework to be copied into
the bundle the bundle
-x, --exclude=MODULE exclude module (with --standalone) -x, --exclude=MODULE exclude module (with --(semi-)standalone)
-i, --include=MODULE include module (with --standalone) -i, --include=MODULE include module (with --(semi-)standalone)
--package=PACKAGE include a whole package (with --standalone) --package=PACKAGE include a whole package (with --(semi-)standalone)
--strip strip binaries (remove debug info) --strip strip binaries (remove debug info)
-v, --verbose increase verbosity level -v, --verbose increase verbosity level
-q, --quiet decrease verbosity level -q, --quiet decrease verbosity level
@@ -734,7 +828,7 @@ def main(builder=None):
"mainprogram=", "creator=", "nib=", "plist=", "link", "mainprogram=", "creator=", "nib=", "plist=", "link",
"link-exec", "help", "verbose", "quiet", "argv", "standalone", "link-exec", "help", "verbose", "quiet", "argv", "standalone",
"exclude=", "include=", "package=", "strip", "iconfile=", "exclude=", "include=", "package=", "strip", "iconfile=",
"lib=") "lib=", "python=", "semi-standalone", "bundle-id=")
try: try:
options, args = getopt.getopt(sys.argv[1:], shortopts, longopts) options, args = getopt.getopt(sys.argv[1:], shortopts, longopts)
@@ -747,7 +841,7 @@ def main(builder=None):
elif opt in ('-n', '--name'): elif opt in ('-n', '--name'):
builder.name = arg builder.name = arg
elif opt in ('-r', '--resource'): elif opt in ('-r', '--resource'):
builder.resources.append(arg) builder.resources.append(os.path.normpath(arg))
elif opt in ('-f', '--file'): elif opt in ('-f', '--file'):
srcdst = arg.split(':') srcdst = arg.split(':')
if len(srcdst) != 2: if len(srcdst) != 2:
@@ -762,10 +856,12 @@ def main(builder=None):
builder.argv_emulation = 1 builder.argv_emulation = 1
elif opt in ('-c', '--creator'): elif opt in ('-c', '--creator'):
builder.creator = arg builder.creator = arg
elif opt == '--bundle-id':
builder.bundle_id = arg
elif opt == '--iconfile': elif opt == '--iconfile':
builder.iconfile = arg builder.iconfile = arg
elif opt == "--lib": elif opt == "--lib":
builder.libs.append(arg) builder.libs.append(os.path.normpath(arg))
elif opt == "--nib": elif opt == "--nib":
builder.nibname = arg builder.nibname = arg
elif opt in ('-p', '--plist'): elif opt in ('-p', '--plist'):
@@ -782,6 +878,10 @@ def main(builder=None):
builder.verbosity -= 1 builder.verbosity -= 1
elif opt == '--standalone': elif opt == '--standalone':
builder.standalone = 1 builder.standalone = 1
elif opt == '--semi-standalone':
builder.semi_standalone = 1
elif opt == '--python':
builder.python = arg
elif opt in ('-x', '--exclude'): elif opt in ('-x', '--exclude'):
builder.excludeModules.append(arg) builder.excludeModules.append(arg)
elif opt in ('-i', '--include'): elif opt in ('-i', '--include'):

View File

@@ -15,11 +15,13 @@ fi
function usage { function usage {
echo "" echo ""
echo "Usage: $0 wx_version py_version [command flags...]" echo "Usage: $0 [apple|local] [command flags...]"
echo " wx_version String to use for version in filenames, etc."
echo " py_version String to append to python (which python version to use.)"
echo "" echo ""
echo "command flags:" echo " apple Build for Apple's python in /usr/bin"
echo " local Build for a locally installed python in /usr/local/bin"
echo " (for example Jaguar's MacPython)"
echo ""
echo "optional command flags:"
echo " skiptar Don't unpack the tarball" echo " skiptar Don't unpack the tarball"
echo " use_cvs Use the CVS workspace instead of a tarfile" echo " use_cvs Use the CVS workspace instead of a tarfile"
echo " skipconfig Don't run configure" echo " skipconfig Don't run configure"
@@ -27,17 +29,23 @@ function usage {
echo " skipinstall Don't do the installation step" echo " skipinstall Don't do the installation step"
echo " skipdmg Don't make the package or diskimage" echo " skipdmg Don't make the package or diskimage"
echo " skipclean Don't do the cleanup at the end" echo " skipclean Don't do the cleanup at the end"
echo ""
} }
if [ $# -lt 2 ]; then if [ $# -lt 1 ]; then
usage usage
exit 1 exit 1
fi fi
VERSION=$1 KIND=$1
PYVER=$2 case $KIND in
shift;shift apple) PYTHON=/usr/bin/python ;;
local) PYTHON=/usr/local/bin/python ;;
*) usage; exit 1 ;;
esac
PYTHONW=${PYTHON}w
shift
for flag in $*; do for flag in $*; do
@@ -57,13 +65,18 @@ for flag in $*; do
done done
SRCDIR=/Volumes/Gate.Stuff/Development/wxPython/dist/$VERSION VERSION=`$PYTHON -c "import setup;print setup.VERSION"`
PYVER=`$PYTHON -c "import sys; print sys.version[:3]"`
PYPREFIX=`$PYTHON -c "import sys; print sys.exec_prefix"`
SITEPACKAGES=$PYPREFIX/lib/python$PYVER/site-packages
SRCDIR=/stuff/Development/wxPython/dist/$VERSION
TARBALL=$SRCDIR/wxPythonSrc-$VERSION.tar.gz TARBALL=$SRCDIR/wxPythonSrc-$VERSION.tar.gz
SITEPACKAGES=/Library/Frameworks/Python.framework/Versions/$PYVER/lib/python$PYVER/site-packages
# TODO: Should I change the prefix to /usr? PREFIX=/usr/lib/wxPython-$VERSION
PREFIX=/usr/local BINPREFIX=/usr/bin
WXROOT=`dirname $PWD`
PROGDIR="`dirname \"$0\"`" PROGDIR="`dirname \"$0\"`"
TMPDIR=$PWD/_build_dmg TMPDIR=$PWD/_build_dmg
@@ -81,7 +94,7 @@ DESTDIR=$PWD/dist
mkdir -p $BUILDROOT mkdir -p $BUILDROOT
mkdir -p $INSTALLROOT mkdir -p $INSTALLROOT
mkdir -p $INSTALLDEVEL #mkdir -p $INSTALLDEVEL
rm -rf $DMGDIR rm -rf $DMGDIR
mkdir -p $DMGDIR/root mkdir -p $DMGDIR/root
@@ -92,7 +105,8 @@ pushd $BUILDROOT
# Unpack the tarball # Unpack the tarball
if [ -z "$skiptar" ]; then if [ -z "$skiptar" ]; then
tar xzvf $TARBALL echo Unarchiving tarball...
tar xzf $TARBALL
fi fi
if [ "$use_cvs" = 1 ]; then if [ "$use_cvs" = 1 ]; then
@@ -104,19 +118,21 @@ if [ "$use_cvs" = 1 ]; then
if [ -e .last_copy ]; then if [ -e .last_copy ]; then
FEXPR="-cnewer .last_copy" FEXPR="-cnewer .last_copy"
fi fi
find /projects/wx $FEXPR -print \ MEASURE=$WXROOT//
| grep -v wx/build \ find $WXROOT $FEXPR -print \
| grep -v $WXROOT/bld \
| grep -v wxPython/build \ | grep -v wxPython/build \
| grep -v wxPython/_build \ | grep -v wxPython/_build \
| grep -v CVS \ | grep -v CVS \
| cut -b 14- > filelist | grep -v .pyc \
| cut -b ${#MEASURE}- > filelist
for x in `cat filelist`; do for x in `cat filelist`; do
if [ -d "/projects/wx/$x" ]; then if [ -d "$WXROOT/$x" ]; then
mkdir -p "wxPythonSrc-$VERSION/$x" mkdir -p "wxPythonSrc-$VERSION/$x"
else else
echo $x echo $x
cp -p "/projects/wx/$x" "wxPythonSrc-$VERSION/$x" cp -p "$WXROOT/$x" "wxPythonSrc-$VERSION/$x"
fi fi
done done
@@ -126,60 +142,60 @@ fi
cd wxPythonSrc-$VERSION cd wxPythonSrc-$VERSION
WXDIR=`pwd` WXDIR=`pwd`
mkdir -p $WXDIR/build mkdir -p $WXDIR/bld
cd $WXDIR/build cd $WXDIR/bld
#---------------------------------------------------------------------- #----------------------------------------------------------------------
# Configure wxWindows # Configure wxWindows
if [ -z "$skipconfig" ]; then if [ -z "$skipconfig" ]; then
../configure --with-mac --prefix=$PREFIX \ ../configure \
--prefix=$PREFIX \
--with-mac \
--disable-monolithic \
--with-opengl \ --with-opengl \
--enable-precomp=no \
--enable-geometry \ --enable-geometry \
--enable-optimise \ --enable-optimise \
--enable-precomp=no \
\
--with-libjpeg=builtin \ --with-libjpeg=builtin \
--with-libpng=builtin \ --with-libpng=builtin \
--with-libtiff=builtin \ --with-libtiff=builtin \
--with-zlib=builtin \
\
# --with-zlib=builtin --enable-debug_flag
# --enable-debug_flag
fi fi
# Build wxWindows and wxPython # Build wxWindows and wxPython
if [ -z "$skipbuild" ]; then if [ -z "$skipbuild" ]; then
make
# Make wxWindows and some contribs
make
make -C contrib/src/gizmos
make -C contrib/src/ogl CXXFLAGS="-DwxUSE_DEPRECATED=0"
make -C contrib/src/stc
make -C contrib/src/xrc
if [ ! -e $WXDIR/include/wx/gizmos ]; then
# Make some links so the wxPython build can find all the headers it needs
pushd $WXDIR/include/wx
ln -s ../../contrib/include/wx/* .
popd
fi
# Build wxPython
cd $WXDIR/wxPython cd $WXDIR/wxPython
python$PYVER setup.py \ $PYTHON setup.py \
IN_CVS_TREE=1 \ NO_SCRIPTS=1 \
WX_CONFIG="$WXDIR/build/wx-config --prefix=$WXDIR --exec-prefix=$WXDIR/build" \ WX_CONFIG="$WXDIR/bld/wx-config --prefix=$WXDIR --exec-prefix=$WXDIR/bld" \
build build
# Build wxrc (XRC resource tool) but don't use the makefiles since they expect # Build wxrc (XRC resource tool)
# a shared version of the xrc lib to have been built... cd $WXDIR/bld/contrib/utils/wxrc
cd $WXDIR/contrib/utils/wxrc make
WX_CONFIG="$WXDIR/build/wx-config --prefix=$WXDIR --exec-prefix=$WXDIR/build"
wCC=`$WX_CONFIG --cc`
wCXX=`$WX_CONFIG --cxx`
for f in wxrc.cpp ../../src/xrc/*.cpp; do
echo $f
$wCXX `$WX_CONFIG --cxxflags` -I ../../include -I ../../src/xrc/expat/xmlparse -I ../../src/xrc/expat/xmltok -c $f
done
for f in ../../src/xrc/expat/xmlparse/xmlparse.c ../../src/xrc/expat/xmltok/xmlrole.c ../../src/xrc/expat/xmltok/xmltok.c; do
echo $f
$wCC `$WX_CONFIG --cxxflags` -I ../../include -I ../../src/xrc/expat/xmlparse -I ../../src/xrc/expat/xmltok -c $f
done
# the handlers are not needed
rm xh_*.o xmlrsall.o
$wCXX `$WX_CONFIG --libs` *.o -o wxrc
strip wxrc strip wxrc
fi fi
@@ -188,37 +204,42 @@ fi
# Install wxWindows # Install wxWindows
if [ -z "$skipinstall" ]; then if [ -z "$skipinstall" ]; then
cd $WXDIR/build cd $WXDIR/bld
make prefix=$INSTALLROOT/$PREFIX install make prefix=$INSTALLROOT$PREFIX install
make -C contrib/src/gizmos prefix=$INSTALLROOT$PREFIX install
make -C contrib/src/ogl CXXFLAGS="-DwxUSE_DEPRECATED=0" prefix=$INSTALLROOT/$PREFIX install
make -C contrib/src/stc prefix=$INSTALLROOT$PREFIX install
make -C contrib/src/xrc prefix=$INSTALLROOT$PREFIX install
# and wxPython # and wxPython
cd $WXDIR/wxPython cd $WXDIR/wxPython
python$PYVER setup.py \ $PYTHON setup.py \
IN_CVS_TREE=1 \ NO_SCRIPTS=1 \
WX_CONFIG="$WXDIR/build/wx-config --prefix=$WXDIR --exec-prefix=$WXDIR/build" \ WX_CONFIG="$INSTALLROOT/$PREFIX/bin/wx-config --prefix=$INSTALLROOT/$PREFIX" \
install \ install \
--root=$INSTALLROOT --root=$INSTALLROOT
# install wxPython's tool scripts # install wxPython's tool scripts
mkdir -p $INSTALLROOT$BINPREFIX
cd $WXDIR/wxPython/scripts cd $WXDIR/wxPython/scripts
python$PYVER CreateMacScripts.py $INSTALLROOT $PREFIX/bin python$PYVER CreateMacScripts.py $INSTALLROOT $BINPREFIX
# Install wxrc # Install wxrc
cp $WXDIR/contrib/utils/wxrc/wxrc $INSTALLROOT$PREFIX/bin cp $WXDIR/bld/contrib/utils/wxrc/wxrc $INSTALLROOT$BINPREFIX
# Move wxWindows devel files and save for a separate installer package # install the wxPython headers
mkdir -p $INSTALLDEVEL$PREFIX cd $WXDIR/wxPython
mkdir -p $INSTALLDEVEL$PREFIX/bin cp -R include $INSTALLROOT$PREFIX
mkdir -p $INSTALLDEVEL$PREFIX/lib mkdir -p $INSTALLROOT$PREFIX/include/wx/wxPython/i_files
mv -f $INSTALLROOT$PREFIX/include $INSTALLDEVEL$PREFIX cp src/*.i $INSTALLROOT$PREFIX/include/wx/wxPython/i_files
mv -f $INSTALLROOT$PREFIX/lib/wx $INSTALLDEVEL$PREFIX/lib
mv -f $INSTALLROOT$PREFIX/bin/wx* $INSTALLDEVEL$PREFIX/bin
# TODO for $INSTALLROOT and $INSTALLDEVEL ? # TODO for $INSTALLROOT and $INSTALLDEVEL ?
# chown -R root:admin #chown -R root:admin $INSTALLROOT
# chmod -R g+w #chmod -R g+w $INSTALLROOT
fi fi
popd popd
@@ -230,63 +251,18 @@ if [ -z "$skipdmg" ]; then
# Remove the .pyc/.pyo files they just take up space and can be recreated # Remove the .pyc/.pyo files they just take up space and can be recreated
# during the install. # during the install.
python $PROGDIR/../zappycfiles.py $INSTALLROOT/Library/Frameworks/Python.framework $PYTHON $PROGDIR/../zappycfiles.py $INSTALLROOT
# Copy the demo, samples, and such to the Applications dir
APPDIR=$INSTALLROOT/Applications/wxPythonOSX-$VERSION
mkdir -p $APPDIR
cp -pR $WXDIR/wxPython/demo $APPDIR
cp -pR $WXDIR/wxPython/samples $APPDIR
# Move sample launchers to .pyw files.
# TODO: A better, more automated way to do this!!!
pushd $APPDIR/samples
for x in StyleEditor/STCStyleEditor \
doodle/superdoodle \
frogedit/FrogEdit \
pySketch/pySketch \
wxProject/wxProject; do
mv $x.py $x.pyw
done
popd
# Make an app to launch the demo
cat > $APPDIR/demo/RunDemo.pyw <<EOF
import sys, os
sys.path.insert(0, "/Applications/wxPythonOSX-$VERSION/demo")
os.chdir("/Applications/wxPythonOSX-$VERSION/demo")
import Main
Main.main()
EOF
pythonw $PROGDIR/../buildapp.py \
--builddir=$APPDIR \
--name=RunDemo \
--mainprogram=$APPDIR/demo/RunDemo.pyw \
--iconfile=$PROGDIR/RunDemo.icns \
build
# Make an app to launch PyShell
pythonw $PROGDIR/../buildapp.py \
--builddir=$APPDIR \
--name=PyShell \
--mainprogram=$INSTALLROOT$PREFIX/bin/pyshell.py \
--iconfile=$PROGDIR/PieShell.icns \
build
# Make an app to launch XRCed
pythonw $PROGDIR/../buildapp.py \
--builddir=$APPDIR \
--name=XRCed \
--mainprogram=$INSTALLROOT$PREFIX/bin/xrced.py \
--iconfile=$PROGDIR/XRCed.icns \
build
# Make the welcome message # Make the welcome message
case $KIND in
apple) W_MSG="an Apple installed (Panther) version of" ;;
local) W_MSG="a locally built version (or Jaguar version) of" ;;
esac
cat > $RESOURCEDIR/Welcome.txt <<EOF cat > $RESOURCEDIR/Welcome.txt <<EOF
Welcome! Welcome!
This program will install wxPython $VERSION for MacPython-OSX $PYVER. This program will install wxPython $VERSION for $W_MSG MacPython-OSX $PYVER.
Build date: `date` Build date: `date`
EOF EOF
@@ -296,6 +272,7 @@ EOF
#!/bin/sh #!/bin/sh
# Cleanup any old install of the wxPython package # Cleanup any old install of the wxPython package
rm -rf \$2$SITEPACKAGES/wxPython rm -rf \$2$SITEPACKAGES/wxPython
rm -rf \$2$SITEPACKAGES/wx
exit 0 exit 0
EOF EOF
chmod +x $RESOURCEDIR/preflight chmod +x $RESOURCEDIR/preflight
@@ -304,20 +281,17 @@ EOF
cat > $RESOURCEDIR/postflight <<EOF cat > $RESOURCEDIR/postflight <<EOF
#!/bin/sh -e #!/bin/sh -e
# Compile the .py files in the wxPython pacakge # Compile the .py files in the wxPython pacakge
/usr/local/bin/python \$2$SITEPACKAGES/../compileall.py \$2$SITEPACKAGES/wxPython $PYTHON \$2$SITEPACKAGES/../compileall.py \$2$SITEPACKAGES/wxPython
/usr/local/bin/python -O \$2$SITEPACKAGES/../compileall.py \$2$SITEPACKAGES/wxPython $PYTHON \$2$SITEPACKAGES/../compileall.py \$2$SITEPACKAGES/wx
$PYTHON -O \$2$SITEPACKAGES/../compileall.py \$2$SITEPACKAGES/wxPython
$PYTHON -O \$2$SITEPACKAGES/../compileall.py \$2$SITEPACKAGES/wx
# and in the demo
/usr/local/bin/python \$2$SITEPACKAGES/../compileall.py /Applications/wxPythonOSX-$VERSION/demo
# Make the demo/data dir writable
chmod a+w /Applications/wxPythonOSX-$VERSION/demo/data
# and the wxPython pacakge should be group writable # and the wxPython pacakge should be group writable
chgrp -R admin \$2$SITEPACKAGES/wxPython chgrp -R admin \$2$SITEPACKAGES/wxPython
chgrp -R admin /Applications/wxPythonOSX-$VERSION
chmod -R g+w \$2$SITEPACKAGES/wxPython chmod -R g+w \$2$SITEPACKAGES/wxPython
chmod -R g+w /Applications/wxPythonOSX-$VERSION chgrp -R admin \$2$SITEPACKAGES/wx
chmod -R g+w \$2$SITEPACKAGES/wx
exit 0 exit 0
EOF EOF
@@ -325,63 +299,106 @@ EOF
# Finally, build the main package... # Finally, build the main Installer Package...
rm -rf wxPythonOSX.pkg rm -rf wxPythonOSX-$KIND.pkg
python $PROGDIR/../buildpkg.py \ python $PROGDIR/../buildpkg.py \
--Title=wxPythonOSX \ --Title=wxPythonOSX-$KIND \
--Version=$VERSION \ --Version=$VERSION \
--Description="wxPython $VERSION for MacPython-OSX $PYVER" \ --Description="wxPython $VERSION for $W_MSG MacPython-OSX $PYVER" \
--NeedsAuthorization="YES" \ --NeedsAuthorization="YES" \
--Relocatable="NO" \ --Relocatable="NO" \
--InstallOnly="YES" \ --InstallOnly="YES" \
$INSTALLROOT \ $INSTALLROOT \
$RESOURCEDIR $RESOURCEDIR
mv wxPythonOSX.pkg $DMGDIR/root mv wxPythonOSX-$KIND.pkg $DMGDIR/root
# and the devel package # # and the devel package
rm -rf wxPythonOSX-devel.pkg # rm -rf wxPythonOSX-devel.pkg
python $PROGDIR/../buildpkg.py \ # python $PROGDIR/../buildpkg.py \
--Title=wxPythonOSX-devel \ # --Title=wxPythonOSX-devel \
--Version=$VERSION \ # --Version=$VERSION \
--Description="Headers and such that allow you to link with the same wxMac that wxPython does" \ # --Description="Headers and such that allow you to link with the same wxMac that wxPython does" \
--NeedsAuthorization="YES" \ # --NeedsAuthorization="YES" \
--Relocatable="NO" \ # --Relocatable="NO" \
--InstallOnly="YES" \ # --InstallOnly="YES" \
$INSTALLROOT # $INSTALLDEVEL
mv wxPythonOSX-devel.pkg $DMGDIR/root # mv wxPythonOSX-devel.pkg $DMGDIR/root
# Make a README.txt to go on the disk image # Make a README.txt to go on the disk image
cat > $DMGDIR/root/README.txt <<EOF cat > $DMGDIR/root/README.txt <<EOF
The files on this disk image are Installer packages for wxPythonOSX Welcome to wxPython!
$VERSION for MacPython-OSX $PVER. You must already have MacPython-OSX
installed.
The wxPython extension modules, library, demo and samples are On this disk image you will find the installer for the wxPython $VERSION for $W_MSG MacPython-OSX $PYVER. You must already have MacPython-OSX installed.
contained in the wxPythonOSX package. You should install at least this
package to use wxPython.
If you have any need to create applicaitons or extension modules that wxPython-$KIND.pkg The installer package. It contains the wxPython
link with the same wxMac that wxPython does, then you can also install extension modules, wxMac dynamic libraries and
the wxPythonOSX-devel package to get the necessary header files and headers, and some scripts for the command-line
such. Otherwise you don't need it. tools.
Everything else here is optional and you can drag them out of the disk
image and drop them where ever you want.
docs/ A few readmes, change log, etc. The full
documentation is downloadable separately.
licence/ License docs.
demo/ A copy of the wxPython demo.
samples/ Several small sample applications that
demonstrate how to use wxPython.
Happy Hacking! Happy Hacking!
EOF EOF
# license files, etc. # license files, docs, etc.
cp -pR $WXDIR/wxPython/licence $DMGDIR/root cp -pR $WXDIR/wxPython/licence $DMGDIR/root
cp $WXDIR/wxPython/CHANGES.txt $DMGDIR/root rm -rf $WXDIR/wxPython/docs/xml-raw
cp -pR $WXDIR/wxPython/docs $DMGDIR/root
rm -rf $DMGDIR/root/docs/bin
# Copy the demo and samples to the disk image
cp -pR $WXDIR/wxPython/demo $DMGDIR/root
cp -pR $WXDIR/wxPython/samples $DMGDIR/root
rm $DMGDIR/root/demo/b
# Make an app bundle to launch PyCrust
$PYTHONW $PROGDIR/../buildapp.py \
--builddir=$DMGDIR/root \
--name=PyCrust \
--mainprogram=$INSTALLROOT$BINPREFIX/pycrust.py \
--iconfile=$PROGDIR/PieShell.icns \
build
# Make an app to launch XRCed
$PYTHONW $PROGDIR/../buildapp.py \
--builddir=$DMGDIR/root \
--name=XRCed \
--mainprogram=$INSTALLROOT$BINPREFIX/xrced.py \
--iconfile=$PROGDIR/XRCed.icns \
build
# Make an app bundle to run the demo
$PYTHONW $PROGDIR/../buildapp.py \
--builddir=$DMGDIR/root \
--name="wxPython Demo" \
--mainprogram=$DMGDIR/root/demo/demo.py \
--iconfile=$PROGDIR/RunDemo.icns \
build
cp -pR $DMGDIR/root/demo/* "$DMGDIR/root/wxPython Demo.app/Contents/Resources"
# and then finally make a disk image containing the packages and etc. # and then finally make a disk image containing the packages and etc.
$PROGDIR/../makedmg $DMGDIR/root $DMGDIR wxPythonOSX-$VERSION-py$PYVER $PROGDIR/../makedmg $DMGDIR/root $DMGDIR wxPythonOSX-$VERSION-$KIND-Py$PYVER
echo Moving $DMGDIR/wxPythonOSX-$VERSION-py$PYVER.dmg to $DESTDIR echo Moving $DMGDIR/wxPythonOSX-$VERSION-$KIND-Py$PYVER.dmg to $DESTDIR
mv $DMGDIR/wxPythonOSX-$VERSION-py$PYVER.dmg $DESTDIR mv $DMGDIR/wxPythonOSX-$VERSION-$KIND-Py$PYVER.dmg $DESTDIR
fi fi

View File

@@ -0,0 +1,2 @@
Welcome.txt
postflight

View File

@@ -1,79 +0,0 @@
{\rtf1\mac\ansicpg10000\cocoartf102
{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;\f2\fnil\fcharset77 Monaco;
\f3\fnil\fcharset77 LucidaGrande;}
{\colortbl;\red255\green255\blue255;\red0\green0\blue255;}
\margl1440\margr1440\vieww11800\viewh14740\viewkind0
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\f0\b\fs24 \cf0 About\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\f1\b0 \cf0 \
This is a binary package of wxPython for MacPython on Mac OS X 10.2 or later. The wxMac binaries will be installed as well. MacPython-OSX, however, is not included with this package, but is also required to run wxPython. Before you continue you should have already installed the MacPython-OSX framework.\
\
Please note that the Mac OS ports of wxPython as well as wxWindows (a.k.a. wxMac) are works-in-progress. Report bugs via SourceForge [1] or discuss the problem on the mailing list(s) related to your questions (see below).\
\
\fs18 [1] \cf2 http://sf.net/tracker/?atid=109863&group_id=9863
\fs24 \cf0 \
\
\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\f0\b \cf0 What will be installed and where\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\f1\b0 \cf0 \
wxMac goes into
\f2 /usr/local
\f1 and wxPython will be installed into the appropriate subfolder of the Python framework. Choose the
\f3 Show files
\f1 command from the
\f3 File
\f1 menu for a complete file listing. (The menu item becomes available as soon as the license agreement is accepted in the next step.)
\f2 \
\f1 \
\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\f0\b \cf0 Getting started with wxPython
\f1\b0 \
\
You can verify that wxPython was succesfully installed by running the demo. It resides on the same disk image where you found this package. Just double click the script named
\f2 demo.py
\f1 or drag and drop it onto the Python interpreter in your
\f2 Application
\f1 folder.\
\
The official wxPython site:\
\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\f2 \cf2 http://wxPython.org\cf0 \
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\f1 \cf0 \
The best way to get help with wxWindows and wxPython is to subscribe to the mail lists and post questions there. You can see info about the mail lists, including how to subscribe, at this website:\
\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\f2 \cf2 http://wxPython.org/maillist.php\
\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\f1 \cf0 \
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\f0\b \cf0 Disclaimer
\f1\b0 \
\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\f2 \cf0 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\f1 \
\
\
Robin Dunn\
\
}

View File

@@ -1,4 +0,0 @@
#!/bin/sh
# Cleanup any old install of the wxPython package
rm -rf $2/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/site-packages/wxPython
exit 0

View File

@@ -10,11 +10,10 @@ doit = 1
def main(): def main():
if not sys.argv[1:]: if not sys.argv[1:]:
if os.name == 'mac': if os.name == 'mac':
import macfs import EasyDialogs
fss, ok = macfs.GetDirectory('Directory to zap pyc files in') dir = EasyDialogs.AskFolder(message='Directory to zap pyc files in')
if not ok: if not dir:
sys.exit(0) sys.exit(0)
dir = fss.as_pathname()
zappyc(dir) zappyc(dir)
else: else:
print 'Usage: zappyc dir ...' print 'Usage: zappyc dir ...'

View File

@@ -1,6 +1,6 @@
#---------------------------------------------------------------------- #----------------------------------------------------------------------
# Name: CreateMacScripts.py # Name: CreateMacScripts.py
# Purpose: Massages the scripts to be usable with MachoPython # Purpose: Massages the scripts to be usable with MacPython-OSX
# #
# Author: Robin Dunn # Author: Robin Dunn
# #