377 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			377 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
This is basic information about the Macintosh(tm) MPW(tm) port of the
 | 
						|
GNU tools.  The information below applies to both native and cross
 | 
						|
compilers.
 | 
						|
 | 
						|
(Please note that there are two versions of this file; "mpw-README"
 | 
						|
is the source form, and "Read Me for MPW" is the distribution form.
 | 
						|
"Read Me for MPW" has 8-bit chars such as \Option-d embedded in it.)
 | 
						|
 | 
						|
INSTALLING GNU TOOLS
 | 
						|
 | 
						|
* System Requirements
 | 
						|
 | 
						|
To use these tools, you will need a Mac with a 68020 or better or else
 | 
						|
any PowerMac, System 7.1 or later, and MPW 3.3 or 3.4.  You will *not*
 | 
						|
need any other MPW compiler unless you want to rebuild from sources,
 | 
						|
nor even any include files, unless you are building actual Mac
 | 
						|
applications.  For PowerMac native you will need PPCLink, however;
 | 
						|
also the executables are PowerPC-only.
 | 
						|
 | 
						|
* Automated Installation
 | 
						|
 | 
						|
The simplest way to install GNU tools is to run the Install script.
 | 
						|
The script will copy things to where you want to keep them, will build
 | 
						|
a UserStartup file with settings corresponding to where things were
 | 
						|
copied, and offer to put that UserStartup file in your MPW folder.
 | 
						|
 | 
						|
The Install script does not alter anything in the System Folder, and
 | 
						|
it does not take any action without confirmation.
 | 
						|
 | 
						|
The Install script will be at the top level of the binary
 | 
						|
distribution, or at the top level of the object directory if
 | 
						|
rebuilding from source.  (The sources include a file called
 | 
						|
"mpw-install" at the top level, but it is the source to the Install
 | 
						|
script and cannot be run directly.)
 | 
						|
 | 
						|
* Manual Installation
 | 
						|
 | 
						|
If you don't want to run the Install script, you can do installation
 | 
						|
manually; this section describes the steps involved.
 | 
						|
 | 
						|
The GNU tools can go in any directory that is in your {Commands} list.
 | 
						|
We generally put all the tools somewhere like {Boot}Cygnus:latest:bin,
 | 
						|
and then add to a UserStartup file:
 | 
						|
 | 
						|
	set Commands "{Boot}Cygnus:latest:bin:,{Commands}"
 | 
						|
 | 
						|
However, the cpp and cc1 programs of GCC are not normally stored here.
 | 
						|
Instead, they will be in a "lib" directory that is alongside "bin",
 | 
						|
and organized by target and version underneath, with names like
 | 
						|
 | 
						|
	:lib:gcc-lib:<target>:cygnus-<version>:
 | 
						|
 | 
						|
If you build and install everything yourself according to the build
 | 
						|
instructions below, then you will not have any problems.  However, you
 | 
						|
may discover that GCC seems unable to find the right cpp and cc1;
 | 
						|
usually this will be because directory names have changed.  (Even
 | 
						|
renaming your hard disk will make this happen.)  In such cases, you
 | 
						|
have several choices.  One is just to add this directory to
 | 
						|
{Commands}, but then you will not be able to get any other cpp or cc1,
 | 
						|
such as those used by a different target or version.  Another way is
 | 
						|
to rename your disk and directories to match the prefix used when the
 | 
						|
tools were compiled.  Finally, you can set the variable
 | 
						|
GCC_EXEC_PREFIX to point to the library directory:
 | 
						|
 | 
						|
	set GCC_EXEC_PREFIX MyDisk:Stuff:lib:gcc-lib:
 | 
						|
	export GCC_EXEC_PREFIX
 | 
						|
 | 
						|
You may also want to edit MPW's HEXA 128 resource.  When GCC is built
 | 
						|
using a native GCC, it is compiled to use a special stack allocator
 | 
						|
function alloca().  While this is very efficient, it means that GCC
 | 
						|
will need considerable stack space to run, especially when compiling
 | 
						|
large programs with optimization turned on.  You give MPW more stack
 | 
						|
by editing the HEXA 128 resource of the MPW Shell.  A value of "0008
 | 
						|
