source: vendor/current/buildtools/wafsamba/samba_install.py

Last change on this file was 988, checked in by Silvan Scherrer, 9 years ago

Samba Server: update vendor to version 4.4.3

File size: 8.3 KB
Line 
1###########################
2# this handles the magic we need to do for installing
3# with all the configure options that affect rpath and shared
4# library use
5
6import os
7import Utils
8from TaskGen import feature, before, after
9from samba_utils import LIB_PATH, MODE_755, install_rpath, build_rpath
10
11@feature('install_bin')
12@after('apply_core')
13@before('apply_link', 'apply_obj_vars')
14def install_binary(self):
15 '''install a binary, taking account of the different rpath varients'''
16 bld = self.bld
17
18 # get the ldflags we will use for install and build
19 install_ldflags = install_rpath(self)
20 build_ldflags = build_rpath(bld)
21
22 if not self.bld.is_install:
23 # just need to set rpath if we are not installing
24 self.env.RPATH = build_ldflags
25 return
26
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)
30
31 orig_target = os.path.basename(self.target)
32
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'
38
39 # setup the right rpath link flags for the install
40 self.env.RPATH = install_ldflags
41
42 if not self.samba_install:
43 # this binary is marked not to be installed
44 return
45
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),
49 chmod=MODE_755)
50
51
52
53@feature('install_lib')
54@after('apply_core')
55@before('apply_link', 'apply_obj_vars')
56def install_library(self):
57 '''install a library, taking account of the different rpath varients'''
58 if getattr(self, 'done_install_library', False):
59 return
60
61 bld = self.bld
62
63 default_env = bld.all_envs['default']
64 try:
65 if self.env['IS_EXTRA_PYTHON']:
66 bld.all_envs['default'] = bld.all_envs['extrapython']
67
68 install_ldflags = install_rpath(self)
69 build_ldflags = build_rpath(bld)
70
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
74 return
75
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}'
81 else:
82 install_path = '${LIBDIR}'
83 install_path = bld.EXPAND_VARIABLES(install_path)
84
85 target_name = self.target
86
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)
93 t.posted = False
94 t.target += '.inst'
95 t.name = self.name + '.inst'
96 self.env.RPATH = build_ldflags
97 else:
98 t = self
99
100 t.env.RPATH = install_ldflags
101
102 dev_link = None
103
104 # in the following the names are:
105 # - inst_name is the name with .inst. in it, in the build
106 # directory
107 # - install_name is the name in the install directory
108 # - install_link is a symlink in the install directory, to install_name
109
110 if getattr(self, 'samba_realname', None):
111 install_name = self.samba_realname
112 install_link = None
113 if getattr(self, 'soname', ''):
114 install_link = self.soname
115 if getattr(self, 'samba_type', None) == 'PYTHON':
116 inst_name = bld.make_libname(t.target, nolibprefix=True, python=True)
117 else:
118 inst_name = bld.make_libname(t.target)
119 elif self.vnum:
120 vnum_base = self.vnum.split('.')[0]
121 install_name = bld.make_libname(target_name, version=self.vnum)
122 install_link = bld.make_libname(target_name, version=vnum_base)
123 inst_name = bld.make_libname(t.target)
124 if not self.private_library:
125 # only generate the dev link for non-bundled libs
126 dev_link = bld.make_libname(target_name)
127 elif getattr(self, 'soname', ''):
128 install_name = bld.make_libname(target_name)
129 install_link = self.soname
130 inst_name = bld.make_libname(t.target)
131 else:
132 install_name = bld.make_libname(target_name)
133 install_link = None
134 inst_name = bld.make_libname(t.target)
135
136 if t.env.SONAME_ST:
137 # ensure we get the right names in the library
138 if install_link:
139 t.env.append_value('LINKFLAGS', t.env.SONAME_ST % install_link)
140 else:
141 t.env.append_value('LINKFLAGS', t.env.SONAME_ST % install_name)
142 t.env.SONAME_ST = ''
143
144 # tell waf to install the library
145 bld.install_as(os.path.join(install_path, install_name),
146 os.path.join(self.path.abspath(bld.env), inst_name),
147 chmod=MODE_755)
148 if install_link and install_link != install_name:
149 # and the symlink if needed
150 bld.symlink_as(os.path.join(install_path, install_link), os.path.basename(install_name))
151 if dev_link:
152 bld.symlink_as(os.path.join(install_path, dev_link), os.path.basename(install_name))
153 finally:
154 bld.all_envs['default'] = default_env
155
156
157@feature('cshlib')
158@after('apply_implib')
159@before('apply_vnum')
160def apply_soname(self):
161 '''install a library, taking account of the different rpath varients'''
162
163 if self.env.SONAME_ST and getattr(self, 'soname', ''):
164 self.env.append_value('LINKFLAGS', self.env.SONAME_ST % self.soname)
165 self.env.SONAME_ST = ''
166
167@feature('cshlib')
168@after('apply_implib')
169@before('apply_vnum')
170def apply_vscript(self):
171 '''add version-script arguments to library build'''
172
173 if self.env.HAVE_LD_VERSION_SCRIPT and getattr(self, 'version_script', ''):
174 self.env.append_value('LINKFLAGS', "-Wl,--version-script=%s" %
175 self.version_script)
176 self.version_script = None
177
178
179##############################
180# handle the creation of links for libraries and binaries in the build tree
181
182@feature('symlink_lib')
183@after('apply_link')
184def symlink_lib(self):
185 '''symlink a shared lib'''
186
187 if self.target.endswith('.inst'):
188 return
189
190 blddir = os.path.dirname(self.bld.srcnode.abspath(self.bld.env))
191 libpath = self.link_task.outputs[0].abspath(self.env)
192
193 # calculat the link target and put it in the environment
194 soext=""
195 vnum = getattr(self, 'vnum', None)
196 if vnum is not None:
197 soext = '.' + vnum.split('.')[0]
198
199 link_target = getattr(self, 'link_name', '')
200 if link_target == '':
201 basename = os.path.basename(self.bld.make_libname(self.target, version=soext))
202 if getattr(self, "private_library", False):
203 link_target = '%s/private/%s' % (LIB_PATH, basename)
204 else:
205 link_target = '%s/%s' % (LIB_PATH, basename)
206
207 link_target = os.path.join(blddir, link_target)
208
209 if os.path.lexists(link_target):
210 if os.path.islink(link_target) and os.readlink(link_target) == libpath:
211 return
212 os.unlink(link_target)
213
214 link_container = os.path.dirname(link_target)
215 if not os.path.isdir(link_container):
216 os.makedirs(link_container)
217
218 os.symlink(libpath, link_target)
219
220
221@feature('symlink_bin')
222@after('apply_link')
223def symlink_bin(self):
224 '''symlink a binary into the build directory'''
225
226 if self.target.endswith('.inst'):
227 return
228
229 if not self.link_task.outputs or not self.link_task.outputs[0]:
230 raise Utils.WafError('no outputs found for %s in symlink_bin' % self.name)
231 binpath = self.link_task.outputs[0].abspath(self.env)
232 bldpath = os.path.join(self.bld.env.BUILD_DIRECTORY, self.link_task.outputs[0].name)
233
234 if os.path.lexists(bldpath):
235 if os.path.islink(bldpath) and os.readlink(bldpath) == binpath:
236 return
237 os.unlink(bldpath)
238 os.symlink(binpath, bldpath)
Note: See TracBrowser for help on using the repository browser.