applied farnkerls patch to handle the jam commandline limitation problems
authorMatthias Braun <matze@braunis.de>
Thu, 6 Jul 2006 21:59:52 +0000 (21:59 +0000)
committerMatthias Braun <matze@braunis.de>
Thu, 6 Jul 2006 21:59:52 +0000 (21:59 +0000)
SVN-Revision: 3923

mk/jam/application.jam
mk/jam/flags.jam
mk/jam/macosx.jam
mk/jam/unix.jam
mk/jam/win32.jam
src/Jamfile

index eea3907..e307bc9 100644 (file)
 ##     noinstall: Don't setup a default installation target.
 ##     independent: The target will not be made a dependency of the apps and
 ##                  all target.
+##      linkerfile: Store a list of objects in a file and link using that
+##      file.  Use this to get around Jam's 10240 character argument limit.
 rule Application
 {
     # check options
-    CheckOptions noinstall console independent : $(3) : $(<) ;
+    CheckOptions noinstall console independent linkerfile : $(3) : $(<) ;
 
     local target = [ ConstructApplicationTarget $(<) : $(3) ] ;
     local sources = [ SearchSource $(>) ] ;
index 5c9150c..1364136 100644 (file)
@@ -48,48 +48,6 @@ rule LinkWith
     }
 }
 
