1 ###########################
2 # this handles the magic we need to do for installing
3 # with all the configure options that affect rpath and shared
8 from TaskGen import feature, before, after
9 from samba_utils import LIB_PATH, MODE_755, install_rpath, build_rpath
11 @feature('install_bin')
13 @before('apply_link', 'apply_obj_vars')
14 def install_binary(self):
15 '''install a binary, taking account of the different rpath varients'''
18 # get the ldflags we will use for install and build
19 install_ldflags = install_rpath(self)
20 build_ldflags = build_rpath(bld)
22 if not self.bld.is_install:
23 # just need to set rpath if we are not installing
24 self.env.RPATH = build_ldflags
27 # work out the install path, expanding variables
28 install_path = getattr(self, 'samba_inst_path', None) or '${BINDIR}'
29 install_path = bld.EXPAND_VARIABLES(install_path)
31 orig_target = os.path.basename(self.target)
33 if install_ldflags != build_ldflags:
34 # we will be creating a new target name, and using that for the
35 # install link. That stops us from overwriting the existing build
36 # target, which has different ldflags
37 self.target += '.inst'
39 # setup the right rpath link flags for the install
40 self.env.RPATH = install_ldflags
42 if not self.samba_install:
43 # this binary is marked not to be installed
46 # tell waf to install the right binary
47 bld.install_as(os.path.join(install_path, orig_target),
48 os.path.join(self.path.abspath(bld.env), self.target),
53 @feature('install_lib')
55 @before('apply_link', 'apply_obj_vars')
56 def install_library(self):
57 '''install a library, taking account of the different rpath varients'''
58 if getattr(self, 'done_install_library', False):
63 default_env = bld.all_envs['default']
65 if self.env['IS_EXTRA_PYTHON']:
66 bld.all_envs['default'] = bld.all_envs['extrapython']
68 install_ldflags = install_rpath(self)
69 build_ldflags = build_rpath(bld)
71 if not self.bld.is_install or not getattr(self, 'samba_install', True):
72 # just need to set the build rpath if we are not installing
73 self.env.RPATH = build_ldflags
76 # setup the install path, expanding variables
77 install_path = getattr(self, 'samba_inst_path', None)
78 if install_path is None:
79 if getattr(self, 'private_library', False):
80 install_path = '${PRIVATELIBDIR}'
82 install_path = '${LIBDIR}'
83 install_path = bld.EXPAND_VARIABLES(install_path)
85 target_name = self.target
87 if install_ldflags != build_ldflags:
88 # we will be creating a new target name, and using that for the
89 # install link. That stops us from overwriting the existing build
90 # target, which has different ldflags
91 self.done_install_library = True
92 t = self.clone(self.env)
95 self.env.RPATH = build_ldflags
99 t.env.RPATH = install_ldflags
103 # in the following the names are:
104 # - inst_name is the name with .inst. in it, in the build
106 # - install_name is the name in the install directory
107 # - install_link is a symlink in the install directory, to install_name
109 if getattr(self, 'samba_realname', None):
110 install_name = self.samba_realname
112 if getattr(self, 'soname', ''):
113 install_link = self.soname
114 if getattr(self, 'samba_type', None) == 'PYTHON':
115 inst_name = bld.make_libname(t.target, nolibprefix=True, python=True)
117 inst_name = bld.make_libname(t.target)
119 vnum_base = self.vnum.split('.')[0]
120 install_name = bld.make_libname(target_name, version=self.vnum)
121 install_link = bld.make_libname(target_name, version=vnum_base)
122 inst_name = bld.make_libname(t.target)
123 if not self.private_library:
124 # only generate the dev link for non-bundled libs
125 dev_link = bld.make_libname(target_name)
126 elif getattr(self, 'soname', ''):
127 install_name = bld.make_libname(target_name)
128 install_link = self.soname
129 inst_name = bld.make_libname(t.target)
131 install_name = bld.make_libname(target_name)
133 inst_name = bld.make_libname(t.target)
136 # ensure we get the right names in the library
138 t.env.append_value('LINKFLAGS', t.env.SONAME_ST % install_link)
140 t.env.append_value('LINKFLAGS', t.env.SONAME_ST % install_name)
143 # tell waf to install the library
144 bld.install_as(os.path.join(install_path, install_name),
145 os.path.join(self.path.abspath(bld.env), inst_name),
147 if install_link and install_link != install_name:
148 # and the symlink if needed
149 bld.symlink_as(os.path.join(install_path, install_link), os.path.basename(install_name))
151 bld.symlink_as(os.path.join(install_path, dev_link), os.path.basename(install_name))
153 bld.all_envs['default'] = default_env
157 @after('apply_implib')
158 @before('apply_vnum')
159 def apply_soname(self):
160 '''install a library, taking account of the different rpath varients'''
162 if self.env.SONAME_ST and getattr(self, 'soname', ''):
163 self.env.append_value('LINKFLAGS', self.env.SONAME_ST % self.soname)
164 self.env.SONAME_ST = ''
167 @after('apply_implib')
168 @before('apply_vnum')
169 def apply_vscript(self):
170 '''add version-script arguments to library build'''
172 if self.env.HAVE_LD_VERSION_SCRIPT and getattr(self, 'version_script', ''):
173 self.env.append_value('LINKFLAGS', "-Wl,--version-script=%s" %
175 self.version_script = None
178 ##############################
179 # handle the creation of links for libraries and binaries in the build tree
181 @feature('symlink_lib')
183 def symlink_lib(self):
184 '''symlink a shared lib'''
186 if self.target.endswith('.inst'):
189 blddir = os.path.dirname(self.bld.srcnode.abspath(self.bld.env))
190 libpath = self.link_task.outputs[0].abspath(self.env)
192 # calculat the link target and put it in the environment
194 vnum = getattr(self, 'vnum', None)
196 soext = '.' + vnum.split('.')[0]
198 link_target = getattr(self, 'link_name', '')
199 if link_target == '':
200 basename = os.path.basename(self.bld.make_libname(self.target, version=soext))
201 if getattr(self, "private_library", False):
202 link_target = '%s/private/%s' % (LIB_PATH, basename)
204 link_target = '%s/%s' % (LIB_PATH, basename)
206 link_target = os.path.join(blddir, link_target)
208 if os.path.lexists(link_target):
209 if os.path.islink(link_target) and os.readlink(link_target) == libpath:
211 os.unlink(link_target)
213 link_container = os.path.dirname(link_target)
214 if not os.path.isdir(link_container):
215 os.makedirs(link_container)
217 os.symlink(libpath, link_target)
220 @feature('symlink_bin')
222 def symlink_bin(self):
223 '''symlink a binary into the build directory'''
225 if self.target.endswith('.inst'):
228 if not self.link_task.outputs or not self.link_task.outputs[0]:
229 raise Utils.WafError('no outputs found for %s in symlink_bin' % self.name)
230 binpath = self.link_task.outputs[0].abspath(self.env)
231 bldpath = os.path.join(self.bld.env.BUILD_DIRECTORY, self.link_task.outputs[0].name)
233 if os.path.lexists(bldpath):
234 if os.path.islink(bldpath) and os.readlink(bldpath) == binpath:
237 os.symlink(binpath, bldpath)