1 Title:      Metrowerks w/ configure HOWTO
 
   5 === Introduction to Metrowerks command line tools ===
 
   7 Since CodeWarrior version 8, Metrowerks has provided command-line compilers
 
   8 hosted on OS X.  There are three available targets.
 
  15 Shared Library:     Mach-O (bundle, dylib, etc.)
 
  16 Static Library:     CodeWarrior
 
  24 Shared Library:     Mach-O (bundle, dylib, etc.)
 
  25 Static Library:     Archived (ar) Mach-O (.a files)
 
  26 Object:             Mach-O .o files
 
  33 Shared Library:     PEF ("code fragments")
 
  34 Static Library:     CodeWarrior
 
  37 As you can see, only one of these targets produces Mach-O .o files that
 
  38 normal ar and ranlib could hope to handle.  It's no matter though,
 
  39 really all that ar and ranlib do is create a static library (.a) from a
 
  40 collection of .o files.  This can be emulated by a shell script which
 
  41 calls the appropriate mwld.  I've provided one called mwar which does this.
 
  42 For ranlib simply use true since mwar does all of the work.
 
  44 === Metrowerks Environment Variables ===
 
  46 In order for any of these programs to work some environment variables
 
  47 must be set.  The compiler must know where to look for headers (CIncludes).
 
  48 The linker needs to know where to look for libraries (Libraries) such as
 
  49 those specified on the commandline with -l as well as crt1.o (or sometimes
 
  50 mwcrt1.o) for OS X.  The linker also needs to know if any additional
 
  51 libraries should be linked into executables (LibraryFiles).  Finally,
 
  52 on OS X the linker needs to know where to look for Frameworks (FrameworkPaths).
 
  53 These are controlled by the following environment variables:
 
  56 CIncludes:          MWCMacOSXPPCIncludes
 
  57 Libraries:          MWMacOSXPPCLibraries
 
  58 LibraryFiles:       MWMacOSXPPCLibraryFiles
 
  59 FrameworkPaths:     MWFrameworkPaths
 
  62 CIncludes:          MWCMachPPCIncludes
 
  63 Libraries:          MWMachPPCLibraries
 
  64 LibraryFiles:       MWMachPPCLibraryFiles
 
  65 FrameworkPaths:     MWFrameworkPaths
 
  68 CIncludes:          MWPEFCIncludes
 
  69 Libraries:          MWPEFLibraries
 
  70 LibraryFiles:       MWPEFLibraryFiles
 
  72 Notes (mwldppc 3.0.3 build 343):
 
  73 The environment variables (including MWPEFLibraries) aren't read until after
 
  74 the command line options have been parsed!  The command line option parser
 
  75 actually tries to do the linking from within the parser and thus -l options
 
  76 which don't have a -L specifying where to look for the library do not work.
 
  77 Yes, this means that MWPEFLibraries is essentially useless AFAICT.
 
  79 I have provided an example mwvars.sh.  It's what I use with CW 8.3.  YMMV.
 
  81 === Compiling wxWidgets targetting Mac OS X with Metrowerks ===
 
  83 With recent wxWidgets (2.5.5) it is possible to compile using the
 
  84 Metrowerks tools with minimal effort.  You may use either mwcc/mwld
 
  85 or mwccppc/mwldppc.  Ideally you will have the tools on your path
 
  86 on your path as well as the mwar script I've provided.  You will also
 
  87 have had to source mwvars.sh (either yourself or by sourcing it from
 
  88 your .profile or .bash_profile).
 
  90 Before beginning I strongly recommend you write a simple C++ hello world
 
  91 program.  I recommend #include <iostream> and cout << "Hello World" << endl;.
 
  92 This will ensure your C++ standard library is working.  Note that
 
  93 you can compile this using mwcc hello.cpp.  You will find a hello.cpp.o
 
  94 file as well as an a.out file if the compiler and linker were successful.
 
  95 Assuming your compiler can produce a.out you're ready to begin.
 
  97 As per usual, I recommend building outside the source tree.
 
  98 From the source tree (workingDirectory$ is the prompt)
 
 100 wxWidgets$ mkdir ../BUILD_MACd_CW8
 
 101 wxWidgets$ cd ../BUILD_MACd_CW8
 
 102 BUILD_MACd_CW8$ ../wxWidgets/configure --enable-debug --disable-shared CC=mwcc CXX=mwcc LD=mwld AR=mwar RANLIB=true
 
 103 [ configure hopefully succeeds ]
 
 105 [ make hopefully succeeds ]
 
 106 BUILD_MACd_CW8$ make -C samples/minimal
 
 107 [ minimal make succeeds ]
 
 108 BUILD_MACd_CW8$ ./samples/minimal/minimal.app/Contents/MacOS/minimal
 
 109 [ minimal runs and your prompt will return when you Quit the app ]
 
 111 The important options are CC=mwcc CXX=mwcc LD=mwld AR=mwar RANLIB=true
 
 112 Right now you also need --disable-shared.  Eventually I hope to add the
 
 113 ability to created shared libraries.
 
 115 If you wish to use the Mach-O compilers instead of the Mac OS X compilers
 
 116 then use CC=mwccppc CXX=mwccppc LD=mwldppc.  You don't need a special
 
 117 AR or RANLIB with this compiler.
 
 119 At the moment, precompiled headers aren't supported though you don't need
 
 120 to pass --disable-precomp-headers since the Makefiles know they can't do PCH.
 
 121 I hope to add this soon.
 
 123 As you can see, this is not wildly different from compiling using any
 
 124 other compiler (for instance GCC).  The same files that would be compiled
 
 125 by gcc are now compiled by mwcc.  The same files that would be linked
 
 126 by the combination of ar and ranlib are now linked using the mwar shell
 
 127 script that calls mwld to do the work and using true in place of ranlib.
 
 128 The same files that would be linked using ld (i.e. the executable sample)
 
 129 are linked using mwld.
 
 132 === Compiling wxWidgets targetting Mac OS (Carbon) with Metrowerks ===
 
 134 Compiling for Mac OS PEF Carbon is not really more or less difficult
 
 135 than compiling for OS X.  However, there is still some work left to do.
 
 137 In particular, the -lCarbonLib and -lQuickTimeLib options to the linker don't
 
 138 work because of the aforementioned bug in mwpefld. To fix this you can add
 
 139 -L/path/to/Universal/Libraries/StubLibraries to LDFLAGS.  Unfortunately
 
 140 because autoconf (2.59) doesn't always use eval appropriately you cannot
 
 141 have spaces in the path.  What I recommend is to make a symlink from
 
 142 /Applications/Metrowerks CodeWarrior 8.0/Metrowerks CodeWarrior/MacOS Support to some path which can be accessed without using spaces.
 
 144 ~$ ln -snf "/Applications/Metrowerks CodeWarrior 8.0/Metrowerks CodeWarrior/MacOS Support" MW_MacOS
 
 146 There is also a problem with the samples Makefiles.  Currently they clear
 
 147 the resource fork of the executable rather than append to it.  This
 
 148 can be remedied by adding the -a option to Rez before making in that
 
 149 sample's directory.  I hope to fix this soon.
 
 151 Assuming you work around these it's pretty straightforward:
 
 153 wxWidgets$ mkdir ../BUILD_MACCARBONd_CW8
 
 154 wxWidgets$ cd ../BUILD_MACCARBONd_CW8
 
 155 BUILD_MACCARBONd_CW8$ ../wxWidgets/configure --host=powerpc-apple-macos --enable-debug --disable-shared CC=mwpefcc CXX=mwpefcc LD=mwpefld AR=mwpefar RANLIB=true LDFLAGS=-L/Users/yourname/MW_MacOS/Universal/Libraries/StubLibraries
 
 156 [ configure hopefully succeeds ]
 
 158 [ make hopefully succeeds ]
 
 159 BUILD_MACd_CW8$ make -C samples/minimal
 
 160 [ minimal make succeeds ]
 
 161 BUILD_MACd_CW8$ /System/Library/Frameworks/Carbon.framework/Versions/A/Support/LaunchCFMApp ./samples/minimal/minimal
 
 162 [ minimal runs and your prompt will return when you Quit the app ]
 
 164 Unlike the OS X case not many people compile wxMac Carbon PEF using configure.
 
 165 From time to time there may be minor problems.  Please report these using
 
 166 the sourceforge bug tracker.
 
 168 === Other Metrowerks notes ===
 
 169 --- Object file extension ---
 
 170 By default, the mw compilers when used with the -c option will append .o
 
 171 to the source filename (following symlinks even).  This is in contrast to
 
 172 normal compilers which replace the files extension with .o.  To get the
 
 173 normal behavior you must add -ext o to the compiler options.  The wxWidgets
 
 174 configure script does this and the macros to check for this are part of
 
 175 Bakefile (bakefile.sourceforge.net).
 
 177 --- Static library extension ---
 
 178 The CodeWarrior IDE typically uses the .lib extension for CodeWarrior static
 
 179 libraries and .a for Mach-O static libraries (ar/ranlib archives).  The
 
 180 wxWidgets makefiles always use .a.  This isn't really a problem just be
 
 181 aware that the .a files aren't really ar/ranlib archives and aren't useable
 
 182 by anything other than CodeWarrior itself.
 
 185 As far as I know it should be possible to use libraries created by
 
 186 the command line tools from the IDE.  For instance, you could compile
 
 187 wxWidgets using this method but continue to use the IDE for your application.
 
 188 Personally, I prefer sticking with the command line so I haven't tried this.
 
 191 Before CodeWarrior 9.3 the usage of SDKs (those in /Developer/SDKs) is
 
 192 impossible.  You might think that it would work simply be prefacing any
 
 193 /System or /usr paths with the SDK path when setting the environment variables.
 
 194 Unfortunately, the libraries and frameworks inside these SDKs contain absolute
 
 195 paths to libraries and frameworks which they depend on.  Thus, the linker
 
 196 attempts to load the non-SDK version to satisfy the dependency.
 
 198 To ensure an app will work correctly on previous versions of the OS you
 
 199 can use Apple's availability macros.
 
 201 --- CodeWarrior 8.3 and Panther ---
 
 202 CodeWarrior 8.3 has some problems running on Panther.  When using the IDE
 
 203 version it is typical to change the OS X directory to the 10.2 SDK.
 
 204 Unfortunately, this is impossible with the command line compiler due to
 
 205 the aforementioned bug.  Thus, the only solution is to allow CodeWarrior
 
 206 8.3 to work with Panther's headers.  Fortunately, this isn't as hard
 
 207 as some people (particularly those at Metrowerks) would make you think.
 
 209 First of all, there are issues with Apple's headers declaring conflicting
 
 210 types.  Particularly with respect to wchar_t.  Now, I'm sure you're
 
 211 aware of the "(wchar_t Support fix)" directory.  What you need to do
 
 212 is create another one called "(wchar_t Support Panther fix)" using the 
 
 213 provided machine/ansi.h file which contains some minor changes from
 
 214 the Metrowerks version.
 
 216 Secondly, there is an issue with crt1.o.  Apple's position is that
 
 217 /usr/lib/crt1.o is intended to be used only with Apple's GCC.
 
 218 Metrowerks does provide an mwcrt1.o and when you're using the IDE you
 
 219 can perfectly well use it instead of Apple's crt1.o.  Unfortunately,
 
 220 when you are using mwld it has crt1.o hardcoded.  Very fortunately, it
 
 221 has only the filename encoded and it searches the libraries path!
 
 222 What I do is symlink "Mac OS X Support/Libraries/Startup/mwcrt1.o" to
 
 223 crt1.o in the same directory.
 
 226 In mwvar.sh for the Mac OS X/PPC toolchain I've used MSL C++ with the
 
 227 BSD CRT.  To do this I used the .a files.  Earlier I used the .lib files
 
 228 but these also require the MSL C .lib.  AFAIK using this would cause
 
 229 the MSL CRT to be used and I think I don't want that unless I'm using
 
 230 the MSL CRT headers.  It did work although I never tested it with
 
 231 anything too complex.  I suspect it would have failed although I'm
 
 232 wondering how it works with the CW projects because I think they do
 
 233 link with the MSL_C libs.  This is probably very wrong.
 
 235 If you do decide to use the MSL_C libs you'll need to add
 
 236 "MSL/MSL_C/MSL_MacOS/Src/console_OS_X.c".  Unfortunately,
 
 237 mwld is a linker and doesn't understand C source code.  Thus you must
 
 238 compile this file and use the compiled version.
 
 240 What I did was simply run mwcc -c console_OS_X.c to generate a
 
 241 console_OS_X.c.o object file.  This file must be in MWMacOSXPPCLibraryFiles.