0000" gives 512K of stack size, which is usually sufficient.
 | 
						|
 | 
						|
USING GNU TOOLS
 | 
						|
 | 
						|
* Using Native PowerMac GCC
 | 
						|
 | 
						|
Using a native PowerMac GCC to produce MPW tools or MacOS applications
 | 
						|
is more complicated than just "gC foo.c", although no more complicated
 | 
						|
than with other Mac compilers.
 | 
						|
 | 
						|
To build a native PowerMac MPW tool, use this sequence, where hello.c
 | 
						|
is the usual "hello world" program, and genericcfrg.r is the Rez file
 | 
						|
with the code fragment resource:
 | 
						|
 | 
						|
gC -I{CIncludes} -fno-builtin -Dpascal= -c -g hello.c
 | 
						|
PPCLink hello.o -o hello \Option-d
 | 
						|
	"{PPCLibraries}"StdCRuntime.o \Option-d
 | 
						|
	"{SharedLibraries}"InterfaceLib \Option-d
 | 
						|
	"{SharedLibraries}"StdCLib \Option-d
 | 
						|
	"{PPCLibraries}"PPCToolLibs.o \Option-d
 | 
						|
	"{PPCLibraries}"PPCCRuntime.o \Option-d
 | 
						|
	"{GCCPPCLibraries}"libgcc.xcoff
 | 
						|
rez -d APPNAME='"'hello'"' GenericCFRG.r -o hello
 | 
						|
setfile -t 'MPST' -c 'MPS ' hello
 | 
						|
 | 
						|
The same sequence works to build a MacOS application, but you set the file
 | 
						|
type to 'APPL' and don't link in PPCToolLibs.o.  For further details on
 | 
						|
using MPW to build Mac applications, see the general MPW documentation.
 | 
						|
 | 
						|
Recent versions of PPCLink have an option to generate the code
 | 
						|
fragment resource and automatically set creator and file type;
 | 
						|
here is what GenericCFRG.r should look like if you have an older
 | 
						|
PPCLink or are using GNU ld:
 | 
						|
 | 
						|
#include "CodeFragmentTypes.r"
 | 
						|
 | 
						|
resource 'cfrg' (0) {
 | 
						|
        {
 | 
						|
                kPowerPC,
 | 
						|
                kFullLib,
 | 
						|
                kNoVersionNum,kNoVersionNum,
 | 
						|
                0,0,
 | 
						|
                kIsApp,kOnDiskFlat,kZeroOffset,kWholeFork,
 | 
						|
                APPNAME // must be defined on Rez command line with -d option
 | 
						|
        }
 | 
						|
};
 | 
						|
 | 
						|
In general this port of GCC supports the same option syntax and
 | 
						|
behavior as its Unix counterpart.  It also has similar compilation
 | 
						|
rules, so it will run the assembler on .s files and so forth.
 | 
						|
 | 
						|
The GCC manual includes full information on the available options.
 | 
						|
One option that may be especially useful is "-v", which shows you what
 | 
						|
tools and options are being used; unlike most Mac C compilers, GCC
 | 
						|
directs assembly and linking in addition to compilation.
 | 
						|
 | 
						|
MPW GCC does feature two extensions to the option syntax; '-d macro=name'
 | 
						|
works just as '-Dmacro=name' does in Unix, and '-i directory' works the
 | 
						|
same as '-Idirectory'.
 | 
						|
 | 
						|
MPW GCC supports the usual Pascal-style strings and alignment pragmas.
 | 
						|
 | 
						|
To find standard include files you can set the variable GCCIncludes:
 | 
						|
 | 
						|
	set GCCIncludes MyDisk:MyIncludes:
 | 
						|
	export GCCIncludes
 | 
						|
 | 
						|
GCCIncludes is similar to MPW's CIncludes or CW's MWCIncludes.  In
 | 
						|
order to use MPW's usual include files, just say:
 | 
						|
 | 
						|
	set GCCIncludes "{CIncludes}"
 | 
						|
	export GCCIncludes
 | 
						|
 | 
						|
* Using GCC as a Cross-Compiler
 | 
						|
 | 
						|
