ede/build/Library.jam

149 lines
3.4 KiB
Plaintext

#
# $Id$
#
# Part of Equinox Desktop Environment (EDE).
# Copyright (c) 2000-2007 EDE Authors.
#
# This program is licensed under terms of the
# GNU General Public License version 2 or newer.
# See COPYING for details.
SUFOBJ_SHARED = ".lo" ;
SUFLIB_SHARED = ".so" ;
SUFLA_SHARED = ".la" ;
# StaticLibrary [lib-name] : [source-files] ;
rule StaticLibrary
{
Library $(<) : $(>) ;
}
rule SharedLibraryFromObjects
{
local _i _l _l_so _l_la _s ;
# Add grist to file names
_s = [ FGristFiles $(3) ] ;
_l = $(1:S=$(SUFLIB_SHARED).$(2)) ;
# for sonames; it accept only libname.so
_l_so = $(1:S=$(SUFLIB_SHARED)) ;
_l_so = $(_l_so:BSR=) ;
# libname.la file
_l_la = $(_l_so:S=$(SUFLA_SHARED)) ;
# library depends on its member objects
if $(KEEPOBJS) {
LocalDepends obj : $(_s) ;
} else {
LocalDepends lib : $(_l) ;
}
# Set LOCATE for the library and its contents. The bound
# value shows up as $(NEEDLIBS) on the Link actions.
# For compatibility, we only do this if the library doesn't
# already have a path.
if ! $(_l:D) {
MakeLocate $(_l) : $(LOCATE_TARGET) ;
}
# we never scan shared libraries for member objects
LocalDepends $(_l) : $(_s) ;
# clean library
LocalClean clean : $(_l) ;
if $(OS) = "SOLARIS" {
# solaris have other options for soname creation
LINKFLAGS on $(_l) = -h $(_l_so) -G [ on $(_l) return $(LINKFLAGS) ] ;
} else {
# let linker knows we are making shared library by adding -shared and -Wl,-soname libname.so flags
LINKFLAGS on $(_l) = -Wl,-soname,$(_l_so) -shared [ on $(_l) return $(LINKFLAGS) ] ;
}
# make it
Link $(_l) : $(_s) ;
# make a link
SymLink $(_l_so) : $(_l) ;
# let link be created in directory where libname.so.X.X.X exists
MakeLocate $(_l_so) : $(_l:D) ;
LocalDepends lib : $(_l_so) ;
# generate libname.la file
DLNAME1 on $(_l_la) = $(_l_so) ;
DLNAME2 on $(_l_la) = $(_l:BSR=) ;
GenLa $(_l_la) ;
LocalClean clean : $(_l_la) ;
LocalClean clean : $(_l_so) ;
# let libname.la be created in directory where libname.so.X.X.X exists
MakeLocate $(_l_la) : $(_l:D) ;
LocalDepends lib : $(_l_la) ;
}
rule SharedObjects
{
# temporary replace SUFOBJ since Objects rule use it
local SUFOBJ = $(SUFOBJ_SHARED) ;
ObjectCcFlags $(<) : -fPIC ;
ObjectC++Flags $(<) : -fPIC ;
# call the normal Objects rule
Objects $(<) ;
}
# SharedLibrary [library] : [version] : [source] ;
# Creates shared library ala libtool
rule SharedLibrary
{
if ! $(UNIX) {
Exit "Don't know how to build shared libraries on this platform" ;
}
SharedLibraryFromObjects $(1) : $(2) : $(3:S=$(SUFOBJ_SHARED)) ;
SharedObjects $(3) ;
}
# .la files are generated by libtool and we emulate that too
# NOTE: jam will discard comments that should be written to the file
# so instead plain '#' is used '@@#' and later is replaced with sed
actions GenLa
{
today=`date`
cat > "$(<).tmp" <<EOF
@@# $(<:D=) - a libtool library file
@@# Generated by 'EDE jam build' on: $today
@@# The name that we can dlopen(3).
dlname='$(DLNAME1)'
@@# Names of this library.
library_names='$(DLNAME2) $(DLNAME1)'
@@# The name of the static archive.
old_library=''
@@# Libraries that this one depends upon.
dependency_libs=''
@@# Is this already installed library.
installed=yes
@@# Files to dlopen/dlpreopen.
dlopen=''
dlpreopen=''
@@# Directory that this library needs to be installed in:
libdir='$(libdir)'
EOF
cat "$(<).tmp" | $(SED) 's/^@@#/#/g' > "$(<)"
$(RM) "$(<).tmp"
}