386 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			386 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
Patrick Beard's Notes for building GC v4.12 with CodeWarrior Pro 2:
 | 
						|
----------------------------------------------------------------------------
 | 
						|
The current build environment for the collector is CodeWarrior Pro 2.
 | 
						|
Projects for CodeWarrior Pro 2 (and for quite a few older versions)
 | 
						|
are distributed in the file Mac_projects.sit.hqx. The project file
 | 
						|
:Mac_projects:gc.prj builds static library versions of the collector.
 | 
						|
:Mac_projects:gctest.prj builds the GC test suite.
 | 
						|
 | 
						|
Configuring the collector is still done by editing the files
 | 
						|
:Mac_files:MacOS_config.h and :Mac_files:MacOS_Test_config.h.
 | 
						|
 | 
						|
Lars Farm's suggestions on building the collector:
 | 
						|
----------------------------------------------------------------------------
 | 
						|
Garbage Collection on MacOS - a manual 'MakeFile'
 | 
						|
-------------------------------------------------
 | 
						|
 | 
						|
Project files and IDE's are great on the Macintosh, but they do have
 | 
						|
problems when used as distribution media. This note tries to provide
 | 
						|
porting instructions in pure TEXT form to avoid those problems. A manual
 | 
						|
'makefile' if you like.
 | 
						|
 | 
						|
    GC version:     4.12a2
 | 
						|
    Codewarrior:    CWPro1
 | 
						|
    date:           18 July 1997
 | 
						|
 | 
						|
The notes may or may not apply to earlier or later versions of the
 | 
						|
GC/CWPro. Actually, they do apply to earlier versions of both except that
 | 
						|
until recently a project could only build one target so each target was a
 | 
						|
separate project. The notes will most likely apply to future versions too.
 | 
						|
Possibly with minor tweaks.
 | 
						|
 | 
						|
This is just to record my experiences. These notes do not mean I now
 | 
						|
provide a supported port of the GC to MacOS. It works for me. If it works
 | 
						|
for you, great. If it doesn't, sorry, try again...;-) Still, if you find
 | 
						|
errors, please let me know.
 | 
						|
 | 
						|
    mailto:         lars.farm@ite.mh.se
 | 
						|
 | 
						|
    address:        Lars Farm
 | 
						|
                    Krönvägen 33b
 | 
						|
                    856 44 Sundsvall
 | 
						|
                    Sweden
 | 
						|
 | 
						|
Porting to MacOS is a bit more complex than it first seems. Which MacOS?
 | 
						|
68K/PowerPC? Which compiler? Each supports both 68K and PowerPC and offer a
 | 
						|
large number of (unique to each environment) compiler settings. Each
 | 
						|
combination of compiler/68K/PPC/settings require a unique combination of
 | 
						|
standard libraries. And the IDE's does not select them for you. They don't
 | 
						|
even check that the library is built with compatible setting and this is
 | 
						|
the major source of problems when porting the GC (and otherwise too).
 | 
						|
 | 
						|
You will have to make choices when you configure the GC. I've made some
 | 
						|
choices here, but there are other combinations of settings and #defines
 | 
						|
that work too.
 | 
						|
 | 
						|
As for target settings the major obstacles may be:
 | 
						|
- 68K Processor: check "4-byte Ints".
 | 
						|
- PPC Processor: uncheck "Store Static Data in TOC".
 | 
						|
 | 
						|
What you need to do:
 | 
						|
===================
 | 
						|
 | 
						|
1) Build the GC as a library
 | 
						|
2) Test that the library works with 'test.c'.
 | 
						|
3) Test that the C++ interface 'gc_cpp.cc/h' works with 'test_cpp.cc'.
 | 
						|
 | 
						|
1) The Libraries:
 | 
						|
=================
 | 
						|
I made one project with four targets (68K/PPC tempmem or appheap). One target
 | 
						|
will suffice if you're able to decide which one you want. I wasn't...
 | 
						|
 | 
						|
Codewarrior allows a large number of compiler/linker settings. I used these:
 | 
						|
 | 
						|
