]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/boost/tools/build/src/build/virtual-target.jam
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / boost / tools / build / src / build / virtual-target.jam
index 2d139bd7f8542dd43300bceb310105e00d1c4117..78c2058be09c1f3280ce000194d8bc474523da9c 100644 (file)
 # builtin.jam modules. They are shown in the diagram to give the big picture.
 
 import "class" : new ;
+import feature ;
 import path ;
+import property-set ;
 import sequence ;
 import set ;
+import toolset ;
 import type ;
 import utility ;
 
@@ -118,6 +121,11 @@ class virtual-target
         .always = 1 ;
     }
 
+    rule fail-expected ( )
+    {
+        .fail-expected = 1 ;
+    }
+
     # Generates all the actual targets and sets up build actions for this
     # target.
     #
@@ -138,6 +146,11 @@ class virtual-target
             ALWAYS $(actual-name) ;
         }
 
+        if $(.fail-expected)
+        {
+            FAIL_EXPECTED $(actual-name) ;
+        }
+
         if ! $(scanner)
         {
             return $(actual-name) ;
@@ -196,6 +209,14 @@ class virtual-target
         errors.error "method should be defined in derived classes" ;
     }
 
+    # Returns additional properties that are relevant for this target
+    # beyond those required by the action.
+    #
+    rule relevant ( )
+    {
+        return [ property-set.empty ] ;
+    }
+
 # implementation
     rule actualize-no-scanner ( )
     {
@@ -999,10 +1020,10 @@ rule register ( target )
             {
                 local ps1 = [ $(a1).properties ] ;
                 local ps2 = [ $(a2).properties ] ;
-                local p1 = [ $(ps1).base ] [ $(ps1).free ] [ set.difference
-                    [ $(ps1).dependency ] : [ $(ps1).incidental ] ] ;
-                local p2 = [ $(ps2).base ] [ $(ps2).free ] [ set.difference
-                    [ $(ps2).dependency ] : [ $(ps2).incidental ] ] ;
+                local relevant = [ toolset.relevant [ $(a1).action-name ] ] ;
+                relevant = [ $(relevant).add [ $(target).relevant ] ] ;
+                local p1 = [ $(ps1).relevant $(relevant) ] ;
+                local p2 = [ $(ps2).relevant $(relevant) ] ;
                 if $(p1) = $(p2)
                 {
                     result = $(t) ;
@@ -1099,8 +1120,17 @@ rule register-actual-name ( actual-name : virtual-target )
         if $(action1) && $(action2)
         {
             local p1 = [ $(action1).properties ] ;
-            p1 = [ $(p1).raw ] ;
             local p2 = [ $(action2).properties ] ;
+            # Only show features that are relevant for either target.
+            local relevant = [ $(p1).get <relevant> ] [ $(p2).get <relevant> ] ;
+            relevant = [ feature.expand-relevant $(relevant) ] ;
+            # The presence of relevant can potentially mess things up,
+            # so we always need to show it.
+            relevant += relevant ;
+            relevant = [ property-set.create <relevant>$(relevant) ] ;
+            p1 = [ $(p1).relevant $(relevant) ] ;
+            p2 = [ $(p2).relevant $(relevant) ] ;
+            p1 = [ $(p1).raw ] ;
             p2 = [ $(p2).raw ] ;
             properties-removed = [ set.difference $(p1) : $(p2) ] ;
             properties-removed ?= "none" ;
@@ -1334,11 +1364,11 @@ class subvariant
 
     rule all-target-directories ( target-type ? )
     {
-        if ! $(self.target-directories)
+        if ! $(self.target-directories.$(target-type:E=))
         {
             compute-target-directories $(target-type) ;
         }
-        return $(self.target-directories) ;
+        return $(self.target-directories.$(target-type:E=)) ;
     }
 
     rule compute-target-directories ( target-type ? )
@@ -1358,6 +1388,6 @@ class subvariant
         {
             result += [ $(d).all-target-directories $(target-type) ] ;
         }
-        self.target-directories = $(result) ;
+        self.target-directories.$(target-type:E=) = $(result) ;
     }
 }