- Remove previous version of the binary distribution script for OSX

- Some small bugfixes for the IDLE.app wrapper
- Tweaks to build-installer to ensure that python gets build in the right way,
  including sqlite3.
- Updated readme files
This commit is contained in:
Ronald Oussoren 2006-05-26 12:23:20 +00:00
parent 2856e5f390
commit 736123605c
15 changed files with 88 additions and 664 deletions

View File

@ -591,10 +591,10 @@ def buildPython():
version = getVersion() version = getVersion()
print "Running configure..." print "Running configure..."
runCommand("%s -C --enable-framework --enable-universalsdk=%s LDFLAGS='-g -L'%s/libraries/usr/local/lib OPT='-g -O3 -I'%s/libraries/usr/local/include 2>&1"%( runCommand("%s -C --enable-framework --enable-universalsdk=%s LDFLAGS='-g -L%s/libraries/usr/local/lib' OPT='-g -O3 -I%s/libraries/usr/local/include' 2>&1"%(
shellQuote(os.path.join(SRCDIR, 'configure')), shellQuote(os.path.join(SRCDIR, 'configure')),
shellQuote(SDKPATH), shellQuote(WORKDIR), shellQuote(SDKPATH), shellQuote(WORKDIR)[1:-1],
shellQuote(WORKDIR))) shellQuote(WORKDIR)[1:-1]))
print "Running make" print "Running make"
runCommand("make") runCommand("make")
@ -839,6 +839,7 @@ def buildInstaller():
writePlist(pl, os.path.join(pkgroot, 'Resources', 'Description.plist')) writePlist(pl, os.path.join(pkgroot, 'Resources', 'Description.plist'))
for fn in os.listdir('resources'): for fn in os.listdir('resources'):
if fn == '.svn': continue
if fn.endswith('.jpg'): if fn.endswith('.jpg'):
shutil.copy(os.path.join('resources', fn), os.path.join(rsrcDir, fn)) shutil.copy(os.path.join('resources', fn), os.path.join(rsrcDir, fn))
else: else:

View File

@ -1,50 +0,0 @@
Building a MacPython distribution
=================================
The ``build`` shell script here creates MacPython distributions.
It builds a complete framework-based Python out-of-tree, installs
it in a funny place with $DESTROOT, massages that installation to remove
.pyc files and such, creates an Installer package from the installation
plus the stuff in ``resources`` and compresses that installer as a
``.dmg`` disk image.
Here are the steps you ned to follow to build a MacPython installer:
- There are various version numbers that need to be updated. Weed through
``Mac/OSXResources``, ``Mac/scripts`` and ``Mac/Tools`` and inspect the
various ``.plist`` and ``.strings`` files. Note that the latter are
UTF-16 files.
- Edit ``resource/ReadMe.txt`` and ``resources/Welcome.rtf`` to reflect
version number and such.
- Edit ``build`` to change ``PYVERSION``, ``PYVER`` and ``BUILDNUM``.
- Edit ``resources/postflight`` and change version number.
- Run ``./build``. Optionally you can pass the name of the directory
where Python will be built, so you don't have to wait for the complete
build when you're debugging the process. For the final distribution use
a clean build.
- When done the script will tell you where the DMG image is.
Currently (November 2003) there is still a bug in the build procedure
for $DESTROOT builds: building some of the applets will fail (in
``Mac/OSX/Makefile``) if you don't have the same version of Python installed
normally. So before doing the distribution you should build and install
a framework Python in the normal way.
When all is done, announcements can be posted to at least the following
places:
- pythonmac-sig@python.org
- python-dev@python.org
- python-announce@python.org
- archivist@info-mac.org
- adcnews@apple.com
- news@macnn.com
- http://www.macupdate.com
- http://guide.apple.com/usindex.lasso
- http://www.apple.com/downloads/macosx/submit
- http://www.versiontracker.com/ (userid Jack.Jansen@oratrix.com)
- http://www.macshareware.net (userid jackjansen)
Also, check out Stephan Deibels http://pythonology.org/market contact list
After all this is done you may also need to update the Package Manager
database for the new distribution. A description of this remains TBD.

View File