-rule LinkWithWholeArchive
-{
-    local i libs sharedlib ;
-
-    for i in $(>) {
-        if $($(i)_TYPE) = "library" {
-            if [ IsElem shared : $($(i)_OPTIONS) ] {
-                libs += $(i) ;
-                sharedlib = true ;
-            } else {
-                # for non shared libs add inherit the compile flags and libs
-                libs += $(i) $($(i)_LIBRARIES) ;
-                # inherit the exported flags
-                CppFlags $(<) : $($(i)_CPPFLAGS) : $(3) ;
-                CFlags $(<) : $($(i)_CFLAGS) : $(3) ;
-                C++Flags $(<) : $($(i)_CXXFLAGS) : $(3) ;
-                LFlags $(<) : $($(i)_LIBS) : $(3) ;
-            }
-        } else {
-            echo "WARNING: Trying to link" $(i)
-                "with" $(<) "which is not a library." ;
-        }
-    }
-    # resolve library dependencies
-    libs = [ RemoveDups $(libs) ] ;    
-    $(<)_LIBRARIES = $(libs) ;
-
-    local libfiles ;
-    for i in $(libs) {
-        libfiles += $($(i)_TARGET) ;
-    }
-
-    DEPENDS $($(<)_TARGET) : $(libfiles) ;
-    NEEDLIBS_WHOLE on $($(<)_TARGET) += $(libfiles) ;
-    $(<)_WHOLE_ARCHIVE = true ;
-    # the usual libtool hack...
-    if $(sharedlib) {
-        LINK on $($(<)_TARGET) = "$(LIBTOOL) $(LINK)" ;
-        INSTALL on $($(<)_INSTALLTARGET) = "$(LIBTOOL) --mode=install $(INSTALL)" ;
-    }
-}
-
 rule CppFlags
 {
     CPPFLAGS on $($(<)_OBJECTS) += $(>) ;
index 5fcb299..9979bbd 100644 (file)
@@ -38,14 +38,20 @@ rule SystemLinkApplication
 {
   local target = $($(<)_TARGET) ;
   Depends $(target) : $(>) ;
-    
-  if $(<)_WHOLE_ARCHIVE
+
+  if [ IsElem linkerfile : $(3) ]
+  {
+    RemoveLinkerInputFile $(target) ;
+    local i ;
+    for i in $(>) { AppendLinkerInputFile $(target) : $(i) ; }
+    LinkApplicationFromFile $(target) : $(target) ;
+    RemoveLinkerInputFile $(target) ;
+  }
+  else
   {
-    WHOLE_ARCH_BEGIN on $(target) = -Wl,--whole-archive ;
-    WHOLE_ARCH_END on $(target) = -Wl,--no-whole-archive ;
+    LinkApplication $(target) : $(>) ;
   }
 
-  LinkApplication $(target) : $(>) ;
   LIBS on $(target) = $(LIBS) ;
   Clean clean : $(target) ;
   Clean $(<)clean : $(target) ;
@@ -53,10 +59,26 @@ rule SystemLinkApplication
 
 # LinkApplicationConsole exe : objects
 #    Link a console (non-GUI) appliation from a set of object files.
-actions LinkApplication bind NEEDLIBS bind NEEDLIBS_WHOLE bind EXTRAOBJECTS
+actions LinkApplication bind NEEDLIBS bind EXTRAOBJECTS
+{
+  $(MACOSX.ENVIRON)
+  $(LINK) -o $(<) $(>) $(EXTRAOBJECTS) $(NEEDLIBS) $(LIBS)
+}
+
+actions quietly RemoveLinkerInputFile
+{
+  $(RM) $(<).opt
+}
+
+actions quietly together piecemeal AppendLinkerInputFile
+{
+  echo $(>) >> $(<).opt
+}
+
+actions LinkApplicationFromFile bind NEEDLIBS bind EXTRAOBJECTS
 {
   $(MACOSX.ENVIRON)
-  $(LINK) -o $(<) $(>) $(EXTRAOBJECTS) $(NEEDLIBS) $(WHOLE_ARCH_BEGIN) \
-    $(NEEDLIBS_WHOLE) $(WHOLE_ARCH_END) $(LIBS)
+  $(LINK) -o $(<) `cat $(>).opt` $(EXTRAOBJECTS) $(NEEDLIBS) $(LIBS)
+#  $(LINK) -o $(<) -Xlinker @$(>).opt $(EXTRAOBJECTS) $(NEEDLIBS) $(LIBS)
 }
 
index 281b738..5ee1aa9 100644 (file)
@@ -30,26 +30,50 @@ rule ConstructPluginTarget
 #  correct clean targets.
 rule SystemLinkApplication
 {
+    # check options
+    CheckOptions linkerfile : $(3) : $(<) ;
+
     local target = $($(<)_TARGET) ;
   
     Depends $(target) : $(>) ;
 
-    if $(<)_WHOLE_ARCHIVE
+    if [ IsElem linkerfile : $(3) ]
+    {
+        RemoveLinkerInputFile $(target) ;
+        local i ;
+        for i in $(>) { AppendLinkerInputFile $(target) : $(i) ; }
+        LinkApplicationFromFile $(target) : $(target) ;
+        RemoveLinkerInputFile $(target) ;
+    }
+    else
     {
-        WHOLE_ARCH_BEGIN on $(target) = -Wl,--whole-archive ;
-        WHOLE_ARCH_END on $(target) = -Wl,--no-whole-archive ;
+        LinkApplication $(target) : $(>) ;
     }
 
-    LinkApplication $(target) : $(>) ;
     LIBS on $(target) = $(LIBS) ;
     # setup clean rules
     Clean clean : $(target) ;
     Clean $(<)clean : $(target) ;
 }
 
-actions LinkApplication bind NEEDLIBS bind NEEDLIBS_WHOLE bind EXTRAOBJECTS
+actions LinkApplication bind NEEDLIBS bind EXTRAOBJECTS
+{
+    $(LINK) -o $(<) $(>) $(EXTRAOBJECTS) $(NEEDLIBS) $(LIBS)
+}
+
+actions quietly RemoveLinkerInputFile
+{
+    $(RM) $(<).opt
+}
+
+actions quietly together piecemeal AppendLinkerInputFile
+{
+    echo $(>) >> $(<).opt
+}
+
+actions LinkApplicationFromFile bind NEEDLIBS bind EXTRAOBJECTS
 {
-    $(LINK) -o $(<) $(>) $(EXTRAOBJECTS) $(NEEDLIBS) $(WHOLE_ARCH_BEGIN) \
-      $(NEEDLIBS_WHOLE) $(WHOLE_ARCH_END) $(LIBS)
+    $(LINK) -o $(<) `cat $(>).opt` $(EXTRAOBJECTS) $(NEEDLIBS) $(LIBS)
+#    $(LINK) -o $(<) -Xlinker @$(>).opt $(EXTRAOBJECTS) $(NEEDLIBS) $(LIBS)
 }
 
index fa97e52..a51400a 100644 (file)
@@ -59,22 +59,43 @@ rule SystemLinkApplication
 
   Depends $(target) : $(>) ;
 
-  if $(<)_WHOLE_ARCHIVE
+  if [ IsElem linkerfile : $(3) ]
   {
-    WHOLE_ARCH_BEGIN on $(target) = -Wl,--whole-archive ;
-    WHOLE_ARCH_END on $(target) = -Wl,--no-whole-archive ;
+    RemoveLinkerInputFile $(target) ;
+    local i ;
+    for i in $(>) { AppendLinkerInputFile $(target) : $(i) ; }
+    LinkApplicationFromFile $(target) : $(target) ;
+    RemoveLinkerInputFile $(target) ;
+  }
+  else
+  {
+    LinkApplication $(target) : $(>) ;
   }
 
-  LinkApplication $(target) : $(>) ;
   LIBS on $(target) = $(LIBS) ;
   # setup clean rules
   Clean clean : $(target) ;
   Clean $(<)clean : $(target) ;
 }
 
-actions LinkApplication bind NEEDLIBS bind NEEDLIBS_WHOLE bind EXTRAOBJECTS
+actions LinkApplication bind NEEDLIBS bind EXTRAOBJECTS
+{
+  $(LINK) -o $(<) $(>) $(EXTRAOBJECTS) $(NEEDLIBS) $(LIBS)
+}
+
+actions quietly RemoveLinkerInputFile
+{
+  $(RM) $(<).opt
+}
+
+actions quietly together piecemeal AppendLinkerInputFile
+{
+  echo $(>) >> $(<).opt
+}
+
+actions LinkApplicationFromFile bind NEEDLIBS bind EXTRAOBJECTS
 {
-  $(LINK) -o $(<) $(>) $(EXTRAOBJECTS) $(NEEDLIBS) $(WHOLE_ARCH_BEGIN) \
-    $(NEEDLIBS_WHOLE) $(WHOLE_ARCH_END) $(LIBS)
+  $(LINK) -o $(<) `cat $(>).opt` $(EXTRAOBJECTS) $(NEEDLIBS) $(LIBS)
+#  $(LINK) -o $(<) -Xlinker @$(>).opt $(EXTRAOBJECTS) $(NEEDLIBS) $(LIBS)
 }
 
index 330588b..c401c98 100644 (file)
@@ -3,39 +3,30 @@ SubDir TOP src ;
 SubInclude TOP src squirrel ;
 SubInclude TOP src scripting ;
 
-#------------------------
-# SuperTux ARCHIVE FILES:
-#------------------------
-# the following keeps the .o files after an archive file (.a) is created
-NOARUPDATE = true ;
-
-for i in audio badguy control gui lisp math object physfs sprite
-    tinygettext trigger video worldmap
-{
-    sources = [ Wildcard $(i) : *.cpp *.hpp ] ;
-    Library $(i) : $(sources) : noinstall ;
-    TRANSLATABLE_SOURCES += [ SearchSource $(sources) ] ;
-}
-
-ExternalLibs audio badguy control gui lisp math object physfs sprite
-      tinygettext trigger video worldmap
-    : SDL SDLIMAGE GL OPENAL VORBIS VORBISFILE OGG ICONV PHYSFS BINRELOC ;
-IncludeDir audio badguy control gui lisp math object physfs sprite
-      tinygettext trigger video worldmap
-    : squirrel/include squirrel ;
-
-#----------------------
-# SuperTux Application:
-#----------------------
-sources = [ Wildcard *.cpp *.hpp ] ;
+sources =
+    [ Wildcard *.cpp *.hpp ]
+    [ Wildcard audio : *.cpp *.hpp ]
+    [ Wildcard audio/newapi : *.cpp *.hpp ]
+    [ Wildcard badguy : *.cpp *.hpp ]
+    [ Wildcard control : *.cpp *.hpp ]
+    [ Wildcard gui : *.cpp *.hpp ]
+    [ Wildcard lisp : *.cpp *.hpp ]
+    [ Wildcard math : *.cpp *.hpp ]
+    [ Wildcard object : *.cpp *.hpp ]
+    [ Wildcard physfs : *.cpp *.hpp ]
+    [ Wildcard sprite : *.cpp *.hpp ]
+    [ Wildcard tinygettext : *.cpp *.hpp ]
+    [ Wildcard trigger : *.cpp *.hpp ]
+    [ Wildcard video : *.cpp *.hpp ]
+    [ Wildcard worldmap : *.cpp *.hpp ]
+;
 TRANSLATABLE_SOURCES += [ SearchSource $(sources) ] ;
 
-Application supertux : $(sources) $(wrapper_objects) ;
+#Application supertux : $(sources) $(wrapper_objects) ;
+Application supertux : $(sources) $(wrapper_objects) : linkerfile ;
 C++Flags supertux : -DAPPDATADIR='\"$(appdatadir)\"' ;
 LinkWith supertux : squirrel ;
 ExternalLibs supertux : SDL SDLIMAGE GL OPENAL VORBIS VORBISFILE OGG ICONV PHYSFS BINRELOC ;
 Help supertux : "Build the supertux executable" ;
 IncludeDir supertux : squirrel/include squirrel ;
 
-LinkWithWholeArchive supertux : audio badguy control gui lisp math object physfs sprite
-    tinygettext trigger video worldmap ;