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')
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.append_value('LINKFLAGS', build_ldflags)
26 # work out the install path, expanding variables
27 install_path = self.samba_inst_path or '${BINDIR}'
28 install_path = bld.EXPAND_VARIABLES(install_path)
30 orig_target = 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.append_value('LINKFLAGS', 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')
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 self.samba_install:
62 # just need to set the build rpath if we are not installing
63 self.env.append_value('LINKFLAGS', build_ldflags)
66 # setup the install path, expanding variables
67 install_path = self.samba_inst_path 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')
77 self.env.append_value('LINKFLAGS', build_ldflags)
81 t.env.append_value('LINKFLAGS', install_ldflags)
83 if self.samba_realname:
84 install_name = self.samba_realname
86 inst_name = t.target + '.so'
88 vnum_base = self.vnum.split('.')[0]
89 install_name = 'lib%s.so.%s' % (self.target, self.vnum)
90 install_link = 'lib%s.so.%s' % (self.target, vnum_base)
91 inst_name = 'lib%s.so' % t.target
93 install_name = 'lib%s.so' % self.target
95 inst_name = 'lib%s.so' % t.target
97 # tell waf to install the library
98 bld.install_as(os.path.join(install_path, install_name),
99 os.path.join(self.path.abspath(bld.env), inst_name))
101 # and the symlink if needed
102 bld.symlink_as(os.path.join(install_path, install_link),
107 ##############################
108 # handle the creation of links for libraries and binaries in the build tree
110 @feature('symlink_lib')
112 def symlink_lib(self):
113 '''symlink a shared lib'''
115 if self.target.endswith('.inst'):
118 blddir = Utils.g_module.blddir
119 libpath = self.link_task.outputs[0].abspath(self.env)
121 # calculat the link target and put it in the environment
123 vnum = getattr(self, 'vnum', None)
125 soext = '.' + vnum.split('.')[0]
127 link_target = getattr(self, 'link_name', '')
128 if link_target == '':
129 link_target = '%s/lib%s.so%s' % (LIB_PATH, self.target, soext)
131 link_target = os.path.join(blddir, link_target)
133 libpath = os_path_relpath(libpath, os.path.dirname(link_target))
135 if os.path.lexists(link_target):
136 os.unlink(link_target)
137 os.symlink(libpath, link_target)
140 @feature('symlink_bin')
142 def symlink_bin(self):
143 '''symlink a binary into the build directory'''
145 if self.target.endswith('.inst'):
148 blddir = Utils.g_module.blddir
149 binpath = self.link_task.outputs[0].abspath(self.env)
150 bldpath = os.path.join(blddir, os.path.basename(self.target))
152 binpath = os_path_relpath(binpath, os.path.dirname(bldpath))
154 if os.path.lexists(bldpath):
156 os.symlink(binpath, bldpath)