@ -1,164 +0,0 @@
#!/bin/sh -e
#----------------------------------------------------------------------
# Build MacPython 2.5 and make an Installer package of it
# TODO: Parameterize the versions, builddirs, etc...
# Script configs
PYVERSION=2.5a0
PYVER=2.5
BUILDNUM=1
DOCLEANUP=no
PROGDIR="`dirname \"$0\"`"
case x$PROGDIR in
x|x.) PROGDIR=`pwd` ;;
x/*) ;;
*) echo "Please run with a full pathname"
exit 1
;;
esac
TMPDIR=/tmp/_py
#TMPDIR=/projects/_py
INSTALLROOT=$TMPDIR/install
DMGDIR=$TMPDIR/dmg
RESOURCEDIR=$PROGDIR/resources
DESTDIR=$TMPDIR/dist
PYTHONSRC=$PROGDIR/../../..
WASTEDIR=$PYTHONSRC/../waste
case x$1 in
x)
BUILDROOT=$TMPDIR/build
;;
*)
BUILDROOT=$1
;;
esac
# Setup
if [ -e $BUILDROOT ]; then
echo Using existing build directory $BUILDROOT
CLEANBUILD=no
else
echo Creating clean build directory $BUILDROOT
CLEANBUILD=yes
mkdir -p $BUILDROOT
fi
rm -rf $DMGDIR
if [ ! -e $TMPDIR ]; then
mkdir $TMPDIR
fi
chgrp admin $TMPDIR
mkdir -p $DMGDIR/root
# Configure and build Python
pushd $BUILDROOT
# Ask the user whether s/he has edited Welcome.txt
read -p "Have you updated $RESOURCEDIR/Welcome.txt (Y/n)? " welcome
if [ "$welcome" = "n" -o "$welcome" = "N" ]; then
echo "Please do so and retry"
exit
fi
# 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 -C --enable-framework LDFLAGS=-Wl,-x
$PYTHONSRC/configure -C --enable-framework
make
make DIRMODE=775 EXEMODE=775 FILEMODE=664 DESTDIR=$INSTALLROOT frameworkinstall
make DIRMODE=775 EXEMODE=775 FILEMODE=664 DESTDIR=$INSTALLROOT frameworkinstallextras
# Unfortunately all the ...MODE arguments above still don't do the trick.
# Cop out, and recursively set everything group-writeable.
chmod -R ug+w $INSTALLROOT
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 -rf $INSTALLROOT/usr
# Next, remove the .pyc/.pyo files
python $PYTHONSRC/Mac/scripts/zappycfiles.py $INSTALLROOT/Library/Frameworks/Python.framework/Versions/$PYVER/lib/python$PYVER
python $PYTHONSRC/Mac/scripts/zappycfiles.py $INSTALLROOT/Library/Frameworks/Python.framework/Versions/$PYVER/Mac/Tools
# Finally, build the package...
rm -rf MacPython-OSX.pkg
python $PYTHONSRC/Mac/scripts/buildpkg.py \
--Title=MacPython-OSX \
--Version=$PYVERSION-$BUILDNUM \
--Description="Python $PYVERSION for Mac OS X, framework based" \
--NeedsAuthorization="YES" \
--Relocatable="NO" \
--InstallOnly="YES" \
--UseUserMask="NO" \
$INSTALLROOT \
$RESOURCEDIR
# --RootVolumeOnly="YES" \
# ...and then make a disk image containing the package.
mv MacPython-OSX.pkg $DMGDIR/root
cp $RESOURCEDIR/ReadMe.txt $DMGDIR/root/ReadMe.txt
$PROGDIR/makedmg $DMGDIR/root $DMGDIR MacPython-OSX-$PYVERSION-$BUILDNUM
echo Moving $DMGDIR/MacPython-OSX-$PYVERSION-$BUILDNUM to $DESTDIR
if [ ! -e $DESTDIR ]; then
mkdir $DESTDIR
fi
mv $DMGDIR/MacPython-OSX-$PYVERSION-$BUILDNUM.dmg $DESTDIR
# Cleanup build/install dirs
if [ $DOCLEANUP = yes ]; then
echo "Cleaning up..."
if [ $CLEANBUILD = yes ]; then
rm -rf $BUILDROOT
fi
rm -rf $INSTALLROOT
rm -rf $DMGDIR
else
echo "Cleanup is disabled. You should remove these dirs when done:"
if [ $CLEANBUILD = yes ]; then
echo " $BUILDROOT"
fi
echo " $INSTALLROOT"
echo " $DMGDIR"
fi
echo "Your installer can be found in $DESTDIR"

View File

@ -1,51 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Description</key>
<string>Enter database description</string>
<key>Maintainer</key>
<string>Enter your email address</string>
<key>Packages</key>
<array>
<dict>
<key>Description</key>
<string>Enter package description</string>
<key>Download-URL</key>
<string>Enter URL for archive download, delete for pseudo-pkgs</string>
<key>Flavor</key>
<string>Enter binary or source</string>
<key>Home-page</key>
<string>Enter URL of human-readable webpage</string>
<key>Install-command</key>
<string>Enter shell commands to run for installation</string>
<key>Install-test</key>
<string>Enter Python code to test for already installed</string>
<key>MD5Sum</key>
<string>Enter checksum of package archive</string>
<key>Name</key>
<string>Enter name of package</string>
<key>Post-install-command</key>
<string>Enter shell command to run after install</string>
<key>Pre-install-command</key>
<string>Enter shell command to run before install</string>
<key>Prerequisites</key>
<array>
<string>Enter human-readable recipy for pseudo-dependencies</string>
<dict>
<key>Flavor</key>
<string>Enter optional flavor for real dependency</string>
<key>Name</key>
<string>Enter name for real dependency</string>
<key>Version</key>
<string></string>
</dict>
</array>
<key>Version</key>
<string>Enter version string for package</string>
</dict>
</array>
<key>Version</key>
<string>0.1</string>
</dict>
</plist>

View File

@ -1,95 +0,0 @@
#!/usr/bin/perl -w
#
# make disk image from folder
#
# usage: makedmg src dst name
#
# Donated by Frank Vercruesse
$hdiUtilExec = "/usr/bin/hdiutil";
$hdiDrvExec = "/usr/bin/hdid";
$newfsExec = "/sbin/newfs_hfs";
$duExec = "/usr/bin/du";
$dittoExec = "/usr/bin/ditto";
if ( $#ARGV != 2 ) {
die "Wrong number of arguments.\nUsage: makedmg src dst name\n";
}
&make_dmg( $ARGV[0], $ARGV[1], $ARGV[2]);
sub make_dmg
{
my $src = $_[0];
my $dst = $_[1];
my $name = $_[2];
# check dirs
if( not -d $dst && -d $src ) {
die "src and dst must be directories\n";
}
# calc disk image size
if( not open( MYPIPE, "$duExec -sk \"${src}\" |") ) {
die "couldn't open pipe\n";
}
(my $dmgsize) = split( /\s+/, <MYPIPE>);
close( MYPIPE);
$dmgsize /= 1024;
$dmgsize = int($dmgsize + 4);
if( $dmgsize < 5 ) {
$dmgsize = 5
}
# create disk image
system "cd \"$dst\"; $hdiUtilExec create -megabytes $dmgsize -ov \"_${name}\"";
if( $? ) { die "couldn't create disk image\n"; }
# format disk image
if( not open( MYPIPE, "cd \"$dst\"; $hdiDrvExec -nomount \"_${name}.dmg\" |") ) {
die "couldn't open pipe\n";
}
(my $dev) = split( /\t/, <MYPIPE>);
$dev =~ s/^(.*\S)\s*$/$1/;
my( $part, $raw, $pname);
while( <MYPIPE> ) {
($part,$pname) = split /\t/;
if( $pname =~ m/^Apple_HFS/ ) {
$part =~ s/^\s*(.*\S)\s*$/$1/;
$raw = $part;
$raw =~ s/^(\/dev\/)(.+)/$1r$2/;
last;
}
}
close( MYPIPE);
system "cd \"$dst\" ; $newfsExec -v \"$name\" $raw";
if( $? ) { system "$hdiUtilExec eject $dev"; die "couldn't format disk image\n"; }
system "$hdiUtilExec eject $dev";
if( $? ) { die "couldn't eject disk image\n"; }
# copy files
if( not open( MYPIPE, "cd \"$dst\"; $hdiDrvExec \"_${name}.dmg\" |") ) {
die "couldn't open pipe\n";
}
($dev) = split( /\t/, <MYPIPE>);
$dev =~ s/^(.*\S)\s*$/$1/;
my $vname;
while( <MYPIPE> ) {
($part,$pname,$vname) = split /\t/;
if( $pname =~ m/^Apple_HFS/ ) {
$vname =~ s/^(.*\S)\s*$/$1/;
last;
}
}
close( MYPIPE);
system "$dittoExec \"${src}\" \"${vname}\"";
if( $? ) { system "$hdiUtilExec eject $dev"; die "couldn't copy files\n"; }
system "$hdiUtilExec eject $dev";
if( $? ) { die "couldn't eject disk image\n"; }
# convert disk image
system "cd \"$dst\"; $hdiUtilExec convert \"_${name}.dmg\" -format UDCO -o \"${name}\"";
if( $? ) { die "couldn't convert disk image\n"; }
}

View File

@ -1,31 +0,0 @@
This package will install MacPython 2.5a0 for Mac OS X
10.3.
Installation requires approximately 20 MB of disk
space, ignore the message that it will take zero bytes.
You must install onto your current boot disk, even
though the installer does not enforce this, otherwise
things will not work.
MacPython consists of the Python programming language
interpreter, plus a set of programs to allow easy
access to it for Mac users (an integrated development
environment, a Python extension package manager), plus
a set of pre-built extension modules that open up
specific Macintosh technologies to Python programs
(Carbon, AppleScript, Quicktime, more).
The installer puts the applications in MacPython-2.5 in
your Applications folder, command-line tools in
/usr/local/bin and the underlying machinery in
/Library/Frameworks/Python.framework.
The PythonIDE application has a Help command that gets
you started quickly with MacPython and contains
references to other documentation.
More information on MacPython can be found at
http://www.cwi.nl/~jack/macpython, more
information on Python in general at
http://www.python.org.

View File

@ -1,15 +0,0 @@
{\rtf1\mac\ansicpg10000\cocoartf102
{\fonttbl\f0\fswiss\fcharset77 Helvetica;\f1\fswiss\fcharset77 Helvetica-Bold;}
{\colortbl;\red255\green255\blue255;}
\paperw11900\paperh16840\margl1440\margr1440\vieww9920\viewh10660\viewkind0
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural
\f0\fs24 \cf0 This package will install
\f1\b MacPython 2.5a0
\f0\b0 for
\f1\b Mac OS X 10.3
\f0\b0 . Installation on 10.2 or earlier will not work.\
\
MacPython consists of the Python programming language interpreter, plus a set of programs to allow easy access to it for Mac users (an integrated development environment, a Python extension package manager), plus a set of pre-built extension modules that open up specific Macintosh technologies to Python programs (Carbon, AppleScript, Quicktime, more).\
\
See the ReadMe file for more information.}

View File

@ -1,92 +0,0 @@
#!/bin/sh
#----------------------------------------------------------------------
# Create the unix tools and compile the .py files after Python has been
# installed.
#----------------------------------------------------------------------
PYVER=2.5
PKG=$1
DEST=$2
# Make sure things are group-writeable
umask 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
ln -fsh $DEST/Library/Frameworks/Python.framework/Versions/$PYVER/bin/python $TOOLDIR/python$PYVER
ln -fsh python$PYVER $TOOLDIR/python
# make the pythonw script
rm -f $TOOLDIR/pythonw$PYVER
cat > $TOOLDIR/pythonw$PYVER <<EOF
#!/bin/sh
exec "$DEST/Library/Frameworks/Python.framework/Versions/$PYVER/Resources/Python.app/Contents/MacOS/Python" "\$@"
EOF
chmod +x $TOOLDIR/pythonw$PYVER
ln -fsh pythonw$PYVER $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
$TOOLDIR/python -Wi -tt \
$DEST/Library/Frameworks/Python.framework/Versions/$PYVER/lib/python$PYVER/compileall.py \
$DEST/Library/Frameworks/Python.framework/Versions/$PYVER/Mac/Tools
$TOOLDIR/python -Wi -tt -O \
$DEST/Library/Frameworks/Python.framework/Versions/$PYVER/lib/python$PYVER/compileall.py \
$DEST/Library/Frameworks/Python.framework/Versions/$PYVER/Mac/Tools
# Make the site-packages and other dirs writable by the admin if destination is /
if [ "$DEST" = "/" ]; then
for d in $DEST/Library/Frameworks/Python.framework/Versions/$PYVER/lib/python$PYVER/site-packages \
$DEST/Library/Frameworks/Python.framework/Versions/$PYVER/bin \
$DEST/Library/Frameworks/Python.framework/Versions/$PYVER/Resources/Python.app/Contents/Resources \
$DEST/Applications/MacPython-$PYVER; do
chgrp -R admin $d
chmod -R g+w $d
done
fi
if [ "$DEST" != "/" ]; then
# The link in the app bundles and in pydoc need updating.
installed_python=$DEST/Library/Frameworks/Python.framework/Versions/$PYVER/Resources/Python.app/Contents/MacOS/python
for app in BuildApplet IDLE PackageManager PythonIDE; do
ln -fsh $installed_python \
$DEST/Applications/MacPython-$PYVER/$app.app/Contents/MacOS
ed -s $DEST/Applications/MacPython-$PYVER/$app.app/Contents/MacOS/$app << xyzzy
1c
#!$installed_python
.
w
q
xyzzy
ed -s $DEST/Library/Frameworks/Python.framework/Versions/$PYVER/bin/pydoc << xyzzy
1c
#!$installed_python
.
w
q
xyzzy
done
fi

View File

@ -3,12 +3,3 @@ This folder contains examples of Python usage and useful scripts and tools.
You should be aware that these are not Macintosh-specific but are shared You should be aware that these are not Macintosh-specific but are shared
among Python on all platforms, so there are some that only run on Windows among Python on all platforms, so there are some that only run on Windows
or Unix or another platform, and/or make little sense on a Macintosh. or Unix or another platform, and/or make little sense on a Macintosh.
Some examples can be run from within the PythonIDE, but many will require
that you start them from the command line or with PythonLauncher. In the
latter case, you can supply any needed command line arguments by holding
the "alt" key while dragging the script to PythonLauncher, or while
double-clicking the script if PythonLauncher is set as the default application
to open Python scripts with. See "Changing the application that opens a file"
in Mac Help for information on making PythonLauncher the default application.

View File

@ -12,6 +12,7 @@ def isclean(name):
if name == 'CVS': return 0 if name == 'CVS': return 0
if name == '.cvsignore': return 0 if name == '.cvsignore': return 0
if name == '.DS_store': return 0 if name == '.DS_store': return 0
if name == '.svn': return 0
if name.endswith('~'): return 0 if name.endswith('~'): return 0
if name.endswith('.BAK'): return 0 if name.endswith('.BAK'): return 0
if name.endswith('.pyc'): return 0 if name.endswith('.pyc'): return 0

View File

@ -38,7 +38,7 @@ IDLE.app: \
$(srcdir)/../Icons/IDLE.icns $(srcdir)/idlemain.py \ $(srcdir)/../Icons/IDLE.icns $(srcdir)/idlemain.py \
$(srcdir)/../Icons/PythonSource.icns \ $(srcdir)/../Icons/PythonSource.icns \
$(srcdir)/../Icons/PythonCompiled.icns $(srcdir)/../Icons/PythonCompiled.icns
rm -fr PythonLauncher.app rm -fr IDLE.app
$(RUNSHARED) $(BUILDPYTHON) $(BUNDLEBULDER) \ $(RUNSHARED) $(BUILDPYTHON) $(BUNDLEBULDER) \
--builddir=. \ --builddir=. \
--name=IDLE \ --name=IDLE \

View File

@ -7,7 +7,7 @@ from idlelib.PyShell import main
# Change the current directory the user's home directory, that way we'll get # Change the current directory the user's home directory, that way we'll get
# a more useful default location in the open/save dialogs. # a more useful default location in the open/save dialogs.
os.chdir(os.expanduser('~')) os.chdir(os.path.expanduser('~/Documents'))
# Make sure sys.executable points to the python interpreter inside the # Make sure sys.executable points to the python interpreter inside the

View File

@ -1,29 +1,57 @@
Building and using a framework-based Python on Mac OS X. ============
-------------------------------------------------------- MacOSX Notes
============
This document provides a quick overview of some Mac OS X specific features in
the Python distribution.
Building and using a universal binary of Python on Mac OS X
===========================================================
1. What is a universal binary
-----------------------------
A universal binary build of Python contains object code for both PPC and i386
and can therefore run at native speed on both classic powerpc based macs and
the newer intel based macs.
2. How do I build a universal binary
------------------------------------
You can enable universal binaries by specifying the "--enable-universalsdk"
flag to configure::
$ ./configure --enable-universalsdk
$ make
$ make install
This flag can be used a framework build of python, but also with a classic
unix build. Either way you will have to build python on Mac OS X 10.4 (or later)
with Xcode 2.1 (or later). You also have to install the 10.4u SDK when
installing Xcode.
Building and using a framework-based Python on Mac OS X.
========================================================
This document provides a quick introduction to framework-based Python, its
advantages, and how to build it.
1. Why would I want a framework Python instead of a normal static Python? 1. Why would I want a framework Python instead of a normal static Python?
-------------------------------------------------------------------------- --------------------------------------------------------------------------
The main reason is because you want to create GUI programs in Python. With the The main reason is because you want to create GUI programs in Python. With the
exception of X11/XDarwin-based GUI toolkits it appears that all GUI programs exception of X11/XDarwin-based GUI toolkits all GUI programs need to be run
need to be run from a fullblown MacOSX application (a ".app" bundle). from a fullblown MacOSX application (a ".app" bundle).
While it is technically possible to create a .app without using frameworks you While it is technically possible to create a .app without using frameworks you
will have to do the work yourself if you really want this. will have to do the work yourself if you really want this.
A second reason for using frameworks is that they put Python-related items in A second reason for using frameworks is that they put Python-related items in
only two places: /Library/Framework/Python.framework and /Applications/MacPython-2.3. only two places: "/Library/Framework/Python.framework" and
This simplifies matters for users installing Python from a binary distribution "/Applications/MacPython 2.5". This simplifies matters for users installing
if they want to get rid of it again. Moreover, due to the way frameworks work Python from a binary distribution if they want to get rid of it again. Moreover,
a user without admin privileges can install a binary distribution in his or due to the way frameworks work a user without admin privileges can install a
her home directory without recompilation. binary distribution in his or her home directory without recompilation.
Incidentally, the procedure described here is also the procedure that is
used to create the MacPython binary installer, so the information here
should theoretically allow you to rebuild that.
2. How does a framework Python differ from a normal static Python? 2. How does a framework Python differ from a normal static Python?
------------------------------------------------------------------ ------------------------------------------------------------------
@ -37,44 +65,40 @@ Versions/Current and you will see the familiar bin and lib directories.
3. Do I need extra packages? 3. Do I need extra packages?
---------------------------- ----------------------------
Yes, probably. If you want to be able to use the PythonIDE you will need to Yes, probably. If you want Tkinter support you need to get the OSX AquaTk
get Waste, an all-singing-all-dancing TextEdit replacement, from distribution, this is installed by default on Mac OS X 10.4 or later. If
www.merzwaren.com. It will unpack into a folder named something like "Waste
2.1 Distribution". Make a symlink called "waste" to this folder, somewhere
beside your Python source distribution (it can be "../waste", "../../waste",
etc).
If you want Tkinter support you need to get the OSX AquaTk distribution. If
you want wxPython you need to get that. If you want Cocoa you need to get you want wxPython you need to get that. If you want Cocoa you need to get
pyobjc. Because all these are currently in a state of flux please refer to PyObjC.
http://www.cwi.nl/~jack/macpython.html, which should contain pointers to more
information.
4. How do I build a framework Python? 4. How do I build a framework Python?
------------------------------------- -------------------------------------
This directory contains a Makefile that will create a couple of python-related This directory contains a Makefile that will create a couple of python-related
applications (fullblown OSX .app applications, that is) in applications (fullblown OSX .app applications, that is) in
/Applications/MacPython-2.3, and a hidden helper application Python.app inside the "/Applications/MacPython 2.3", and a hidden helper application Python.app
Python.framework, and unix tools "python" and "pythonw" into /usr/local/bin. inside the Python.framework, and unix tools "python" and "pythonw" into
In addition it has a target "installmacsubtree" that installs the relevant /usr/local/bin. In addition it has a target "installmacsubtree" that installs
portions of the Mac subtree into the Python.framework. the relevant portions of the Mac subtree into the Python.framework.
It is normally invoked indirectly through the main Makefile, as the last step It is normally invoked indirectly through the main Makefile, as the last step
in the sequence in the sequence
1. ./configure --enable-framework
2. make 1. ./configure --enable-framework
3. make frameworkinstall
2. make
3. make install
This sequence will put the framework in /Library/Framework/Python.framework, This sequence will put the framework in /Library/Framework/Python.framework,
the applications in /Applications/Python and the unix tools in /usr/local/bin. the applications in /Applications/MacPython 2.5 and the unix tools in
/usr/local/bin.
Installing in another place, for instance $HOME/Library/Frameworks if you have Installing in another place, for instance $HOME/Library/Frameworks if you have
no admin privileges on your machine, has only been tested very lightly. This no admin privileges on your machine, has only been tested very lightly. This
can be done by configuring with --enable-framework=$HOME/Library/Frameworks. can be done by configuring with --enable-framework=$HOME/Library/Frameworks.
The other two directories, /Applications/MacPython-2.3 and /usr/local/bin, will then The other two directories, /Applications/MacPython-2.3 and /usr/local/bin, will
also be deposited in $HOME. This is sub-optimal for the unix tools, which you then also be deposited in $HOME. This is sub-optimal for the unix tools, which
would want in $HOME/bin, but there is no easy way to fix this right now. you would want in $HOME/bin, but there is no easy way to fix this right now.
Note that there are no references to the actual locations in the code or Note that there are no references to the actual locations in the code or
resource files, so you are free to move things around afterwards. For example, resource files, so you are free to move things around afterwards. For example,
@ -89,18 +113,13 @@ There is an extra target frameworkinstallextras that is not part of the
normal frameworkinstall which installs the Demo and Tools directories normal frameworkinstall which installs the Demo and Tools directories
into /Applications/MacPython-2.3, this is useful for binary distributions. into /Applications/MacPython-2.3, this is useful for binary distributions.
If you want to run the Makefile here directly, in stead of through the main What do all these programs do?
Makefile, you will have to pass various variable-assignments. Read the ===============================
beginning of the Makefile for details.
"IDLE.app" is an integrated development environment for Python: editor,
5. What do all these programs do?
---------------------------------
PythonIDE.app is an integrated development environment for Python: editor,
debugger, etc. debugger, etc.
PythonLauncher.app is a helper application that will handle things when you "PythonLauncher.app" is a helper application that will handle things when you
double-click a .py, .pyc or .pyw file. For the first two it creates a Terminal double-click a .py, .pyc or .pyw file. For the first two it creates a Terminal
window and runs the scripts with the normal command-line Python. For the window and runs the scripts with the normal command-line Python. For the
latter it runs the script in the Python.app interpreter so the script can do latter it runs the script in the Python.app interpreter so the script can do
@ -108,7 +127,7 @@ GUI-things. Keep the "alt" key depressed while dragging or double-clicking a
script to set runtime options. These options can be set once and for all script to set runtime options. These options can be set once and for all
through PythonLauncher's preferences dialog. through PythonLauncher's preferences dialog.
BuildApplet.app creates an applet from a Python script. Drop the script on it "BuildApplet.app" creates an applet from a Python script. Drop the script on it
and out comes a full-featured MacOS application. There is much more to this, and out comes a full-featured MacOS application. There is much more to this,
to be supplied later. Some useful (but outdated) info can be found in to be supplied later. Some useful (but outdated) info can be found in
Mac/Demo. Mac/Demo.
@ -116,43 +135,27 @@ Mac/Demo.
The commandline scripts /usr/local/bin/python and pythonw can be used to run The commandline scripts /usr/local/bin/python and pythonw can be used to run
non-GUI and GUI python scripts from the command line, respectively. non-GUI and GUI python scripts from the command line, respectively.
6. How do I create a binary distribution? How do I create a binary distribution?
----------------------------------------- ======================================
First go to Mac/OSX and run "python fixversions.py -a" with the Python Go to the directory "Mac/OSX/BuildScript". There you'll find a script
you are going to distribute. This will fix the version numbers and copyright "build-installer.py" that does all the work. This will download and build
strings in the various Info.plist files. a number of 3th-party libaries, configures and builds a framework Python,
installs it, creates the installer pacakge files and then packs this in a
DMG image.
Go to the Mac/OSX/Dist directory. There you find a script "build" that The script will build a universal binary, you'll therefore have to run this
does all the work: it configures and builds a framework Python, installs script on Mac OS X 10.4 or later and with Xcode 2.1 or later installed.
it, creates the installer package file and packs this in a DMG image.
All of this is normally done completely isolated in /tmp/_py, so it does not All of this is normally done completely isolated in /tmp/_py, so it does not
use your normal build directory nor does it install into /. use your normal build directory nor does it install into /.
Because the build script locates the Python source tree relative to its own Because of the way the script locates the files it needs you have to run it
pathname you may have to run it with a full pathname. If you are debugging your from within the BuildScript directory. The script accepts a number of
install you can pass one argument: the pathname where the build directory command-line arguments, run it with --help for more information.
is located (i.e. where configure and make will be run), then this directory
will be saved between runs of the build script. Do *not* specify your normal
build directory here.
build will ask you whether you have updated the readme file, and it will offer Odds and ends
to include the full documentation in the installer. That option has not =============
been used for a while, and it may not work.
If you need to execute code on the client machine after installing Python
you can add this to resources/postflight. If you need to do even stranger things
you have to read Apple's documentation on PackageMaker and read the source
of Mac/scripts/buildpkg.py.
7. Odds and ends.
-----------------
The PythonLauncher is actually an Objective C Cocoa app built with Project
Builder. It could be a Python program, except for the fact that pyobjc is not
a part of the core distribution, and is not completely finished yet as of this
writing.
Something to take note of is that the ".rsrc" files in the distribution are Something to take note of is that the ".rsrc" files in the distribution are
not actually resource files, they're AppleSingle encoded resource files. The not actually resource files, they're AppleSingle encoded resource files. The
@ -161,3 +164,4 @@ macresource module and the Mac/OSX/Makefile cater for this, and create
files. files.
Jack Jansen, Jack.Jansen@cwi.nl, 15-Jul-2004. Jack Jansen, Jack.Jansen@cwi.nl, 15-Jul-2004.
Ronald Oussoren, RonaldOussoren@mac.com, 26-May-2006

View File

@ -1,69 +0,0 @@
"""fixversions - Fix version numbers in .plist files to match current
python version and date"""
import sys
import os
import time
import plistlib
SHORTVERSION = "%d.%d" % (sys.version_info[0], sys.version_info[1])
if sys.version_info[2]:
SHORTVERSION = SHORTVERSION + ".%d" % sys.version_info[2]
if sys.version_info[3] != 'final':
SHORTVERSION = SHORTVERSION + "%s%d" % (sys.version_info[3], sys.version_info[4])
COPYRIGHT = "(c) %d Python Software Foundation." % time.gmtime()[0]
LONGVERSION = SHORTVERSION + ", " + COPYRIGHT
def fix(file):
plist = plistlib.Plist.fromFile(file)
changed = False
if plist.has_key("CFBundleGetInfoString") and \
plist["CFBundleGetInfoString"] != LONGVERSION:
plist["CFBundleGetInfoString"] = LONGVERSION
changed = True
if plist.has_key("CFBundleLongVersionString") and \
plist["CFBundleLongVersionString"] != LONGVERSION:
plist["CFBundleLongVersionString"] = LONGVERSION
changed = True
if plist.has_key("NSHumanReadableCopyright") and \
plist["NSHumanReadableCopyright"] != COPYRIGHT:
plist["NSHumanReadableCopyright"] = COPYRIGHT
changed = True
if plist.has_key("CFBundleVersion") and \
plist["CFBundleVersion"] != SHORTVERSION:
plist["CFBundleVersion"] = SHORTVERSION
changed = True
if plist.has_key("CFBundleShortVersionString") and \
plist["CFBundleShortVersionString"] != SHORTVERSION:
plist["CFBundleShortVersionString"] = SHORTVERSION
changed = True
if changed:
os.rename(file, file + '~')
plist.write(file)
def main():
if len(sys.argv) < 2:
print "Usage: %s plistfile ..." % sys.argv[0]
print "or: %s -a fix standard Python plist files"
sys.exit(1)
if sys.argv[1] == "-a":
files = [
"../OSXResources/app/Info.plist",
"../OSXResources/framework/version.plist",
"../Tools/IDE/PackageManager.plist",
"../Tools/IDE/PythonIDE.plist",
"../scripts/BuildApplet.plist"
]
if not os.path.exists(files[0]):
print "%s -a must be run from Mac/OSX directory"
sys.exit(1)
else:
files = sys.argv[1:]
for file in files:
fix(file)
sys.exit(0)
if __name__ == "__main__":
main()

View File

@ -1,6 +0,0 @@
import sys
import os
_maclib = os.path.join(sys.prefix, 'Mac', 'Lib')
_scriptlib = os.path.join(_maclib, 'lib-scriptpackages')
sys.path.append(_maclib)
sys.path.append(_scriptlib)