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>