| 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 | 
|  | 44 | been built with version 9 of CodeWarrior. Ordering information is | 
|  | 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 | 27b10ec | 1996-08-23 15:44:18 +0000 | [diff] [blame] | 126 | projects <code>GUSI.68K.µ</code>, <code>GUSI.CFM68K.µ</code> | 
| Jack Jansen | 319f1a2 | 1996-10-16 15:28:30 +0000 | [diff] [blame] | 127 | (note that the Gusi CFM68K project is | 
|  | 128 | distributed without "far data": you should set this option before building) | 
|  | 129 | and <code>GUSI.PPC.µ</code>. | 
|  | 130 | If you have a CWGUSI version more recent than | 
| Jack Jansen | 16e99c0 | 1996-09-07 17:11:26 +0000 | [diff] [blame] | 131 | 1.7.2 it could be that the fixes are already included, check it. Alternatively, | 
|  | 132 | you can forget about the fixes and remove the one reference to GUSILoadPreferences | 
|  | 133 | in the Python sources. This will disable the "default file creator/type" and | 
|  | 134 | "Delay Sioux window" preferences in Python. | 
|  | 135 |  | 
|  | 136 | Next, in | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 137 | <code>MoreFiles</code>, <code>libjpeg</code>, <code>pbmplus</code> | 
|  | 138 | 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] | 139 | case, see below. Of course, if you are only interested in one of | 
|  | 140 | static 68K, CFM68K or PPC you can skip building the other libraries. | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 141 |  | 
|  | 142 | <H2><A NAME="tcltk">Building Tcl/Tk</H2> | 
|  | 143 |  | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 144 | You need to make a minor organizational change to the Tcl/Tk | 
|  | 145 | distribution. The current instructions are for the | 
|  | 146 | <code>tcl7.5.1</code> and <code>tk4.1.1</code> distribution: | 
|  | 147 |  | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 148 | <UL> | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 149 |  | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 150 | <LI> Rename the <code>compat</code> folders to <code>(compat)</code> | 
|  | 151 | in both the Tcl and Tk folders. | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 152 |  | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 153 | <LI> In the Tcl folder, move <code>strncasecmp.c</code> and | 
|  | 154 | <code>tclErrno.h</code> from <code>(compat)</code> to the main Tcl | 
|  | 155 | folder. | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 156 |  | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 157 | <LI> Fix <code>dnr.c</code> as provided by MetroWerks by inserting | 
|  | 158 | <pre><code> #pragma ANSI_strict off </code></pre> at the | 
|  | 159 | beginning. The tcl library is built with strict ANSI on, and this file | 
|  | 160 | uses C++ style comments. | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 161 |  | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 162 | <LI> If you want to build <code>SimpleTcl</code> and | 
|  | 163 | <code>SimpleTk</code> you will probably have to remove the references | 
|  | 164 | to <code>libmoto</code> from the project. | 
|  | 165 |  | 
|  | 166 | <LI> You are <EM>strongly</EM> advised to add a line | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 167 | <pre><code> | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 168 | #define USE_TCLALLOC 1 | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 169 | </code></pre> | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 170 | somewhere at the beginning of <code>MW_TclHeader.pch</code>. | 
|  | 171 | As distributed, tcl and tk assume that malloc calls always succeed and | 
|  | 172 | use the resulting pointer without checking for <code>NULL</code> | 
|  | 173 | values. Needless to say, this wreaks havoc on a Macintosh. | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 174 |  | 
| Jack Jansen | 27b10ec | 1996-08-23 15:44:18 +0000 | [diff] [blame] | 175 | <LI> If you want to build for CFM68K you have to modify <code>TclMacNotify.c</code> | 
|  | 176 | because there is an error in the Apple Universal headers (sic!). Read the | 
|  | 177 | comments at the beginning of <code>Mac:Python:macglue.c</code> and copy the | 
|  | 178 | code to <code>TclMacNotify.c</code>. If you get linker errors on <code>GetEvQHdr</code> | 
|  | 179 | you have not done this correctly. | 
|  | 180 |  | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 181 | </UL> | 
|  | 182 |  | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 183 | Build first the MoreFiles library, then the Tcl library, then | 
|  | 184 | SimpleTcl (test it by typing <code>ls -l</code> in the window you get) | 
|  | 185 | then the Tk library, then SimpleTk (which can again be tested with | 
|  | 186 | <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] | 187 | building Python. | 
|  | 188 |  | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 189 | <H2>Building Waste</H2> | 
|  | 190 |  | 
|  | 191 | You do not need to build the Waste libraries, as Python includes the | 
|  | 192 | source modules themselves. You have to make one modification, | 
|  | 193 | though. In file <code>ICCFMGlue.c</code> in folder <code>Minimal IC | 
|  | 194 | APIs</code>, add the following lines: | 
|  | 195 |  | 
|  | 196 | <blockquote><pre><code> | 
|  | 197 | #include <Gestalt.h> | 
|  | 198 | #include <Errors.h> | 
|  | 199 | </code></pre></blockquote> | 
|  | 200 |  | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 201 | <H2>The organization of the Python source tree</H2> | 
|  | 202 |  | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 203 | Time for a short break, while we have a look at the organization of | 
|  | 204 | the Python source tree.  At the top level, we find the following | 
|  | 205 | folders: | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 206 |  | 
|  | 207 | <DL> | 
|  | 208 | <DT> build.mac68k.stand | 
| Jack Jansen | 27b10ec | 1996-08-23 15:44:18 +0000 | [diff] [blame] | 209 | <DD> This is where you will build static 68K interpreters. | 
|  | 210 |  | 
|  | 211 | <DT> build.mac68k.shared | 
|  | 212 | <DD> This is where you build the CFM68K shared library, interpreter | 
|  | 213 | and applet framework. | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 214 |  | 
|  | 215 | <DT> build.macppc.shared | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 216 | <DD> This is where you build the PPC shared library, interpreter and | 
| Jack Jansen | 27b10ec | 1996-08-23 15:44:18 +0000 | [diff] [blame] | 217 | applet framework. You can also build the fat applet framework here. | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 218 |  | 
|  | 219 | <DT> build.macppc.stand | 
|  | 220 | <DD> This is where you build a nonshared PPC interpreter (optional). | 
|  | 221 |  | 
|  | 222 | <DT> Demo | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 223 | <DD> Demo programs that are not Mac-specific. Some of these may not | 
|  | 224 | work, the file <code>README-Mac</code> has some details. | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 225 |  | 
|  | 226 | <DT> Extensions | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 227 | <DD> Extensions to the interpreter that are not Mac-specific. Contains | 
|  | 228 | only the <code>img</code> extension in this distribution. Extensions | 
|  | 229 | are <em>not</em> built here, as they are on Unix, but incorporated in | 
|  | 230 | the core interpreter or built as plugin modules. | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 231 |  | 
|  | 232 | <DT> Grammar | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 233 | <DD> The Python grammar. Included for reference only, you cannot build | 
|  | 234 | the parser on a Mac. | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 235 |  | 
|  | 236 | <DT> Include | 
|  | 237 | <DD> Machine-independent header files. | 
|  | 238 |  | 
|  | 239 | <DT> Modules | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 240 | <DD> Machine-independent optional modules. Not all of these will work | 
|  | 241 | on the Mac. | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 242 |  | 
|  | 243 | <DT> Objects | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 244 | <DD> Machine-independent code for various objects. Most of these are | 
|  | 245 | not really optional: the interpreter will not function without them. | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 246 |  | 
|  | 247 | <DT> Parser | 
|  | 248 | <DD> The Python parser (machine-independent). | 
|  | 249 |  | 
|  | 250 | <DT> PlugIns | 
| Jack Jansen | 27b10ec | 1996-08-23 15:44:18 +0000 | [diff] [blame] | 251 | <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] | 252 |  | 
|  | 253 | <DT> Python | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 254 | <DD> The core interpreter. Most files are machine-independent, some | 
|  | 255 | are unix-specific and not used on the Mac. | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 256 |  | 
|  | 257 | <DT> Tools | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 258 | <DD> Tools for python developers. Contains <code>modulator</code> | 
|  | 259 | which builds skeleton C extension modules and <code>bgen</code> which | 
|  | 260 | generates complete interface modules from information in C header | 
|  | 261 | files. There are some readme files, but more documentation is sorely | 
|  | 262 | needed. | 
|  | 263 |  | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 264 | </DL> | 
|  | 265 |  | 
|  | 266 | All the mac-specific stuff lives in the <code>Mac</code> folder: | 
|  | 267 | <DL> | 
|  | 268 |  | 
|  | 269 | <DT> Compat | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 270 | <DD> Unix-compatability routines. Some of these are not used anymore, | 
|  | 271 | since CWGUSI provides a rather complete emulation, but you may need | 
|  | 272 | these if you are trying to build a non-GUSI python. | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 273 |  | 
|  | 274 | <DT> Demo | 
|  | 275 | <DD> Mac-specific demo programs, some of them annotated. | 
|  | 276 |  | 
|  | 277 | <DT> Include | 
|  | 278 | <DD> Mac-specific but compiler-independent include files. | 
|  | 279 |  | 
|  | 280 | <DT> Lib | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 281 | <DD> Mac-specific standard modules. The <code>toolbox</code> folder | 
|  | 282 | contains modules specifically needed with various MacOS toolbox | 
|  | 283 | interface modules. | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 284 |  | 
|  | 285 | <DT> Modules | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 286 | <DD> Mac-specific builtin modules. Theoretically these are all | 
|  | 287 | optional, but some are rather essential (like | 
|  | 288 | <code>macmodule</code>). A lot of these modules are generated with | 
|  | 289 | <code>bgen</code>, in which case the bgen input files are included so | 
|  | 290 | you can attempt to regenerate them or extend them. | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 291 |  | 
|  | 292 | <DT> MPW | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 293 | <DD> MPW-specific files. These have not been used or kept up-to-date | 
|  | 294 | for a long time, so use at your own risk. | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 295 |  | 
|  | 296 | <DT> mwerks | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 297 | <DD> Mwerks-specific sources and headers. Contains glue code for | 
|  | 298 | Pythons shared-library architecture, a replacement for | 
|  | 299 | <code>malloc</code> and a directory with various projects for building | 
|  | 300 | variations on the Python interpreter. The <code>mwerks_*.h</code> | 
|  | 301 | files here are the option-setting files for the various interpreters | 
|  | 302 | and such, comparable to the unix command-line <code>-D</code> options | 
|  | 303 | to the compiler. Each project uses the correct option file as its | 
|  | 304 | "prefix file" in the "C/C++ language" settings. Disabling optional | 
|  | 305 | modules (for the 68K interpreter), building non-GUSI interpreters and | 
|  | 306 | various other things are accomplished by modifying these files (and | 
|  | 307 | possibly changing the list of files included in the project window, of | 
|  | 308 | course). | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 309 |  | 
|  | 310 | <DT> Python | 
|  | 311 | <DD> Mac-specific parts of the core interpreter. | 
|  | 312 |  | 
|  | 313 | <DT> Resources | 
|  | 314 | <DD> Resource files needed to build the interpreter. | 
|  | 315 |  | 
|  | 316 | <DT> Scripts | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 317 | <DD> A collection of various mac-specific Python scripts. Some are | 
|  | 318 | essential, some are useful but few are documented, so you will have to | 
|  | 319 | use your imagination to work them out. | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 320 |  | 
|  | 321 | <DT> Unsupported | 
|  | 322 | <DD> Modules that are not supported any longer but may still work with a little effort. | 
|  | 323 | </DL> | 
|  | 324 |  | 
|  | 325 | <H2>Building the 68K interpreter</H2> | 
|  | 326 |  | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 327 | If you have all the optional libraries mentioned <A | 
|  | 328 | HREF="#optional">above</A> loaded buildin Python for 68K macs is a | 
|  | 329 | breeze: open the project in the folder <code>build.mac68k.stand</code> | 
|  | 330 | and build it.  Do <em>not</em> run it yet, this will possibly result | 
|  | 331 | in a garbled preferences file. <p> | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 332 |  | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 333 | First remove the <code>Python preferences</code> file from your | 
|  | 334 | preference folder, only if you had an older version of Python | 
|  | 335 | installed.  (this is also what you do if you did not heed the last | 
|  | 336 | sentence of the preceeding paragraph). Next, move the interpreter to | 
|  | 337 | the main Python folder (up one level) and run it there. This will | 
|  | 338 | create a correct initial preferences file. You are now all set, and | 
|  | 339 | your tree should be completely compatible with a binary-only | 
|  | 340 | distribution. Read the release notes | 
|  | 341 | (<code>Relnotes-somethingorother</code>) and | 
|  | 342 | <code>ReadMeOrSuffer</code> in the <code>Mac</code> folder. | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 343 |  | 
| Jack Jansen | 27b10ec | 1996-08-23 15:44:18 +0000 | [diff] [blame] | 344 | <H2>Building the CFM68K interpreter</H2> | 
|  | 345 |  | 
|  | 346 | Building the CFM68K interpreter is as almost exactly the same as building | 
|  | 347 | the PPC interpreter, with the exception that you should read "CFM68K" | 
|  | 348 | for "PPC" every time. Continue reading with the next section. | 
|  | 349 |  | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 350 | <H2>Building the PPC interpreter</H2> | 
|  | 351 |  | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 352 | First you build the interpreter, core library and applet skeleton in | 
|  | 353 | folder <code>build.macppc.stand</code>.  The order to build things is | 
|  | 354 | the following: | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 355 |  | 
|  | 356 | <DL> | 
| Jack Jansen | 27b10ec | 1996-08-23 15:44:18 +0000 | [diff] [blame] | 357 | <DT> MWRuntimeStaticLib | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 358 | <DD> A modified version of the MetroWerks runtime library that is | 
|  | 359 | suitable for Pythons' shared library architecture. The sources all | 
|  | 360 | come from the MW distribution. | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 361 |  | 
| Jack Jansen | 27b10ec | 1996-08-23 15:44:18 +0000 | [diff] [blame] | 362 | <DT> PythonCorePPC | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 363 | <DD> The shared library that contains the bulk of the interpreter and | 
|  | 364 | its resources. It is a good idea to immedeately put an alias to this | 
|  | 365 | shared library in the <code>Extensions</code> folder of your system | 
|  | 366 | folder.  Do exactly that: put an <em>alias</em> there, copying or | 
|  | 367 | moving the file will cause you grief later. | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 368 |  | 
|  | 369 | <DT> PythonPPC | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 370 | <DD> The interpreter. This is basically a routine to call out to the | 
|  | 371 | shared library. Because of the organization of GUSI it also contains | 
|  | 372 | the Gusi settings resource (together with a ResEdit template, so you | 
|  | 373 | can change the gusi settings should you feel like doing so).  Do | 
|  | 374 | <em>not</em> run it yet, this will possibly result in a garbled | 
|  | 375 | preferences file. <p> | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 376 |  | 
| Jack Jansen | 061ac50 | 1996-10-22 15:27:56 +0000 | [diff] [blame^] | 377 | <DT> PythonAppletPPC | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 378 | <DD> The applet skeleton application. Very similar to | 
|  | 379 | <code>PythonPPC</code>, but it calls to a different entrypoint in the | 
|  | 380 | core library. The <code>mkapplet</code> script will copy this complete | 
|  | 381 | file, and add a <code>'PYC '</code> with the module to generate an | 
|  | 382 | applet. <p> | 
|  | 383 |  | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 384 | </DL> | 
|  | 385 |  | 
| Jack Jansen | 061ac50 | 1996-10-22 15:27:56 +0000 | [diff] [blame^] | 386 | After creating the alias to <code>PythonCorePPC</code> you should move | 
|  | 387 | <code>PythonPPC</code> to the main Python folder. Next you remove any old | 
|  | 388 | <code>Python XXX Preferences</code> file from the <code>Preferences</code> folder | 
|  | 389 | (if you had python installed on your system before) and run the interpreter once | 
|  | 390 | to create the correct preferences file. You should also make an alias | 
|  | 391 | <code>PythonApplet</code> pointing to <code>PythonAppletPPC</code> in the main | 
|  | 392 | Python folder. (again: making an alias is preferrable to copying or moving the | 
|  | 393 | file, since this will cause the correct file to be used if you ever rebuild | 
|  | 394 | PythonAppletPPC). <p> | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 395 |  | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 396 | Next, you have to build the extension modules in the | 
| Jack Jansen | 27b10ec | 1996-08-23 15:44:18 +0000 | [diff] [blame] | 397 | <code>PlugIns</code> folder. Open each project with <code>.ppc</code> in the | 
|  | 398 | name and build it. After all | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 399 | the dynamically loaded modules are built you have to create a number | 
|  | 400 | of aliases: some modules live together in a single dynamic | 
| Jack Jansen | 27b10ec | 1996-08-23 15:44:18 +0000 | [diff] [blame] | 401 | library. Run the <code>MkPluginAliases.py</code> script from | 
|  | 402 | <code>Mac:scripts</code> to create the aliases. <p> | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 403 |  | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 404 | Finally, you must build the standard applets: | 
|  | 405 | <code>EditPythonPrefs</code>, <code>mkapplet</code>, etc. This is | 
|  | 406 | easiest done with the <code>fullbuild</code> script from | 
|  | 407 | <code>Mac:scripts</code>. Answer <em>no</em> to all questions except | 
|  | 408 | when it asks whether to build the applets. <p> | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 409 |  | 
|  | 410 | <BLOCKQUOTE> | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 411 | Actually, the <code>fullbuild</code> script can be used to build | 
|  | 412 | everything, but you need a fully-functional interpreter before you can | 
|  | 413 | use it (and one that isn't rebuilt in the process: you cannot rebuild | 
|  | 414 | a running program). You could copy the 68K interpreter to a different | 
|  | 415 | place and use that to run fullbuild, or use the standalone PPC python | 
|  | 416 | for this. I tend to keep a standalone interpreter in a safe place for | 
|  | 417 | this use only. | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 418 | </BLOCKQUOTE> | 
|  | 419 |  | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 420 | You are all set now, and should read the release notes and | 
|  | 421 | <code>ReadMeOrSuffer</code> file from the <code>Mac</code> folder. | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 422 |  | 
| Jack Jansen | 27b10ec | 1996-08-23 15:44:18 +0000 | [diff] [blame] | 423 | <H2>Rebuilding <code>.exp</code> files for PPC and CFM68K</H2> | 
|  | 424 |  | 
|  | 425 | Occasionally it may be necessary to rebuild your PythonCore <code>.exp</code> | 
|  | 426 | file, a file that controls which symbols are exported by your PythonCore | 
|  | 427 | shared library. Rebuild it if you get unexpected undefined symbols when you | 
|  | 428 | are building a plugin module. <p> | 
|  | 429 |  | 
|  | 430 | Rebuilding the .exp file is done by first removing the file and removing the | 
|  | 431 | reference to it in the project (in the "config" section). Next, build PythonCore. | 
|  | 432 | This will create a new .exp file. Edit this file to remove the references to | 
|  | 433 | the symbols <code>__initialize</code>, <code>__terminate</code>, <code>setjmp</code>, | 
|  | 434 | <code>longjmp</code> and <code>__ptmf_null</code>. Next, add the .exp file to the project | 
|  | 435 | again and rebuild PythonCore. <p> | 
|  | 436 |  | 
|  | 437 | This rather convoluted procedure is needed to ensure that plugin modules don't | 
|  | 438 | accidentally link with those entrypoints from PythonCore, which will not work because | 
|  | 439 | those routines have to be in the same code fragment as they are used from. | 
|  | 440 |  | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 441 | <H2>Odds and ends</H2> | 
|  | 442 |  | 
|  | 443 | Some remarks that I could not fit in elsewhere: | 
|  | 444 |  | 
|  | 445 | <UL> | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 446 |  | 
| Jack Jansen | 4c1e56c | 1996-08-06 16:16:20 +0000 | [diff] [blame] | 447 | <LI> It may be possible to use the <code>PythonCore</code> shared | 
|  | 448 | library to embed Python in another program, if your program can live | 
|  | 449 | with using GUSI for I/O. Use PythonCore in stead of your C library | 
|  | 450 | (or, at the very least, link it before the normal C library). Let me | 
|  | 451 | know whether this works. | 
|  | 452 |  | 
|  | 453 | <LI> It is possible to build PPC extension modules without building a | 
|  | 454 | complete Python. Take the binary distribution, add folders | 
|  | 455 | <code>Include</code>, <code>Mac:Include</code> and | 
|  | 456 | <code>Mac:mwerks</code> from the source distribution and you should be | 
|  | 457 | all set. A template for a dynamic module can be found in | 
| Jack Jansen | 27b10ec | 1996-08-23 15:44:18 +0000 | [diff] [blame] | 458 | <code>xx.ppc.µ</code> or <code>xx.CFM68K.µ</code>. | 
|  | 459 |  | 
|  | 460 | <LI> The Python shared library architecture is a variant of the architecture | 
|  | 461 | described as "application with shared libraries and dropins" in the MetroWerks | 
|  | 462 | "Targeting MacOS" documentation. The Python Application and applet-template use | 
|  | 463 | the <code>AppRuntime.Lib</code> runtime library (with properly set CFM | 
|  | 464 | initialization and termination routines). PythonCore uses <code>ShlibRuntime.Lib</code> | 
|  | 465 | and <code>MWRuntimeStaticLib.Lib</code>, which is almost identical to the MW | 
|  | 466 | standard <code>MWRuntimeLib</code>, but not dynamically loaded. This library contains | 
|  | 467 | the part of the runtime that can (or must) be shared between all modules in the program. | 
|  | 468 | It is linked statically into PythonCore (and exported to the applications and plugins) | 
|  | 469 | so we do not have to distribute yet another shared library. Plugin modules use | 
|  | 470 | <code>ShlibRuntime.Lib</code> and obtain the rest from PythonCore. PythonCore uses a | 
|  | 471 | non-standard initialization entry point, <code>__initialize_with_resources</code>, to | 
|  | 472 | be able to obtain resources from the library file lateron. Plugins can do the same or | 
|  | 473 | use the standard <code>__initialize</code> entry point. | 
| Jack Jansen | 8f2d802 | 1996-08-05 15:34:45 +0000 | [diff] [blame] | 474 |  | 
|  | 475 |  | 
|  | 476 | <UL> | 
|  | 477 | </BODY> | 
|  | 478 | </HTML> |