build: fixed the dependencies of the install targets
authorAndrew Tridgell <tridge@samba.org>
Wed, 31 Mar 2010 22:49:46 +0000 (09:49 +1100)
committerAndrew Tridgell <tridge@samba.org>
Tue, 6 Apr 2010 10:27:21 +0000 (20:27 +1000)
we want the install targets to have identical calculated dependencies
to the build targets.

buildtools/wafsamba/samba_deps.py
buildtools/wafsamba/wafsamba.py

index 31062e71a87a761027b591b18e1c5533d355764c..19cd451161639becbdaf884157578c7a435b3e28 100644 (file)
@@ -310,6 +310,13 @@ def add_samba_attributes(bld, tgt_list):
         t.samba_deps_extended = t.samba_deps[:]
         t.samba_includes_extended = TO_LIST(t.samba_includes)[:]
         t.ccflags = getattr(t, 'samba_cflags', '')
+        install_target = getattr(t, 'install_target', None)
+        if install_target:
+            t2 = bld.name_to_obj(install_target, bld.env)
+            t2.sname = install_target
+            t2.samba_type = t.samba_type
+            t2.samba_abspath = t2.path.abspath(bld.env)
+            t2.ccflags = t.ccflags
 
 
 def build_direct_deps(bld, tgt_list):
@@ -621,6 +628,7 @@ def calculate_final_deps(bld, tgt_list, loops):
         if t.sname in t.final_objects:
             t.final_objects.remove(t.sname)
 
+
     # find any library loops
     for t in tgt_list:
         if t.samba_type in ['LIBRARY', 'PYTHON']:
@@ -674,7 +682,6 @@ def calculate_final_deps(bld, tgt_list, loops):
     debug('deps: removed duplicate dependencies')
 
 
-
 ######################################################################
 # this provides a way to save our dependency calculations between runs
 savedeps_version = 3
@@ -734,6 +741,7 @@ def save_samba_deps(bld, tgt_list):
     denv.store(depsfile)
 
 
+
 def load_samba_deps(bld, tgt_list):
     '''load a previous set of build dependencies if possible'''
     depsfile = os.path.join(bld.bdir, "sambadeps")
@@ -775,15 +783,22 @@ def load_samba_deps(bld, tgt_list):
             #print '%s: \ntdeps=%s \nodeps=%s' % (t.sname, tdeps, olddeps)
             return False
 
-    # put outputs in place
+    tgt_list_extended = tgt_list[:]
     for t in tgt_list:
+        install_target = getattr(t, 'install_target', None)
+        if install_target:
+            t2 = bld.name_to_obj(install_target, bld.env)
+            tgt_list_extended.append(t2)
+
+    # put outputs in place
+    for t in tgt_list_extended:
         if not t.sname in denv.output: continue
         tdeps = denv.output[t.sname]
         for a in tdeps:
             setattr(t, a, tdeps[a])
 
     # put output env vars in place
-    for t in tgt_list:
+    for t in tgt_list_extended:
         if not t.sname in denv.outenv: continue
         tdeps = denv.outenv[t.sname]
         for a in tdeps:
@@ -793,6 +808,30 @@ def load_samba_deps(bld, tgt_list):
     return True
 
 
+
+def add_install_deps(bld, tgt_list):
+    '''add attributes for install libs/binaries
+
+    This ensures that all the install targets have identical dependencies
+    to the build targets.
+    '''
+    for t in tgt_list[:]:
+        install_target = getattr(t, 'install_target', None)
+        if install_target:
+            t2 = bld.name_to_obj(install_target, bld.env)
+            if not t2:
+                print('install_target %s not found for %s' % (install_target, t.sname))
+                sys.exit(1)
+            tgt_list.append(t2)
+            for attr in savedeps_outputs:
+                v = getattr(t, attr, None)
+                if v:
+                    setattr(t2, attr, v)
+            for attr in savedeps_outenv:
+                if attr in t.env:
+                    t2.env[attr] = t.env[attr]
+
+
 def check_project_rules(bld):
     '''check the project rules - ensuring the targets are sane'''
 
@@ -803,6 +842,8 @@ def check_project_rules(bld):
     # build a list of task generators we are interested in
     tgt_list = []
     for tgt in targets:
+        if tgt.endswith('.inst'):
+            continue
         type = targets[tgt]
         if not type in ['SUBSYSTEM', 'MODULE', 'BINARY', 'LIBRARY', 'ASN1', 'PYTHON']:
             continue
@@ -815,6 +856,7 @@ def check_project_rules(bld):
     add_samba_attributes(bld, tgt_list)
 
     if load_samba_deps(bld, tgt_list):
+        add_install_deps(bld, tgt_list)
         return
 
     print "Checking project rules ..."
@@ -846,6 +888,8 @@ def check_project_rules(bld):
 
     save_samba_deps(bld, tgt_list)
 
+    add_install_deps(bld, tgt_list)
+
     print "Project rules pass"
 
 
index 2fc7eceee51538f43941063a3cc61a7e0f10ee4f..5a48cb4ba1bf8d7bae2fead0c7e074b5a605e6ea 100644 (file)
@@ -162,16 +162,18 @@ def SAMBA_LIBRARY(bld, libname, source,
     if link_name:
         t.link_name = link_name
 
-    if install_path is None:
-        install_path = '${LIBDIR}'
-    install_path = SUBST_VARS_RECURSIVE(install_path, bld.env)
-
     # we don't need the double libraries if rpath is off
     if (bld.env.RPATH_ON_INSTALL == False and
         bld.env.RPATH_ON_BUILD == False):
         install_target = bundled_name
     else:
         install_target = bundled_name + '.inst'
+        if install:
+            t.install_target = install_target
+
+    if install_path is None:
+        install_path = '${LIBDIR}'
+    install_path = SUBST_VARS_RECURSIVE(install_path, bld.env)
 
     if install and install_target != bundled_name:
         # create a separate install library, which may have
@@ -277,7 +279,7 @@ def SAMBA_BINARY(bld, binname, source,
     deps = TO_LIST(deps)
     deps.append(obj_target)
 
-    bld(
+    t = bld(
         features       = features + ' symlink_bin',
         source         = [],
         target         = binname,
@@ -302,6 +304,8 @@ def SAMBA_BINARY(bld, binname, source,
         install_target = binname
     else:
         install_target = binname + '.inst'
+        if install:
+            t.install_target = install_target
 
     if install and install_target != binname:
         # we create a separate 'install' binary, which