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
 |