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
109 # note that we use a relative symlink path to allow the whole tree
110 # to me moved/copied elsewhere without breaking the links
111 t = Task.simple_task_type('symlink_lib', 'rm -f ${LINK_TARGET} && ln -s ${LINK_SOURCE} ${LINK_TARGET}',
112 shell=True, color='PINK', ext_in='.bin')
115 @feature('symlink_lib')
117 def symlink_lib(self):
118 '''symlink a shared lib'''
119 if Options.is_install:
122 tsk = self.create_task('symlink_lib', self.link_task.outputs[0])
124 # calculat the link target and put it in the environment
126 vnum = getattr(self, 'vnum', None)
128 soext = '.' + vnum.split('.')[0]
130 link_target = getattr(self, 'link_name', '')
131 if link_target == '':
132 link_target = '%s/lib%s.so%s' % (LIB_PATH, self.target, soext)
135 link_source = os_path_relpath(self.link_task.outputs[0].abspath(self.env),
136 os.path.join(self.env.BUILD_DIRECTORY, link_target))
138 tsk.env.LINK_TARGET = link_target
139 tsk.env.LINK_SOURCE = link_source[3:]
140 debug('task_gen: LINK for %s is %s -> %s',
141 self.name, tsk.env.LINK_SOURCE, tsk.env.LINK_TARGET)
144 t = Task.simple_task_type('symlink_bin', 'rm -f ${BIN_TARGET} && ln -s ${SRC} ${BIN_TARGET}',
145 shell=True, color='PINK', ext_in='.bin')
148 @feature('symlink_bin')
150 def symlink_bin(self):
151 '''symlink a binary'''
152 if Options.is_install:
154 tsk = self.create_task('symlink_bin', self.link_task.outputs[0])
156 tsk.env.BIN_TARGET = self.target
157 debug('task_gen: BIN_TARGET for %s is %s', self.name, tsk.env.BIN_TARGET)