Commit | Line | Data |
---|---|---|
252b5132 RH |
1 | This is basic information about the Macintosh(tm) MPW(tm) port of the |
2 | GNU tools. The information below applies to both native and cross | |
3 | compilers. | |
4 | ||
5 | (Please note that there are two versions of this file; "mpw-README" | |
6 | is the source form, and "Read Me for MPW" is the distribution form. | |
7 | "Read Me for MPW" has 8-bit chars such as \Option-d embedded in it.) | |
8 | ||
9 | INSTALLING GNU TOOLS | |
10 | ||
11 | * System Requirements | |
12 | ||
13 | To use these tools, you will need a Mac with a 68020 or better or else | |
14 | any PowerMac, System 7.1 or later, and MPW 3.3 or 3.4. You will *not* | |
15 | need any other MPW compiler unless you want to rebuild from sources, | |
16 | nor even any include files, unless you are building actual Mac | |
17 | applications. For PowerMac native you will need PPCLink, however; | |
18 | also the executables are PowerPC-only. | |
19 | ||
20 | * Automated Installation | |
21 | ||
22 | The simplest way to install GNU tools is to run the Install script. | |
23 | The script will copy things to where you want to keep them, will build | |
24 | a UserStartup file with settings corresponding to where things were | |
25 | copied, and offer to put that UserStartup file in your MPW folder. | |
26 | ||
27 | The Install script does not alter anything in the System Folder, and | |
28 | it does not take any action without confirmation. | |
29 | ||
30 | The Install script will be at the top level of the binary | |
31 | distribution, or at the top level of the object directory if | |
32 | rebuilding from source. (The sources include a file called | |
33 | "mpw-install" at the top level, but it is the source to the Install | |
34 | script and cannot be run directly.) | |
35 | ||
36 | * Manual Installation | |
37 | ||
38 | If you don't want to run the Install script, you can do installation | |
39 | manually; this section describes the steps involved. | |
40 | ||
41 | The GNU tools can go in any directory that is in your {Commands} list. | |
42 | We generally put all the tools somewhere like {Boot}Cygnus:latest:bin, | |
43 | and then add to a UserStartup file: | |
44 | ||
45 | set Commands "{Boot}Cygnus:latest:bin:,{Commands}" | |
46 | ||
47 | However, the cpp and cc1 programs of GCC are not normally stored here. | |
48 | Instead, they will be in a "lib" directory that is alongside "bin", | |
49 | and organized by target and version underneath, with names like | |
50 | ||
51 | :lib:gcc-lib:<target>:cygnus-<version>: | |
52 | ||
53 | If you build and install everything yourself according to the build | |
54 | instructions below, then you will not have any problems. However, you | |
55 | may discover that GCC seems unable to find the right cpp and cc1; | |
56 | usually this will be because directory names have changed. (Even | |
57 | renaming your hard disk will make this happen.) In such cases, you | |
58 | have several choices. One is just to add this directory to | |
59 | {Commands}, but then you will not be able to get any other cpp or cc1, | |
60 | such as those used by a different target or version. Another way is | |
61 | to rename your disk and directories to match the prefix used when the | |
62 | tools were compiled. Finally, you can set the variable | |
63 | GCC_EXEC_PREFIX to point to the library directory: | |
64 | ||
65 | set GCC_EXEC_PREFIX MyDisk:Stuff:lib:gcc-lib: | |
66 | export GCC_EXEC_PREFIX | |
67 | ||
68 | You may also want to edit MPW's HEXA 128 resource. When GCC is built | |
69 | using a native GCC, it is compiled to use a special stack allocator | |
70 | function alloca(). While this is very efficient, it means that GCC | |
71 | will need considerable stack space to run, especially when compiling | |
72 | large programs with optimization turned on. You give MPW more stack | |
73 | by editing the HEXA 128 resource of the MPW Shell. A value of "0008 | |
74 | 0000" gives 512K of stack size, which is usually sufficient. | |
75 | ||
76 | USING GNU TOOLS | |
77 | ||
78 | * Using Native PowerMac GCC | |
79 | ||
80 | Using a native PowerMac GCC to produce MPW tools or MacOS applications | |
81 | is more complicated than just "gC foo.c", although no more complicated | |
82 | than with other Mac compilers. | |
83 | ||
84 | To build a native PowerMac MPW tool, use this sequence, where hello.c | |
85 | is the usual "hello world" program, and genericcfrg.r is the Rez file | |
86 | with the code fragment resource: | |
87 | ||
88 | gC -I{CIncludes} -fno-builtin -Dpascal= -c -g hello.c | |
89 | PPCLink hello.o -o hello \Option-d | |
90 | "{PPCLibraries}"StdCRuntime.o \Option-d | |
91 | "{SharedLibraries}"InterfaceLib \Option-d | |
92 | "{SharedLibraries}"StdCLib \Option-d | |
93 | "{PPCLibraries}"PPCToolLibs.o \Option-d | |
94 | "{PPCLibraries}"PPCCRuntime.o \Option-d | |
95 | "{GCCPPCLibraries}"libgcc.xcoff | |
96 | rez -d APPNAME='"'hello'"' GenericCFRG.r -o hello | |
97 | setfile -t 'MPST' -c 'MPS ' hello | |
98 | ||
99 | The same sequence works to build a MacOS application, but you set the file | |
100 | type to 'APPL' and don't link in PPCToolLibs.o. For further details on | |
101 | using MPW to build Mac applications, see the general MPW documentation. | |
102 | ||
103 | Recent versions of PPCLink have an option to generate the code | |
104 | fragment resource and automatically set creator and file type; | |
105 | here is what GenericCFRG.r should look like if you have an older | |
106 | PPCLink or are using GNU ld: | |
107 | ||
108 | #include "CodeFragmentTypes.r" | |
109 | ||
110 | resource 'cfrg' (0) { | |
111 | { | |
112 | kPowerPC, | |
113 | kFullLib, | |
114 | kNoVersionNum,kNoVersionNum, | |
115 | 0,0, | |
116 | kIsApp,kOnDiskFlat,kZeroOffset,kWholeFork, | |
117 | APPNAME // must be defined on Rez command line with -d option | |
118 | } | |
119 | }; | |
120 | ||
121 | In general this port of GCC supports the same option syntax and | |
122 | behavior as its Unix counterpart. It also has similar compilation | |
123 | rules, so it will run the assembler on .s files and so forth. | |
124 | ||
125 | The GCC manual includes full information on the available options. | |
126 | One option that may be especially useful is "-v", which shows you what | |
127 | tools and options are being used; unlike most Mac C compilers, GCC | |
128 | directs assembly and linking in addition to compilation. | |
129 | ||
130 | MPW GCC does feature two extensions to the option syntax; '-d macro=name' | |
131 | works just as '-Dmacro=name' does in Unix, and '-i directory' works the | |
132 | same as '-Idirectory'. | |
133 | ||
134 | MPW GCC supports the usual Pascal-style strings and alignment pragmas. | |
135 | ||
136 | To find standard include files you can set the variable GCCIncludes: | |
137 | ||
138 | set GCCIncludes MyDisk:MyIncludes: | |
139 | export GCCIncludes | |
140 | ||
141 | GCCIncludes is similar to MPW's CIncludes or CW's MWCIncludes. In | |
142 | order to use MPW's usual include files, just say: | |
143 | ||
144 | set GCCIncludes "{CIncludes}" | |
145 | export GCCIncludes | |
146 | ||
147 | * Using GCC as a Cross-Compiler | |
148 | ||
149 | If you have a cross-compiler, and you have all of the correct | |
150 | target-side crt0 and libraries available, then to compile and link a | |
151 | file "foo.c", you can say just | |
152 | ||
153 | gC foo.c | |
154 | ||
155 | The output file will be an MPW binary file named "a.out"; the format | |
156 | of the contents will depend on which target is in use, so for instance | |
157 | a MIPS-targeting GCC will produce ECOFF or ELF executables. | |
158 | ||
159 | Note that using MPW include files with a cross-compiler is somewhat | |
160 | dangerous. | |
161 | ||
162 | * Using the Assembler and Friends | |
163 | ||
164 | The assembler ("as") and linker ("ld") are faithful ports of their | |
165 | Unix counterparts. Similarly, the binutils "ar", "cplusfilt", "nm", | |
166 | "objcopy", "objdump", "ranlib", "size", "strings", and "strip" are all | |
167 | like they are under Unix. (Note that "cplusfilt" is usually called | |
168 | "c++filt" under Unix.) | |
169 | ||
170 | * Using GDB | |
171 | ||
172 | There are two flavors of GDB. "gdb" is an MPW tool that works very | |
173 | much like it does in Unix; put a command into the MPW worksheet and | |
174 | type the <enter> key to send it to GDB. While "gdb" is running, you | |
175 | cannot do anything else in MPW, although you can switch to other | |
176 | Mac applications and use them. | |
177 | ||
178 | "SiowGDB" is also a Mac application, but it is GDB using the SIOW | |
179 | package to provide console emulation. Commands are exactly as for the | |
180 | MPW tool, but since this is its own application, you can switch | |
181 | between it and MPW. | |
182 | ||
183 | BUILDING GNU TOOLS | |
184 | ||
185 | This port of the GNU tools uses a configure script similar to | |
186 | that used for GNU tools under Unix, but rewritten for MPW. As with | |
187 | Unix configuration, there is an "object" directory that may be | |
188 | different from the "source" directory. In the example commands below, | |
189 | we will assume that we are currently in the object directory, and that | |
190 | the source directory is "{Boot}Cygnus:src:". | |
191 | ||
192 | * Requirements for Building | |
193 | ||
194 | In addition to the sources, you will need a set of tools that the | |
195 | configure and build scripts assume to be available. These tools | |
196 | (and their versions, if relevant) are as follows: | |
197 | ||
198 | byacc tool | |
199 | flex (2.3.7) tool (and Flex.skel file) | |
200 | forward-include script | |
201 | MoveIfChange script | |
202 | mpw-touch script | |
203 | mpw-true script | |
204 | NewFolderRecursive script | |
205 | null-command script | |
206 | open-brace script | |
207 | sed (1.13) tool | |
208 | tr-7to8 script | |
209 | true script | |
210 | ||
211 | The scripts are in the sources, under utils:mpw:. You must arrange to | |
212 | get the other tools yourself (they are readily available from the | |
213 | "usual" net sites, and are also on many CDROMS). In addition, there | |
214 | will usually be a set of these available at ftp.cygnus.com, in pub/mac. | |
215 | ||
216 | You may put the build tools in your usual Tools or Scripts | |
217 | directories, or keep them in a separate directories. We prefer to | |
218 | make a directory called "buildtools" and we put this in one of our | |
219 | UserStartup files: | |
220 | ||
221 | set Commands "{Boot}Cygnus:buildtools:,{Commands}" | |
222 | ||
223 | Flex uses an environment variable FLEX_SKELETON to locate its skeleton | |
224 | file, so you need to do something like this, preferably in a UserStartup: | |
225 | ||
226 | Set FLEX_SKELETON "{Boot}"Cygnus:buildtools:Flex.skel | |
227 | Export FLEX_SKELETON | |
228 | ||
229 | * Configuring | |
230 | ||
231 | Before you can build anything, you must configure. You do this by | |
232 | creating an directory where object files will be stored, setdirectory | |
233 | to that directory and do a configure command: | |
234 | ||
235 | {Boot}Cygnus:src:mpw-configure --target <name> --cc <compiler> --srcdir {Boot}Cygnus:src: --prefix <whatever> | |
236 | ||
237 | If the source directory is not in your {Commands} list, then you must | |
238 | supply a full pathname to mpw-configure, since mpw-configure invokes | |
239 | itself after switching into each subdirectory. Using a relative | |
240 | pathname, even something like ':mpw-configure', will therefore not work. | |
241 | ||
242 | <name> must be a known target. Valid ones include "m68k-apple-macos", | |
243 | "powerpc-apple-macos", "i386-unknown-go32", "mips-idt-ecoff", and | |
244 | "sh-hitachi-hms". Not all target types are accepted for all of the | |
245 | tools yet. | |
246 | ||
247 | <compiler> must be the name of the compiler to use. It defaults to "mpwc". | |
248 | ||
249 | (m68k) | |
250 | mpwc MPW C | |
251 | sc68k Symantec C | |
252 | mwc68k Metrowerks C (Codewarrior) | |
253 | gcc68k GCC | |
254 | ||
255 | (powerpc) | |
256 | ppcc PPCC | |
257 | mrc Macintosh on RisC (Mister C, aka(?) Frankenstein) | |
258 | scppc Symantec C | |
259 | mwcppc Metrowerks C (Codewarrior) | |
260 | gccppc GCC | |
261 | ||
262 | Not all compilers will compile all tools equally well! For m68k Macs, | |
263 | MPW C has the best record so far (it has problems, but they can be | |
264 | worked around), while for PowerMacs, CodeWarrior is the only compiler | |
265 | that has successfully compiled everything into running code. | |
266 | ||
267 | <prefix> is the path that "gcc" will prepend when looking for tools | |
268 | to execute. GCC_EXEC_PREFIX overrides this value, so you need not | |
269 | include it if you plan to use GCC_EXEC_PREFIX. | |
270 | ||
271 | As an example, here is the configure line that you could use to build | |
272 | native PowerMac GCC: | |
273 | ||
274 | "{Boot}"Cygnus:src:mpw-configure --cc mwcppc --target powerpc-apple-macos --srcdir "{Boot}"Cygnus:src: --prefix "{Boot}"GNUTools: | |
275 | ||
276 | * Building | |
277 | ||
278 | If you use CodeWarrior, you *must* first set MWCIncludes to | |
279 | {CIncludes}. This is because you will be building MPW tools, and | |
280 | their standard I/O works by making references to data that is part of | |
281 | the MPW Shell, which means that the code must be compiled and linked | |
282 | with macros that refer to that data, and those macros are in | |
283 | {CIncludes}, not the default {MWCIncludes}. Without this change, you | |
284 | will encounter problems compiling libiberty/mpw.c, but tweaking that | |
285 | file only masks the real problem, and does not fix it. | |
286 | ||
287 | The command | |
288 | ||
289 | mpw-build | |
290 | ||
291 | will build everything. Building will take over an hour on a Quadra 800 | |
292 | or PowerMac 8100/110, longer if the sources are on a shared volume. | |
293 | ||
294 | You may see some warnings; these are mostly likely benign, typically | |
295 | disagreements about declarations of library and system functions. | |
296 | ||
297 | * Installing | |
298 | ||
299 | To install the just-built tools, use the command | |
300 | ||
301 | mpw-build install | |
302 | ||
303 | This part of the installation procedure just copies files to the | |
304 | location specified at configure time by <prefix>, and, in some cases, | |
305 | renames them from temporary internal names to their usual names. This | |
306 | install process is *not* the same as what the Install script does; | |
307 | Install can copy tools from the installation location chosen at | |
308 | configuration time to a user-chosen place, and sets up a UserStartup | |
309 | file. Note that while the Install script is optional, the install | |
310 | build action performs some tasks would be very hard to replicate | |
311 | manually, so you should always do it before using the tools. | |
312 | ||
313 | * Known Problems With Using Various Compilers to Build | |
314 | ||
315 | Most versions of MPW C have problems with compiling GNU software. | |
316 | ||
317 | MPW C 3.2.x has preprocessing bugs that render it incapable of | |
318 | compiling the BFD library, so it can't be used at all for building BFD. | |
319 | ||
320 | MPW C 3.3, 3.3.1, and 3.3.2 will spontaneously claim to have found | |
321 | errors in the source code, but in fact the code is perfectly fine. If | |
322 | this happens, just set the working directory back to the top-level | |
323 | objdir (where the configure command above was performed), and type | |
324 | "mpw-build all" again. If it goes on through the supposed error, then | |
325 | you got one of the spurious errors. A full build may require a number | |
326 | of these restarts. | |
327 | ||
328 | MPW C 3.3.3 seems to work OK, at least with the aid of a number of | |
329 | workarounds that are in the sources (look for #ifdef MPW_C). | |
330 | ||
331 | Versions of MPW Make earlier than 4.0d2 have exhibited bizarre behavior, | |
332 | failure to substitute variables and the like. | |
333 | ||
334 | Metrowerks CW6 PPC linker (MWLinkPPC) seems to do bad things with memory | |
335 | if the "Modern Memory Manager" is turned on (in the Memory control panel), | |
336 | but works OK if it is turned off. | |
337 | ||
338 | Metrowerks CW6 loses bigtime compiling opcodes:ppc-opc.c, which has | |
339 | some deeply nested macros. (CW7 is OK.) There is a way to patch the | |
340 | file, by substituting constant values. If you need to do this, | |
341 | contact shebs@cygnus.com for details. | |
342 | ||
343 | <Gestalt.h> is missing from {CIncludes} in the MPW version that comes | |
344 | with CW7. You can just copy the one in CW7's {MWCIncludes}. | |
345 | ||
346 | CW8 and later have changes to headers and such that will require changes | |
347 | to the source in order to be able to use them to rebuild. | |
348 | ||
349 | KNOWN BUGS | |
350 | ||
351 | The declarations for memcpy and memcmp in some versions of header files | |
352 | may conflict with GCC's builtin definition. Either use -fno-builtin | |
353 | or ignore the warnings. | |
354 | ||
355 | This is not a bug, but - watch out for cr/nl translation! For instance, | |
356 | if config/mpw-mh-mpw is not properly translated because it has been | |
357 | copied or updated separately, then everything will almost build, but | |
358 | you will get puzzling error messages from make or the compiler. | |
359 | ||
360 | '/' or ' ' embedded in any device, directory, or file name may or may | |
361 | not work. | |
362 | ||
363 | objcopy -O srec foo.o makes random output filenames. | |
364 | ||
365 | Mac-x-mips requires -mgas but Unix hosts don't. | |
366 | ||
367 | GDB will frequently require a '/' on the front of a device name in order | |
368 | to recognize it as an absolute rather than a relative pathname. | |
369 | ||
370 | GDB doesn't seem to use the printer port correctly, although it tries. | |
371 | ||
372 | The cursor doesn't always spin as much as it should. To get elaborate | |
373 | statistics and warnings about spin rates, add this to UserStartup: | |
374 | ||
375 | set MEASURE_SPIN all | |
376 | export MEASURE_SPIN |