ede/build/Library.jam

111 lines
2.9 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.
SUFSHAREDLIB = ".so" ;
# StaticLibrary [lib-name] : [source-files] ;
rule StaticLibrary
{
Library $(<) : $(>) ;
}
rule SharedLibraryFromObjects
{
if ! $(UNIX) {
Echo "Dynamic libraries can't be built on this OS now" ;
return ;
}
local s t t_only ;
t = $(1) ;
s = [ FGristFiles $(2) ] ;
# Rip directory and grist parts from target because this will
# be passed to compiler as soname
t_only = $(t:D=:G=) ;
# if given suffix, skip it; otherwise add SUFSHAREDLIB
if ! $(t:S) {
t = $(t:S=$(SUFSHAREDLIB)) ;
}
LocalDepends lib : $(t) ;
# This is used if library already does not have a path
if ! $(t:D) {
MakeLocate $(t) $(t)($(s:BS)) : $(LOCATE_TARGET) ;
}
LINKLIBS on $(t) = -shared -Wl,-soname,\"$(t_only)\" [ on $(t) return $(LINKLIBS) ] ;
# Let target is dependant on source
LocalDepends $(t) : $(s) ;
Link $(t) : $(s) ;
LocalClean clean : $(t) ;
}
# SharedLibrary [libname] : [sources] ;
# Creates shared library [libname] from [sources].
#
# Note: ftjam in later versions provide rule with the same name, althought it calls
# libtool in the background. The way jam works, selecting latest redefined rules, ftjam's
# will be overriden with this.
rule SharedLibrary
{
local shlib = $(1) ;
local src = $(2) ;
local objects = [ FGristFiles $(src:S=$(SUFOBJ)) ] ;
CCFLAGS on $(objects) += -fPIC ;
C++FLAGS on $(objects) += -fPIC ;
SharedLibraryFromObjects $(shlib) : $(objects) ;
Objects $(src) ;
}
# SharedLibraryVersioned [libname] : [sources] : [opt-version] : ["nolink"] ;
# Creates versioned shared library (foo.so.[version]) which is often library naming
# on unix platforms. If [opt-version] is not given, it is like calling SharedLibrary only.
# By default it will create, besides [libname], ".so" symlink to it too. If "nolink" is given
# as 4 parameter, it will skip symlink creation.
rule SharedLibraryVersioned
{
if $(3) {
local target target_dir symlink versioned ;
# Set .so.version extension
versioned = "$(SUFSHAREDLIB).$(3)" ;
# Jam is not smart about ripping suffixes so cases 'foo.so.2.0'
# will produce 'foo.so.2'. We must hope that provided [libname] does _not_
# have full name or everything will be screwed up (no facility in jam to check this).
# With good hopes, we set first full target name and it's link abbreviation.
target = $(1:S=$(versioned)) ;
symlink = $(1:S=$(SUFSHAREDLIB)) ;
SharedLibrary $(target) : $(2) ;
# Create symlink
if $(4) != "nolink" {
# copy target directory or symlink will be created
# from place where jam is called
LOCATE on $(symlink) = [ on $(target) return $(LOCATE) ] ;
LocalDepends lib : $(symlink) ;
SymLink $(symlink) : $(target) ;
LocalClean clean : $(symlink) ;
}
} else {
SharedLibrary $(1) : $(2) ;
}
}