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

Refactorings.

The targets (both abstract and virtual) used to refer to project there belong
to using the name of Jamfile module corresponding to the project. That was a
bit messy, and whatevet it was necessary to get any project attribute, one
had to call 'project.attribute', which was messy too.

Now, projects are identified by instance of project-target class, and
attributes are obtained via 'get' method in that class.


[SVN r23001]
This commit is contained in:
Vladimir Prus
2004-06-02 14:26:15 +00:00
parent c463f8e3c7
commit d4e260045f
8 changed files with 57 additions and 48 deletions

View File

@@ -72,7 +72,7 @@ if --version in [ modules.peek : ARGV ]
# We always load project in "." so that 'use-project' directives has
# any chance of been seen. Otherwise, we won't be able to refer to
# subprojects using target ids.
current-project = [ project.load "." ] ;
current-project = [ project.target [ project.load "." ] ] ;
if [ MATCH (--dump-projects) : [ modules.peek : ARGV ] ]
{

View File

@@ -305,7 +305,7 @@ rule initialize (
inherit-attributes $(module-name) : $(project-root-module) : $(parent-module) ;
}
.current-project = $(module-name) ;
.current-project = [ target $(module-name) ] ;
}
# Make 'project-module' inherit attributes of project root and parent module.
@@ -513,16 +513,6 @@ rule target ( project-module )
return $(.target.$(project-module)) ;
}
# If 'path' is absolute, returns it.
# Oherwise, returns the location of 'project', joined
# with 'path'
rule path-relative-to-project-location ( path project )
{
local project-location = [ attribute $(project) location ] ;
return [ path.root $(path) $(project-location) ] ;
}
# Use/load a project.
rule use ( id : location )
{

View File

@@ -78,23 +78,25 @@ import feature ;
import virtual-target ;
import path ;
import set ;
import assert ;
# Base class for all abstract targets.
class abstract-target
{
import project ;
import project assert "class" ;
rule __init__ ( name # name of the target in Jamfile
: project # the project module where the target is declared
: project-target # the project target to which this one belongs
)
{
assert.true class.is-a $(project-target) : project-target ;
# Note: it might seem that we don't need either name or project at all.
# However, there are places where we really need it. One example is error
# messages which should name problematic targets. Another is setting correct
# paths for sources and generated files.
self.name = $(name) ;
self.project = $(project) ;
self.project = $(project-target) ;
}
# Returns the name of this target.
@@ -112,7 +114,7 @@ class abstract-target
# Returns a user-readable name for this target.
rule full-name ( )
{
local location = [ project.attribute $(self.project) location ] ;
local location = [ $(self.project).get location ] ;
return $(location)/$(self.name) ;
}
@@ -160,13 +162,27 @@ class project-target : abstract-target
import sequence ;
import "class" : new ;
rule __init__ ( name : project : requirements * : default-build * )
rule __init__ ( name : project-module : requirements * : default-build * )
{
abstract-target.__init__ $(name) : $(project) ;
abstract-target.__init__ $(name) : $(__name__) ;
self.project-module = $(project-module) ;
self.requirements = $(requirements) ;
self.default-build = $(default-build) ;
}
# This is needed only by the 'make' rule. Need to find the
# way to make 'make' work without this method.
rule project-module ( )
{
return $(self.project-module) ;
}
rule get ( attribute )
{
return [ project.attribute $(self.project-module) $(attribute) ] ;
}
# Generates all possible targets contained in this project.
rule generate ( property-set * )
@@ -204,8 +220,8 @@ class project-target : abstract-target
}
# Collect all projects referenced via "projects-to-build" attribute.
local self-location = [ project.attribute $(self.project) location ] ;
for local pn in [ project.attribute $(self.project) projects-to-build ]
local self-location = [ get location ] ;
for local pn in [ get projects-to-build ]
{
local p = [ project.module-name [ path.join $(self-location) $(pn) ] ] ;
result += [ project.target $(p) ] ;
@@ -561,7 +577,7 @@ class file-reference : abstract-target
rule exists ( )
{
local location = [ path.root $(self.name)
[ project.attribute $(self.project) source-location ] ] ;
[ $(self.project).get source-location ] ] ;
return [ path.exists [ path.native $(location) ] ] ;
}
}
@@ -575,7 +591,7 @@ if "--quiet" in [ modules.peek : ARGV ]
rule find ( id : project )
{
local current-location = [ project.attribute $(project) location ] ;
local current-location = [ $(project).get location ] ;
local target ;
local split = [ MATCH (.*)//(.*) : $(id) ] ;
@@ -595,7 +611,8 @@ rule find ( id : project )
local base-project ;
if $(project-part)
{
base-project = [ project.find $(project-part) : $(current-location) ] ;
base-project = [ project.target
[ project.find $(project-part) : $(current-location) ] ] ;
}
else
{
@@ -618,10 +635,9 @@ rule find ( id : project )
# Interpret target-name as name of main target
if ! $(target) && $(base-project)
{
local project-target = [ project.target $(base-project) ] ;
if [ $(project-target).has-main-target $(target-part) ]
if [ $(base-project).has-main-target $(target-part) ]
{
target = [ $(project-target).main-target $(target-part) ] ;
target = [ $(base-project).main-target $(target-part) ] ;
}
}
@@ -1157,12 +1173,12 @@ rule main-target-requirements (
: project # Project where the main target is to be declared
)
{
local loc = [ project.attribute $(project) location ] ;
local loc = [ $(project).get location ] ;
local requirements = [ property.translate-paths $(specification) : $(loc) ] ;
local requirements =
[ property.expand-subfeatures-in-conditions $(requirements) ] ;
local requirements = [ property-set.create $(requirements) ] ;
local project-requirements = [ project.attribute $(project) requirements ] ;
local project-requirements = [ $(project).get requirements ] ;
requirements = [ $(project-requirements).refine $(requirements) ] ;
if $(requirements[1]) = "@error"
{
@@ -1180,8 +1196,8 @@ rule main-target-usage-requirements (
: project # Project where the main target is to be declared
)
{
local loc = [ project.attribute $(project) location ] ;
local project-usage-requirements = [ project.attribute $(project) usage-requirements ] ;
local loc = [ $(project).get location ] ;
local project-usage-requirements = [ $(project).get usage-requirements ] ;
local usage-requirements = [ property-set.create
[ property.translate-paths $(specification) : $(loc) ] ] ;
@@ -1204,7 +1220,7 @@ rule main-target-default-build (
}
else
{
result = [ project.attribute $(project) default-build ] ;
result = [ $(project).get default-build ] ;
}
return [ property-set.create-with-validation $(result) ] ;
}
@@ -1213,7 +1229,7 @@ rule main-target-default-build (
# Returns 'target'.
rule main-target-alternative ( target )
{
local ptarget = [ project.target [ $(target).project ] ] ;
local ptarget = [ $(target).project ] ;
$(ptarget).add-alternative $(target) ;
return $(target) ;

View File

@@ -387,7 +387,7 @@ class abstract-file-target : virtual-target
{
# File is either source, which will be searched for, or is not a file at
# all. Use the location of project for distinguishing.
local project-location = [ project.attribute $(self.project) location ] ;
local project-location = [ $(self.project).get location ] ;
local location-grist =
[ sequence.join [ regex.split $(project-location) "/" ] : "!" ] ;
@@ -476,7 +476,7 @@ class file-target : abstract-file-target
{
# This is a source file.
SEARCH on $(target) =
[ path.native [ project.attribute $(self.project) source-location ] ] ;
[ path.native [ $(self.project).get source-location ] ] ;
}
}
@@ -487,11 +487,11 @@ class file-target : abstract-file-target
{
if $(self.action)
{
local build-dir = [ project.attribute $(self.project) build-dir ] ;
local build-dir = [ $(self.project).get build-dir ] ;
if ! $(build-dir)
{
build-dir = [ path.join
[ project.attribute $(self.project) location ]
[ $(self.project).get location ]
bin
] ;
}

View File

@@ -45,17 +45,18 @@ rule make ( target-name : sources * : generating-rule + : requirements *
: caller ? )
{
caller ?= [ project.current ] ;
local rules = [ RULENAMES $(caller) ] ;
caller-module = [ $(caller).project-module ] ;
local rules = [ RULENAMES $(caller-module) ] ;
if $(generating-rule[1]) in $(rules)
{
# This is local rule, make it global
local n = $(caller).$(generating-rule[1]) ;
IMPORT $(caller) : $(generating-rule[1]) : : $(n) ;
local n = $(caller-module).$(generating-rule[1]) ;
IMPORT $(caller-module) : $(generating-rule[1]) : : $(n) ;
generating-rule = $(n) $(generating-rule[2-]) ;
}
targets.main-target-alternative
[ new make-target-class $(target-name) : $(caller)
[ new make-target-class $(target-name) : $(caller)
: [ targets.main-target-sources $(sources) : $(target-name) ]
: [ targets.main-target-requirements $(requirements) : $(caller) ]
: $(generating-rule)

View File

@@ -63,7 +63,7 @@ feature.feature <include-type> : : free incidental ;
class stage-target-class : basic-target
{
import feature project type errors generators ;
import feature project type errors generators path ;
import "class" : new ;
rule __init__ ( name-and-dir : project : sources * : requirements * : default-build * )
@@ -78,8 +78,7 @@ class stage-target-class : basic-target
local loc = [ $(property-set).get <location> ] ;
if ! $(loc)
{
loc = [ project.path-relative-to-project-location $(self.name)
$(self.project) ] ;
loc = [ path.root $(self.name) [ $(self.project).get location ] ] ;
property-set = [ $(property-set).add-raw $(loc:G=<location>) ] ;
}

View File

@@ -16,7 +16,7 @@ feature.feature symlink-location : project-relative build-relative : incidental
#
class symlink-targets : basic-target
{
import numbers modules class property project ;
import numbers modules class property project path ;
rule __init__ (
project
@@ -64,8 +64,7 @@ class symlink-targets : basic-target
# location, instead of placing it in the build directory.
if [ property.select <symlink-location> : [ $(property-set).raw ] ] = <symlink-location>project-relative
{
$(vt).set-path [ project.path-relative-to-project-location
$(s:D) $(self.project) ] ;
$(vt).set-path [ path.root $(s:D) [ $(self.project).get location ] ] ;
}
self.virtual-targets += $(vt) ;

View File

@@ -161,6 +161,10 @@ rule dump-test ( target )
{
local type = [ $(target).type ] ;
local name = [ $(target).name ] ;
local project = [ $(target).project ] ;
local project-root = [ project.attribute $(project) project-root-module ] ;
local project-root-location = [ $(project-root).location ] ;
local sources = [ $(target).sources ] ;
local source-files ;
for local s in $(sources)
@@ -170,7 +174,7 @@ rule dump-test ( target )
source-files +=
[ path.relative
[ path.root [ $(s).location ] [ path.pwd ] ]
/home/ghost/Work/boost ] ;
$(project-root-location) ] ;
}
}