If you have a cross-compiler, and you have all of the correct
 | 
						|
target-side crt0 and libraries available, then to compile and link a
 | 
						|
file "foo.c", you can say just
 | 
						|
 | 
						|
	gC foo.c
 | 
						|
 | 
						|
The output file will be an MPW binary file named "a.out"; the format
 | 
						|
of the contents will depend on which target is in use, so for instance
 | 
						|
a MIPS-targeting GCC will produce ECOFF or ELF executables.
 | 
						|
 | 
						|
Note that using MPW include files with a cross-compiler is somewhat
 | 
						|
dangerous.
 | 
						|
 | 
						|
* Using the Assembler and Friends
 | 
						|
 | 
						|
The assembler ("as") and linker ("ld") are faithful ports of their
 | 
						|
Unix counterparts.  Similarly, the binutils "ar", "cplusfilt", "nm",
 | 
						|
"objcopy", "objdump", "ranlib", "size", "strings", and "strip" are all
 | 
						|
like they are under Unix.  (Note that "cplusfilt" is usually called
 | 
						|
"c++filt" under Unix.)
 | 
						|
 | 
						|
* Using GDB
 | 
						|
 | 
						|
There are two flavors of GDB.  "gdb" is an MPW tool that works very
 | 
						|
much like it does in Unix; put a command into the MPW worksheet and
 | 
						|
type the <enter> key to send it to GDB.  While "gdb" is running, you
 | 
						|
cannot do anything else in MPW, although you can switch to other
 | 
						|
Mac applications and use them.
 | 
						|
 | 
						|
"SiowGDB" is also a Mac application, but it is GDB using the SIOW
 | 
						|
package to provide console emulation.  Commands are exactly as for the
 | 
						|
MPW tool, but since this is its own application, you can switch
 | 
						|
between it and MPW.
 | 
						|
 | 
						|
BUILDING GNU TOOLS
 | 
						|
 | 
						|
This port of the GNU tools uses a configure script similar to
 | 
						|
that used for GNU tools under Unix, but rewritten for MPW.  As with
 | 
						|
Unix configuration, there is an "object" directory that may be
 | 
						|
different from the "source" directory.  In the example commands below,
 | 
						|
we will assume that we are currently in the object directory, and that
 | 
						|
the source directory is "{Boot}Cygnus:src:".
 | 
						|
 | 
						|
* Requirements for Building
 | 
						|
 | 
						|
In addition to the sources, you will need a set of tools that the
 | 
						|
configure and build scripts assume to be available.  These tools
 | 
						|
(and their versions, if relevant) are as follows:
 | 
						|
 | 
						|
	byacc tool
 | 
						|
	flex (2.3.7) tool (and Flex.skel file)
 | 
						|
	forward-include script
 | 
						|
	MoveIfChange script
 | 
						|
	mpw-touch script
 | 
						|
	mpw-true script
 | 
						|
	NewFolderRecursive script
 | 
						|
	null-command script
 | 
						|
	open-brace script
 | 
						|
	sed (1.13) tool
 | 
						|
	tr-7to8 script
 | 
						|
	true script
 | 
						|
 | 
						|
The scripts are in the sources, under utils:mpw:. You must arrange to
 | 
						|
get the other tools yourself (they are readily available from the
 | 
						|
"usual" net sites, and are also on many CDROMS).  In addition, there
 | 
						|
will usually be a set of these available at ftp.cygnus.com, in pub/mac.
 | 
						|
 | 
						|
You may put the build tools in your usual Tools or Scripts
 | 
						|
directories, or keep them in a separate directories.  We prefer to
 | 
						|
make a directory called "buildtools" and we put this in one of our
 | 
						|
UserStartup files:
 | 
						|
 | 
						|
	set Commands "{Boot}Cygnus:buildtools:,{Commands}"
 | 
						|
 | 
						|
Flex uses an environment variable FLEX_SKELETON to locate its skeleton
 | 
						|
file, so you need to do something like this, preferably in a UserStartup:
 | 
						|
 | 
						|
	Set FLEX_SKELETON "{Boot}"Cygnus:buildtools:Flex.skel
 | 
						|
	Export FLEX_SKELETON
 | 
						|
 | 
						|
