Jack Jansen | 0fdaee7 | 2002-08-02 21:45:27 +0000 | [diff] [blame] | 1 | Building and using a framework-based Python on Mac OS X. |
| 2 | -------------------------------------------------------- |
| 3 | |
Jack Jansen | 7c0d7ba | 2003-06-20 15:14:08 +0000 | [diff] [blame] | 4 | This document provides a quick introduction to framework-based Python, its |
| 5 | advantages, and how to build it. |
Jack Jansen | 0fdaee7 | 2002-08-02 21:45:27 +0000 | [diff] [blame] | 6 | |
| 7 | 1. Why would I want a framework Python in stead of a normal static Python? |
| 8 | -------------------------------------------------------------------------- |
| 9 | |
Jack Jansen | 1f74ed8 | 2002-09-06 21:00:55 +0000 | [diff] [blame] | 10 | The main reason is because you want to create GUI programs in Python. With the |
| 11 | exception of X11/XDarwin-based GUI toolkits it appears that all GUI programs |
Jack Jansen | 0fdaee7 | 2002-08-02 21:45:27 +0000 | [diff] [blame] | 12 | need to be run from a fullblown MacOSX application (a ".app" bundle). |
| 13 | |
Jack Jansen | 1f74ed8 | 2002-09-06 21:00:55 +0000 | [diff] [blame] | 14 | While it is technically possible to create a .app without using frameworks you |
| 15 | will have to do the work yourself if you really want this. |
Jack Jansen | 0fdaee7 | 2002-08-02 21:45:27 +0000 | [diff] [blame] | 16 | |
Jack Jansen | 1f74ed8 | 2002-09-06 21:00:55 +0000 | [diff] [blame] | 17 | A second reason for using frameworks is that they put Python-related items in |
Jack Jansen | 7c0d7ba | 2003-06-20 15:14:08 +0000 | [diff] [blame] | 18 | only two places: /Library/Framework/Python.framework and /Applications/MacPython-2.3. |
Jack Jansen | 0fdaee7 | 2002-08-02 21:45:27 +0000 | [diff] [blame] | 19 | This simplifies matters for users installing Python from a binary distribution |
Jack Jansen | 1f74ed8 | 2002-09-06 21:00:55 +0000 | [diff] [blame] | 20 | if they want to get rid of it again. Moreover, due to the way frameworks work |
| 21 | a user without admin privileges can install a binary distribution in his or |
| 22 | her home directory without recompilation. |
Jack Jansen | 0fdaee7 | 2002-08-02 21:45:27 +0000 | [diff] [blame] | 23 | |
Jack Jansen | 7c0d7ba | 2003-06-20 15:14:08 +0000 | [diff] [blame] | 24 | Incidentally, the procedure described here is also the procedure that is |
| 25 | used to create the MacPython binary installer, so the information here |
| 26 | should theoretically allow you to rebuild that. |
| 27 | |
Jack Jansen | 0fdaee7 | 2002-08-02 21:45:27 +0000 | [diff] [blame] | 28 | 2. How does a framework Python differ from a normal static Python? |
| 29 | ------------------------------------------------------------------ |
| 30 | |
| 31 | In everyday use there is no difference, except that things are stored in |
| 32 | a different place. If you look in /Library/Frameworks/Python.framework |
| 33 | you will see lots of relative symlinks, see the Apple documentation for |
| 34 | details. If you are used to a normal unix Python file layout go down to |
| 35 | Versions/Current and you will see the familiar bin and lib directories. |
| 36 | |
| 37 | 3. Do I need extra packages? |
| 38 | ---------------------------- |
| 39 | |
| 40 | Yes, probably. If you want to be able to use the PythonIDE you will need to |
Jack Jansen | 1f74ed8 | 2002-09-06 21:00:55 +0000 | [diff] [blame] | 41 | get Waste, an all-singing-all-dancing TextEdit replacement, from |
| 42 | www.merzwaren.com. It will unpack into a folder named something like "Waste |
| 43 | 2.1 Distribution". Make a symlink called "waste" to this folder, somewhere |
| 44 | beside your Python source distribution (it can be "../waste", "../../waste", |
| 45 | etc). |
Jack Jansen | 0fdaee7 | 2002-08-02 21:45:27 +0000 | [diff] [blame] | 46 | |
Jack Jansen | 1f74ed8 | 2002-09-06 21:00:55 +0000 | [diff] [blame] | 47 | If you want Tkinter support you need to get the OSX AquaTk distribution. If |
| 48 | you want wxPython you need to get that. If you want Cocoa you need to get |
| 49 | pyobjc. Because all these are currently in a state of flux please refer to |
Jack Jansen | 0fdaee7 | 2002-08-02 21:45:27 +0000 | [diff] [blame] | 50 | http://www.cwi.nl/~jack/macpython.html, which should contain pointers to more |
| 51 | information. |
| 52 | |
| 53 | 4. How do I build a framework Python? |
| 54 | ------------------------------------- |
| 55 | |
Jack Jansen | 21ed16a | 2002-08-02 14:11:24 +0000 | [diff] [blame] | 56 | This directory contains a Makefile that will create a couple of python-related |
Jack Jansen | 1f74ed8 | 2002-09-06 21:00:55 +0000 | [diff] [blame] | 57 | applications (fullblown OSX .app applications, that is) in |
Jack Jansen | 7c0d7ba | 2003-06-20 15:14:08 +0000 | [diff] [blame] | 58 | /Applications/MacPython-2.3, and a hidden helper application Python.app inside the |
Jack Jansen | 1f74ed8 | 2002-09-06 21:00:55 +0000 | [diff] [blame] | 59 | Python.framework, and unix tools "python" and "pythonw" into /usr/local/bin. |
| 60 | In addition it has a target "installmacsubtree" that installs the relevant |
| 61 | portions of the Mac subtree into the Python.framework. |
Jack Jansen | 0511b76 | 2001-09-06 16:36:42 +0000 | [diff] [blame] | 62 | |
Jack Jansen | 21ed16a | 2002-08-02 14:11:24 +0000 | [diff] [blame] | 63 | It is normally invoked indirectly through the main Makefile, as the last step |
| 64 | in the sequence |
Just van Rossum | b7dd494 | 2002-09-16 20:18:27 +0000 | [diff] [blame] | 65 | 1. ./configure --enable-framework |
Jack Jansen | 21ed16a | 2002-08-02 14:11:24 +0000 | [diff] [blame] | 66 | 2. make |
| 67 | 3. make frameworkinstall |
Jack Jansen | 0fdaee7 | 2002-08-02 21:45:27 +0000 | [diff] [blame] | 68 | |
Jack Jansen | 1f74ed8 | 2002-09-06 21:00:55 +0000 | [diff] [blame] | 69 | This sequence will put the framework in /Library/Framework/Python.framework, |
| 70 | the applications in /Applications/Python and the unix tools in /usr/local/bin. |
Jack Jansen | 7a1703d | 2002-08-12 20:46:18 +0000 | [diff] [blame] | 71 | |
Jack Jansen | 7c0d7ba | 2003-06-20 15:14:08 +0000 | [diff] [blame] | 72 | Installing in another place, for instance $HOME/Library/Frameworks if you have |
Jack Jansen | 1f74ed8 | 2002-09-06 21:00:55 +0000 | [diff] [blame] | 73 | no admin privileges on your machine, has only been tested very lightly. This |
| 74 | can be done by configuring with --enable-framework=$HOME/Library/Frameworks. |
Jack Jansen | 7c0d7ba | 2003-06-20 15:14:08 +0000 | [diff] [blame] | 75 | The other two directories, /Applications/MacPython-2.3 and /usr/local/bin, will then |
Jack Jansen | 1f74ed8 | 2002-09-06 21:00:55 +0000 | [diff] [blame] | 76 | also be deposited in $HOME. This is sub-optimal for the unix tools, which you |
| 77 | would want in $HOME/bin, but there is no easy way to fix this right now. |
Jack Jansen | 7a1703d | 2002-08-12 20:46:18 +0000 | [diff] [blame] | 78 | |
Jack Jansen | 1f74ed8 | 2002-09-06 21:00:55 +0000 | [diff] [blame] | 79 | Note that there are no references to the actual locations in the code or |
| 80 | resource files, so you are free to move things around afterwards. For example, |
| 81 | you could use --enable-framework=/tmp/newversion/Library/Frameworks and use |
| 82 | /tmp/newversion as the basis for an installer or something. |
Jack Jansen | 7a1703d | 2002-08-12 20:46:18 +0000 | [diff] [blame] | 83 | |
| 84 | If you want to install some part, but not all, read the main Makefile. The |
Jack Jansen | 1f74ed8 | 2002-09-06 21:00:55 +0000 | [diff] [blame] | 85 | frameworkinstall is composed of a couple of sub-targets that install the |
| 86 | framework itself, the Mac subtree, the applications and the unix tools. |
Jack Jansen | 7a1703d | 2002-08-12 20:46:18 +0000 | [diff] [blame] | 87 | |
Jack Jansen | 7c0d7ba | 2003-06-20 15:14:08 +0000 | [diff] [blame] | 88 | There is an extra target frameworkinstallextras that is not part of the |
| 89 | normal frameworkinstall which installs the Demo and Tools directories |
| 90 | into /Applications/MacPython-2.3, this is useful for binary distributions. |
| 91 | |
Jack Jansen | 1f74ed8 | 2002-09-06 21:00:55 +0000 | [diff] [blame] | 92 | If you want to run the Makefile here directly, in stead of through the main |
| 93 | Makefile, you will have to pass various variable-assignments. Read the |
| 94 | beginning of the Makefile for details. |
Jack Jansen | 7a1703d | 2002-08-12 20:46:18 +0000 | [diff] [blame] | 95 | |
Jack Jansen | 0fdaee7 | 2002-08-02 21:45:27 +0000 | [diff] [blame] | 96 | |
| 97 | 5. What do all these programs do? |
| 98 | --------------------------------- |
| 99 | |
| 100 | PythonIDE.app is an integrated development environment for Python: editor, |
| 101 | debugger, etc. |
| 102 | |
| 103 | PythonLauncher.app is a helper application that will handle things when you |
| 104 | double-click a .py, .pyc or .pyw file. For the first two it creates a Terminal |
Jack Jansen | 1f74ed8 | 2002-09-06 21:00:55 +0000 | [diff] [blame] | 105 | window and runs the scripts with the normal command-line Python. For the |
| 106 | latter it runs the script in the Python.app interpreter so the script can do |
| 107 | GUI-things. Keep the "alt" key depressed while dragging or double-clicking a |
| 108 | script to set runtime options. These options can be set once and for all |
| 109 | through PythonLauncher's preferences dialog. |
Jack Jansen | 0fdaee7 | 2002-08-02 21:45:27 +0000 | [diff] [blame] | 110 | |
| 111 | BuildApplet.app creates an applet from a Python script. Drop the script on it |
Jack Jansen | 1f74ed8 | 2002-09-06 21:00:55 +0000 | [diff] [blame] | 112 | and out comes a full-featured MacOS application. There is much more to this, |
| 113 | to be supplied later. Some useful (but outdated) info can be found in |
| 114 | Mac/Demo. |
Jack Jansen | 0fdaee7 | 2002-08-02 21:45:27 +0000 | [diff] [blame] | 115 | |
Jack Jansen | 1f74ed8 | 2002-09-06 21:00:55 +0000 | [diff] [blame] | 116 | The commandline scripts /usr/local/bin/python and pythonw can be used to run |
| 117 | non-GUI and GUI python scripts from the command line, respectively. |
Jack Jansen | 0fdaee7 | 2002-08-02 21:45:27 +0000 | [diff] [blame] | 118 | |
Jack Jansen | 8ba4220 | 2002-09-06 20:24:51 +0000 | [diff] [blame] | 119 | 6. How do I create a binary distribution? |
| 120 | ----------------------------------------- |
| 121 | |
Jack Jansen | 4f90137 | 2004-07-15 21:30:41 +0000 | [diff] [blame] | 122 | First go to Mac/OSX and run "python fixversions.py -a" with the Python |
| 123 | you are going to distribute. This will fix the version numbers and copyright |
| 124 | strings in the various Info.plist files. |
| 125 | |
Jack Jansen | 7c0d7ba | 2003-06-20 15:14:08 +0000 | [diff] [blame] | 126 | Go to the Mac/OSX/Dist directory. There you find a script "build" that |
| 127 | does all the work: it configures and builds a framework Python, installs |
| 128 | it, creates the installer package file and packs this in a DMG image. |
Jack Jansen | 8ba4220 | 2002-09-06 20:24:51 +0000 | [diff] [blame] | 129 | |
Jack Jansen | 7c0d7ba | 2003-06-20 15:14:08 +0000 | [diff] [blame] | 130 | All of this is normally done completely isolated in /tmp/_py, so it does not |
| 131 | use your normal build directory nor does it install into /. |
Jack Jansen | 8ba4220 | 2002-09-06 20:24:51 +0000 | [diff] [blame] | 132 | |
Jack Jansen | 7c0d7ba | 2003-06-20 15:14:08 +0000 | [diff] [blame] | 133 | Because the build script locates the Python source tree relative to its own |
| 134 | pathname you may have to run it with a full pathname. If you are debugging your |
| 135 | install you can pass one argument: the pathname where the build directory |
| 136 | is located (i.e. where configure and make will be run), then this directory |
| 137 | will be saved between runs of the build script. Do *not* specify your normal |
| 138 | build directory here. |
Jack Jansen | 8ba4220 | 2002-09-06 20:24:51 +0000 | [diff] [blame] | 139 | |
Jack Jansen | 7c0d7ba | 2003-06-20 15:14:08 +0000 | [diff] [blame] | 140 | build will ask you whether you have updated the readme file, and it will offer |
| 141 | to include the full documentation in the installer. That option has not |
| 142 | been used for a while, and it may not work. |
Jack Jansen | 8ba4220 | 2002-09-06 20:24:51 +0000 | [diff] [blame] | 143 | |
Jack Jansen | 7c0d7ba | 2003-06-20 15:14:08 +0000 | [diff] [blame] | 144 | If you need to execute code on the client machine after installing Python |
| 145 | you can add this to resources/postflight. If you need to do even stranger things |
| 146 | you have to read Apple's documentation on PackageMaker and read the source |
| 147 | of Mac/scripts/buildpkg.py. |
Jack Jansen | 8ba4220 | 2002-09-06 20:24:51 +0000 | [diff] [blame] | 148 | |
| 149 | 7. Odds and ends. |
Jack Jansen | 0fdaee7 | 2002-08-02 21:45:27 +0000 | [diff] [blame] | 150 | ----------------- |
Jack Jansen | 0511b76 | 2001-09-06 16:36:42 +0000 | [diff] [blame] | 151 | |
Jack Jansen | 1f74ed8 | 2002-09-06 21:00:55 +0000 | [diff] [blame] | 152 | The PythonLauncher is actually an Objective C Cocoa app built with Project |
| 153 | Builder. It could be a Python program, except for the fact that pyobjc is not |
| 154 | a part of the core distribution, and is not completely finished yet as of this |
| 155 | writing. |
Jack Jansen | 408c16f | 2001-09-11 11:30:02 +0000 | [diff] [blame] | 156 | |
Jack Jansen | 1f74ed8 | 2002-09-06 21:00:55 +0000 | [diff] [blame] | 157 | Something to take note of is that the ".rsrc" files in the distribution are |
| 158 | not actually resource files, they're AppleSingle encoded resource files. The |
| 159 | macresource module and the Mac/OSX/Makefile cater for this, and create |
| 160 | ".rsrc.df.rsrc" files on the fly that are normal datafork-based resource |
| 161 | files. |
Jack Jansen | 0511b76 | 2001-09-06 16:36:42 +0000 | [diff] [blame] | 162 | |
Jack Jansen | 4f90137 | 2004-07-15 21:30:41 +0000 | [diff] [blame] | 163 | Jack Jansen, Jack.Jansen@cwi.nl, 15-Jul-2004. |