Merge commit 'release-4-0-0alpha15' into master4-tmp
[nivanova/samba-autobuild/.git] / buildtools / wafsamba / samba_install.py
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
6 import Options
7 from TaskGen import feature, before, after
8 from samba_utils import *
9
10 @feature('install_bin')
11 @after('apply_core')
12 @before('apply_link', 'apply_obj_vars')
13 def install_binary(self):
14     '''install a binary, taking account of the different rpath varients'''
15     bld = self.bld
16
17     # get the ldflags we will use for install and build
18     install_ldflags = install_rpath(self)
19     build_ldflags   = build_rpath(bld)
20
21     if not Options.is_install:
22         # just need to set rpath if we are not installing
23         self.env.RPATH = build_ldflags
24         return
25
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)
29
30     orig_target = os.path.basename(self.target)
31
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'
37
38     # setup the right rpath link flags for the install
39     self.env.RPATH = install_ldflags
40
41     if not self.samba_install:
42         # this binary is marked not to be installed
43         return
44
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),
48                    chmod=MODE_755)
49
50
51
52 @feature('install_lib')
53 @after('apply_core')
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):
58         return
59
60     bld = self.bld
61
62     install_ldflags = install_rpath(self)
63     build_ldflags   = build_rpath(bld)
64
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
68         return
69
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}'
75         else:
76             install_path = '${LIBDIR}'
77     install_path = bld.EXPAND_VARIABLES(install_path)
78
79     target_name = self.target
80
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')
87         t.posted = False
88         t.target += '.inst'
89         self.env.RPATH = build_ldflags
90     else:
91         t = self
92
93     t.env.RPATH = install_ldflags
94
95     dev_link     = None
96
97     # in the following the names are:
98     # - inst_name is the name with .inst. in it, in the build
99     #   directory
100     # - install_name is the name in the install directory
101     # - install_link is a symlink in the install directory, to install_name
102
103     if getattr(self, 'samba_realname', None):
104         install_name = self.samba_realname
105         install_link = None
106         if getattr(self, 'samba_type', None) == 'PYTHON':
107             inst_name    = bld.make_libname(t.target, nolibprefix=True, python=True)
108         else:
109             inst_name    = bld.make_libname(t.target)
110     elif self.vnum:
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)
122     else:
123         install_name = bld.make_libname(target_name)
124         install_link = None
125         inst_name    = bld.make_libname(t.target)
126
127     if t.env.SONAME_ST:
128         # ensure we get the right names in the library
129         if install_link:
130             t.env.append_value('LINKFLAGS', t.env.SONAME_ST % install_link)
131         else:
132             t.env.append_value('LINKFLAGS', t.env.SONAME_ST % install_name)
133         t.env.SONAME_ST = ''
134
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), os.path.basename(install_name))
141     if dev_link:
142         bld.symlink_as(os.path.join(install_path, dev_link), os.path.basename(install_name))
143
144
145 @feature('cshlib')
146 @after('apply_implib')
147 @before('apply_vnum')
148 def apply_soname(self):
149     '''install a library, taking account of the different rpath varients'''
150
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 = ''
154
155 @feature('cshlib')
156 @after('apply_implib')
157 @before('apply_vnum')
158 def apply_vscript(self):
159     '''add version-script arguments to library build'''
160
161     if self.env.HAVE_LD_VERSION_SCRIPT and getattr(self, 'version_script', ''):
162         self.env.append_value('LINKFLAGS', "-Wl,--version-script=%s" %
163             self.version_script)
164         self.version_script = None
165
166
167 ##############################
168 # handle the creation of links for libraries and binaries in the build tree
169
170 @feature('symlink_lib')
171 @after('apply_link')
172 def symlink_lib(self):
173     '''symlink a shared lib'''
174
175     if self.target.endswith('.inst'):
176         return
177
178     blddir = os.path.dirname(self.bld.srcnode.abspath(self.bld.env))
179     libpath = self.link_task.outputs[0].abspath(self.env)
180
181     # calculat the link target and put it in the environment
182     soext=""
183     vnum = getattr(self, 'vnum', None)
184     if vnum is not None:
185         soext = '.' + vnum.split('.')[0]
186
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)
192         else:
193             link_target = '%s/%s' % (LIB_PATH, basename)
194
195     link_target = os.path.join(blddir, link_target)
196
197     if os.path.lexists(link_target):
198         if os.path.islink(link_target) and os.readlink(link_target) == libpath:
199             return
200         os.unlink(link_target)
201
202     link_container = os.path.dirname(link_target)
203     if not os.path.isdir(link_container):
204         os.makedirs(link_container)
205
206     os.symlink(libpath, link_target)
207
208
209 @feature('symlink_bin')
210 @after('apply_link')
211 def symlink_bin(self):
212     '''symlink a binary into the build directory'''
213
214     if self.target.endswith('.inst'):
215         return
216
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)
222
223     if os.path.lexists(bldpath):
224         if os.path.islink(bldpath) and os.readlink(bldpath) == binpath:
225             return
226         os.unlink(bldpath)
227     os.symlink(binpath, bldpath)