* Configuring
 | 
						|
 | 
						|
Before you can build anything, you must configure.  You do this by
 | 
						|
creating an directory where object files will be stored, setdirectory
 | 
						|
to that directory and do a configure command:
 | 
						|
 | 
						|
	{Boot}Cygnus:src:mpw-configure --target <name> --cc <compiler> --srcdir {Boot}Cygnus:src: --prefix <whatever>
 | 
						|
 | 
						|
If the source directory is not in your {Commands} list, then you must
 | 
						|
supply a full pathname to mpw-configure, since mpw-configure invokes
 | 
						|
itself after switching into each subdirectory.  Using a relative
 | 
						|
pathname, even something like ':mpw-configure', will therefore not work.
 | 
						|
 | 
						|
<name> must be a known target.  Valid ones include "m68k-apple-macos",
 | 
						|
"powerpc-apple-macos", "i386-unknown-go32", "mips-idt-ecoff", and
 | 
						|
"sh-hitachi-hms".  Not all target types are accepted for all of the
 | 
						|
tools yet.
 | 
						|
 | 
						|
<compiler> must be the name of the compiler to use.  It defaults to "mpwc".
 | 
						|
 | 
						|
	(m68k)
 | 
						|
	mpwc	MPW C
 | 
						|
	sc68k	Symantec C
 | 
						|
	mwc68k	Metrowerks C (Codewarrior)
 | 
						|
	gcc68k	GCC
 | 
						|
 | 
						|
	(powerpc)
 | 
						|
	ppcc	PPCC
 | 
						|
	mrc	Macintosh on RisC (Mister C, aka(?) Frankenstein)
 | 
						|
	scppc	Symantec C
 | 
						|
	mwcppc	Metrowerks C (Codewarrior)
 | 
						|
	gccppc	GCC
 | 
						|
 | 
						|
Not all compilers will compile all tools equally well!  For m68k Macs,
 | 
						|
MPW C has the best record so far (it has problems, but they can be
 | 
						|
worked around), while for PowerMacs, CodeWarrior is the only compiler
 | 
						|
that has successfully compiled everything into running code.
 | 
						|
 | 
						|
<prefix> is the path that "gcc" will prepend when looking for tools
 | 
						|
to execute.  GCC_EXEC_PREFIX overrides this value, so you need not
 | 
						|
include it if you plan to use GCC_EXEC_PREFIX.
 | 
						|
 | 
						|
As an example, here is the configure line that you could use to build
 | 
						|
native PowerMac GCC:
 | 
						|
 | 
						|
"{Boot}"Cygnus:src:mpw-configure --cc mwcppc --target powerpc-apple-macos --srcdir "{Boot}"Cygnus:src: --prefix "{Boot}"GNUTools:
 | 
						|
 | 
						|
* Building
 | 
						|
 | 
						|
If you use CodeWarrior, you *must* first set MWCIncludes to
 | 
						|
{CIncludes}.  This is because you will be building MPW tools, and
 | 
						|
their standard I/O works by making references to data that is part of
 | 
						|
the MPW Shell, which means that the code must be compiled and linked
 | 
						|
with macros that refer to that data, and those macros are in
 | 
						|
{CIncludes}, not the default {MWCIncludes}.  Without this change, you
 | 
						|
will encounter problems compiling libiberty/mpw.c, but tweaking that
 | 
						|
file only masks the real problem, and does not fix it.
 | 
						|
 | 
						|
The command
 | 
						|
 | 
						|
	mpw-build
 | 
						|
 | 
						|
will build everything. Building will take over an hour on a Quadra 800
 | 
						|
or PowerMac 8100/110, longer if the sources are on a shared volume.
 | 
						|
 | 
						|
You may see some warnings; these are mostly likely benign, typically
 | 
						|
disagreements about declarations of library and system functions.
 | 
						|
 | 
						|
* Installing
 | 
						|
 | 
						|
To install the just-built tools, use the command
 | 
						|
 | 
						|
	mpw-build install
 | 
						|
 | 
						|
This part of the installation procedure just copies files to the
 | 
						|
