2010-04-01 22:19:32 +11:00
###########################
# this handles the magic we need to do for installing
# with all the configure options that affect rpath and shared
# library use
2015-10-27 20:46:46 +01:00
import os
2015-11-07 00:57:36 +01:00
import Utils
2010-04-01 22:19:32 +11:00
from TaskGen import feature , before , after
2015-10-27 20:46:46 +01:00
from samba_utils import LIB_PATH , MODE_755 , install_rpath , build_rpath
2010-04-01 22:19:32 +11:00
@feature ( ' install_bin ' )
@after ( ' apply_core ' )
2010-05-03 16:37:33 +02:00
@before ( ' apply_link ' , ' apply_obj_vars ' )
2010-04-01 22:19:32 +11:00
def install_binary ( self ) :
''' install a binary, taking account of the different rpath varients '''
bld = self . bld
# get the ldflags we will use for install and build
2010-11-30 01:10:31 +01:00
install_ldflags = install_rpath ( self )
2010-04-01 22:19:32 +11:00
build_ldflags = build_rpath ( bld )
2015-11-07 00:57:36 +01:00
if not self . bld . is_install :
2010-04-01 22:19:32 +11:00
# just need to set rpath if we are not installing
2010-05-03 16:37:33 +02:00
self . env . RPATH = build_ldflags
2010-04-01 22:19:32 +11:00
return
# work out the install path, expanding variables
2010-10-05 17:17:31 +11:00
install_path = getattr ( self , ' samba_inst_path ' , None ) or ' $ {BINDIR} '
2010-04-01 22:19:32 +11:00
install_path = bld . EXPAND_VARIABLES ( install_path )
2010-04-18 21:08:11 +10:00
orig_target = os . path . basename ( self . target )
2010-04-01 22:19:32 +11:00
if install_ldflags != build_ldflags :
# we will be creating a new target name, and using that for the
# install link. That stops us from overwriting the existing build
# target, which has different ldflags
self . target + = ' .inst '
# setup the right rpath link flags for the install
2010-05-03 16:37:33 +02:00
self . env . RPATH = install_ldflags
2010-04-01 22:19:32 +11:00
2010-11-08 11:01:13 +11:00
if not self . samba_install :
# this binary is marked not to be installed
return
2010-04-01 22:19:32 +11:00
# tell waf to install the right binary
bld . install_as ( os . path . join ( install_path , orig_target ) ,
os . path . join ( self . path . abspath ( bld . env ) , self . target ) ,
2010-10-06 20:11:01 +11:00
chmod = MODE_755 )
2010-04-01 22:19:32 +11:00
@feature ( ' install_lib ' )
@after ( ' apply_core ' )
2010-05-03 16:37:33 +02:00
@before ( ' apply_link ' , ' apply_obj_vars ' )
2010-04-01 22:19:32 +11:00
def install_library ( self ) :
''' install a library, taking account of the different rpath varients '''
if getattr ( self , ' done_install_library ' , False ) :
return
bld = self . bld
2015-01-15 14:22:22 +01:00
default_env = bld . all_envs [ ' default ' ]
2015-05-22 13:06:48 +02:00
try :
if self . env [ ' IS_EXTRA_PYTHON ' ] :
bld . all_envs [ ' default ' ] = bld . all_envs [ ' extrapython ' ]
install_ldflags = install_rpath ( self )
build_ldflags = build_rpath ( bld )
2015-11-07 00:57:36 +01:00
if not self . bld . is_install or not getattr ( self , ' samba_install ' , True ) :
2015-05-22 13:06:48 +02:00
# just need to set the build rpath if we are not installing
self . env . RPATH = build_ldflags
return
# setup the install path, expanding variables
install_path = getattr ( self , ' samba_inst_path ' , None )
if install_path is None :
if getattr ( self , ' private_library ' , False ) :
install_path = ' $ {PRIVATELIBDIR} '
else :
install_path = ' $ {LIBDIR} '
install_path = bld . EXPAND_VARIABLES ( install_path )
target_name = self . target
if install_ldflags != build_ldflags :
# we will be creating a new target name, and using that for the
# install link. That stops us from overwriting the existing build
# target, which has different ldflags
self . done_install_library = True
t = self . clone ( self . env )
t . posted = False
t . target + = ' .inst '
2015-11-19 01:44:43 +01:00
t . name = self . name + ' .inst '
2015-05-22 13:06:48 +02:00
self . env . RPATH = build_ldflags
2010-11-04 23:23:39 +01:00
else :
2015-05-22 13:06:48 +02:00
t = self
t . env . RPATH = install_ldflags
dev_link = None
# in the following the names are:
# - inst_name is the name with .inst. in it, in the build
# directory
# - install_name is the name in the install directory
# - install_link is a symlink in the install directory, to install_name
if getattr ( self , ' samba_realname ' , None ) :
install_name = self . samba_realname
install_link = None
if getattr ( self , ' soname ' , ' ' ) :
install_link = self . soname
if getattr ( self , ' samba_type ' , None ) == ' PYTHON ' :
inst_name = bld . make_libname ( t . target , nolibprefix = True , python = True )
else :
inst_name = bld . make_libname ( t . target )
elif self . vnum :
vnum_base = self . vnum . split ( ' . ' ) [ 0 ]
install_name = bld . make_libname ( target_name , version = self . vnum )
install_link = bld . make_libname ( target_name , version = vnum_base )
inst_name = bld . make_libname ( t . target )
if not self . private_library :
# only generate the dev link for non-bundled libs
dev_link = bld . make_libname ( target_name )
elif getattr ( self , ' soname ' , ' ' ) :
install_name = bld . make_libname ( target_name )
2012-10-17 18:03:55 +02:00
install_link = self . soname
2010-10-17 21:58:22 +11:00
inst_name = bld . make_libname ( t . target )
2011-03-02 11:40:33 +11:00
else :
2015-05-22 13:06:48 +02:00
install_name = bld . make_libname ( target_name )
install_link = None
inst_name = bld . make_libname ( t . target )
2010-04-01 22:19:32 +11:00
2015-05-22 13:06:48 +02:00
if t . env . SONAME_ST :
# ensure we get the right names in the library
if install_link :
t . env . append_value ( ' LINKFLAGS ' , t . env . SONAME_ST % install_link )
else :
t . env . append_value ( ' LINKFLAGS ' , t . env . SONAME_ST % install_name )
t . env . SONAME_ST = ' '
# tell waf to install the library
bld . install_as ( os . path . join ( install_path , install_name ) ,
os . path . join ( self . path . abspath ( bld . env ) , inst_name ) ,
chmod = MODE_755 )
if install_link and install_link != install_name :
# and the symlink if needed
bld . symlink_as ( os . path . join ( install_path , install_link ) , os . path . basename ( install_name ) )
if dev_link :
bld . symlink_as ( os . path . join ( install_path , dev_link ) , os . path . basename ( install_name ) )
finally :
bld . all_envs [ ' default ' ] = default_env
2015-01-15 14:22:22 +01:00
2010-04-01 22:19:32 +11:00
2010-10-27 02:54:56 +02:00
@feature ( ' cshlib ' )
@after ( ' apply_implib ' )
@before ( ' apply_vnum ' )
def apply_soname ( self ) :
''' install a library, taking account of the different rpath varients '''
if self . env . SONAME_ST and getattr ( self , ' soname ' , ' ' ) :
self . env . append_value ( ' LINKFLAGS ' , self . env . SONAME_ST % self . soname )
self . env . SONAME_ST = ' '
2010-04-01 22:19:32 +11:00
2010-12-17 19:16:33 +01:00
@feature ( ' cshlib ' )
@after ( ' apply_implib ' )
@before ( ' apply_vnum ' )
def apply_vscript ( self ) :
''' add version-script arguments to library build '''
if self . env . HAVE_LD_VERSION_SCRIPT and getattr ( self , ' version_script ' , ' ' ) :
self . env . append_value ( ' LINKFLAGS ' , " -Wl,--version-script= %s " %
2010-12-17 19:38:12 +01:00
self . version_script )
2010-12-17 19:16:33 +01:00
self . version_script = None
2010-04-01 22:19:32 +11:00
##############################
# handle the creation of links for libraries and binaries in the build tree
@feature ( ' symlink_lib ' )
@after ( ' apply_link ' )
def symlink_lib ( self ) :
''' symlink a shared lib '''
2010-04-05 11:23:28 +10:00
if self . target . endswith ( ' .inst ' ) :
2010-04-01 22:19:32 +11:00
return
2010-04-08 21:46:20 +10:00
blddir = os . path . dirname ( self . bld . srcnode . abspath ( self . bld . env ) )
2010-04-05 11:23:28 +10:00
libpath = self . link_task . outputs [ 0 ] . abspath ( self . env )
2010-04-01 22:19:32 +11:00
# calculat the link target and put it in the environment
soext = " "
vnum = getattr ( self , ' vnum ' , None )
if vnum is not None :
soext = ' . ' + vnum . split ( ' . ' ) [ 0 ]
link_target = getattr ( self , ' link_name ' , ' ' )
if link_target == ' ' :
2011-02-18 10:52:48 +11:00
basename = os . path . basename ( self . bld . make_libname ( self . target , version = soext ) )
2010-11-05 02:30:01 +01:00
if getattr ( self , " private_library " , False ) :
link_target = ' %s /private/ %s ' % ( LIB_PATH , basename )
else :
link_target = ' %s / %s ' % ( LIB_PATH , basename )
2010-04-01 22:19:32 +11:00
2010-04-05 11:23:28 +10:00
link_target = os . path . join ( blddir , link_target )
2010-04-01 22:19:32 +11:00
2010-04-05 11:23:28 +10:00
if os . path . lexists ( link_target ) :
2010-04-13 09:33:18 +10:00
if os . path . islink ( link_target ) and os . readlink ( link_target ) == libpath :
2010-04-09 20:30:44 +10:00
return
2010-04-05 11:23:28 +10:00
os . unlink ( link_target )
2010-09-04 02:18:31 +02:00
link_container = os . path . dirname ( link_target )
if not os . path . isdir ( link_container ) :
2010-09-05 18:00:44 +02:00
os . makedirs ( link_container )
2010-09-04 02:18:31 +02:00
2010-04-05 11:23:28 +10:00
os . symlink ( libpath , link_target )
2010-04-01 22:19:32 +11:00
@feature ( ' symlink_bin ' )
@after ( ' apply_link ' )
def symlink_bin ( self ) :
2010-04-05 11:23:28 +10:00
''' symlink a binary into the build directory '''
if self . target . endswith ( ' .inst ' ) :
2010-04-01 22:19:32 +11:00
return
2011-02-17 14:03:13 +11:00
if not self . link_task . outputs or not self . link_task . outputs [ 0 ] :
raise Utils . WafError ( ' no outputs found for %s in symlink_bin ' % self . name )
2010-04-05 11:23:28 +10:00
binpath = self . link_task . outputs [ 0 ] . abspath ( self . env )
2010-04-11 21:59:43 +02:00
bldpath = os . path . join ( self . bld . env . BUILD_DIRECTORY , self . link_task . outputs [ 0 ] . name )
2010-04-01 22:19:32 +11:00
2010-04-05 11:23:28 +10:00
if os . path . lexists ( bldpath ) :
2010-04-13 09:33:18 +10:00
if os . path . islink ( bldpath ) and os . readlink ( bldpath ) == binpath :
2010-04-09 20:30:44 +10:00
return
2010-04-05 11:23:28 +10:00
os . unlink ( bldpath )
os . symlink ( binpath , bldpath )