Settings shared by all targets:
 | 
						|
------------------------------
 | 
						|
o Access Paths:
 | 
						|
  - User Paths:   the GC folder
 | 
						|
  - System Paths: {Compiler}:Metrowerks Standard Library:
 | 
						|
                  {Compiler}:MacOS Support:Headers:
 | 
						|
                  {Compiler}:MacOS Support:MacHeaders:
 | 
						|
o C/C++ language:
 | 
						|
  - inlining: normal
 | 
						|
  - direct to SOM: off
 | 
						|
  - enable/check: exceptions, RTTI, bool (and if you like pool strings)
 | 
						|
 | 
						|
PowerPC target settings
 | 
						|
-----------------------
 | 
						|
o Target Settings:
 | 
						|
  - name of target
 | 
						|
  - MacOS PPC Linker
 | 
						|
o PPC Target
 | 
						|
  - name of library
 | 
						|
o C/C++ language
 | 
						|
  - prefix file as described below
 | 
						|
o PPC Processor
 | 
						|
  - Struct Alignment: PowerPC
 | 
						|
  - uncheck "Store Static Data in TOC" -- important!
 | 
						|
    I don't think the others matter, I use full optimization and its ok
 | 
						|
o PPC Linker
 | 
						|
  - Factory Settings (SYM file with full paths, faster linking, dead-strip
 | 
						|
    static init, Main: __start)
 | 
						|
 | 
						|
 | 
						|
68K target settings
 | 
						|
-------------------
 | 
						|
o Target Settings:
 | 
						|
  - name of target
 | 
						|
  - MacOS 68K Linker
 | 
						|
o 68K Target
 | 
						|
  - name of library
 | 
						|
  - A5 relative data
 | 
						|
o C/C++ language
 | 
						|
  - prefix file as described below
 | 
						|
o 68K Processor
 | 
						|
  - Code model: smart
 | 
						|
  - Struct alignment: 68K
 | 
						|
  - FP: SANE
 | 
						|
  - enable 4-Byte Ints -- important!
 | 
						|
    I don't think the others matter. I selected...
 | 
						|
  - enable: 68020
 | 
						|
  - enable: global register allocation
 | 
						|
o IR Optimizer
 | 
						|
  - enable: Optimize Space, Optimize Speed
 | 
						|
    I suppose the others would work too, but haven't tried...
 | 
						|
o 68K Linker
 | 
						|
  - Factory Settings (New Style MacsBug,SYM file with full paths,
 | 
						|
    A6 Frames, fast link, Merge compiler glue into segment 1,
 | 
						|
    dead-strip static init)
 | 
						|
 | 
						|
Prefix Files to configure the GC sources
 | 
						|
----------------------------------------
 | 
						|
The Codewarrior equivalent of commandline compilers -DNAME=X is to use
 | 
						|
prefix-files. A TEXT file that is automatically #included before the first byte
 | 
						|
of every source file. I used these:
 | 
						|
 | 
						|
---- ( cut here ) ----  gc_prefix_tempmem.h     -- 68K and PPC -----
 | 
						|
    #include "gc_prefix_common.h"
 | 
						|
    #undef USE_TEMPORARY_MEMORY
 | 
						|
    #define USE_TEMPORARY_MEMORY
 | 
						|
---- ( cut here ) ----  gc_prefix_appmem.h      -- 68K and PPC -----
 | 
						|
    #include "gc_prefix_common.h"
 | 
						|
    #undef USE_TEMPORARY_MEMORY
 | 
						|
//  #define USE_TEMPORARY_MEMORY
 | 
						|
 | 
						|
---- ( cut here ) ----  gc_prefix_common.h      --------------------
 | 
						|
// gc_prefix_common.h
 | 
						|
// ------------------
 | 
						|
// Codewarrior prefix file to configure the GC libraries
 | 
						|
//
 | 
						|
//   prefix files are the Codewarrior equivalent of the
 | 
						|
//   command line option -Dname=x frequently seen in makefiles
 | 
						|
 | 
						|