location specified at configure time by <prefix>, and, in some cases,
 | 
						|
renames them from temporary internal names to their usual names. This
 | 
						|
install process is *not* the same as what the Install script does;
 | 
						|
Install can copy tools from the installation location chosen at
 | 
						|
configuration time to a user-chosen place, and sets up a UserStartup
 | 
						|
file.  Note that while the Install script is optional, the install
 | 
						|
build action performs some tasks would be very hard to replicate
 | 
						|
manually, so you should always do it before using the tools.
 | 
						|
 | 
						|
* Known Problems With Using Various Compilers to Build
 | 
						|
 | 
						|
Most versions of MPW C have problems with compiling GNU software.
 | 
						|
 | 
						|
MPW C 3.2.x has preprocessing bugs that render it incapable of
 | 
						|
compiling the BFD library, so it can't be used at all for building BFD.
 | 
						|
 | 
						|
MPW C 3.3, 3.3.1, and 3.3.2 will spontaneously claim to have found
 | 
						|
errors in the source code, but in fact the code is perfectly fine.  If
 | 
						|
this happens, just set the working directory back to the top-level
 | 
						|
objdir (where the configure command above was performed), and type
 | 
						|
"mpw-build all" again.  If it goes on through the supposed error, then
 | 
						|
you got one of the spurious errors.  A full build may require a number
 | 
						|
of these restarts.
 | 
						|
 | 
						|
MPW C 3.3.3 seems to work OK, at least with the aid of a number of
 | 
						|
workarounds that are in the sources (look for #ifdef MPW_C).
 | 
						|
 | 
						|
Versions of MPW Make earlier than 4.0d2 have exhibited bizarre behavior,
 | 
						|
failure to substitute variables and the like.
 | 
						|
 | 
						|
Metrowerks CW6 PPC linker (MWLinkPPC) seems to do bad things with memory
 | 
						|
if the "Modern Memory Manager" is turned on (in the Memory control panel),
 | 
						|
but works OK if it is turned off.
 | 
						|
 | 
						|
Metrowerks CW6 loses bigtime compiling opcodes:ppc-opc.c, which has
 | 
						|
some deeply nested macros.  (CW7 is OK.)  There is a way to patch the
 | 
						|
file, by substituting constant values.  If you need to do this,
 | 
						|
contact shebs@cygnus.com for details.
 | 
						|
 | 
						|
<Gestalt.h> is missing from {CIncludes} in the MPW version that comes
 | 
						|
with CW7.  You can just copy the one in CW7's {MWCIncludes}.
 | 
						|
 | 
						|
CW8 and later have changes to headers and such that will require changes
 | 
						|
to the source in order to be able to use them to rebuild.
 | 
						|
 | 
						|
KNOWN BUGS
 | 
						|
 | 
						|
The declarations for memcpy and memcmp in some versions of header files
 | 
						|
may conflict with GCC's builtin definition.  Either use -fno-builtin
 | 
						|
or ignore the warnings.
 | 
						|
 | 
						|
This is not a bug, but - watch out for cr/nl translation!  For instance,
 | 
						|
if config/mpw-mh-mpw is not properly translated because it has been
 | 
						|
copied or updated separately, then everything will almost build, but
 | 
						|
you will get puzzling error messages from make or the compiler.
 | 
						|
 | 
						|
'/' or ' ' embedded in any device, directory, or file name may or may
 | 
						|
not work.
 | 
						|
 | 
						|
objcopy -O srec foo.o makes random output filenames.
 | 
						|
 | 
						|
Mac-x-mips requires -mgas but Unix hosts don't.
 | 
						|
 | 
						|
GDB will frequently require a '/' on the front of a device name in order
 | 
						|
to recognize it as an absolute rather than a relative pathname.
 | 
						|
 | 
						|
GDB doesn't seem to use the printer port correctly, although it tries.
 | 
						|
 | 
						|
The cursor doesn't always spin as much as it should.  To get elaborate
 | 
						|
statistics and warnings about spin rates, add this to UserStartup:
 | 
						|
 | 
						|
	set MEASURE_SPIN all
 | 
						|
	export MEASURE_SPIN
 |