1 ###########################
2 # this handles the magic we need to do for installing
3 # with all the configure options that affect rpath and shared
7 from TaskGen
import feature
, before
, after
8 from samba_utils
import *
10 @feature('install_bin')
12 @before('apply_link', 'apply_obj_vars')
13 def install_binary(self
):
14 '''install a binary, taking account of the different rpath varients'''
17 # get the ldflags we will use for install and build
18 install_ldflags
= install_rpath(self
)
19 build_ldflags
= build_rpath(bld
)
21 if not Options
.is_install
:
22 # just need to set rpath if we are not installing
23 self
.env
.RPATH
= build_ldflags
26 # work out the install path, expanding variables
27 install_path
= getattr(self
, 'samba_inst_path', None) or '${BINDIR}'
28 install_path
= bld
.EXPAND_VARIABLES(install_path
)
30 orig_target
= os
.path
.basename(self
.target
)
32 if install_ldflags
!= build_ldflags
:
33 # we will be creating a new target name, and using that for the
34 # install link. That stops us from overwriting the existing build
35 # target, which has different ldflags
36 self
.target
+= '.inst'
38 # setup the right rpath link flags for the install
39 self
.env
.RPATH
= install_ldflags
41 if not self
.samba_install
:
42 # this binary is marked not to be installed
45 # tell waf to install the right binary
46 bld
.install_as(os
.path
.join(install_path
, orig_target
),
47 os
.path
.join(self
.path
.abspath(bld
.env
), self
.target
),
52 @feature('install_lib')
54 @before('apply_link', 'apply_obj_vars')
55 def install_library(self
):
56 '''install a library, taking account of the different rpath varients'''
57 if getattr(self
, 'done_install_library', False):
62 install_ldflags
= install_rpath(self
)
63 build_ldflags
= build_rpath(bld
)
65 if not Options
.is_install
or not getattr(self
, 'samba_install', True):
66 # just need to set the build rpath if we are not installing
67 self
.env
.RPATH
= build_ldflags
70 # setup the install path, expanding variables
71 install_path
= getattr(self
, 'samba_inst_path', None)
72 if install_path
is None:
73 if getattr(self
, 'private_library', False):
74 install_path
= '${PRIVATELIBDIR}'
76 install_path
= '${LIBDIR}'
77 install_path
= bld
.EXPAND_VARIABLES(install_path
)
79 target_name
= self
.target
81 if install_ldflags
!= build_ldflags
:
82 # we will be creating a new target name, and using that for the
83 # install link. That stops us from overwriting the existing build
84 # target, which has different ldflags
85 self
.done_install_library
= True
86 t
= self
.clone('default')
89 self
.env
.RPATH
= build_ldflags
93 t
.env
.RPATH
= install_ldflags
97 # in the following the names are:
98 # - inst_name is the name with .inst. in it, in the build
100 # - install_name is the name in the install directory
101 # - install_link is a symlink in the install directory, to install_name
103 if getattr(self
, 'samba_realname', None):
104 install_name
= self
.samba_realname
106 if getattr(self
, 'samba_type', None) == 'PYTHON':
107 inst_name
= bld
.make_libname(t
.target
, nolibprefix
=True, python
=True)
109 inst_name
= bld
.make_libname(t
.target
)
111 vnum_base
= self
.vnum
.split('.')[0]
112 install_name
= bld
.make_libname(target_name
, version
=self
.vnum
)
113 install_link
= bld
.make_libname(target_name
, version
=vnum_base
)
114 inst_name
= bld
.make_libname(t
.target
)
115 if not self
.private_library
:
116 # only generate the dev link for non-bundled libs
117 dev_link
= bld
.make_libname(target_name
)
118 elif getattr(self
, 'soname', ''):
119 install_name
= bld
.make_libname(target_name
)
120 install_link
= self
.soname
121 inst_name
= bld
.make_libname(t
.target
)
123 install_name
= bld
.make_libname(target_name
)
125 inst_name
= bld
.make_libname(t
.target
)
128 # ensure we get the right names in the library
130 t
.env
.append_value('LINKFLAGS', t
.env
.SONAME_ST
% install_link
)
132 t
.env
.append_value('LINKFLAGS', t
.env
.SONAME_ST
% install_name
)
135 # tell waf to install the library
136 bld
.install_as(os
.path
.join(install_path
, install_name
),
137 os
.path
.join(self
.path
.abspath(bld
.env
), inst_name
))
138 if install_link
and install_link
!= install_name
:
139 # and the symlink if needed
140 bld
.symlink_as(os
.path
.join(install_path
, install_link
), install_name
)
142 bld
.symlink_as(os
.path
.join(install_path
, dev_link
), install_name
)
146 @after('apply_implib')
147 @before('apply_vnum')
148 def apply_soname(self
):
149 '''install a library, taking account of the different rpath varients'''
151 if self
.env
.SONAME_ST
and getattr(self
, 'soname', ''):
152 self
.env
.append_value('LINKFLAGS', self
.env
.SONAME_ST
% self
.soname
)
153 self
.env
.SONAME_ST
= ''
156 @after('apply_implib')
157 @before('apply_vnum')
158 def apply_vscript(self
):
159 '''add version-script arguments to library build'''
161 if self
.env
.HAVE_LD_VERSION_SCRIPT
and getattr(self
, 'version_script', ''):
162 self
.env
.append_value('LINKFLAGS', "-Wl,--version-script=%s" %
164 self
.version_script
= None
167 ##############################
168 # handle the creation of links for libraries and binaries in the build tree
170 @feature('symlink_lib')
172 def symlink_lib(self
):
173 '''symlink a shared lib'''
175 if self
.target
.endswith('.inst'):
178 blddir
= os
.path
.dirname(self
.bld
.srcnode
.abspath(self
.bld
.env
))
179 libpath
= self
.link_task
.outputs
[0].abspath(self
.env
)
181 # calculat the link target and put it in the environment
183 vnum
= getattr(self
, 'vnum', None)
185 soext
= '.' + vnum
.split('.')[0]
187 link_target
= getattr(self
, 'link_name', '')
188 if link_target
== '':
189 basename
= os
.path
.basename(self
.bld
.make_libname(self
.target
, version
=soext
))
190 if getattr(self
, "private_library", False):
191 link_target
= '%s/private/%s' % (LIB_PATH
, basename
)
193 link_target
= '%s/%s' % (LIB_PATH
, basename
)
195 link_target
= os
.path
.join(blddir
, link_target
)
197 if os
.path
.lexists(link_target
):
198 if os
.path
.islink(link_target
) and os
.readlink(link_target
) == libpath
:
200 os
.unlink(link_target
)
202 link_container
= os
.path
.dirname(link_target
)
203 if not os
.path
.isdir(link_container
):
204 os
.makedirs(link_container
)
206 os
.symlink(libpath
, link_target
)
209 @feature('symlink_bin')
211 def symlink_bin(self
):
212 '''symlink a binary into the build directory'''
214 if self
.target
.endswith('.inst'):
217 blddir
= os
.path
.dirname(self
.bld
.srcnode
.abspath(self
.bld
.env
))
218 if not self
.link_task
.outputs
or not self
.link_task
.outputs
[0]:
219 raise Utils
.WafError('no outputs found for %s in symlink_bin' % self
.name
)
220 binpath
= self
.link_task
.outputs
[0].abspath(self
.env
)
221 bldpath
= os
.path
.join(self
.bld
.env
.BUILD_DIRECTORY
, self
.link_task
.outputs
[0].name
)
223 if os
.path
.lexists(bldpath
):
224 if os
.path
.islink(bldpath
) and os
.readlink(bldpath
) == binpath
:
227 os
.symlink(binpath
, bldpath
)