#if !__MWERKS__
 | 
						|
  #error only tried this with Codewarrior
 | 
						|
#endif
 | 
						|
 | 
						|
#if macintosh
 | 
						|
  #define MSL_USE_PRECOMPILED_HEADERS 0
 | 
						|
  #include <ansi_prefix.mac.h>
 | 
						|
  #ifndef __STDC__
 | 
						|
    #define __STDC__ 0
 | 
						|
  #endif
 | 
						|
 | 
						|
  //  See list of #defines to configure the library in: 'MakeFile'
 | 
						|
  //  see also README
 | 
						|
 | 
						|
  #define SILENT                // no collection messages. In case
 | 
						|
                                // of trouble you might want this off
 | 
						|
  #define ALL_INTERIOR_POINTERS // follows interior pointers.
 | 
						|
//#define DONT_ADD_BYTE_AT_END  // disables the padding if defined.
 | 
						|
//#define SMALL_CONFIG          // whether to use a smaller heap.
 | 
						|
  #define NO_SIGNALS            // signals aren't real on the Macintosh.
 | 
						|
  #define ATOMIC_UNCOLLECTABLE  // GC_malloc_atomic_uncollectable()
 | 
						|
 | 
						|
  // define either or none as per personal preference
 | 
						|
  //   used in malloc.c
 | 
						|
  #define REDIRECT_MALLOC GC_malloc
 | 
						|
//#define REDIRECT_MALLOC GC_malloc_uncollectable
 | 
						|
  // if REDIRECT_MALLOC is #defined make sure that the GC library
 | 
						|
  // is listed before the ANSI/ISO libs in the Codewarrior
 | 
						|
  // 'Link order' panel
 | 
						|
//#define IGNORE_FREE
 | 
						|
 | 
						|
  // mac specific configs
 | 
						|
//#define USE_TEMPORARY_MEMORY    // use Macintosh temporary memory.
 | 
						|
//#define SHARED_LIBRARY_BUILD    // build for use in a shared library.
 | 
						|
 | 
						|
#else
 | 
						|
  // could build Win32 here too, or in the future
 | 
						|
  // Rhapsody PPC-mach, Rhapsody PPC-MacOS,
 | 
						|
  // Rhapsody Intel-mach, Rhapsody Intel-Win32,...
 | 
						|
  // ... ugh this will get messy ...
 | 
						|
#endif
 | 
						|
 | 
						|
// make sure ints are at least 32-bit
 | 
						|
// ( could be set to 16-bit by compiler settings (68K) )
 | 
						|
 | 
						|
struct gc_private_assert_intsize_{ char x[ sizeof(int)>=4 ? 1 : 0 ]; };
 | 
						|
 | 
						|
#if __powerc
 | 
						|
  #if __option(toc_data)
 | 
						|
    #error turn off "store static data in TOC" when using GC
 | 
						|
    //     ... or find a way to add TOC to the root set...(?)
 | 
						|
  #endif
 | 
						|
#endif
 | 
						|
---- ( cut here ) ----  end of gc_prefix_common.h  -----------------
 | 
						|
 | 
						|
Files to  build the GC libraries:
 | 
						|
--------------------------------
 | 
						|
    allchblk.c
 | 
						|
    alloc.c
 | 
						|
    blacklst.c
 | 
						|
    checksums.c
 | 
						|
    dbg_mlc.c
 | 
						|
    finalize.c
 | 
						|
    headers.c
 | 
						|
    mach_dep.c
 | 
						|
    MacOS.c    -- contains MacOS code
 | 
						|
    malloc.c
 | 
						|
    mallocx.c
 | 
						|
    mark.c
 | 
						|
    mark_rts.c
 | 
						|
    misc.c
 | 
						|
    new_hblk.c
 | 
						|
    obj_map.c
 | 
						|
    os_dep.c   -- contains MacOS code
 | 
						|
    ptr_chck.c
 | 
						|
    reclaim.c
 | 
						|
    stubborn.c
 | 
						|
    typd_mlc.c
 | 
						|
    gc++.cc    -- this is 'gc_cpp.cc' with less 'inline' and
 | 
						|
               -- throw std::bad_alloc when out of memory
 | 
						|
               -- gc_cpp.cc works just fine too
 | 
						|
 | 
						|
