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(bld)
19 build_ldflags = build_rpath(bld)
21 if not Options.is_install or not self.samba_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 # tell waf to install the right binary
42 bld.install_as(os.path.join(install_path, orig_target),
43 os.path.join(self.path.abspath(bld.env), self.target),
48 @feature('install_lib')
50 @before('apply_link', 'apply_obj_vars')
51 def install_library(self):
52 '''install a library, taking account of the different rpath varients'''
53 if getattr(self, 'done_install_library', False):
58 install_ldflags = install_rpath(bld)
59 build_ldflags = build_rpath(bld)
61 if not Options.is_install or not getattr(self, 'samba_install', True):
62 # just need to set the build rpath if we are not installing
63 self.env.RPATH = build_ldflags
66 # setup the install path, expanding variables
67 install_path = getattr(self, 'samba_inst_path', None) or '${LIBDIR}'
68 install_path = bld.EXPAND_VARIABLES(install_path)
70 if install_ldflags != build_ldflags:
71 # we will be creating a new target name, and using that for the
72 # install link. That stops us from overwriting the existing build
73 # target, which has different ldflags
74 self.done_install_library = True
75 t = self.clone('default')
78 self.env.RPATH = build_ldflags
82 t.env.RPATH = install_ldflags
86 if getattr(self, 'samba_realname', None):
87 install_name = self.samba_realname
89 if getattr(self, 'samba_type', None) == 'PYTHON':
90 inst_name = '%s.so' % t.target
92 inst_name = 'lib%s.so' % t.target
94 vnum_base = self.vnum.split('.')[0]
95 install_name = 'lib%s.so.%s' % (self.target, self.vnum)
96 install_link = 'lib%s.so.%s' % (self.target, vnum_base)
97 inst_name = 'lib%s.so' % t.target
98 if not self.is_bundled:
99 # only generate the dev link for non-bundled libs
100 dev_link = 'lib%s.so' % self.target
102 install_name = 'lib%s.so' % self.target
104 inst_name = 'lib%s.so' % t.target
106 if t.env.SONAME_ST and install_link:
107 t.env.append_value('LINKFLAGS', t.env.SONAME_ST % install_link)
110 # tell waf to install the library
111 bld.install_as(os.path.join(install_path, install_name),
112 os.path.join(self.path.abspath(bld.env), inst_name))
114 # and the symlink if needed
115 bld.symlink_as(os.path.join(install_path, install_link),
118 bld.symlink_as(os.path.join(install_path, dev_link),
123 ##############################
124 # handle the creation of links for libraries and binaries in the build tree
126 @feature('symlink_lib')
128 def symlink_lib(self):
129 '''symlink a shared lib'''
131 if self.target.endswith('.inst'):
134 blddir = os.path.dirname(self.bld.srcnode.abspath(self.bld.env))
135 libpath = self.link_task.outputs[0].abspath(self.env)
137 # calculat the link target and put it in the environment
139 vnum = getattr(self, 'vnum', None)
141 soext = '.' + vnum.split('.')[0]
143 link_target = getattr(self, 'link_name', '')
144 if link_target == '':
145 link_target = '%s/lib%s.so%s' % (LIB_PATH, self.target, soext)
147 link_target = os.path.join(blddir, link_target)
149 if os.path.lexists(link_target):
150 if os.path.islink(link_target) and os.readlink(link_target) == libpath:
152 os.unlink(link_target)
154 link_container = os.path.dirname(link_target)
155 if not os.path.isdir(link_container):
156 os.makedirs(link_container)
158 os.symlink(libpath, link_target)
161 @feature('symlink_bin')
163 def symlink_bin(self):
164 '''symlink a binary into the build directory'''
166 if self.target.endswith('.inst'):
169 blddir = os.path.dirname(self.bld.srcnode.abspath(self.bld.env))
170 binpath = self.link_task.outputs[0].abspath(self.env)
171 bldpath = os.path.join(self.bld.env.BUILD_DIRECTORY, self.link_task.outputs[0].name)
173 if os.path.lexists(bldpath):
174 if os.path.islink(bldpath) and os.readlink(bldpath) == binpath:
177 os.symlink(binpath, bldpath)