wafsamba: If we define a realname and a soname create a symlink.
[obnox/samba/samba-obnox.git] / buildtools / wafsamba / samba_install.py
index dda44cd0122fe516130c5fc1c9cee4a4871aaa3b..aa7f14331a37aa64db31d1ba70192e88441f75b9 100644 (file)
@@ -15,10 +15,10 @@ def install_binary(self):
     bld = self.bld
 
     # get the ldflags we will use for install and build
-    install_ldflags = install_rpath(bld)
+    install_ldflags = install_rpath(self)
     build_ldflags   = build_rpath(bld)
 
-    if not Options.is_install or not self.samba_install:
+    if not Options.is_install:
         # just need to set rpath if we are not installing
         self.env.RPATH = build_ldflags
         return
@@ -38,6 +38,10 @@ def install_binary(self):
     # setup the right rpath link flags for the install
     self.env.RPATH = install_ldflags
 
+    if not self.samba_install:
+        # this binary is marked not to be installed
+        return
+
     # 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),
@@ -55,7 +59,7 @@ def install_library(self):
 
     bld = self.bld
 
-    install_ldflags = install_rpath(bld)
+    install_ldflags = install_rpath(self)
     build_ldflags   = build_rpath(bld)
 
     if not Options.is_install or not getattr(self, 'samba_install', True):
@@ -64,9 +68,16 @@ def install_library(self):
         return
 
     # setup the install path, expanding variables
-    install_path = getattr(self, 'samba_inst_path', None) or '${LIBDIR}'
+    install_path = getattr(self, 'samba_inst_path', None)
+    if install_path is None:
+        if getattr(self, 'private_library', False):
+            install_path = '${PRIVATELIBDIR}'
+        else:
+            install_path = '${LIBDIR}'
     install_path = bld.EXPAND_VARIABLES(install_path)
 
+    target_name = self.target
+
     if install_ldflags != build_ldflags:
         # we will be creating a new target name, and using that for the
         # install link. That stops us from overwriting the existing build
@@ -83,42 +94,78 @@ def install_library(self):
 
     dev_link     = None
 
+    # in the following the names are:
+    # - inst_name is the name with .inst. in it, in the build
+    #   directory
+    # - install_name is the name in the install directory
+    # - install_link is a symlink in the install directory, to install_name
+
     if getattr(self, 'samba_realname', None):
         install_name = self.samba_realname
         install_link = None
+        if getattr(self, 'soname', ''):
+            install_link = self.soname
         if getattr(self, 'samba_type', None) == 'PYTHON':
-            inst_name    = '%s.so' % t.target
+            inst_name    = bld.make_libname(t.target, nolibprefix=True, python=True)
         else:
-            inst_name    = 'lib%s.so' % t.target
+            inst_name    = bld.make_libname(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:
+        install_name = bld.make_libname(target_name, version=self.vnum)
+        install_link = bld.make_libname(target_name, version=vnum_base)
+        inst_name    = bld.make_libname(t.target)
+        if not self.private_library:
             # only generate the dev link for non-bundled libs
-            dev_link     = 'lib%s.so' % self.target
+            dev_link     = bld.make_libname(target_name)
+    elif getattr(self, 'soname', ''):
+        install_name = bld.make_libname(target_name)
+        install_link = self.soname
+        inst_name    = bld.make_libname(t.target)
     else:
-        install_name = 'lib%s.so' % self.target
+        install_name = bld.make_libname(target_name)
         install_link = None
-        inst_name    = 'lib%s.so' % t.target
+        inst_name    = bld.make_libname(t.target)
 
-    if t.env.SONAME_ST and install_link:
-        t.env.append_value('LINKFLAGS', t.env.SONAME_ST % install_link)
+    if t.env.SONAME_ST:
+        # ensure we get the right names in the library
+        if install_link:
+            t.env.append_value('LINKFLAGS', t.env.SONAME_ST % install_link)
+        else:
+            t.env.append_value('LINKFLAGS', t.env.SONAME_ST % install_name)
         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))
-    if install_link:
+                   os.path.join(self.path.abspath(bld.env), inst_name),
+                   chmod=MODE_755)
+    if install_link and install_link != install_name:
         # and the symlink if needed
-        bld.symlink_as(os.path.join(install_path, install_link),
-                       install_name)
+        bld.symlink_as(os.path.join(install_path, install_link), os.path.basename(install_name))
     if dev_link:
-        bld.symlink_as(os.path.join(install_path, dev_link),
-                       install_name)
+        bld.symlink_as(os.path.join(install_path, dev_link), os.path.basename(install_name))
 
 
+@feature('cshlib')
+@after('apply_implib')
+@before('apply_vnum')
+def apply_soname(self):
+    '''install a library, taking account of the different rpath varients'''
+
+    if self.env.SONAME_ST and getattr(self, 'soname', ''):
+        self.env.append_value('LINKFLAGS', self.env.SONAME_ST % self.soname)
+        self.env.SONAME_ST = ''
+
+@feature('cshlib')
+@after('apply_implib')
+@before('apply_vnum')
+def apply_vscript(self):
+    '''add version-script arguments to library build'''
+
+    if self.env.HAVE_LD_VERSION_SCRIPT and getattr(self, 'version_script', ''):
+        self.env.append_value('LINKFLAGS', "-Wl,--version-script=%s" %
+            self.version_script)
+        self.version_script = None
+
 
 ##############################
 # handle the creation of links for libraries and binaries in the build tree
@@ -142,7 +189,11 @@ def symlink_lib(self):
 
     link_target = getattr(self, 'link_name', '')
     if link_target == '':
-        link_target = '%s/lib%s.so%s' % (LIB_PATH, self.target, soext)
+        basename = os.path.basename(self.bld.make_libname(self.target, version=soext))
+        if getattr(self, "private_library", False):
+            link_target = '%s/private/%s' % (LIB_PATH, basename)
+        else:
+            link_target = '%s/%s' % (LIB_PATH, basename)
 
     link_target = os.path.join(blddir, link_target)
 
@@ -167,6 +218,8 @@ def symlink_bin(self):
         return
 
     blddir = os.path.dirname(self.bld.srcnode.abspath(self.bld.env))
+    if not self.link_task.outputs or not self.link_task.outputs[0]:
+        raise Utils.WafError('no outputs found for %s in symlink_bin' % self.name)
     binpath = self.link_task.outputs[0].abspath(self.env)
     bldpath = os.path.join(self.bld.env.BUILD_DIRECTORY, self.link_task.outputs[0].name)