123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386 |
- 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
|