Retro68/README.md
2017-09-23 21:05:40 +02:00

269 lines
8.7 KiB
Markdown

Retro68
=======
A GCC-based cross-compilation environment for 68K and PowerPC Macs.
Why? Because there is no decent C++11 Compiler targeting Apple's System 6.
If that's not a sufficient reason for you, I'm sure you will find
something more useful elsewhere.
If you are crazy enough to try it out, please say hello at
wolfgang.thaller@gmx.net.
Installing/Building
-------------------
### Prerequisites
- Linux or Mac OS X
- boost
- CMake 2.8
- GCC dependencies: GMP 4.2+, MPFR 2.3.1+ and MPC 0.8.0+
- bison version 3.0.2 or later
- Apple Universal Interfaces (version 3.x; version 3.4 is tested)
- An ancient Mac and/or an emulator.
For Ubuntu Linux, the following should help a bit:
sudo apt-get install cmake libgmp-dev libmpfr-dev libmpc-dev libboost-all-dev bison
On a Mac, get the homebrew package manager and:
brew install boost --c++11
brew install cmake gmp mpfr libmpc bison
In theory, you can also run Retro68 on a PowerMac G4 or G5 running Mac OS 10.4 (Tiger).
In that case, get the tigerbrew package manager and
brew install gcc cmake
### Apple Universal Interfaces
Before you can build Retro68, you need to find a copy of Apple's Universal Interfaces
and put it inside the InterfacesAndLibraries directory in the source tree.
Version 3.4 has received the most testing, but any 3.x version could theoretically
work.
The exact directory layout inside the InterfacesAndLibraries directory does
not matter. The resource forks of the files are not required.
The Universal Interfaces used to be a free download from Apple. However,
they have taken the site off-line and the license agreement does not allow
redistribution, which is why it's not included in this repository.
The concept of fair use might cover keeping it available for reasons of historical
interest, or it might not. I am not a lawyer.
The Universal Interfaces were also included with Apple's free-to-download
Macintosh Programmer's Workshop (MPW; redistribution is not officially allowed, either)
and with Metrowerks CodeWarrior.
One of the most easily found downloads is the MPW 3.5 Golden Master release,
usually in a file named mpg-gm.img_.bin. At the time of this writing, this can be
found at:
http://macintoshgarden.org/apps/macintosh-programmers-workshop
https://www.macintoshrepository.org/1360-macintosh-programmer-s-workshop-mpw-3-0-to-3-5
You will need a Mac or a Mac emulator (with DiscCopy) to read that file.
### Compiling Retro68
Once you have all the prerequisites, execute these commands from the top level
of the Retro68 directory:
cd ..
mkdir Retro68-build
cd Retro68-build
../Retro68/build-toolchain.bash
The toolchain will be installed in the "toolchain" directory inside
the build directory.
If you're building this on a PowerMac running Mac OS X 10.4, tell the build script
to use the gcc you've installed via tigerbrew:
../Retro68/build-toolchain.bash --host-cxx-compiler=g++-5
### Build options and recompiling
Building all of Retro68 involves building binutils and gcc... twice, so it
takes quite a while.
You can pass the `--no-68k`, `--no-ppc` or `--no-carbon`
flags to `build-toolchain` to limit yourself to the old Macs you're really
interested in (note that `--no-ppc` implies `--no-carbon`).
After the initial build, you can use the `--skip-thirdparty` option in order to
skip gcc and binutils and just compile the Retro68-specific tools, libraries and
sample programs.
The `build-host`, `build-target`, `build-target-ppc` and `build-target-carbon`
directories are CMake build directories generated from the top-level `CMakeLists.txt`,
so you can also `cd` to one of these and run `make` separately if you've made changes.
Sample programs
---------------
Sample programs are built in several formats:
- On Macs: Real Mac Applications (`ApplicationName.APPL`)
- Elsewhere: `ApplicationName.APPL`, `.rsrc/ApplicationName.APPL`, `.finf/ApplicationName.APPL` (BasiliskII/Sheepshaver compatible)
- MacBinary files (`ApplicationName.bin`)
- Raw HFS disk image (`ApplicationName.dsk`, containing `ApplicationName`)
- AppleDouble file pairs (`ApplicationName.ad`, `%ApplicationName.ad`, Executor compatible)
Look under `Retro68-build/build-target/` (68K),
`Retro68-build/build-target-ppc/` (PowerPC Classic) and
`Retro68-build/build-target-carbon/` (PowerPC Carbon) for the compiled examples.
Components
----------
Retro68 is an aggegation of various existing free software
projects with a few components added.
Third Party Components:
- binutils 2.28
- gcc 6.3.0
- newlib 2.10.1 (inside the gcc directory)
- elf2flt (from the ucLinux project's CVS)
- hfsutils 3.2.6
Retro68-Specific Components:
- ResourceFiles library
- Rez
- PEFTools (MakePEF and MakeImport)
- MakeAPPL
- libretro
- TestApps - a few tiny test programs
- Sample Programs: Raytracer, HelloWorld, Launcher, Dialog
### binutils
Two new target platforms:
- `m68k-apple-macos`, based on the `m68k-unknown-elf` target
- `powerpc-apple-macos`, based on the `powerpc-ibm-aix` target
The powerpc target has a few hacks to make weak symbols work as expected.
### gcc
Various patches and hacks:
- New target platforms `m68k-apple-macos` and `powerpc-apple-macos`.
- support `"\pPascal String Literals"``
68K specific:
- Changed register usage.
- Change the way 1-byte and 2-byte parameters are passed.
- added a pascal calling convention (`pascal` or `__attribute__((__pascal__))`)
- added `__attribute__((__raw_inline__(word1, word2, word3)))` to emulate `ONEWORDINLINE` and friends
- added `__attribute__((regparam("...")))` to specify custom register calling conventions
- added `#pragma parameter` to specify custom register calling conventions
- added support for the `= { 0x1234 }` syntax for inline machine code.
PowerPC specific:
- New flag -carbon that makes gcc link with `-lCarbonLib` instead of `-lInterfaceLib`
### newlib
Standard C library. Currently unmodified. The missing platform-dependent
bits haven't been added, instead they are found in 'libretro'.
### elf2flt
Converts from ELF to a much simpler binary format.
Minor patch: provide symbols around .init and .fini sections
### hfsutils:
No changes.
### ResourceFiles
A C++ Library for manipulating resource forks.
### Rez
A reimplementation of Apple's Rez resource compiler. Reads `.r` files
containing textual resource descriptions and compiles them to binary
resource files.
### ConvertObj
Reads a MPW 68K Object file (`*.o`) and converts it to input for the
GNU assembler (`powerpc-apple-macos-as`). Well, as long as the .o file does not
use global variables or non-local function calls. Used to import glue code from
MPW's `Interface.o` library.
### MakeAPPL
Reads a FLAT executable as output by elf2flt and converts it to
a MacBinary file containing a classic Macintosh application.
The CMake setup for the sample programs no longer uses this, but rather uses
Rez to generate the appropriate resources.
### PEFTools
Tools supporting the Apple's PEF format, the Preferred Executable Format
for PowerPC Macs.
- `MakePEF`, a tool to convert xcoff files to PEF.
- `MakeImport`, a tool to create an xcoff import stub library from a PEF-format library.
### prepare-headers.sh:
Apply any necessary patches to Apple's headers.
### ImportLibraries
Import Libraries in XCOFF format. Based on the list of symbols in Apple's import
libraries. Generated using the `MakeImport` tool.
### libretro
Contains startup code (handles relocations on 68K) and implementations
for some standard library functions.
### Console
Contains a library that implements basic text console functionality.
### Sample Program: Hello World
The binary is in Retro68-build/build-target/Samples/HelloWorld/.
### Sample Program: Raytracer
Calculates a nice 3D image, pixel by pixel.
There are two versions: raytracer.c is a straightforward
plain C implementation using floating point arithmetic.
Raytracer2 makes use of C++ features; it also uses
fixed point arithmetic instead of floating point
(operator overloading FTW).
The binaries are in Retro68-build/build-target/Samples/Raytracer/.
### Sample Program: Launcher
A utility program for using Retro68 together with the minivmac emulator.
Waits for a disk(image) to be inserted, and if it contains a single application, launches it.
After the application exits, the disk is ejected again.
This way, you can just drag a .dsk file generated by Retro68 on a minivmac Window to run your application.
Intended for System 6 without Multifinder.
### Sample Program: Dialog
Shows a simple and useless dialog box. Demonstrates how to use Rez, the resource compiler.
The binary is in Retro68-build/build-target/Samples/Dialog/.
License
-------
The original parts of Retro68 are licensed under GPL3+, as are
most other parts. Some parts are licensed GPL2+ or with more
liberal licenses. Check the copyright notices in the individual
files.