Add Framework support for Mac OS X. (Greg Noel) Document it. (Gary Oberbrunner)
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Fri, 12 Aug 2005 11:58:49 +0000 (11:58 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Fri, 12 Aug 2005 11:58:49 +0000 (11:58 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@1322 fdb21ef1-2011-0410-befe-b5e4ea1792b1

doc/man/scons.1
src/CHANGES.txt
src/RELEASE.txt
src/engine/SCons/Tool/applelink.py
src/engine/SCons/Tool/applelink.xml
src/engine/SCons/Tool/c++.py
src/engine/SCons/Tool/cc.py
src/engine/SCons/Tool/gnulink.py
src/engine/SCons/Tool/link.py
test/ToolSurrogate.py
test/gnutools.py

index 76fc70596213573ac238254fca0ed0804210f723..6e690a244fff534d7814f9cbca14809def0c018b 100644 (file)
@@ -5711,11 +5711,66 @@ The default list is:
 A function that converts a file name into a File instance relative to the
 target being built. 
 
+.IP FRAMEWORKPATH
+On Mac OS X with gcc,
+a list containing the paths to search for frameworks.
+Used by the compiler to find framework-style includes like
+#include <Fmwk/Header.h>.
+Used by the linker to find user-specified frameworks when linking (see
+$FRAMEWORKS).
+For example:
+.ES
+ env.AppendUnique(FRAMEWORKPATH='#myframeworkdir')
+.EE
+.IP
+will add
+.ES
+  ... -Fmyframeworkdir
+.EE
+.IP
+to the compiler and linker command lines.
+
+.IP _FRAMEWORKPATH
+On Mac OS X with gcc, an automatically-generated construction variable
+containing the linker command-line options corresponding to FRAMEWORKPATH.
+
+.IP FRAMEWORKPATHPREFIX
+On Mac OS X with gcc, the prefix to be used for the FRAMEWORKPATH entries.
+(see $FRAMEWORKPATH).
+The default value is
+.BR -F .
+
+.IP FRAMEWORKPREFIX
+On Mac OS X with gcc,
+the prefix to be used for linking in frameworks
+(see $FRAMEWORKS).
+The default value is
+.BR -framework .
+
+.IP FRAMEWORKS
+On Mac OS X with gcc, a list of the framework names to be linked into a
+program or shared library or bundle.
+The default value is the empty list.
+For example:
+.ES
+ env.AppendUnique(FRAMEWORKS=Split('System Cocoa SystemConfiguration'))
+.EE
+
+.IP _FRAMEWORKS
+On Mac OS X with gcc,
+an automatically-generated construction variable
+containing the linker command-line options
+for linking with FRAMEWORKS.
+
 .IP FRAMEWORKSFLAGS
-On Mac OS X,
-frameworks options to be added at
+On Mac OS X with gcc,
+general user-supplied frameworks options to be added at
 the end of a command
 line building a loadable module.
+(This has been largely superceded by
+the $FRAMEWORKPATH, $FRAMEWORKPATHPREFIX,
+$FRAMWORKPREFIX and $FRAMEWORKS variables
+described above.)
 
 .IP GS
 The Ghostscript program used to convert PostScript to PDF files.
index cbc0a72578eb38cf9b5bc06c0de9b63b059ff405..9ef394cb2a766fa4fbb4916304f03e9066011126 100644 (file)
@@ -311,6 +311,10 @@ RELEASE 0.97 - XXX
   - Add a --raw argument to the sconsign script, so it can print a
     raw representation of each entry's NodeInfo dictionary.
 
+  From Chen Lee:
+
+  - Handle Visual Studio project and solution files in Unicode.
+
   From Wayne Lee:
 
   - Avoid "maximum recursion limit" errors when removing $(-$) pairs
@@ -368,6 +372,14 @@ RELEASE 0.97 - XXX
     value directory; avoiding slowing substitution logic when there's no
     '$' in the string.
 
+  From Greg Noel:
+
+  - Add construction variables to support frameworks on Mac OS X:
+    $FRAMEWORKS, $FRAMEWORKPREFIX, $FRAMEWORKPATH, $FRAMEWORKPATHPREFIX.
+
+  - Re-order link lines so the -o option always comes right after the
+    command name.
+
   From Gary Oberbrunner:
 
   - Add an Environment.Dump() method to print the contents of a
@@ -418,6 +430,8 @@ RELEASE 0.97 - XXX
 
   - Add support for Intel C++ beta 9.0 (both 32 and 64 bit versions).
 
+  - Document the new $FRAMEWORK* variables for Mac OS X.
+
   From Chris Pawling:
 
   - Have the linkloc tool use $MSVS_VERSION to select the Microsoft
index 5b95aa781b03ed36add6769c96d02df70b6d4c0a..d55c7a44fabcd60d0d9e36e3a44644e73c34e9d4 100644 (file)
@@ -137,6 +137,13 @@ RELEASE 0.97 - XXX
               converting signature information from .sconsign files
               written by SCons versions prior to 0.96 has been removed.
 
+          --  ORDER OF -o FLAGS ON CERTAIN LINK COMMAND LINES HAS CHANGED
+
+              The -o flag that specifies an output file has been moved on
+              certain linker command lines to place it consistently after
+              the link command itself.  This will cause recompilation
+              of target files created by these changed lines.
+
     --  CACHED Configure() RESULTS ARE STORED IN A DIFFERENT FILE
 
         The Configure() subsystem now stores its cached results in a
index 87c92d42588507267da4d337f7f37c2cde0e7e0f..a65a4aff60a07f2ff5cc873bbf38d12c1080dff3 100644 (file)
@@ -42,16 +42,20 @@ def generate(env):
     Environment."""
     gnulink.generate(env)
 
+    env['FRAMEWORKPATHPREFIX'] = '-F'
+    env['_FRAMEWORKPATH'] = '${_concat(FRAMEWORKPATHPREFIX, FRAMEWORKPATH, "", __env__)}'
+    env['_FRAMEWORKS'] = '${_concat("-framework ", FRAMEWORKS, "", __env__)}'
+    env['LINKCOM'] = env['LINKCOM'] + ' $_FRAMEWORKPATH $_FRAMEWORKS'
     env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -dynamiclib')
+    env['SHLINKCOM'] = env['SHLINKCOM'] + ' $_FRAMEWORKPATH $_FRAMEWORKS'
 
     # override the default for loadable modules, which are different
     # on OS X than dynamic shared libs.  echoing what XCode does for
     # pre/suffixes:
     env['LDMODULEPREFIX'] = '' 
     env['LDMODULESUFFIX'] = '' 
-    env['LDMODULE'] = '$SHLINK'
     env['LDMODULEFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -bundle')
-    env['LDMODULECOM'] = '$LDMODULE $LDMODULEFLAGS -o  ${TARGET} $SOURCES $_LIBDIRFLAGS $_LIBFLAGS $FRAMEWORKSFLAGS' 
+    env['LDMODULECOM'] = '$LDMODULE -o ${TARGET} $LDMODULEFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS'
 
 
 
index d839be0df2bc72786e2b1660807d643f12d76364..13eea3116994103d4167df1647e90699197904f1 100644 (file)
@@ -1,11 +1,87 @@
-<!-- __COPYRIGHT__ -->
-<cvar name="FRAMEWORKSFLAGS">
+<!-- Copyright (c) 2001, 2002, 2003, 2004 The SCons Foundation -->
+<cvar name="FRAMEWORKSFLAGS">">
 <summary>
-On Mac OS X,
-frameworks options to be added at
+On Mac OS X with gcc,
+general user-supplied frameworks options to be added at
 the end of a command
 line building a loadable module.
+(This has been largely superceded by
+the &cv-FRAMEWORKPATH;, &cv-FRAMEWORKPATHPREFIX;,
+&cv-FRAMEWORKPREFIX; and &cv-FRAMEWORKS; variables
+described above.)
 </summary>
 </cvar>
 
+<cvar name="FRAMEWORKS">
+<summary>
+On Mac OS X with gcc, a list of the framework names to be linked into a
+program or shared library or bundle.
+The default value is the empty list.
+For example:
+
+<example>
+ env.AppendUnique(FRAMEWORKS=Split('System Cocoa SystemConfiguration'))
+</example>
+
+</summary>
+</cvar>
+
+<cvar name="FRAMEWORKPREFIX">
+<summary>
+On Mac OS X with gcc,
+the prefix to be used for linking in frameworks
+(see &cv-FRAMEWORKS;).
+The default value is
+<option>-framework</option>.
+</summary>
+</cvar>
+
+<cvar name="_FRAMEWORKS">
+<summary>
+On Mac OS X with gcc,
+an automatically-generated construction variable
+containing the linker command-line options
+for linking with FRAMEWORKS.
+</summary>
+</cvar>
+
+<cvar name="FRAMEWORKPATH">
+<summary>
+On Mac OS X with gcc,
+a list containing the paths to search for frameworks.
+Used by the compiler to find framework-style includes like
+#include &lt;Fmwk/Header.h&gt;.
+Used by the linker to find user-specified frameworks when linking (see
+&cv-FRAMEWORKS;).
+For example:
+
+<example>
+ env.AppendUnique(FRAMEWORKPATH='#myframeworkdir')
+</example>
+
+will add
+
+<example>
+  ... -Fmyframeworkdir
+</example>
+
+to the compiler and linker command lines.
+</summary>
+</cvar>
 
+<cvar name="FRAMEWORKPATHPREFIX">
+<summary>
+On Mac OS X with gcc, the prefix to be used for the FRAMEWORKPATH entries.
+(see &cv-FRAMEWORKPATH;).
+The default value is
+<option>-F</option>.
+</summary>
+</cvar>
+
+<cvar name="_FRAMEWORKPATH">
+<summary>
+On Mac OS X with gcc, an automatically-generated construction variable
+containing the linker command-line options corresponding to
+&cv-FRAMEWORKPATH;.
+</summary>
+</cvar>
index 90b01ae821a39ab2612a362729c57c228ab2f79f..a44fa6de9f1878ff2706b3212a7f4c981780ef49 100644 (file)
@@ -70,10 +70,10 @@ def generate(env):
         
     env['CXX']        = 'c++'
     env['CXXFLAGS']   = SCons.Util.CLVar('$CCFLAGS')
-    env['CXXCOM']     = '$CXX $CXXFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o $TARGET $SOURCES'
+    env['CXXCOM']     = '$CXX -o $TARGET -c $CXXFLAGS $_CCCOMCOM $SOURCES'
     env['SHCXX']      = '$CXX'
     env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS')
-    env['SHCXXCOM']   = '$SHCXX $SHCXXFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o $TARGET $SOURCES'
+    env['SHCXXCOM']   = '$SHCXX -o $TARGET -c $SHCXXFLAGS $_CCCOMCOM $SOURCES'
 
     env['CPPDEFPREFIX']  = '-D'
     env['CPPDEFSUFFIX']  = ''
index 8fb9e26f624fd882c13880c4a60511240a1aa960..c4114b739e966eb61aaf3a78f40aa4720416836a 100644 (file)
@@ -52,12 +52,21 @@ def generate(env):
         static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
         shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
         
+    env['_CCCOMCOM'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS'
+    # It's a hack to test for darwin here, but the alternative of creating
+    # an applecc.py to contain this seems overkill.  Maybe someday the Apple
+    # platform will require more setup and this logic will be moved.
+    env['FRAMEWORKS'] = SCons.Util.CLVar('')
+    env['FRAMEWORKPATH'] = SCons.Util.CLVar('')
+    if env['PLATFORM'] == 'darwin':
+        env['_CCCOMCOM'] = env['_CCCOMCOM'] + ' $_FRAMEWORKPATH'
+
     env['CC']        = 'cc'
     env['CCFLAGS']   = SCons.Util.CLVar('')
-    env['CCCOM']     = '$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o $TARGET $SOURCES'
+    env['CCCOM']     = '$CC -o $TARGET -c $CCFLAGS $_CCCOMCOM $SOURCES'
     env['SHCC']      = '$CC'
     env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
-    env['SHCCCOM']   = '$SHCC $SHCCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o $TARGET $SOURCES'
+    env['SHCCCOM']   = '$SHCC -o $TARGET -c $SHCCFLAGS $_CCCOMCOM $SOURCES'
 
     env['CPPDEFPREFIX']  = '-D'
     env['CPPDEFSUFFIX']  = ''
index 6276fbe30ac8fe7677da9eb385da11d4010ac013..dbd0c54c79b3c324353b985ef38f8c82ca6dfec8 100644 (file)
@@ -45,13 +45,11 @@ def generate(env):
 
     if env['PLATFORM'] == 'hpux':
         env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared -fPIC')
-    elif env['PLATFORM'] == 'darwin':
-        env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -dynamiclib')
 
     # __RPATH is set to $_RPATH in the platform specification if that
     # platform supports it.
     env.Append(LINKFLAGS=['$__RPATH'])
-    env['RPATHPREFIX'] = '-Wl,--rpath='
+    env['RPATHPREFIX'] = '-Wl,-rpath='
     env['RPATHSUFFIX'] = ''
     env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}'
     
index 51886345404aa6fa6955277753634e940d3749f4..b9fb71d76908e273aa8995c66b0021ac8f4f863c 100644 (file)
@@ -51,14 +51,14 @@ def generate(env):
     
     env['SHLINK']      = '$LINK'
     env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared')
-    env['SHLINKCOM']   = '$SHLINK $SHLINKFLAGS -o $TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
+    env['SHLINKCOM']   = '$SHLINK -o $TARGET $SHLINKFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
     # don't set up the emitter, cause AppendUnique will generate a list
     # starting with None :-(
     #env['SHLIBEMITTER']= None
     env['SMARTLINK']   = smart_link
     env['LINK']        = "$SMARTLINK"
     env['LINKFLAGS']   = SCons.Util.CLVar('')
-    env['LINKCOM']     = '$LINK $LINKFLAGS -o $TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
+    env['LINKCOM']     = '$LINK -o $TARGET $LINKFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
     env['LIBDIRPREFIX']='-L'
     env['LIBDIRSUFFIX']=''
     env['_LIBFLAGS']='${_stripixes(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, LIBPREFIX, LIBSUFFIX, __env__)}'
index fa13b578403241c9f3dcd8cf4a3b22461b3a83f3..527e3d33571dac23284d8f1b6b72356a00e8e47d 100644 (file)
@@ -87,7 +87,7 @@ env.Program('foo.c')
 test.write('foo.c', "foo.c posix\n")
 
 test.run(arguments = '. platform=posix', stdout = test.wrap_stdout("""\
-cc -c -o foo.obj foo.c
+cc -o foo.obj -c foo.c
 cc -o foo.exe foo.obj
 """))
 
index d5173ee29f143e7cfd04c7ec2ea74aff7b6dc265..82c83ef6abecb0a980e9eb30c0734470fe0efeb2 100644 (file)
@@ -128,16 +128,16 @@ def testObject(test, obj, command, flags):
 if sys.platform == 'cygwin':
     fpic = ''
 else:
-    fpic = '-fPIC '
+    fpic = ' -fPIC'
 
 test.fail_test(not testObject(test, 'cfile1.o', 'gcc', '-c') or
                not testObject(test, 'cfile2.o', 'gcc', '-c') or
                not testObject(test, 'cppfile1.o', 'g++', '-c') or
                not testObject(test, 'cppfile2.o', 'g++', '-c') or
-               not testObject(test, 'cfile1.os', 'gcc', fpic + '-c') or
-               not testObject(test, 'cfile2.os', 'gcc', fpic + '-c') or
-               not testObject(test, 'cppfile1.os', 'g++', fpic + '-c') or
-               not testObject(test, 'cppfile2.os', 'g++', fpic + '-c') or
+               not testObject(test, 'cfile1.os', 'gcc', '-c' + fpic) or
+               not testObject(test, 'cfile2.os', 'gcc', '-c' + fpic) or
+               not testObject(test, 'cppfile1.os', 'g++', '-c' + fpic) or
+               not testObject(test, 'cppfile2.os', 'g++', '-c' + fpic) or
                not testObject(test, 'c-only' + _exe, 'gcc', '') or
                not testObject(test, 'cpp-only' + _exe, 'g++', '') or
                not testObject(test, 'c-and-cpp' + _exe, 'g++', '') or