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
