wxPython on OSX can now be built in Unicode mode, can support multiple
version installs, and comes with an uninstaller script. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30055 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -606,7 +606,7 @@ if debug:
|
|||||||
if FINAL:
|
if FINAL:
|
||||||
HYBRID = 0
|
HYBRID = 0
|
||||||
|
|
||||||
if UNICODE and WXPORT not in ['msw', 'gtk2']:
|
if UNICODE and WXPORT not in ['msw', 'gtk2', 'mac']:
|
||||||
raise SystemExit, "UNICODE mode not currently supported on this WXPORT: "+WXPORT
|
raise SystemExit, "UNICODE mode not currently supported on this WXPORT: "+WXPORT
|
||||||
|
|
||||||
|
|
||||||
|
196
wxPython/distrib/mac/uninstall_wxPython.py
Executable file
196
wxPython/distrib/mac/uninstall_wxPython.py
Executable file
@@ -0,0 +1,196 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
"""
|
||||||
|
This script will search for installed versions of wxPython on OSX and
|
||||||
|
allow the user to choose one to uninstall. It then will use the
|
||||||
|
metadata stored about the installed package to remove all the files
|
||||||
|
associated with that install.
|
||||||
|
|
||||||
|
Only the files installed by the main Installer Package will be
|
||||||
|
removed. This includes the Python modules and the wxWidgets shared
|
||||||
|
libraries. If you also installed the demo or docs by dragging them out
|
||||||
|
of the disk image, then you will need to drag them to the Trash
|
||||||
|
yourself.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import sys, os, glob
|
||||||
|
import cPickle, urllib
|
||||||
|
|
||||||
|
RCPTDIR = "/Library/Receipts"
|
||||||
|
RSRCDIR = "Contents/Resources"
|
||||||
|
|
||||||
|
# only clean up dirs that have one of these as a prefix. We do this
|
||||||
|
# because the file list returned from lsbom will include /, /usr,
|
||||||
|
# /usr/local, etc.
|
||||||
|
PREFIXES = [ '/Library/Python/2.3/',
|
||||||
|
'/Library/Python/2.4/',
|
||||||
|
'/usr/local/lib/',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class AccessError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class InstalledReceipt(object):
|
||||||
|
def __init__(self, rcptPath):
|
||||||
|
self.rcptPath = rcptPath
|
||||||
|
self.rsrcPath = os.path.join(rcptPath, RSRCDIR)
|
||||||
|
self.bomFile = glob.glob(os.path.join(self.rsrcPath, "*.bom"))[0]
|
||||||
|
self.findMetaData()
|
||||||
|
|
||||||
|
|
||||||
|
def findMetaData(self):
|
||||||
|
# TODO: Make this be able to also look at Info.plist files
|
||||||
|
infoFile = glob.glob(os.path.join(self.rsrcPath, "*.info"))[0]
|
||||||
|
self.mdata = {}
|
||||||
|
for line in open(infoFile, "r").readlines():
|
||||||
|
line = line.strip()
|
||||||
|
if line and line[0] != '#':
|
||||||
|
ls = line.split()
|
||||||
|
self.mdata[ls[0]] = line[len(ls[0])+1:]
|
||||||
|
|
||||||
|
|
||||||
|
def getFileList(self):
|
||||||
|
p = os.popen("lsbom -s %s" % self.bomFile, "r")
|
||||||
|
data = p.read()
|
||||||
|
data.strip()
|
||||||
|
data = filter(lambda s: s!='' and s!='.', data.split('\n'))
|
||||||
|
loc = self.mdata['DefaultLocation']
|
||||||
|
return [loc+item for item in data]
|
||||||
|
|
||||||
|
|
||||||
|
def walkFiles(self, handleFile, handleDir):
|
||||||
|
dirs = []
|
||||||
|
names = self.getFileList()
|
||||||
|
|
||||||
|
# the plain files
|
||||||
|
for name in names:
|
||||||
|
name = os.path.abspath(name)
|
||||||
|
if os.path.isdir(name):
|
||||||
|
dirs.append(name)
|
||||||
|
else:
|
||||||
|
handleFile(name)
|
||||||
|
|
||||||
|
# the directories
|
||||||
|
dirs.reverse()
|
||||||
|
for dir in dirs:
|
||||||
|
for prefix in PREFIXES:
|
||||||
|
if dir.startswith(prefix):
|
||||||
|
handleDir(dir)
|
||||||
|
break
|
||||||
|
|
||||||
|
# Finally, remove the Receipts package, bottom-up
|
||||||
|
for dirpath, dirname, filenames in os.walk(self.rcptPath, False):
|
||||||
|
for name in filenames:
|
||||||
|
name = os.path.join(dirpath, name)
|
||||||
|
handleFile(name)
|
||||||
|
handleDir(dirpath)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def showFiles(self):
|
||||||
|
def show(name):
|
||||||
|
if os.path.exists(name):
|
||||||
|
print "Will remove:", name
|
||||||
|
self.walkFiles(show, show)
|
||||||
|
|
||||||
|
|
||||||
|
def testUninstallAccess(self):
|
||||||
|
def testFile(name):
|
||||||
|
if os.path.exists(name):
|
||||||
|
if not os.access(name, os.W_OK):
|
||||||
|
raise AccessError(name)
|
||||||
|
self.walkFiles(testFile, testFile)
|
||||||
|
|
||||||
|
|
||||||
|
def doUninstall(self):
|
||||||
|
def removeFile(name):
|
||||||
|
if os.path.exists(name):
|
||||||
|
print "Removing:", name
|
||||||
|
os.unlink(name)
|
||||||
|
def removeDir(name):
|
||||||
|
print "Removing:", name
|
||||||
|
if os.path.exists(name):
|
||||||
|
hasFiles = os.listdir(name)
|
||||||
|
if hasFiles: # perhaps some left over symlinks, or .pyc files
|
||||||
|
for file in hasFiles:
|
||||||
|
os.unlink(os.path.join(name, file))
|
||||||
|
os.rmdir(name)
|
||||||
|
|
||||||
|
try:
|
||||||
|
self.testUninstallAccess()
|
||||||
|
except AccessError, e:
|
||||||
|
print "UNABLE TO UNINSTALL!\nNo permission to remove: ", e.args[0]
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
self.walkFiles(removeFile, removeDir)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def findInstalled():
|
||||||
|
installed = []
|
||||||
|
for name in glob.glob(os.path.join(RCPTDIR, "wxPython*")):
|
||||||
|
ir = InstalledReceipt(name)
|
||||||
|
installed.append(ir)
|
||||||
|
|
||||||
|
return installed
|
||||||
|
|
||||||
|
|
||||||
|
# Just in case a Python < 2.3 is used to run this
|
||||||
|
try:
|
||||||
|
enumerate
|
||||||
|
except NameError:
|
||||||
|
def enumerate(sequence):
|
||||||
|
return zip(range(len(sequence)), sequence)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if len(sys.argv) > 1 and sys.argv[1] == "-doit":
|
||||||
|
inst = cPickle.loads(urllib.unquote(sys.argv[2]))
|
||||||
|
inst.doUninstall()
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
print __doc__
|
||||||
|
installed = findInstalled()
|
||||||
|
|
||||||
|
if not installed:
|
||||||
|
print "*** No wxPython installations found! ***"
|
||||||
|
raw_input("Press RETURN...")
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
for i, inst in enumerate(installed):
|
||||||
|
print " %d. %s \t%s" % (i+1, inst.mdata["Title"], inst.mdata["Version"])
|
||||||
|
|
||||||
|
print
|
||||||
|
ans = raw_input("Enter the number of the install to examine or 'Q' to quit: ")
|
||||||
|
if ans in ['Q', 'q']:
|
||||||
|
sys.exit()
|
||||||
|
inst = installed[int(ans) - 1]
|
||||||
|
|
||||||
|
while True:
|
||||||
|
print
|
||||||
|
print """
|
||||||
|
Title: %(Title)s
|
||||||
|
Version: %(Version)s
|
||||||
|
Description: %(Description)s
|
||||||
|
""" % inst.mdata
|
||||||
|
|
||||||
|
ans = raw_input("(U)ninstall, (S)how what will be removed, or (Q)uit? [u,s,q] ")
|
||||||
|
if ans in ['Q', 'q']:
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
elif ans in ['S', 's']:
|
||||||
|
inst.showFiles()
|
||||||
|
|
||||||
|
elif ans in ['U', 'u']:
|
||||||
|
print
|
||||||
|
print "Launching uninstaller with sudo, please enter your password if prompted:"
|
||||||
|
os.system("sudo %s -doit %s" %
|
||||||
|
(sys.argv[0],
|
||||||
|
urllib.quote(cPickle.dumps(inst))))
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
@@ -31,6 +31,7 @@ function usage {
|
|||||||
echo " skiptar Don't unpack the tarball"
|
echo " skiptar Don't unpack the tarball"
|
||||||
echo " inplace Don't use the tarball, build from the CVS tree instead"
|
echo " inplace Don't use the tarball, build from the CVS tree instead"
|
||||||
echo " (The Docs and Demo tarballs are still required for a full build.)"
|
echo " (The Docs and Demo tarballs are still required for a full build.)"
|
||||||
|
echo " unicode Make a unicode build"
|
||||||
echo " skipconfig Don't run configure"
|
echo " skipconfig Don't run configure"
|
||||||
echo " skipbuild Don't build wxWidgets or wxPython"
|
echo " skipbuild Don't build wxWidgets or wxPython"
|
||||||
echo " skipinstall Don't do the installation step"
|
echo " skipinstall Don't do the installation step"
|
||||||
@@ -61,6 +62,7 @@ skipinstall=no
|
|||||||
skipdmg=no
|
skipdmg=no
|
||||||
skipclean=no
|
skipclean=no
|
||||||
inplace=no
|
inplace=no
|
||||||
|
unicode=no
|
||||||
|
|
||||||
for flag in $*; do
|
for flag in $*; do
|
||||||
case ${flag} in
|
case ${flag} in
|
||||||
@@ -71,6 +73,7 @@ for flag in $*; do
|
|||||||
skipdmg) skipdmg=yes ;;
|
skipdmg) skipdmg=yes ;;
|
||||||
skipclean) skipclean=yes ;;
|
skipclean) skipclean=yes ;;
|
||||||
inplace) inplace=yes; skiptar=yes ;;
|
inplace) inplace=yes; skiptar=yes ;;
|
||||||
|
unicode) unicode=yes ;;
|
||||||
|
|
||||||
*) echo "Unknown flag \"${flag}\""
|
*) echo "Unknown flag \"${flag}\""
|
||||||
usage
|
usage
|
||||||
@@ -86,9 +89,15 @@ PYLIB=$PYPREFIX/lib/python$PYVER
|
|||||||
SITEPACKAGES=$PYLIB/site-packages
|
SITEPACKAGES=$PYLIB/site-packages
|
||||||
SHORTVER=`echo $VERSION | cut -c 1,2,3`
|
SHORTVER=`echo $VERSION | cut -c 1,2,3`
|
||||||
|
|
||||||
# TODO: enable selecting unicode or ansi builds, then set this accordingly...
|
if [ $unicode == yes ]; then
|
||||||
CHARTYPE=ansi
|
CHARTYPE=unicode
|
||||||
|
UNICODEOPT=--enable-unicode
|
||||||
|
PYUNICODEOPT=1
|
||||||
|
else
|
||||||
|
CHARTYPE=ansi
|
||||||
|
UNICODEOPT=--disable-unicode
|
||||||
|
PYUNICODEOPT=0
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
if [ -z "$TARBALLDIR" ]; then
|
if [ -z "$TARBALLDIR" ]; then
|
||||||
@@ -118,7 +127,7 @@ fi
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
PREFIX=/usr/local/lib/wxPython-$VERSION
|
PREFIX=/usr/local/lib/wxPython-$CHARTYPE-$VERSION
|
||||||
BINPREFIX=/usr/local/bin
|
BINPREFIX=/usr/local/bin
|
||||||
|
|
||||||
WXROOT=`dirname $PWD`
|
WXROOT=`dirname $PWD`
|
||||||
@@ -126,9 +135,15 @@ PROGDIR="`dirname \"$0\"`"
|
|||||||
TMPDIR=$PWD/_build_dmg
|
TMPDIR=$PWD/_build_dmg
|
||||||
|
|
||||||
BUILDROOT=$TMPDIR/build
|
BUILDROOT=$TMPDIR/build
|
||||||
INSTALLROOT=$TMPDIR/install
|
|
||||||
INSTALLDEVEL=$TMPDIR/install-devel
|
INSTALLROOT=$TMPDIR/install-root
|
||||||
|
INSTALLCOMMON=$TMPDIR/install-common
|
||||||
|
INSTALLAPPS=$TMPDIR/install-apps
|
||||||
|
|
||||||
DMGDIR=$TMPDIR/dmg
|
DMGDIR=$TMPDIR/dmg
|
||||||
|
DMGROOT=$DMGDIR/root
|
||||||
|
DMGAPPS=$DMGDIR/apps
|
||||||
|
|
||||||
RESOURCEDIR=$PROGDIR/resources
|
RESOURCEDIR=$PROGDIR/resources
|
||||||
DESTDIR=$PWD/dist
|
DESTDIR=$PWD/dist
|
||||||
SRCROOT=$BUILDROOT/wxPython-src-$VERSION
|
SRCROOT=$BUILDROOT/wxPython-src-$VERSION
|
||||||
@@ -139,11 +154,13 @@ SRCROOT=$BUILDROOT/wxPython-src-$VERSION
|
|||||||
|
|
||||||
mkdir -p $BUILDROOT
|
mkdir -p $BUILDROOT
|
||||||
mkdir -p $INSTALLROOT
|
mkdir -p $INSTALLROOT
|
||||||
#mkdir -p $INSTALLDEVEL
|
mkdir -p $INSTALLCOMMON
|
||||||
|
mkdir -p $INSTALLAPPS
|
||||||
|
|
||||||
rm -rf $DMGDIR
|
rm -rf $DMGDIR
|
||||||
mkdir -p $DMGDIR/root/Apps
|
mkdir -p $DMGROOT
|
||||||
mkdir -p $DMGDIR/root/Docs
|
mkdir -p $DMGAPPS/Docs
|
||||||
mkdir -p $DMGDIR/root/Samples
|
mkdir -p $DMGAPPS/Samples
|
||||||
|
|
||||||
|
|
||||||
pushd $BUILDROOT
|
pushd $BUILDROOT
|
||||||
@@ -191,11 +208,8 @@ if [ $skipconfig != yes ]; then
|
|||||||
--enable-debug_flag \
|
--enable-debug_flag \
|
||||||
--enable-precomp=no \
|
--enable-precomp=no \
|
||||||
--enable-optimise \
|
--enable-optimise \
|
||||||
|
$UNICODEOPT
|
||||||
|
|
||||||
## --with-libjpeg=builtin \
|
|
||||||
## --with-libpng=builtin \
|
|
||||||
## --with-libtiff=builtin \
|
|
||||||
## --with-zlib=builtin \
|
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -205,8 +219,10 @@ if [ $skipbuild != yes ]; then
|
|||||||
# Make wxWidgets and some contribs
|
# Make wxWidgets and some contribs
|
||||||
|
|
||||||
# For some reason Rez and DeRez have started locking up if run as root...
|
# For some reason Rez and DeRez have started locking up if run as root...
|
||||||
chmod a+w lib
|
if [ "$UID" = "0" ]; then
|
||||||
su robind -c "make lib/libwx_macd-2.5.3.r"
|
chmod a+w lib
|
||||||
|
su robind -c "make lib/libwx_macd-2.5.3.r"
|
||||||
|
fi
|
||||||
|
|
||||||
make
|
make
|
||||||
make -C contrib/src/gizmos
|
make -C contrib/src/gizmos
|
||||||
@@ -216,6 +232,7 @@ if [ $skipbuild != yes ]; then
|
|||||||
# Build wxPython
|
# Build wxPython
|
||||||
cd $WXDIR/wxPython
|
cd $WXDIR/wxPython
|
||||||
$PYTHON setup.py \
|
$PYTHON setup.py \
|
||||||
|
UNICODE=$PYUNICODEOPT \
|
||||||
NO_SCRIPTS=1 \
|
NO_SCRIPTS=1 \
|
||||||
EP_ADD_OPTS=1 \
|
EP_ADD_OPTS=1 \
|
||||||
WX_CONFIG="$WXBLD/wx-config --inplace" \
|
WX_CONFIG="$WXBLD/wx-config --inplace" \
|
||||||
@@ -242,6 +259,7 @@ if [ $skipinstall != yes ]; then
|
|||||||
# and wxPython
|
# and wxPython
|
||||||
cd $WXDIR/wxPython
|
cd $WXDIR/wxPython
|
||||||
$PYTHON setup.py \
|
$PYTHON setup.py \
|
||||||
|
UNICODE=$PYUNICODEOPT \
|
||||||
NO_SCRIPTS=1 \
|
NO_SCRIPTS=1 \
|
||||||
EP_ADD_OPTS=1 \
|
EP_ADD_OPTS=1 \
|
||||||
WX_CONFIG="$INSTALLROOT/$PREFIX/bin/wx-config --prefix=$INSTALLROOT/$PREFIX" \
|
WX_CONFIG="$INSTALLROOT/$PREFIX/bin/wx-config --prefix=$INSTALLROOT/$PREFIX" \
|
||||||
@@ -263,21 +281,34 @@ if [ $skipinstall != yes ]; then
|
|||||||
SITEPACKAGES=/Library/Python/$PYVER
|
SITEPACKAGES=/Library/Python/$PYVER
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# move the common files to $INSTALLCOMMON
|
||||||
|
mkdir -p $INSTALLCOMMON$SITEPACKAGES
|
||||||
|
mv $INSTALLROOT$SITEPACKAGES/wx.pth $INSTALLCOMMON$SITEPACKAGES
|
||||||
|
mv $INSTALLROOT$SITEPACKAGES/wxversion.py $INSTALLCOMMON$SITEPACKAGES
|
||||||
|
|
||||||
# install wxPython's tool scripts
|
# install wxPython's tool scripts in COMMON too
|
||||||
mkdir -p $INSTALLROOT$BINPREFIX
|
mkdir -p $INSTALLCOMMON$BINPREFIX
|
||||||
cd $WXDIR/wxPython/scripts
|
cd $WXDIR/wxPython/scripts
|
||||||
python$PYVER CreateMacScripts.py $INSTALLROOT $BINPREFIX
|
python$PYVER CreateMacScripts.py $INSTALLCOMMON $BINPREFIX
|
||||||
|
|
||||||
|
|
||||||
# Set premissions for files in $INSTALLROOT
|
# Remove the .pyc/.pyo files they just take up space and can be recreated
|
||||||
|
# during the install.
|
||||||
|
pushd $WXDIR/wxPython
|
||||||
|
$PYTHON $PROGDIR/../zappycfiles.py $INSTALLROOT > /dev/null
|
||||||
|
popd
|
||||||
|
|
||||||
|
# Set premissions for files in $INSTALLROOT and $INSTALLCOMMON
|
||||||
if [ "$UID" = "0" ]; then
|
if [ "$UID" = "0" ]; then
|
||||||
chown -R root:admin $INSTALLROOT
|
chown -R root:admin $INSTALLROOT $INSTALLCOMMON
|
||||||
chmod -R g+w $INSTALLROOT
|
chmod -R g+w $INSTALLROOT $INSTALLCOMMON
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
PKGDIR=`cat $INSTALLROOT/Library/Python/$PYVER/wx.pth`
|
if [ "$KIND" = "panther" ]; then
|
||||||
|
SITEPACKAGES=/Library/Python/$PYVER
|
||||||
|
fi
|
||||||
|
PKGDIR=`cat $INSTALLCOMMON$SITEPACKAGES/wx.pth`
|
||||||
|
|
||||||
popd
|
popd
|
||||||
|
|
||||||
@@ -286,22 +317,27 @@ popd
|
|||||||
# Make the Installer packages and disk image
|
# Make the Installer packages and disk image
|
||||||
if [ $skipdmg != yes ]; then
|
if [ $skipdmg != yes ]; then
|
||||||
|
|
||||||
# Remove the .pyc/.pyo files they just take up space and can be recreated
|
#-----------------------------------------------
|
||||||
# during the install.
|
# The main runtime installer package
|
||||||
$PYTHON $PROGDIR/../zappycfiles.py $INSTALLROOT > /dev/null
|
|
||||||
|
|
||||||
|
|
||||||
# Make the welcome message
|
# Make the welcome message
|
||||||
case $KIND in
|
case $KIND in
|
||||||
panther) W_MSG="the Panther (OS X 10.3.x) version of" ;;
|
panther) W_MSG="the Panther (OS X 10.3.x) version of" ;;
|
||||||
jaguar) W_MSG="the Jaguar (OS X 10.2.x) version of" ;;
|
jaguar) W_MSG="the Jaguar (OS X 10.2.x) version of" ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
|
||||||
cat > $RESOURCEDIR/Welcome.txt <<EOF
|
cat > $RESOURCEDIR/Welcome.txt <<EOF
|
||||||
Welcome!
|
Welcome!
|
||||||
|
|
||||||
This program will install wxPython $VERSION for $W_MSG MacPython-OSX $PYVER.
|
This Installer package will install the wxPython $CHARTYPE runtime $VERSION for $W_MSG MacPython-OSX $PYVER. This includes:
|
||||||
|
|
||||||
You must install onto your current boot disk, even though the installer does not enforce this, otherwise things will not work.
|
* The wxPython packages and modules
|
||||||
|
* The wxWidgets shared libraries and headers
|
||||||
|
|
||||||
|
You must install onto your current boot disk, eventhough the installer does not enforce this, otherwise things will not work.
|
||||||
|
|
||||||
|
You can install more than one version of the wxPython runtime if you desire. You also need to install one instance of the wxPython-common package, which will determine which of the installed runtimes will be the default.
|
||||||
|
|
||||||
Build date: `date`
|
Build date: `date`
|
||||||
EOF
|
EOF
|
||||||
@@ -324,7 +360,6 @@ EOF
|
|||||||
$PYTHON \$2$PYLIB/compileall.py \$2$SITEPACKAGES/$PKGDIR
|
$PYTHON \$2$PYLIB/compileall.py \$2$SITEPACKAGES/$PKGDIR
|
||||||
$PYTHON -O \$2$PYLIB/compileall.py \$2$SITEPACKAGES/$PKGDIR
|
$PYTHON -O \$2$PYLIB/compileall.py \$2$SITEPACKAGES/$PKGDIR
|
||||||
|
|
||||||
|
|
||||||
# and all of the wxPython pacakge should be group writable
|
# and all of the wxPython pacakge should be group writable
|
||||||
chgrp -R admin \$2$SITEPACKAGES/$PKGDIR
|
chgrp -R admin \$2$SITEPACKAGES/$PKGDIR
|
||||||
chmod -R g+w \$2$SITEPACKAGES/$PKGDIR
|
chmod -R g+w \$2$SITEPACKAGES/$PKGDIR
|
||||||
@@ -340,41 +375,124 @@ EOF
|
|||||||
python $PROGDIR/../buildpkg.py \
|
python $PROGDIR/../buildpkg.py \
|
||||||
--Title=wxPython${SHORTVER}-osx-$CHARTYPE-$KIND \
|
--Title=wxPython${SHORTVER}-osx-$CHARTYPE-$KIND \
|
||||||
--Version=$VERSION \
|
--Version=$VERSION \
|
||||||
--Description="wxPython $VERSION for $W_MSG MacPython-OSX $PYVER" \
|
--Description="wxPython $CHARTYPE runtime $VERSION for $W_MSG MacPython-OSX $PYVER" \
|
||||||
--NeedsAuthorization="YES" \
|
--NeedsAuthorization="YES" \
|
||||||
--Relocatable="NO" \
|
--Relocatable="NO" \
|
||||||
--InstallOnly="YES" \
|
--InstallOnly="YES" \
|
||||||
$INSTALLROOT \
|
$INSTALLROOT \
|
||||||
$RESOURCEDIR
|
$RESOURCEDIR
|
||||||
|
|
||||||
mv wxPython${SHORTVER}-osx-$CHARTYPE-$KIND.pkg $DMGDIR/root
|
mv wxPython${SHORTVER}-osx-$CHARTYPE-$KIND.pkg $DMGROOT
|
||||||
|
|
||||||
|
rm $RESOURCEDIR/postflight
|
||||||
|
rm $RESOURCEDIR/preflight
|
||||||
|
rm $RESOURCEDIR/Welcome.txt
|
||||||
|
|
||||||
|
|
||||||
|
#-----------------------------------------------
|
||||||
|
# The common files package
|
||||||
|
|
||||||
|
# Make the welcome message
|
||||||
|
cat > $RESOURCEDIR/Welcome.txt <<EOF
|
||||||
|
Welcome!
|
||||||
|
|
||||||
|
This package contains the common files that are shared between versions of the wxPython runtime. This includes some command line scripts installed to /usr/local/bin as well as a Python .pth file for site-packages that will determine which version of the installed runtimes is the default version.
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Build the common Installer Package...
|
||||||
|
rm -rf wxPython-common-osx-$KIND.pkg
|
||||||
|
python $PROGDIR/../buildpkg.py \
|
||||||
|
--Title=wxPython-common-osx-$KIND \
|
||||||
|
--Version=$VERSION \
|
||||||
|
--Description="Common files for the wxPython runtime ($CHARTYPE-$VERSION)" \
|
||||||
|
--NeedsAuthorization="YES" \
|
||||||
|
--Relocatable="NO" \
|
||||||
|
--InstallOnly="YES" \
|
||||||
|
$INSTALLCOMMON \
|
||||||
|
$RESOURCEDIR
|
||||||
|
|
||||||
|
mv wxPython-common-osx-$KIND.pkg $DMGROOT
|
||||||
|
|
||||||
|
rm $RESOURCEDIR/Welcome.txt
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Make a README.txt to go on the disk image
|
#-----------------------------------------------
|
||||||
cat > "$DMGDIR/root/README 1st.txt" <<EOF
|
# Make a README to go on the disk image
|
||||||
|
cat > "$DMGROOT/README 1st.txt" <<EOF
|
||||||
Welcome to wxPython!
|
Welcome to wxPython!
|
||||||
|
|
||||||
On this disk image you will find the installer for wxPython $VERSION for $W_MSG MacPython-OSX $PYVER. MacPython-OSX is not included.
|
This disk image contains the following items:
|
||||||
|
|
||||||
wxPython${SHORTVER}-osx-$CHARTYPE-$KIND.pkg The installer package.
|
wxPython${SHORTVER}-osx-$CHARTYPE-$VERSION-$KIND
|
||||||
It contains the wxPython extension modules,
|
|
||||||
wxMac dynamic libraries and headers, and some
|
|
||||||
scripts for the command-line tools.
|
|
||||||
|
|
||||||
Everything else here is optional and you can drag them out of the disk
|
This is the main component of the wxPython runtime. It
|
||||||
image and drop them wherever you want. You do need to install the above
|
includes the Python modules and extension modules, as well as
|
||||||
package before you can use any of the items below.
|
the wxWidgets libraries. It is possible to have more than one
|
||||||
|
version of the runtime installed at once if you wish, See
|
||||||
|
http://wkik.wxpython.org/index.cgi/MultiVersionInstalls
|
||||||
|
for details on how to choose which version is installed.
|
||||||
|
|
||||||
|
|
||||||
Apps/wxPython Demo An application bundle version of the demo.
|
wxPython-common-osx-$CHARTYPE-$VERSION-$KIND
|
||||||
(This has it's own copy of the sources within
|
|
||||||
the bundle.)
|
|
||||||
|
|
||||||
Apps/XRCed An application for editing wxPython resource
|
This is the common files for the runtime that are shared
|
||||||
|
between all versions of the runtime. You need to have one of
|
||||||
|
these installed and it will determine which of the runtimes is
|
||||||
|
the default one that is imported with "import wx", so it
|
||||||
|
should match the version and character type of one of the
|
||||||
|
installed runtimes. If you are wanting to have only one
|
||||||
|
wxPython installed then be sure to install both of the
|
||||||
|
packages in this disk image.
|
||||||
|
|
||||||
|
uninstall_wxPython.py
|
||||||
|
|
||||||
|
A simple tool to help you manage your installed versions of
|
||||||
|
wxPython. It will allow you to choose from the currently
|
||||||
|
installed wxPython packages and to select one for
|
||||||
|
uninstallation. It is a text-mode tool so you can either run
|
||||||
|
it from a Terminal command line, or you can open it with
|
||||||
|
PythonLauncher and let it create a Terminal to run it in.
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cp $PROGDIR/../uninstall_wxPython.py $DMGROOT
|
||||||
|
|
||||||
|
|
||||||
|
#-----------------------------------------------
|
||||||
|
# Make a disk image to hold these files
|
||||||
|
dmgname=wxPython${SHORTVER}-osx-$CHARTYPE-$VERSION-$KIND-py$PYVER
|
||||||
|
$PROGDIR/../makedmg $DMGROOT $DMGDIR $dmgname
|
||||||
|
|
||||||
|
echo Moving $DMGDIR/$dmgname.dmg to $DESTDIR
|
||||||
|
mv $DMGDIR/$dmgname.dmg $DESTDIR
|
||||||
|
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Now create app bundles for the demo, docs, and tools and make another
|
||||||
|
# disk image to hold it all.
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
cat > "$DMGAPPS/README 1st.txt" <<EOF
|
||||||
|
Welcome to wxPython!
|
||||||
|
|
||||||
|
On this disk image you will find Demo, Tools, Docs, and etc. for
|
||||||
|
wxPython $VERSION. Everything here is optional and you can drag them
|
||||||
|
out of the disk image and drop them wherever you want. You will need
|
||||||
|
to have an installed wxPython runtime to be able to use any of them.
|
||||||
|
|
||||||
|
|
||||||
|
wxPython Demo An application bundle version of the demo.
|
||||||
|
(This has it's own copy of the demo sources
|
||||||
|
within the bundle.)
|
||||||
|
|
||||||
|
XRCed An application for editing wxPython resource
|
||||||
files (XRC files.)
|
files (XRC files.)
|
||||||
|
|
||||||
Apps/PyCrust An application that provides an interactive
|
PyCrust An application that provides an interactive
|
||||||
Python shell and also namespace inspectors.
|
Python shell and also namespace inspectors.
|
||||||
|
|
||||||
|
|
||||||
@@ -402,7 +520,7 @@ EOF
|
|||||||
|
|
||||||
# wxDocs
|
# wxDocs
|
||||||
if [ ! -e $TARBALLDIR/wxPython-docs-$VERSION.tar.gz ]; then
|
if [ ! -e $TARBALLDIR/wxPython-docs-$VERSION.tar.gz ]; then
|
||||||
cat > "$DMGDIR/root/Docs/Build ERROR.txt" <<EOF
|
cat > "$DMGAPPS/Docs/Build ERROR.txt" <<EOF
|
||||||
|
|
||||||
The wxPython-docs tarball was not found when building this disk image!
|
The wxPython-docs tarball was not found when building this disk image!
|
||||||
|
|
||||||
@@ -415,15 +533,15 @@ EOF
|
|||||||
|
|
||||||
# Make an app to launch viewdocs.py
|
# Make an app to launch viewdocs.py
|
||||||
$PYTHONW $PROGDIR/../buildapp.py \
|
$PYTHONW $PROGDIR/../buildapp.py \
|
||||||
--builddir=$DMGDIR/root/Docs \
|
--builddir=$DMGAPPS/Docs \
|
||||||
--name=wxDocsViewer \
|
--name=wxDocsViewer \
|
||||||
--mainprogram=$BUILDROOT/wxPython-$VERSION/docs/viewdocs.py \
|
--mainprogram=$BUILDROOT/wxPython-$VERSION/docs/viewdocs.py \
|
||||||
--iconfile=$PROGDIR/Info.icns \
|
--iconfile=$PROGDIR/Info.icns \
|
||||||
build
|
build
|
||||||
|
|
||||||
cp $BUILDROOT/wxPython-$VERSION/docs/*.zip $DMGDIR/root/Docs/wxDocsViewer.app/Contents/Resources
|
cp $BUILDROOT/wxPython-$VERSION/docs/*.zip $DMGAPPS/Docs/wxDocsViewer.app/Contents/Resources
|
||||||
|
|
||||||
cat > "$DMGDIR/root/Docs/README 1st.txt" <<EOF
|
cat > "$DMGAPPS/Docs/README 1st.txt" <<EOF
|
||||||
|
|
||||||
The wxDocsViewer application needs to be copied to your Desktop (or
|
The wxDocsViewer application needs to be copied to your Desktop (or
|
||||||
someplace else you have write access to) before you can run it, so it
|
someplace else you have write access to) before you can run it, so it
|
||||||
@@ -434,7 +552,7 @@ EOF
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# license files, docs, etc.
|
# license files, docs, etc.
|
||||||
pushd $DMGDIR/root/Docs
|
pushd $DMGAPPS/Docs
|
||||||
cp -pR $SRCROOT/wxPython/licence .
|
cp -pR $SRCROOT/wxPython/licence .
|
||||||
cp -pR $SRCROOT/wxPython/docs .
|
cp -pR $SRCROOT/wxPython/docs .
|
||||||
rm -rf docs/bin
|
rm -rf docs/bin
|
||||||
@@ -444,17 +562,17 @@ EOF
|
|||||||
|
|
||||||
|
|
||||||
if [ ! -e $TARBALLDIR/wxPython-demo-$VERSION.tar.gz ]; then
|
if [ ! -e $TARBALLDIR/wxPython-demo-$VERSION.tar.gz ]; then
|
||||||
cat > "$DMGDIR/root/Samples/Build ERROR.txt" <<EOF
|
cat > "$DMGAPPS/Samples/Build ERROR.txt" <<EOF
|
||||||
|
|
||||||
The wxPython-demo tarball was not found when building this disk image!
|
The wxPython-demo tarball was not found when building this disk image!
|
||||||
|
|
||||||
EOF
|
EOF
|
||||||
cp "$DMGDIR/root/Samples/Build ERROR.txt" $DMGDIR/root/Apps
|
cp "$DMGAPPS/Samples/Build ERROR.txt" $DMGAPPS
|
||||||
|
|
||||||
else
|
else
|
||||||
|
|
||||||
# Copy the demo and samples to the disk image from the tarball
|
# Copy the demo and samples to the disk image from the tarball
|
||||||
pushd $DMGDIR/root/Samples
|
pushd $DMGAPPS/Samples
|
||||||
tar xzvf $TARBALLDIR/wxPython-demo-$VERSION.tar.gz
|
tar xzvf $TARBALLDIR/wxPython-demo-$VERSION.tar.gz
|
||||||
mv wxPython-$VERSION/* .
|
mv wxPython-$VERSION/* .
|
||||||
rm -rf wxPython-$VERSION
|
rm -rf wxPython-$VERSION
|
||||||
@@ -464,46 +582,47 @@ EOF
|
|||||||
|
|
||||||
# Make an app bundle to run the demo
|
# Make an app bundle to run the demo
|
||||||
$PYTHONW $PROGDIR/../buildapp.py \
|
$PYTHONW $PROGDIR/../buildapp.py \
|
||||||
--builddir=$DMGDIR/root/Apps \
|
--builddir=$DMGAPPS \
|
||||||
--name="wxPython Demo" \
|
--name="wxPython Demo" \
|
||||||
--mainprogram=$DMGDIR/root/Samples/demo/demo.pyw \
|
--mainprogram=$DMGAPPS/Samples/demo/demo.pyw \
|
||||||
--iconfile=$PROGDIR/RunDemo.icns \
|
--iconfile=$PROGDIR/RunDemo.icns \
|
||||||
build
|
build
|
||||||
cp -pR $DMGDIR/root/Samples/demo/* "$DMGDIR/root/Apps/wxPython Demo.app/Contents/Resources"
|
cp -pR $DMGAPPS/Samples/demo/* "$DMGAPPS/wxPython Demo.app/Contents/Resources"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
# Make an app bundle to launch PyCrust
|
# Make an app bundle to launch PyCrust
|
||||||
$PYTHONW $PROGDIR/../buildapp.py \
|
$PYTHONW $PROGDIR/../buildapp.py \
|
||||||
--builddir=$DMGDIR/root/Apps \
|
--builddir=$DMGAPPS \
|
||||||
--name=PyCrust \
|
--name=PyCrust \
|
||||||
--mainprogram=$INSTALLROOT$BINPREFIX/pycrust.py \
|
--mainprogram=$INSTALLCOMMON$BINPREFIX/pycrust.py \
|
||||||
--iconfile=$PROGDIR/PieShell.icns \
|
--iconfile=$PROGDIR/PieShell.icns \
|
||||||
build
|
build
|
||||||
|
|
||||||
# # and PyAlaMode
|
# # and PyAlaMode
|
||||||
# $PYTHONW $PROGDIR/../buildapp.py \
|
# $PYTHONW $PROGDIR/../buildapp.py \
|
||||||
# --builddir=$DMGDIR/root \
|
# --builddir=$DMGAPPS \
|
||||||
# --name=PyAlaMode \
|
# --name=PyAlaMode \
|
||||||
# --mainprogram=$INSTALLROOT$BINPREFIX/pyalamode.py \
|
# --mainprogram=$INSTALLCOMMON$BINPREFIX/pyalamode.py \
|
||||||
# --iconfile=$PROGDIR/PieShell.icns \
|
# --iconfile=$PROGDIR/PieShell.icns \
|
||||||
# build
|
# build
|
||||||
|
|
||||||
# Make an app to launch XRCed
|
# Make an app to launch XRCed
|
||||||
$PYTHONW $PROGDIR/../buildapp.py \
|
$PYTHONW $PROGDIR/../buildapp.py \
|
||||||
--builddir=$DMGDIR/root/Apps \
|
--builddir=$DMGAPPS \
|
||||||
--name=XRCed \
|
--name=XRCed \
|
||||||
--mainprogram=$INSTALLROOT$BINPREFIX/xrced.py \
|
--mainprogram=$INSTALLCOMMON$BINPREFIX/xrced.py \
|
||||||
--iconfile=$PROGDIR/XRCed.icns \
|
--iconfile=$PROGDIR/XRCed.icns \
|
||||||
build
|
build
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# and then finally make a disk image containing the packages and etc.
|
# and then finally make a disk image containing everything
|
||||||
$PROGDIR/../makedmg $DMGDIR/root $DMGDIR wxPython${SHORTVER}-osx-$CHARTYPE-$VERSION-$KIND-py$PYVER
|
dmgname=wxPython${SHORTVER}-osx-docs-demos-$VERSION
|
||||||
|
$PROGDIR/../makedmg $DMGAPPS $DMGDIR $dmgname
|
||||||
|
|
||||||
echo Moving $DMGDIR/wxPython${SHORTVER}-osx-$CHARTYPE-$VERSION-$KIND-py$PYVER.dmg to $DESTDIR
|
echo Moving $DMGDIR/$dmgname.dmg to $DESTDIR
|
||||||
mv $DMGDIR/wxPython${SHORTVER}-osx-$CHARTYPE-$VERSION-$KIND-py$PYVER.dmg $DESTDIR
|
mv $DMGDIR/$dmgname.dmg $DESTDIR
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
@@ -189,6 +189,10 @@ Added (thanks to Kevin Ollivier!) wrappers for wx.WebKitCtrl for the
|
|||||||
OSX build. Other platforms will raise an exception if you try to use
|
OSX build. Other platforms will raise an exception if you try to use
|
||||||
it.
|
it.
|
||||||
|
|
||||||
|
wxPython on OSX can now be built in Unicode mode, can support multiple
|
||||||
|
version installs, and comes with an uninstaller script.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user