[BACK]Return to README.Mac CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gc

Annotation of OpenXM_contrib/gc/README.Mac, Revision 1.1

1.1     ! maekawa     1: Patrick Beard's Notes for building GC v4.12 with CodeWarrior Pro 2:
        !             2: ----------------------------------------------------------------------------
        !             3: The current build environment for the collector is CodeWarrior Pro 2.
        !             4: Projects for CodeWarrior Pro 2 (and for quite a few older versions)
        !             5: are distributed in the file Mac_projects.sit.hqx. The project file
        !             6: :Mac_projects:gc.prj builds static library versions of the collector.
        !             7: :Mac_projects:gctest.prj builds the GC test suite.
        !             8:
        !             9: Configuring the collector is still done by editing the files
        !            10: :Mac_files:MacOS_config.h and :Mac_files:MacOS_Test_config.h.
        !            11:
        !            12: Lars Farm's suggestions on building the collector:
        !            13: ----------------------------------------------------------------------------
        !            14: Garbage Collection on MacOS - a manual 'MakeFile'
        !            15: -------------------------------------------------
        !            16:
        !            17: Project files and IDE's are great on the Macintosh, but they do have
        !            18: problems when used as distribution media. This note tries to provide
        !            19: porting instructions in pure TEXT form to avoid those problems. A manual
        !            20: 'makefile' if you like.
        !            21:
        !            22:     GC version:     4.12a2
        !            23:     Codewarrior:    CWPro1
        !            24:     date:           18 July 1997
        !            25:
        !            26: The notes may or may not apply to earlier or later versions of the
        !            27: GC/CWPro. Actually, they do apply to earlier versions of both except that
        !            28: until recently a project could only build one target so each target was a
        !            29: separate project. The notes will most likely apply to future versions too.
        !            30: Possibly with minor tweaks.
        !            31:
        !            32: This is just to record my experiences. These notes do not mean I now
        !            33: provide a supported port of the GC to MacOS. It works for me. If it works
        !            34: for you, great. If it doesn't, sorry, try again...;-) Still, if you find
        !            35: errors, please let me know.
        !            36:
        !            37:     mailto:         lars.farm@ite.mh.se
        !            38:
        !            39:     address:        Lars Farm
        !            40:                     Krönvägen 33b
        !            41:                     856 44 Sundsvall
        !            42:                     Sweden
        !            43:
        !            44: Porting to MacOS is a bit more complex than it first seems. Which MacOS?
        !            45: 68K/PowerPC? Which compiler? Each supports both 68K and PowerPC and offer a
        !            46: large number of (unique to each environment) compiler settings. Each
        !            47: combination of compiler/68K/PPC/settings require a unique combination of
        !            48: standard libraries. And the IDE's does not select them for you. They don't
        !            49: even check that the library is built with compatible setting and this is
        !            50: the major source of problems when porting the GC (and otherwise too).
        !            51:
        !            52: You will have to make choices when you configure the GC. I've made some
        !            53: choices here, but there are other combinations of settings and #defines
        !            54: that work too.
        !            55:
        !            56: As for target settings the major obstacles may be:
        !            57: - 68K Processor: check "4-byte Ints".
        !            58: - PPC Processor: uncheck "Store Static Data in TOC".
        !            59:
        !            60: What you need to do:
        !            61: ===================
        !            62:
        !            63: 1) Build the GC as a library
        !            64: 2) Test that the library works with 'test.c'.
        !            65: 3) Test that the C++ interface 'gc_cpp.cc/h' works with 'test_cpp.cc'.
        !            66:
        !            67: 1) The Libraries:
        !            68: =================
        !            69: I made one project with four targets (68K/PPC tempmem or appheap). One target
        !            70: will suffice if you're able to decide which one you want. I wasn't...
        !            71:
        !            72: Codewarrior allows a large number of compiler/linker settings. I used these:
        !            73:
        !            74: Settings shared by all targets:
        !            75: ------------------------------
        !            76: o Access Paths:
        !            77:   - User Paths:   the GC folder
        !            78:   - System Paths: {Compiler}:Metrowerks Standard Library:
        !            79:                   {Compiler}:MacOS Support:Headers:
        !            80:                   {Compiler}:MacOS Support:MacHeaders:
        !            81: o C/C++ language:
        !            82:   - inlining: normal
        !            83:   - direct to SOM: off
        !            84:   - enable/check: exceptions, RTTI, bool (and if you like pool strings)
        !            85:
        !            86: PowerPC target settings
        !            87: -----------------------
        !            88: o Target Settings:
        !            89:   - name of target
        !            90:   - MacOS PPC Linker
        !            91: o PPC Target
        !            92:   - name of library
        !            93: o C/C++ language
        !            94:   - prefix file as described below
        !            95: o PPC Processor
        !            96:   - Struct Alignment: PowerPC
        !            97:   - uncheck "Store Static Data in TOC" -- important!
        !            98:     I don't think the others matter, I use full optimization and its ok
        !            99: o PPC Linker
        !           100:   - Factory Settings (SYM file with full paths, faster linking, dead-strip
        !           101:     static init, Main: __start)
        !           102:
        !           103:
        !           104: 68K target settings
        !           105: -------------------
        !           106: o Target Settings:
        !           107:   - name of target
        !           108:   - MacOS 68K Linker
        !           109: o 68K Target
        !           110:   - name of library
        !           111:   - A5 relative data
        !           112: o C/C++ language
        !           113:   - prefix file as described below
        !           114: o 68K Processor
        !           115:   - Code model: smart
        !           116:   - Struct alignment: 68K
        !           117:   - FP: SANE
        !           118:   - enable 4-Byte Ints -- important!
        !           119:     I don't think the others matter. I selected...
        !           120:   - enable: 68020
        !           121:   - enable: global register allocation
        !           122: o IR Optimizer
        !           123:   - enable: Optimize Space, Optimize Speed
        !           124:     I suppose the others would work too, but haven't tried...
        !           125: o 68K Linker
        !           126:   - Factory Settings (New Style MacsBug,SYM file with full paths,
        !           127:     A6 Frames, fast link, Merge compiler glue into segment 1,
        !           128:     dead-strip static init)
        !           129:
        !           130: Prefix Files to configure the GC sources
        !           131: ----------------------------------------
        !           132: The Codewarrior equivalent of commandline compilers -DNAME=X is to use
        !           133: prefix-files. A TEXT file that is automatically #included before the first byte
        !           134: of every source file. I used these:
        !           135:
        !           136: ---- ( cut here ) ----  gc_prefix_tempmem.h     -- 68K and PPC -----
        !           137:     #include "gc_prefix_common.h"
        !           138:     #undef USE_TEMPORARY_MEMORY
        !           139:     #define USE_TEMPORARY_MEMORY
        !           140: ---- ( cut here ) ----  gc_prefix_appmem.h      -- 68K and PPC -----
        !           141:     #include "gc_prefix_common.h"
        !           142:     #undef USE_TEMPORARY_MEMORY
        !           143: //  #define USE_TEMPORARY_MEMORY
        !           144:
        !           145: ---- ( cut here ) ----  gc_prefix_common.h      --------------------
        !           146: // gc_prefix_common.h
        !           147: // ------------------
        !           148: // Codewarrior prefix file to configure the GC libraries
        !           149: //
        !           150: //   prefix files are the Codewarrior equivalent of the
        !           151: //   command line option -Dname=x frequently seen in makefiles
        !           152:
        !           153: #if !__MWERKS__
        !           154:   #error only tried this with Codewarrior
        !           155: #endif
        !           156:
        !           157: #if macintosh
        !           158:   #define MSL_USE_PRECOMPILED_HEADERS 0
        !           159:   #include <ansi_prefix.mac.h>
        !           160:   #ifndef __STDC__
        !           161:     #define __STDC__ 0
        !           162:   #endif
        !           163:
        !           164:   //  See list of #defines to configure the library in: 'MakeFile'
        !           165:   //  see also README
        !           166:
        !           167:   #define SILENT                // no collection messages. In case
        !           168:                                 // of trouble you might want this off
        !           169:   #define ALL_INTERIOR_POINTERS // follows interior pointers.
        !           170: //#define DONT_ADD_BYTE_AT_END  // disables the padding if defined.
        !           171: //#define SMALL_CONFIG          // whether to use a smaller heap.
        !           172:   #define NO_SIGNALS            // signals aren't real on the Macintosh.
        !           173:   #define ATOMIC_UNCOLLECTABLE  // GC_malloc_atomic_uncollectable()
        !           174:
        !           175:   // define either or none as per personal preference
        !           176:   //   used in malloc.c
        !           177:   #define REDIRECT_MALLOC GC_malloc
        !           178: //#define REDIRECT_MALLOC GC_malloc_uncollectable
        !           179:   // if REDIRECT_MALLOC is #defined make sure that the GC library
        !           180:   // is listed before the ANSI/ISO libs in the Codewarrior
        !           181:   // 'Link order' panel
        !           182: //#define IGNORE_FREE
        !           183:
        !           184:   // mac specific configs
        !           185: //#define USE_TEMPORARY_MEMORY    // use Macintosh temporary memory.
        !           186: //#define SHARED_LIBRARY_BUILD    // build for use in a shared library.
        !           187:
        !           188: #else
        !           189:   // could build Win32 here too, or in the future
        !           190:   // Rhapsody PPC-mach, Rhapsody PPC-MacOS,
        !           191:   // Rhapsody Intel-mach, Rhapsody Intel-Win32,...
        !           192:   // ... ugh this will get messy ...
        !           193: #endif
        !           194:
        !           195: // make sure ints are at least 32-bit
        !           196: // ( could be set to 16-bit by compiler settings (68K) )
        !           197:
        !           198: struct gc_private_assert_intsize_{ char x[ sizeof(int)>=4 ? 1 : 0 ]; };
        !           199:
        !           200: #if __powerc
        !           201:   #if __option(toc_data)
        !           202:     #error turn off "store static data in TOC" when using GC
        !           203:     //     ... or find a way to add TOC to the root set...(?)
        !           204:   #endif
        !           205: #endif
        !           206: ---- ( cut here ) ----  end of gc_prefix_common.h  -----------------
        !           207:
        !           208: Files to  build the GC libraries:
        !           209: --------------------------------
        !           210:     allchblk.c
        !           211:     alloc.c
        !           212:     blacklst.c
        !           213:     checksums.c
        !           214:     dbg_mlc.c
        !           215:     finalize.c
        !           216:     headers.c
        !           217:     mach_dep.c
        !           218:     MacOS.c    -- contains MacOS code
        !           219:     malloc.c
        !           220:     mallocx.c
        !           221:     mark.c
        !           222:     mark_rts.c
        !           223:     misc.c
        !           224:     new_hblk.c
        !           225:     obj_map.c
        !           226:     os_dep.c   -- contains MacOS code
        !           227:     ptr_chck.c
        !           228:     reclaim.c
        !           229:     stubborn.c
        !           230:     typd_mlc.c
        !           231:     gc++.cc    -- this is 'gc_cpp.cc' with less 'inline' and
        !           232:                -- throw std::bad_alloc when out of memory
        !           233:                -- gc_cpp.cc works just fine too
        !           234:
        !           235: 2) Test that the library works with 'test.c'.
        !           236: =============================================
        !           237:
        !           238: The test app is just an ordinary ANSI-C console app. Make sure settings
        !           239: match the library you're testing.
        !           240:
        !           241: Files
        !           242: -----
        !           243:     test.c
        !           244:     the GC library to test        -- link order before ANSI libs
        !           245:     suitable Mac+ANSI libraries
        !           246:
        !           247: prefix:
        !           248: ------
        !           249: ---- ( cut here ) ----  gc_prefix_testlib.h     -- all libs -----
        !           250: #define MSL_USE_PRECOMPILED_HEADERS 0
        !           251: #include <ansi_prefix.mac.h>
        !           252: #undef NDEBUG
        !           253:
        !           254: #define ALL_INTERIOR_POINTERS  /* for GC_priv.h */
        !           255: ---- ( cut here ) ----
        !           256:
        !           257: 3) Test that the C++ interface 'gc_cpp.cc/h' works with 'test_cpp.cc'.
        !           258:
        !           259: The test app is just an ordinary ANSI-C console app. Make sure settings match
        !           260: the library you're testing.
        !           261:
        !           262: Files
        !           263: -----
        !           264:     test_cpp.cc
        !           265:     the GC library to test        -- link order before ANSI libs
        !           266:     suitable Mac+ANSI libraries
        !           267:
        !           268: prefix:
        !           269: ------
        !           270: same as for test.c
        !           271:
        !           272: For convenience I used one test-project with several targets so that all
        !           273: test apps are build at once. Two for each library to test: test.c and
        !           274: gc_app.cc. When I was satisfied that the libraries were ok. I put the
        !           275: libraries + gc.h + the c++ interface-file in a folder that I then put into
        !           276: the MSL hierarchy so that I don't have to alter access-paths in projects
        !           277: that use the GC.
        !           278:
        !           279: After that, just add the proper GC library to your project and the GC is in
        !           280: action! malloc will call GC_malloc and free GC_free, new/delete too. You
        !           281: don't have to call free or delete. You may have to be a bit cautious about
        !           282: delete if you're freeing other resources than RAM. See gc_cpp.h. You can
        !           283: also keep coding as always with delete/free. That works too. If you want,
        !           284: "include <gc.h> and tweak it's use a bit.
        !           285:
        !           286: Symantec SPM
        !           287: ============
        !           288: It has been a while since I tried the GC in SPM, but I think that the above
        !           289: instructions should be sufficient to guide you through in SPM too. SPM
        !           290: needs to know where the global data is. Use the files 'datastart.c' and
        !           291: 'dataend.c'. Put 'datastart.c' at the top of your project and 'dataend.c'
        !           292: at the bottom  of your project so that all data is surrounded. This is not
        !           293: needed in Codewarrior because it provides intrinsic variables
        !           294: __datastart__, __data_end__ that wraps all globals.
        !           295:
        !           296: Source Changes (GC 4.12a2)
        !           297: ==========================
        !           298: Very few. Just one tiny in the GC, not strictly needed.
        !           299: - MacOS.c line 131 in routine GC_MacFreeTemporaryMemory()
        !           300:   change #       if !defined(SHARED_LIBRARY_BUILD)
        !           301:   to     #       if !defined(SILENT) && !defined(SHARED_LIBRARY_BUILD)
        !           302:   To turn off a message when the application quits (actually, I faked
        !           303:   this change by #defining SHARED_LIBRARY_BUILD in a statically linked
        !           304:   library for more than a year without ill effects but perhaps this is
        !           305:   better).
        !           306:
        !           307: - test_cpp.cc
        !           308:   made the first lines of main() look like this:
        !           309:   ------------
        !           310:   int main( int argc, char* argv[] ) {
        !           311:   #endif
        !           312:   #if macintosh                             // MacOS
        !           313:     char* argv_[] = {"test_cpp","10"};      //   doesn't
        !           314:     argv=argv_;                             //     have a
        !           315:     argc = sizeof(argv_)/sizeof(argv_[0]);  //       commandline
        !           316:   #endif                                    //
        !           317:
        !           318:   int i, iters, n;
        !           319:   # ifndef __GNUC__
        !           320:    alloc dummy_to_fool_the_compiler_into_doing_things_it_currently_cant_handle;
        !           321:   ------------
        !           322:
        !           323: - config.h [now gcconfig.h]
        !           324:   __MWERKS__ does not have to mean MACOS. You can use Codewarrior to
        !           325:   build a Win32 or BeOS library and soon a Rhapsody library. You may
        !           326:   have to change that #if...
        !           327:
        !           328:
        !           329:
        !           330:    It worked for me, hope it works for you.
        !           331:
        !           332:    Lars Farm
        !           333:    18 July 1997
        !           334: ----------------------------------------------------------------------------
        !           335:
        !           336:
        !           337: Patrick Beard's instructions (may be dated):
        !           338:
        !           339: v4.3 of the collector now runs under Symantec C++/THINK C v7.0.4, and
        !           340: Metrowerks C/C++ v4.5 both 68K and PowerPC. Project files are provided
        !           341: to build and test the collector under both development systems.
        !           342:
        !           343: Configuration
        !           344: -------------
        !           345:
        !           346: To configure the collector, under both development systems, a prefix file
        !           347: is used to set preprocessor directives. This file is called "MacOS_config.h".
        !           348: Also to test the collector, "MacOS_Test_config.h" is provided.
        !           349:
        !           350: Testing
        !           351: -------
        !           352:
        !           353: To test the collector (always a good idea), build one of the gctest projects,
        !           354: gctest.¹ (Symantec C++/THINK C), mw/gctest.68K.¹, or mw/gctest.PPC.¹. The
        !           355: test will ask you how many times to run; 1 should be sufficient.
        !           356:
        !           357: Building
        !           358: --------
        !           359:
        !           360: For your convenience project files for the major Macintosh development
        !           361: systems are provided.
        !           362:
        !           363: For Symantec C++/THINK C, you must build the two projects gclib-1.¹ and
        !           364: gclib-2.¹. It has to be split up because the collector has more than 32k
        !           365: of static data and no library can have more than this in the Symantec
        !           366: environment. (Future versions will probably fix this.)
        !           367:
        !           368: For Metrowerks C/C++ 4.5 you build gc.68K.¹/gc.PPC.¹ and the result will
        !           369: be a library called gc.68K.lib/gc.PPC.lib.
        !           370:
        !           371: Using
        !           372: -----
        !           373:
        !           374: Under Symantec C++/THINK C, you can just add the gclib-1.¹ and gclib-2.¹
        !           375: projects to your own project. Under Metrowerks, you add gc.68K.lib or
        !           376: gc.PPC.lib and two additional files. You add the files called datastart.c
        !           377: and dataend.c to your project, bracketing all files that use the collector.
        !           378: See mw/gctest.¹ for an example.
        !           379:
        !           380: Include the projects/libraries you built above into your own project,
        !           381: #include "gc.h", and call GC_malloc. You don't have to call GC_free.
        !           382:
        !           383:
        !           384: Patrick C. Beard
        !           385: January 4, 1995

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>