2) Test that the library works with 'test.c'.
 | 
						|
=============================================
 | 
						|
 | 
						|
The test app is just an ordinary ANSI-C console app. Make sure settings
 | 
						|
match the library you're testing.
 | 
						|
 | 
						|
Files
 | 
						|
-----
 | 
						|
    test.c
 | 
						|
    the GC library to test        -- link order before ANSI libs
 | 
						|
    suitable Mac+ANSI libraries
 | 
						|
 | 
						|
prefix:
 | 
						|
------
 | 
						|
---- ( cut here ) ----  gc_prefix_testlib.h     -- all libs -----
 | 
						|
#define MSL_USE_PRECOMPILED_HEADERS 0
 | 
						|
#include <ansi_prefix.mac.h>
 | 
						|
#undef NDEBUG
 | 
						|
 | 
						|
#define ALL_INTERIOR_POINTERS	/* for GC_priv.h */
 | 
						|
---- ( cut here ) ----
 | 
						|
 | 
						|
3) Test that the C++ interface 'gc_cpp.cc/h' works with 'test_cpp.cc'.
 | 
						|
 | 
						|
The test app is just an ordinary ANSI-C console app. Make sure settings match
 | 
						|
the library you're testing.
 | 
						|
 | 
						|
Files
 | 
						|
-----
 | 
						|
    test_cpp.cc
 | 
						|
    the GC library to test        -- link order before ANSI libs
 | 
						|
    suitable Mac+ANSI libraries
 | 
						|
 | 
						|
prefix:
 | 
						|
------
 | 
						|
same as for test.c
 | 
						|
 | 
						|
For convenience I used one test-project with several targets so that all
 | 
						|
test apps are build at once. Two for each library to test: test.c and
 | 
						|
gc_app.cc. When I was satisfied that the libraries were ok. I put the
 | 
						|
libraries + gc.h + the c++ interface-file in a folder that I then put into
 | 
						|
the MSL hierarchy so that I don't have to alter access-paths in projects
 | 
						|
that use the GC.
 | 
						|
 | 
						|
After that, just add the proper GC library to your project and the GC is in
 | 
						|
action! malloc will call GC_malloc and free GC_free, new/delete too. You
 | 
						|
don't have to call free or delete. You may have to be a bit cautious about
 | 
						|
delete if you're freeing other resources than RAM. See gc_cpp.h. You can
 | 
						|
also keep coding as always with delete/free. That works too. If you want,
 | 
						|
"include <gc.h> and tweak it's use a bit.
 | 
						|
 | 
						|
Symantec SPM
 | 
						|
============
 | 
						|
It has been a while since I tried the GC in SPM, but I think that the above
 | 
						|
instructions should be sufficient to guide you through in SPM too. SPM
 | 
						|
needs to know where the global data is. Use the files 'datastart.c' and
 | 
						|
'dataend.c'. Put 'datastart.c' at the top of your project and 'dataend.c'
 | 
						|
at the bottom  of your project so that all data is surrounded. This is not
 | 
						|
needed in Codewarrior because it provides intrinsic variables
 | 
						|
__datastart__, __data_end__ that wraps all globals.
 | 
						|
 | 
						|
Source Changes (GC 4.12a2)
 | 
						|
==========================
 | 
						|
Very few. Just one tiny in the GC, not strictly needed.
 | 
						|
- MacOS.c line 131 in routine GC_MacFreeTemporaryMemory()
 | 
						|
  change #       if !defined(SHARED_LIBRARY_BUILD)
 | 
						|
  to     #       if !defined(SILENT) && !defined(SHARED_LIBRARY_BUILD)
 | 
						|
  To turn off a message when the application quits (actually, I faked
 | 
						|
  this change by #defining SHARED_LIBRARY_BUILD in a statically linked
 | 
						|
  library for more than a year without ill effects but perhaps this is
 | 
						|
  better).
 | 
						|
 | 
						|
