#============================================================================ # Jam configuration and actions for Unix (GNU/Linux, BSD, Darwin, etc.) # Copyright (C)2003 by Matze Braun # # This library is free software; you can redistribute it and/or modify it # under the terms of the GNU Library General Public License as published by # the Free Software Foundation; either version 2 of the License, or (at your # option) any later version. # # This library is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public # License for more details. # # You should have received a copy of the GNU Library General Public License # along with this library; if not, write to the Free Software Foundation, # Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # #============================================================================ SHELL ?= "/bin/sh" ; # Only use nasm on x86 for now... NASM.FLAGS += -f elf ; PLUGIN.CFLAGS += $(COMPILER.C++FLAGS.PIC) ; LIBRARY.CFLAGS += $(COMPILER.C++FLAGS.PIC) ; # The BFD tag name under which to embed meta-information into a plugin module. # This much match the name expected by csGetPluginMetadata() (bfdplugins.cpp). SECTION_TAG_NAME ?= .crystalspace ; #---------------------------------------------------------------------------- # platform specific rules ## ConstructApplicationTarget target : options ## Constructs the application target name (ie. foo.exe for foo) rule ConstructApplicationTarget { return $(<) ; } rule ConstructStaticLibraryTarget { return lib$(<)$(SUFLIB) ; } rule ConstructSharedLibraryTarget { return lib$(<).so.$(PACKAGE_VERSION) ; } rule ConstructSharedLibraryLinkLib { return lib$(<).so.$(PACKAGE_VERSION) ; } rule ConstructPluginTarget { return $(<).so ; } # SystemLinkApplication target : objects : options # do system specific actions needed for linking the application and construct # correct clean targets. rule SystemLinkApplication { local target = $($(<)_TARGET) ; Depends $(target) : $(>) ; LinkApplication $(target) : $(>) ; # setup clean rules Clean clean : $(target) ; Clean $(<)clean : $(target) ; } rule SystemInstallApplication { Depends install_bin : [ DoInstall $(<) : $(bindir) $(2) : $(INSTALL_PROGRAM) ] ; } rule SystemInstallPlugin { Depends install_plugin : [ DoInstall $(<) : $(plugindir) $(2) : $(INSTALL_PROGRAM) ] ; } # Put the meta data into the object file headers rule ObjTagMetaData { Depends $(<) : $(>) ; } actions ObjTagMetaData { $(CMD.OBJCOPY) --add-section $(SECTION_TAG_NAME)=$(>) $(<) } # SystemLinkPlugin target : objects : options # do system specific actions needed for linking the plugin and construct # correct clean targets. rule SystemLinkPlugin { local target = $($(<)_TARGET) ; Depends $(target) : $(>) ; LinkPlugin $(target) : $(>) ; if $(EMBED_META) = "yes" && $(OBJCOPY.AVAILABLE) = "yes" { ObjTagMetaData $(target) : $($(<)_METAFILE) ; } else { PluginMetaData $(<) : $($(<)_METAFILE) : $(3) ; } # setup clean rules Clean clean : $(target) ; Clean $(<)clean : $(target) ; } rule SystemLinkSharedLibrary { LFlags $(<) : $(LINKLIBS) ; Depends $(<) : $(>) ; local response = $(<).resp ; MakeLocate $(response) : $(LOCATE.OBJECTS)/libs ; ResponseFile $(response) : $(>) ; # @@@ FIXME: response files are only supported on newer binutils # But quite useful to avoid blowing jam's 10240 max action length. #Depends $(response) : $(>) ; #Depends $(<) : $(response) ; #LinkSharedLibrary $(<) : $(response) ; LinkSharedLibrary $(<) : $(>) ; Clean clean : $(<) ; Clean $(<)clean : $(<) ; } actions LinkApplication bind NEEDLIBS bind EXTRAOBJECTS { $(CMD.LINK) -o $(<) $(>) $(EXTRAOBJECTS) $(NEEDLIBS) $(LINKLIBS) } if $(PLUGIN.LFLAGS.USE_SONAME) = "yes" { actions LinkPlugin bind NEEDLIBS bind EXTRAOBJECTS { $(CMD.LINK) -o $(<) $(>) $(EXTRAOBJECTS) $(NEEDLIBS) $(LINKLIBS) \ -Wl,-soname,$(<:BS) } } else { actions LinkPlugin bind NEEDLIBS bind EXTRAOBJECTS { $(CMD.LINK) -o $(<) $(>) $(EXTRAOBJECTS) $(NEEDLIBS) $(LINKLIBS) } } actions LinkSharedLibrary bind NEEDLIBS bind EXTRAOBJECTS { $(CMD.LINK) -shared -o $(<) $(>) $(EXTRAOBJECTS) $(NEEDLIBS) $(LINKLIBS) \ -Wl,-soname,$(<:BS) }