waf: workaround for the 'make install' breakage
[mat/samba.git] / buildtools / wafsamba / samba_install.py
index 6da44932189a125d3a3254bd31eb6f5fcfd68a9a..05ea56cc47ec8caeca7128a7a31429f875958b44 100644 (file)
@@ -7,11 +7,9 @@ import Options
 from TaskGen import feature, before, after
 from samba_utils import *
 
-O755 = 493
-
 @feature('install_bin')
 @after('apply_core')
-@before('apply_link')
+@before('apply_link', 'apply_obj_vars')
 def install_binary(self):
     '''install a binary, taking account of the different rpath varients'''
     bld = self.bld
@@ -22,14 +20,14 @@ def install_binary(self):
 
     if not Options.is_install or not self.samba_install:
         # just need to set rpath if we are not installing
-        self.env.append_value('LINKFLAGS', build_ldflags)
+        self.env.RPATH = build_ldflags
         return
 
     # work out the install path, expanding variables
-    install_path = self.samba_inst_path or '${BINDIR}'
+    install_path = getattr(self, 'samba_inst_path', None) or '${BINDIR}'
     install_path = bld.EXPAND_VARIABLES(install_path)
 
-    orig_target = self.target
+    orig_target = os.path.basename(self.target)
 
     if install_ldflags != build_ldflags:
         # we will be creating a new target name, and using that for the
@@ -38,18 +36,18 @@ def install_binary(self):
         self.target += '.inst'
 
     # setup the right rpath link flags for the install
-    self.env.append_value('LINKFLAGS', install_ldflags)
+    self.env.RPATH = install_ldflags
 
     # tell waf to install the right binary
     bld.install_as(os.path.join(install_path, orig_target),
                    os.path.join(self.path.abspath(bld.env), self.target),
-                   chmod=O755)
+                   chmod=0755)
 
 
 
 @feature('install_lib')
 @after('apply_core')
-@before('apply_link')
+@before('apply_link', 'apply_obj_vars')
 def install_library(self):
     '''install a library, taking account of the different rpath varients'''
     if getattr(self, 'done_install_library', False):
@@ -60,13 +58,13 @@ def install_library(self):
     install_ldflags = install_rpath(bld)
     build_ldflags   = build_rpath(bld)
 
-    if not Options.is_install or not self.samba_install:
+    if not Options.is_install or not getattr(self, 'samba_install', True):
         # just need to set the build rpath if we are not installing
-        self.env.append_value('LINKFLAGS', build_ldflags)
+        self.env.RPATH = build_ldflags
         return
 
     # setup the install path, expanding variables
-    install_path = self.samba_inst_path or '${LIBDIR}'
+    install_path = getattr(self, 'samba_inst_path', None) or '${LIBDIR}'
     install_path = bld.EXPAND_VARIABLES(install_path)
 
     if install_ldflags != build_ldflags:
@@ -75,27 +73,40 @@ def install_library(self):
         # target, which has different ldflags
         self.done_install_library = True
         t = self.clone('default')
+        t.posted = False
         t.target += '.inst'
-        self.env.append_value('LINKFLAGS', build_ldflags)
+        self.env.RPATH = build_ldflags
     else:
         t = self
 
-    t.env.append_value('LINKFLAGS', install_ldflags)
+    t.env.RPATH = install_ldflags
 
-    if self.samba_realname:
+    dev_link     = None
+
+    if getattr(self, 'samba_realname', None):
         install_name = self.samba_realname
         install_link = None
-        inst_name    = t.target + '.so'
+        if getattr(self, 'samba_type', None) == 'PYTHON':
+            inst_name    = '%s.so' % t.target
+        else:
+            inst_name    = 'lib%s.so' % t.target
     elif self.vnum:
         vnum_base    = self.vnum.split('.')[0]
         install_name = 'lib%s.so.%s' % (self.target, self.vnum)
         install_link = 'lib%s.so.%s' % (self.target, vnum_base)
         inst_name    = 'lib%s.so' % t.target
+        if not self.is_bundled:
+            # only generate the dev link for non-bundled libs
+            dev_link     = 'lib%s.so' % self.target
     else:
         install_name = 'lib%s.so' % self.target
         install_link = None
         inst_name    = 'lib%s.so' % t.target
 
+    if t.env.SONAME_ST and install_link:
+        t.env.append_value('LINKFLAGS', t.env.SONAME_ST % install_link)
+        t.env.SONAME_ST = ''
+
     # tell waf to install the library
     bld.install_as(os.path.join(install_path, install_name),
                    os.path.join(self.path.abspath(bld.env), inst_name))
@@ -103,6 +114,9 @@ def install_library(self):
         # and the symlink if needed
         bld.symlink_as(os.path.join(install_path, install_link),
                        install_name)
+    if dev_link:
+        bld.symlink_as(os.path.join(install_path, dev_link),
+                       install_name)
 
 
 
@@ -133,10 +147,14 @@ def symlink_lib(self):
     link_target = os.path.join(blddir, link_target)
 
     if os.path.lexists(link_target):
-        old_link = os.readlink(link_target)
-        if libpath == old_link:
+        if os.path.islink(link_target) and os.readlink(link_target) == libpath:
             return
         os.unlink(link_target)
+
+    link_container = os.path.dirname(link_target)
+    if not os.path.isdir(link_container):
+        os.makedirs(link_container)
+
     os.symlink(libpath, link_target)
 
 
@@ -153,8 +171,7 @@ def symlink_bin(self):
     bldpath = os.path.join(self.bld.env.BUILD_DIRECTORY, self.link_task.outputs[0].name)
 
     if os.path.lexists(bldpath):
-        old_link = os.readlink(bldpath)
-        if binpath == old_link:
+        if os.path.islink(bldpath) and os.readlink(bldpath) == binpath:
             return
         os.unlink(bldpath)
     os.symlink(binpath, bldpath)