build: much simpler and faster rpath install handler
[samba.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')
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(bld)
19     build_ldflags   = build_rpath(bld)
20
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)
24         return
25
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)
29
30     orig_target = 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.append_value('LINKFLAGS', install_ldflags)
40
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),
44                    chmod=0755)
45
46
47
48 @feature('install_lib')
49 @after('apply_core')
50 @before('apply_link')
51 def install_library(self):
52     '''install a library, taking account of the different rpath varients'''
53     if getattr(self, 'done_install_library', False):
54         return
55
56     bld = self.bld
57
58     install_ldflags = install_rpath(bld)
59     build_ldflags   = build_rpath(bld)
60
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)
64         return
65
66     # setup the install path, expanding variables
67     install_path = self.samba_inst_path or '${LIBDIR}'
68     install_path = bld.EXPAND_VARIABLES(install_path)
69
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')
76         t.target += '.inst'
77         self.env.append_value('LINKFLAGS', build_ldflags)
78     else:
79         t = self
80
81     t.env.append_value('LINKFLAGS', install_ldflags)
82
83     if self.samba_realname:
84         install_name = self.samba_realname
85         install_link = None
86         inst_name    = t.target + '.so'
87     elif self.vnum:
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
92     else:
93         install_name = 'lib%s.so' % self.target
94         install_link = None
95         inst_name    = 'lib%s.so' % t.target
96
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))
100     if install_link:
101         # and the symlink if needed
102         bld.symlink_as(os.path.join(install_path, install_link),
103                        install_name)
104
105
106
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')
113 t.quiet = True
114
115 @feature('symlink_lib')
116 @after('apply_link')
117 def symlink_lib(self):
118     '''symlink a shared lib'''
119     if Options.is_install:
120         return
121
122     tsk = self.create_task('symlink_lib', self.link_task.outputs[0])
123
124     # calculat the link target and put it in the environment
125     soext=""
126     vnum = getattr(self, 'vnum', None)
127     if vnum is not None:
128         soext = '.' + vnum.split('.')[0]
129
130     link_target = getattr(self, 'link_name', '')
131     if link_target == '':
132         link_target = '%s/lib%s.so%s' % (LIB_PATH, self.target, soext)
133
134
135     link_source = os_path_relpath(self.link_task.outputs[0].abspath(self.env),
136                                   os.path.join(self.env.BUILD_DIRECTORY, link_target))
137
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)
142
143
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')
146 t.quiet = True
147
148 @feature('symlink_bin')
149 @after('apply_link')
150 def symlink_bin(self):
151     '''symlink a binary'''
152     if Options.is_install:
153         return
154     tsk = self.create_task('symlink_bin', self.link_task.outputs[0])
155
156     tsk.env.BIN_TARGET = self.target
157     debug('task_gen: BIN_TARGET for %s is %s', self.name, tsk.env.BIN_TARGET)
158