- test_cpp.cc
 | 
						|
  made the first lines of main() look like this:
 | 
						|
  ------------
 | 
						|
  int main( int argc, char* argv[] ) {
 | 
						|
  #endif
 | 
						|
  #if macintosh                             // MacOS
 | 
						|
    char* argv_[] = {"test_cpp","10"};      //   doesn't
 | 
						|
    argv=argv_;                             //     have a
 | 
						|
    argc = sizeof(argv_)/sizeof(argv_[0]);  //       commandline
 | 
						|
  #endif                                    //
 | 
						|
 | 
						|
  int i, iters, n;
 | 
						|
  # ifndef __GNUC__
 | 
						|
   alloc dummy_to_fool_the_compiler_into_doing_things_it_currently_cant_handle;
 | 
						|
  ------------
 | 
						|
 | 
						|
- config.h [now gcconfig.h]
 | 
						|
  __MWERKS__ does not have to mean MACOS. You can use Codewarrior to
 | 
						|
  build a Win32 or BeOS library and soon a Rhapsody library. You may
 | 
						|
  have to change that #if...
 | 
						|
 | 
						|
 | 
						|
 | 
						|
   It worked for me, hope it works for you.
 | 
						|
 | 
						|
   Lars Farm
 | 
						|
   18 July 1997
 | 
						|
----------------------------------------------------------------------------
 | 
						|
 | 
						|
 | 
						|
Patrick Beard's instructions (may be dated):
 | 
						|
 | 
						|
v4.3 of the collector now runs under Symantec C++/THINK C v7.0.4, and
 | 
						|
Metrowerks C/C++ v4.5 both 68K and PowerPC. Project files are provided
 | 
						|
to build and test the collector under both development systems.
 | 
						|
 | 
						|
Configuration
 | 
						|
-------------
 | 
						|
 | 
						|
To configure the collector, under both development systems, a prefix file
 | 
						|
is used to set preprocessor directives. This file is called "MacOS_config.h".
 | 
						|
Also to test the collector, "MacOS_Test_config.h" is provided.
 | 
						|
 | 
						|
Testing
 | 
						|
-------
 | 
						|
 | 
						|
To test the collector (always a good idea), build one of the gctest projects,
 | 
						|
gctest.¹ (Symantec C++/THINK C), mw/gctest.68K.¹, or mw/gctest.PPC.¹. The
 | 
						|
test will ask you how many times to run; 1 should be sufficient.
 | 
						|
 | 
						|
Building 
 | 
						|
--------
 | 
						|
 | 
						|
For your convenience project files for the major Macintosh development
 | 
						|
systems are provided.
 | 
						|
 | 
						|
For Symantec C++/THINK C, you must build the two projects gclib-1.¹ and
 | 
						|
gclib-2.¹. It has to be split up because the collector has more than 32k
 | 
						|
of static data and no library can have more than this in the Symantec
 | 
						|
environment. (Future versions will probably fix this.)
 | 
						|
 | 
						|
For Metrowerks C/C++ 4.5 you build gc.68K.¹/gc.PPC.¹ and the result will
 | 
						|
be a library called gc.68K.lib/gc.PPC.lib.
 | 
						|
 | 
						|
Using
 | 
						|
-----
 | 
						|
 | 
						|
Under Symantec C++/THINK C, you can just add the gclib-1.¹ and gclib-2.¹
 | 
						|
projects to your own project. Under Metrowerks, you add gc.68K.lib or
 | 
						|
gc.PPC.lib and two additional files. You add the files called datastart.c
 | 
						|
and dataend.c to your project, bracketing all files that use the collector.
 | 
						|
See mw/gctest.¹ for an example.
 | 
						|
 | 
						|
Include the projects/libraries you built above into your own project,
 | 
						|
#include "gc.h", and call GC_malloc. You don't have to call GC_free.
 | 
						|
 | 
						|
 | 
						|
Patrick C. Beard
 | 
						|
January 4, 1995
 |