2
0
mirror of https://github.com/boostorg/build.git synced 2026-02-21 15:02:19 +00:00

topological sort ordered includes.

This commit is contained in:
Steven Watanabe
2014-04-01 13:12:17 -07:00
parent 5c1a97b928
commit 290e284ffe
3 changed files with 183 additions and 30 deletions

View File

@@ -17,6 +17,8 @@ import regex ;
import sequence ;
import set ;
import property-set ;
import order ;
import "class" : new ;
.flag-no = 1 ;
@@ -237,6 +239,7 @@ rule handle-flag-value ( value * : properties * )
if $(value:G)
{
local matches = [ property.select $(value) : $(properties) ] ;
local order ;
for local p in $(matches)
{
local att = [ feature.attributes $(p:G) ] ;
@@ -263,11 +266,24 @@ rule handle-flag-value ( value * : properties * )
}
if path in $(att)
{
result += [ sequence.transform path.native : $(values) ] ;
values = [ sequence.transform path.native : $(values) ] ;
}
else
result += $(values) ;
if $(values[2])
{
result += $(values) ;
if ! $(order)
{
order = [ new order ] ;
}
local prev ;
for local v in $(values)
{
if $(prev)
{
$(order).add-pair $(prev) $(v) ;
}
prev = $(v) ;
}
}
}
else
@@ -275,6 +291,11 @@ rule handle-flag-value ( value * : properties * )
result += $(p:G=) ;
}
}
if $(order)
{
result = [ $(order).order [ sequence.unique $(result) : stable ] ] ;
DELETE_MODULE $(order) ;
}
}
else
{

View File

@@ -15,17 +15,17 @@ class c-scanner : scanner
import regex ;
import scanner ;
import sequence ;
import toolset ;
import virtual-target ;
rule __init__ ( includes * )
{
scanner.__init__ ;
for local i in $(includes)
{
self.includes += [ sequence.transform path.native : [ regex.split
$(i:G=) "&&" ] ] ;
}
# toolset.handle-flag-value is a bit of overkill, but it
# does correctly handle the topological sort of && separated
# include paths
self.includes = [ toolset.handle-flag-value <include> : $(includes) ] ;
}
rule pattern ( )