Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 1 | <HTML> |
| 2 | <HEAD> |
| 3 | <TITLE>Building Mac Python from source</TITLE> |
| 4 | </HEAD> |
| 5 | <BODY> |
| 6 | <H1>Building Mac Python from source</H1> |
| 7 | <HR> |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 8 | |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 9 | This document explains how to build MacPython from source. This is |
| 10 | necessary if you want to write extension modules for 68K Python, and |
| 11 | currently also probably the easiest way to build PPC extension |
| 12 | modules. Building Python is not something to be undertaken lightly, |
| 13 | the process is not very streamlined so you need a reasonable working |
| 14 | knowledge of the CodeWarrior development environment, a good net |
| 15 | connection and probably quite some time too. <p> |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 16 | |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 17 | The information density in this file is high, so you should probably |
| 18 | print it and read it at your leasure. Most things are explained only |
| 19 | once (and probably in the wrong place:-). <p> |
| 20 | |
| 21 | I am very interested in feedback on this document, contact me at <A |
| 22 | HREF="mailto:jack@cwi.nl"><jack@cwi.nl></A> or send your |
| 23 | comments to the <A |
| 24 | HREF="http://www.python.org/sigs/pythonmac-sig/">Mac Python Special |
| 25 | Interest Group</A>. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 26 | |
| 27 | <H2>What you need.</H2> |
| 28 | |
| 29 | The following things you definitely need: |
| 30 | |
| 31 | <UL> |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 32 | |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 33 | <LI> You need a MacPython source distribution, of course. You can |
| 34 | obtain one from <A |
| 35 | HREF="ftp://ftp.cwi.nl/pub/jack/python/mac">ftp://ftp.cwi.nl/pub/jack/python/mac</A>, |
| 36 | and possibly also from the standard <A |
| 37 | HREF="ftp://ftp.python.org/pub/python/mac">python.org ftp |
| 38 | site</A>. Everything you need is also included in the standard Python |
| 39 | source distribution, but the organization is different. Look in |
| 40 | directory <code>Mac/mwerks/projects</code> for the project files and |
| 41 | related stuff. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 42 | |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 43 | <LI> You need MetroWerks CodeWarrior. The current distribution has |
Jack Jansen | abc2db7 | 1996-11-09 18:48:49 +0000 | [diff] [blame^] | 44 | been built with version 10 of CodeWarrior. Ordering information is |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 45 | available on the <A HREF="http://www.metrowerks.com/">MetroWerks |
| 46 | homepage</A>. You might still be able to build Python with MPW or |
| 47 | Think/Symantec C but you are basically on your own. |
| 48 | |
| 49 | <LI> You need GUSI, the Grand Unified Socket Interface, by Matthias |
Jack Jansen | 16e99c0 | 1996-09-07 17:11:26 +0000 | [diff] [blame] | 50 | Neeracher. The current distribution has been built with a modified version of |
Jack Jansen | 061ac50 | 1996-10-22 15:27:56 +0000 | [diff] [blame] | 51 | CWGUSI 1.8.0. CWGUSI is |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 52 | obtainable from <A |
| 53 | HREF="ftp://ftp.switch.ch/software/mac/src/mw_c">ftp://ftp.switch.ch/software/mac/src/mw_c</A>. |
| 54 | It is possible to build a non-GUSI Python, see below. |
| 55 | |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 56 | </UL> |
| 57 | |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 58 | <A NAME="optional">The MacPython project files are configured to |
| 59 | include a plethora of optional modules</A>, and these modules need a |
| 60 | number extra packages. To use the project files as-is you have to |
Jack Jansen | 27b10ec | 1996-08-23 15:44:18 +0000 | [diff] [blame] | 61 | download these packages too. PPC and CFM68K Python have all such modules as |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 62 | dynamically loaded modules, so if you don't need a certain package it |
Jack Jansen | 27b10ec | 1996-08-23 15:44:18 +0000 | [diff] [blame] | 63 | suffices to just refrain from builing the extension module. For static 68K |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 64 | Python things are a bit more complicated: you have to edit the |
| 65 | interpreter project file to remove the reference to the module (and |
Jack Jansen | 27b10ec | 1996-08-23 15:44:18 +0000 | [diff] [blame] | 66 | the libraries it uses), and edit the <code>Mac:mwerks:mwerks_nonshared_config.h</code> |
| 67 | file to remove the <code>USE_...</code> line. Here are the locations for the various things |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 68 | you need: |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 69 | |
| 70 | <UL> |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 71 | |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 72 | <LI> Tcl and Tk can be obtained from <A |
| 73 | HREF="ftp://ftp.smli.com/pub/tcl/mac/">ftp://ftp.smli.com/pub/tcl/mac/</A>. |
| 74 | The current distributions, Tcl 7.5p1 and Tk 4.1p1 need a bit of work, |
| 75 | see the section on <A HREF="#tcltk">building Tcl/Tk Python</A> |
| 76 | below. Get the "full source" distribution, which includes MoreFiles. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 77 | |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 78 | <LI> Waste, a TextEdit replacement written by Marco Piovanelli, <A |
| 79 | HREF="mailto:piovanel@kagi.com"><piovanel@kagi.com></A>. Python |
| 80 | was built using version 1.2, which you can obtain from <A |
| 81 | HREF="ftp://rhino.harvard.edu/pub/dan/WASTE"><ftp://rhino.harvard.edu/pub/dan/WASTE></A> |
| 82 | and various other places. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 83 | |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 84 | <LI> JPEG library by the Independent JPEG Group. Python is still built |
| 85 | using an archaic version of the library, version 4. It can be obtained |
| 86 | from the <A HREF="ftp://ftp.cwi.nl/pub/jack/python/mac"> |
| 87 | ftp://ftp.cwi.nl/pub/jack/python/mac</A> directory, complete with CW8 |
| 88 | projects. If someone manages to build Python with the version 6 |
| 89 | library I would be grateful if they sent me the changes needed. The |
| 90 | most recent JPEG library can always be obtained from <A |
| 91 | HREF="ftp://ftp.uu.net/graphics/jpeg/">ftp://ftp.uu.net/graphics/jpeg/</A>. |
| 92 | |
| 93 | <LI> The netpbm/pbmplus and libtiff libraries. The netpbm distribution |
| 94 | (which includes libtiff) is generally available on Internet ftp |
| 95 | servers. For Python pbmplus, an older incarnation of netpbm, is |
| 96 | functionally identical to netpbm, since Python only uses the library |
| 97 | and not the complete applications. A distribution with correct |
| 98 | projects and library source only is available from, you guessed it, <A |
| 99 | HREF="ftp://ftp.cwi.nl/pub/jack/python/mac">ftp://ftp.cwi.nl/pub/jack/python/mac</A>. |
| 100 | |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 101 | </UL> |
| 102 | |
| 103 | <H2>Setting Up</H2> |
| 104 | |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 105 | Now that you have collected everything you should start with building |
| 106 | the various parts. Everything is independent, with the single |
| 107 | exception that Tcl and Tk depend on CWGUSI. If you don't want to fix |
| 108 | access paths try to set things up as follows: |
| 109 | |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 110 | <PRE> |
| 111 | Top-level-folder: |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 112 | CWGUSI |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 113 | imglibs |
| 114 | libjpeg |
| 115 | pbmplus |
| 116 | libtiff |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 117 | MoreFiles 1.4.2 (not needed by Python, only by tcl/tk) |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 118 | Python |
| 119 | Tcl 7.5 |
| 120 | Tk 4.1 |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 121 | Waste 1.2 distribution (if you want waste) |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 122 | </PRE> |
| 123 | |
Jack Jansen | 16e99c0 | 1996-09-07 17:11:26 +0000 | [diff] [blame] | 124 | First build GUSI. Move the files from the "CWGUSI-mods" to the right |
| 125 | place in the CWGUSI distribution folder, and build the |
Jack Jansen | abc2db7 | 1996-11-09 18:48:49 +0000 | [diff] [blame^] | 126 | projects <code>GUSI.68K.µ</code>, <code>GUSI.CFM68K.µ</code> and |
| 127 | <code>GUSI.PPC.µ</code>. |
| 128 | Two notes: |
| 129 | <ul> |
| 130 | <li> The projects as distributed have a slightly incorrect access path, due |
| 131 | to which they cannot find their <code>GUSICWFile.???</code> files. Change |
| 132 | the access path to <code>{project folder}::</code> to fix this. |
| 133 | <li> The Gusi CFM68K project is |
| 134 | distributed without "far data": you should set this option before building. |
| 135 | </ul> |
Jack Jansen | 319f1a2 | 1996-10-16 15:28:30 +0000 | [diff] [blame] | 136 | If you have a CWGUSI version more recent than |
Jack Jansen | abc2db7 | 1996-11-09 18:48:49 +0000 | [diff] [blame^] | 137 | 1.8 it could be that the fixes are already included, check it. Alternatively, |
Jack Jansen | 16e99c0 | 1996-09-07 17:11:26 +0000 | [diff] [blame] | 138 | you can forget about the fixes and remove the one reference to GUSILoadPreferences |
| 139 | in the Python sources. This will disable the "default file creator/type" and |
| 140 | "Delay Sioux window" preferences in Python. |
| 141 | |
| 142 | Next, in |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 143 | <code>MoreFiles</code>, <code>libjpeg</code>, <code>pbmplus</code> |
| 144 | and<code>libtiff</code> you build all projects. Tcl/tk is a special |
Jack Jansen | 27b10ec | 1996-08-23 15:44:18 +0000 | [diff] [blame] | 145 | case, see below. Of course, if you are only interested in one of |
| 146 | static 68K, CFM68K or PPC you can skip building the other libraries. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 147 | |
| 148 | <H2><A NAME="tcltk">Building Tcl/Tk</H2> |
| 149 | |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 150 | You need to make a minor organizational change to the Tcl/Tk |
| 151 | distribution. The current instructions are for the |
| 152 | <code>tcl7.5.1</code> and <code>tk4.1.1</code> distribution: |
| 153 | |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 154 | <UL> |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 155 | |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 156 | <LI> Rename the <code>compat</code> folders to <code>(compat)</code> |
| 157 | in both the Tcl and Tk folders. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 158 | |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 159 | <LI> In the Tcl folder, move <code>strncasecmp.c</code> and |
| 160 | <code>tclErrno.h</code> from <code>(compat)</code> to the main Tcl |
| 161 | folder. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 162 | |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 163 | <LI> Fix <code>dnr.c</code> as provided by MetroWerks by inserting |
| 164 | <pre><code> #pragma ANSI_strict off </code></pre> at the |
| 165 | beginning. The tcl library is built with strict ANSI on, and this file |
| 166 | uses C++ style comments. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 167 | |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 168 | <LI> If you want to build <code>SimpleTcl</code> and |
| 169 | <code>SimpleTk</code> you will probably have to remove the references |
| 170 | to <code>libmoto</code> from the project. |
| 171 | |
| 172 | <LI> You are <EM>strongly</EM> advised to add a line |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 173 | <pre><code> |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 174 | #define USE_TCLALLOC 1 |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 175 | </code></pre> |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 176 | somewhere at the beginning of <code>MW_TclHeader.pch</code>. |
| 177 | As distributed, tcl and tk assume that malloc calls always succeed and |
| 178 | use the resulting pointer without checking for <code>NULL</code> |
| 179 | values. Needless to say, this wreaks havoc on a Macintosh. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 180 | |
Jack Jansen | 27b10ec | 1996-08-23 15:44:18 +0000 | [diff] [blame] | 181 | <LI> If you want to build for CFM68K you have to modify <code>TclMacNotify.c</code> |
| 182 | because there is an error in the Apple Universal headers (sic!). Read the |
| 183 | comments at the beginning of <code>Mac:Python:macglue.c</code> and copy the |
| 184 | code to <code>TclMacNotify.c</code>. If you get linker errors on <code>GetEvQHdr</code> |
| 185 | you have not done this correctly. |
| 186 | |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 187 | </UL> |
| 188 | |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 189 | Build first the MoreFiles library, then the Tcl library, then |
| 190 | SimpleTcl (test it by typing <code>ls -l</code> in the window you get) |
| 191 | then the Tk library, then SimpleTk (which can again be tested with |
| 192 | <code>ls -l</code>). If this all worked you are all set to try |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 193 | building Python. |
| 194 | |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 195 | <H2>Building Waste</H2> |
| 196 | |
| 197 | You do not need to build the Waste libraries, as Python includes the |
| 198 | source modules themselves. You have to make one modification, |
| 199 | though. In file <code>ICCFMGlue.c</code> in folder <code>Minimal IC |
| 200 | APIs</code>, add the following lines: |
| 201 | |
| 202 | <blockquote><pre><code> |
| 203 | #include <Gestalt.h> |
| 204 | #include <Errors.h> |
| 205 | </code></pre></blockquote> |
| 206 | |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 207 | <H2>The organization of the Python source tree</H2> |
| 208 | |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 209 | Time for a short break, while we have a look at the organization of |
| 210 | the Python source tree. At the top level, we find the following |
| 211 | folders: |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 212 | |
| 213 | <DL> |
| 214 | <DT> build.mac68k.stand |
Jack Jansen | 27b10ec | 1996-08-23 15:44:18 +0000 | [diff] [blame] | 215 | <DD> This is where you will build static 68K interpreters. |
| 216 | |
| 217 | <DT> build.mac68k.shared |
| 218 | <DD> This is where you build the CFM68K shared library, interpreter |
| 219 | and applet framework. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 220 | |
| 221 | <DT> build.macppc.shared |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 222 | <DD> This is where you build the PPC shared library, interpreter and |
Jack Jansen | 27b10ec | 1996-08-23 15:44:18 +0000 | [diff] [blame] | 223 | applet framework. You can also build the fat applet framework here. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 224 | |
| 225 | <DT> build.macppc.stand |
| 226 | <DD> This is where you build a nonshared PPC interpreter (optional). |
| 227 | |
| 228 | <DT> Demo |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 229 | <DD> Demo programs that are not Mac-specific. Some of these may not |
| 230 | work, the file <code>README-Mac</code> has some details. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 231 | |
| 232 | <DT> Extensions |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 233 | <DD> Extensions to the interpreter that are not Mac-specific. Contains |
| 234 | only the <code>img</code> extension in this distribution. Extensions |
| 235 | are <em>not</em> built here, as they are on Unix, but incorporated in |
| 236 | the core interpreter or built as plugin modules. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 237 | |
| 238 | <DT> Grammar |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 239 | <DD> The Python grammar. Included for reference only, you cannot build |
| 240 | the parser on a Mac. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 241 | |
| 242 | <DT> Include |
| 243 | <DD> Machine-independent header files. |
| 244 | |
| 245 | <DT> Modules |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 246 | <DD> Machine-independent optional modules. Not all of these will work |
| 247 | on the Mac. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 248 | |
| 249 | <DT> Objects |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 250 | <DD> Machine-independent code for various objects. Most of these are |
| 251 | not really optional: the interpreter will not function without them. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 252 | |
| 253 | <DT> Parser |
| 254 | <DD> The Python parser (machine-independent). |
| 255 | |
| 256 | <DT> PlugIns |
Jack Jansen | 27b10ec | 1996-08-23 15:44:18 +0000 | [diff] [blame] | 257 | <DD> This is where you build the PPC and CFM68K dynamically-loaded plugin modules. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 258 | |
| 259 | <DT> Python |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 260 | <DD> The core interpreter. Most files are machine-independent, some |
| 261 | are unix-specific and not used on the Mac. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 262 | |
| 263 | <DT> Tools |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 264 | <DD> Tools for python developers. Contains <code>modulator</code> |
| 265 | which builds skeleton C extension modules and <code>bgen</code> which |
| 266 | generates complete interface modules from information in C header |
| 267 | files. There are some readme files, but more documentation is sorely |
| 268 | needed. |
| 269 | |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 270 | </DL> |
| 271 | |
| 272 | All the mac-specific stuff lives in the <code>Mac</code> folder: |
| 273 | <DL> |
| 274 | |
| 275 | <DT> Compat |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 276 | <DD> Unix-compatability routines. Some of these are not used anymore, |
| 277 | since CWGUSI provides a rather complete emulation, but you may need |
| 278 | these if you are trying to build a non-GUSI python. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 279 | |
| 280 | <DT> Demo |
| 281 | <DD> Mac-specific demo programs, some of them annotated. |
| 282 | |
| 283 | <DT> Include |
| 284 | <DD> Mac-specific but compiler-independent include files. |
| 285 | |
| 286 | <DT> Lib |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 287 | <DD> Mac-specific standard modules. The <code>toolbox</code> folder |
| 288 | contains modules specifically needed with various MacOS toolbox |
| 289 | interface modules. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 290 | |
| 291 | <DT> Modules |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 292 | <DD> Mac-specific builtin modules. Theoretically these are all |
| 293 | optional, but some are rather essential (like |
| 294 | <code>macmodule</code>). A lot of these modules are generated with |
| 295 | <code>bgen</code>, in which case the bgen input files are included so |
| 296 | you can attempt to regenerate them or extend them. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 297 | |
| 298 | <DT> MPW |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 299 | <DD> MPW-specific files. These have not been used or kept up-to-date |
| 300 | for a long time, so use at your own risk. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 301 | |
| 302 | <DT> mwerks |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 303 | <DD> Mwerks-specific sources and headers. Contains glue code for |
| 304 | Pythons shared-library architecture, a replacement for |
| 305 | <code>malloc</code> and a directory with various projects for building |
| 306 | variations on the Python interpreter. The <code>mwerks_*.h</code> |
| 307 | files here are the option-setting files for the various interpreters |
| 308 | and such, comparable to the unix command-line <code>-D</code> options |
| 309 | to the compiler. Each project uses the correct option file as its |
| 310 | "prefix file" in the "C/C++ language" settings. Disabling optional |
| 311 | modules (for the 68K interpreter), building non-GUSI interpreters and |
| 312 | various other things are accomplished by modifying these files (and |
| 313 | possibly changing the list of files included in the project window, of |
| 314 | course). |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 315 | |
| 316 | <DT> Python |
| 317 | <DD> Mac-specific parts of the core interpreter. |
| 318 | |
| 319 | <DT> Resources |
| 320 | <DD> Resource files needed to build the interpreter. |
| 321 | |
| 322 | <DT> Scripts |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 323 | <DD> A collection of various mac-specific Python scripts. Some are |
| 324 | essential, some are useful but few are documented, so you will have to |
| 325 | use your imagination to work them out. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 326 | |
| 327 | <DT> Unsupported |
| 328 | <DD> Modules that are not supported any longer but may still work with a little effort. |
| 329 | </DL> |
| 330 | |
| 331 | <H2>Building the 68K interpreter</H2> |
| 332 | |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 333 | If you have all the optional libraries mentioned <A |
| 334 | HREF="#optional">above</A> loaded buildin Python for 68K macs is a |
| 335 | breeze: open the project in the folder <code>build.mac68k.stand</code> |
| 336 | and build it. Do <em>not</em> run it yet, this will possibly result |
| 337 | in a garbled preferences file. <p> |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 338 | |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 339 | First remove the <code>Python preferences</code> file from your |
| 340 | preference folder, only if you had an older version of Python |
| 341 | installed. (this is also what you do if you did not heed the last |
| 342 | sentence of the preceeding paragraph). Next, move the interpreter to |
| 343 | the main Python folder (up one level) and run it there. This will |
| 344 | create a correct initial preferences file. You are now all set, and |
| 345 | your tree should be completely compatible with a binary-only |
| 346 | distribution. Read the release notes |
| 347 | (<code>Relnotes-somethingorother</code>) and |
| 348 | <code>ReadMeOrSuffer</code> in the <code>Mac</code> folder. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 349 | |
Jack Jansen | 27b10ec | 1996-08-23 15:44:18 +0000 | [diff] [blame] | 350 | <H2>Building the CFM68K interpreter</H2> |
| 351 | |
| 352 | Building the CFM68K interpreter is as almost exactly the same as building |
| 353 | the PPC interpreter, with the exception that you should read "CFM68K" |
| 354 | for "PPC" every time. Continue reading with the next section. |
| 355 | |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 356 | <H2>Building the PPC interpreter</H2> |
| 357 | |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 358 | First you build the interpreter, core library and applet skeleton in |
| 359 | folder <code>build.macppc.stand</code>. The order to build things is |
| 360 | the following: |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 361 | |
| 362 | <DL> |
Jack Jansen | 27b10ec | 1996-08-23 15:44:18 +0000 | [diff] [blame] | 363 | <DT> MWRuntimeStaticLib |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 364 | <DD> A modified version of the MetroWerks runtime library that is |
| 365 | suitable for Pythons' shared library architecture. The sources all |
| 366 | come from the MW distribution. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 367 | |
Jack Jansen | 27b10ec | 1996-08-23 15:44:18 +0000 | [diff] [blame] | 368 | <DT> PythonCorePPC |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 369 | <DD> The shared library that contains the bulk of the interpreter and |
| 370 | its resources. It is a good idea to immedeately put an alias to this |
| 371 | shared library in the <code>Extensions</code> folder of your system |
| 372 | folder. Do exactly that: put an <em>alias</em> there, copying or |
| 373 | moving the file will cause you grief later. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 374 | |
| 375 | <DT> PythonPPC |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 376 | <DD> The interpreter. This is basically a routine to call out to the |
| 377 | shared library. Because of the organization of GUSI it also contains |
| 378 | the Gusi settings resource (together with a ResEdit template, so you |
| 379 | can change the gusi settings should you feel like doing so). Do |
| 380 | <em>not</em> run it yet, this will possibly result in a garbled |
| 381 | preferences file. <p> |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 382 | |
Jack Jansen | 061ac50 | 1996-10-22 15:27:56 +0000 | [diff] [blame] | 383 | <DT> PythonAppletPPC |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 384 | <DD> The applet skeleton application. Very similar to |
| 385 | <code>PythonPPC</code>, but it calls to a different entrypoint in the |
| 386 | core library. The <code>mkapplet</code> script will copy this complete |
| 387 | file, and add a <code>'PYC '</code> with the module to generate an |
| 388 | applet. <p> |
| 389 | |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 390 | </DL> |
| 391 | |
Jack Jansen | 061ac50 | 1996-10-22 15:27:56 +0000 | [diff] [blame] | 392 | After creating the alias to <code>PythonCorePPC</code> you should move |
| 393 | <code>PythonPPC</code> to the main Python folder. Next you remove any old |
| 394 | <code>Python XXX Preferences</code> file from the <code>Preferences</code> folder |
| 395 | (if you had python installed on your system before) and run the interpreter once |
| 396 | to create the correct preferences file. You should also make an alias |
| 397 | <code>PythonApplet</code> pointing to <code>PythonAppletPPC</code> in the main |
| 398 | Python folder. (again: making an alias is preferrable to copying or moving the |
| 399 | file, since this will cause the correct file to be used if you ever rebuild |
| 400 | PythonAppletPPC). <p> |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 401 | |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 402 | Next, you have to build the extension modules in the |
Jack Jansen | 27b10ec | 1996-08-23 15:44:18 +0000 | [diff] [blame] | 403 | <code>PlugIns</code> folder. Open each project with <code>.ppc</code> in the |
| 404 | name and build it. After all |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 405 | the dynamically loaded modules are built you have to create a number |
| 406 | of aliases: some modules live together in a single dynamic |
Jack Jansen | 27b10ec | 1996-08-23 15:44:18 +0000 | [diff] [blame] | 407 | library. Run the <code>MkPluginAliases.py</code> script from |
| 408 | <code>Mac:scripts</code> to create the aliases. <p> |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 409 | |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 410 | Finally, you must build the standard applets: |
| 411 | <code>EditPythonPrefs</code>, <code>mkapplet</code>, etc. This is |
| 412 | easiest done with the <code>fullbuild</code> script from |
| 413 | <code>Mac:scripts</code>. Answer <em>no</em> to all questions except |
| 414 | when it asks whether to build the applets. <p> |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 415 | |
| 416 | <BLOCKQUOTE> |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 417 | Actually, the <code>fullbuild</code> script can be used to build |
| 418 | everything, but you need a fully-functional interpreter before you can |
| 419 | use it (and one that isn't rebuilt in the process: you cannot rebuild |
| 420 | a running program). You could copy the 68K interpreter to a different |
| 421 | place and use that to run fullbuild, or use the standalone PPC python |
| 422 | for this. I tend to keep a standalone interpreter in a safe place for |
| 423 | this use only. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 424 | </BLOCKQUOTE> |
| 425 | |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 426 | You are all set now, and should read the release notes and |
| 427 | <code>ReadMeOrSuffer</code> file from the <code>Mac</code> folder. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 428 | |
Jack Jansen | 27b10ec | 1996-08-23 15:44:18 +0000 | [diff] [blame] | 429 | <H2>Rebuilding <code>.exp</code> files for PPC and CFM68K</H2> |
| 430 | |
| 431 | Occasionally it may be necessary to rebuild your PythonCore <code>.exp</code> |
| 432 | file, a file that controls which symbols are exported by your PythonCore |
| 433 | shared library. Rebuild it if you get unexpected undefined symbols when you |
| 434 | are building a plugin module. <p> |
| 435 | |
| 436 | Rebuilding the .exp file is done by first removing the file and removing the |
| 437 | reference to it in the project (in the "config" section). Next, build PythonCore. |
| 438 | This will create a new .exp file. Edit this file to remove the references to |
| 439 | the symbols <code>__initialize</code>, <code>__terminate</code>, <code>setjmp</code>, |
| 440 | <code>longjmp</code> and <code>__ptmf_null</code>. Next, add the .exp file to the project |
| 441 | again and rebuild PythonCore. <p> |
| 442 | |
| 443 | This rather convoluted procedure is needed to ensure that plugin modules don't |
| 444 | accidentally link with those entrypoints from PythonCore, which will not work because |
| 445 | those routines have to be in the same code fragment as they are used from. |
| 446 | |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 447 | <H2>Odds and ends</H2> |
| 448 | |
| 449 | Some remarks that I could not fit in elsewhere: |
| 450 | |
| 451 | <UL> |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 452 | |
Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 453 | <LI> It may be possible to use the <code>PythonCore</code> shared |
| 454 | library to embed Python in another program, if your program can live |
| 455 | with using GUSI for I/O. Use PythonCore in stead of your C library |
| 456 | (or, at the very least, link it before the normal C library). Let me |
| 457 | know whether this works. |
| 458 | |
| 459 | <LI> It is possible to build PPC extension modules without building a |
| 460 | complete Python. Take the binary distribution, add folders |
| 461 | <code>Include</code>, <code>Mac:Include</code> and |
| 462 | <code>Mac:mwerks</code> from the source distribution and you should be |
| 463 | all set. A template for a dynamic module can be found in |
Jack Jansen | 27b10ec | 1996-08-23 15:44:18 +0000 | [diff] [blame] | 464 | <code>xx.ppc.µ</code> or <code>xx.CFM68K.µ</code>. |
| 465 | |
| 466 | <LI> The Python shared library architecture is a variant of the architecture |
| 467 | described as "application with shared libraries and dropins" in the MetroWerks |
| 468 | "Targeting MacOS" documentation. The Python Application and applet-template use |
| 469 | the <code>AppRuntime.Lib</code> runtime library (with properly set CFM |
| 470 | initialization and termination routines). PythonCore uses <code>ShlibRuntime.Lib</code> |
| 471 | and <code>MWRuntimeStaticLib.Lib</code>, which is almost identical to the MW |
| 472 | standard <code>MWRuntimeLib</code>, but not dynamically loaded. This library contains |
| 473 | the part of the runtime that can (or must) be shared between all modules in the program. |
| 474 | It is linked statically into PythonCore (and exported to the applications and plugins) |
| 475 | so we do not have to distribute yet another shared library. Plugin modules use |
| 476 | <code>ShlibRuntime.Lib</code> and obtain the rest from PythonCore. PythonCore uses a |
| 477 | non-standard initialization entry point, <code>__initialize_with_resources</code>, to |
| 478 | be able to obtain resources from the library file lateron. Plugins can do the same or |
| 479 | use the standard <code>__initialize</code> entry point. |
Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 480 | |
| 481 | |
| 482 | <UL> |
| 483 | </BODY> |
| 484 | </HTML> |