mirror of
https://github.com/boostorg/build.git
synced 2026-02-15 00:52:16 +00:00
in favour of the latter (toolset.prebuilt). This cuts down the number of generator invocations for prebuilt target and is more clear. Thanks to Mark Evans for pointing this out. [SVN r32952]
224 lines
5.7 KiB
Plaintext
224 lines
5.7 KiB
Plaintext
# Copyright (c) 2004 Vladimir Prus.
|
|
#
|
|
# Use, modification and distribution is subject to the Boost Software
|
|
# License Version 1.0. (See accompanying file LICENSE_1_0.txt or
|
|
# http://www.boost.org/LICENSE_1_0.txt)
|
|
|
|
# This file implements linking semantic common to all unixes. On unix, static
|
|
# libraries must be specified in a fixed order on the linker command line. Generators
|
|
# declared there store information about the order and use it property.
|
|
|
|
import feature ;
|
|
import "class" : new ;
|
|
import generators ;
|
|
import type ;
|
|
import set ;
|
|
import order ;
|
|
import builtin ;
|
|
|
|
class unix-linking-generator : linking-generator
|
|
{
|
|
import property-set ;
|
|
import type ;
|
|
import unix ;
|
|
|
|
rule __init__ ( id
|
|
composing ? : # Specify if generator is composing. The generator will be
|
|
# composing if non-empty string is passed, or parameter is
|
|
# not given. To make generator non-composing, pass empty
|
|
# string ("")
|
|
source-types + : target-types + :
|
|
requirements * )
|
|
{
|
|
composing ?= true ;
|
|
generator.__init__ $(id) $(composing) : $(source-types) : $(target-types) :
|
|
$(requirements) ;
|
|
}
|
|
|
|
rule run ( project name ? : property-set : sources + )
|
|
{
|
|
local result = [ linking-generator.run $(project) $(name) : $(property-set)
|
|
: $(sources) ] ;
|
|
|
|
unix.set-library-order $(sources) : $(property-set) : $(result[2-]) ;
|
|
|
|
return $(result) ;
|
|
}
|
|
|
|
rule generated-targets ( sources + : property-set : project name ? )
|
|
{
|
|
local sources2 ;
|
|
local libraries ;
|
|
for local l in $(sources)
|
|
{
|
|
if [ type.is-derived [ $(l).type ] LIB ]
|
|
{
|
|
libraries += $(l) ;
|
|
}
|
|
else
|
|
{
|
|
sources2 += $(l) ;
|
|
}
|
|
}
|
|
|
|
sources = $(sources2) [ unix.order-libraries $(libraries) ] ;
|
|
|
|
return [ linking-generator.generated-targets $(sources) : $(property-set)
|
|
: $(project) $(name) ] ;
|
|
}
|
|
|
|
}
|
|
|
|
class unix-archive-generator : archive-generator
|
|
{
|
|
import unix ;
|
|
|
|
rule __init__ ( id composing ? : source-types + : target-types + :
|
|
requirements * )
|
|
{
|
|
composing ?= true ;
|
|
archive-generator.__init__ $(id) $(composing) : $(source-types) : $(target-types) :
|
|
$(requirements) ;
|
|
}
|
|
|
|
rule run ( project name ? : property-set : sources + )
|
|
{
|
|
local result = [ archive-generator.run $(project) $(name) : $(property-set)
|
|
: $(sources) ] ;
|
|
|
|
unix.set-library-order $(sources) : $(property-set) : $(result[2-]) ;
|
|
|
|
return $(result) ;
|
|
|
|
}
|
|
}
|
|
|
|
class unix-searched-lib-generator : searched-lib-generator
|
|
{
|
|
import unix ;
|
|
rule __init__ ( * : * )
|
|
{
|
|
generator.__init__
|
|
$(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
|
|
}
|
|
|
|
rule optional-properties ( )
|
|
{
|
|
return $(self.requirements) ;
|
|
}
|
|
|
|
rule run ( project name ? : property-set : sources * )
|
|
{
|
|
local result = [ searched-lib-generator.run $(project) $(name)
|
|
: $(property-set) : $(sources) ] ;
|
|
|
|
unix.set-library-order $(sources) : $(property-set) : $(result[2-]) ;
|
|
|
|
return $(result) ;
|
|
}
|
|
}
|
|
|
|
class unix-prebuilt-lib-generator : generator
|
|
{
|
|
import unix ;
|
|
rule __init__ ( * : * )
|
|
{
|
|
generator.__init__ $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
|
|
}
|
|
|
|
rule run ( project name ? : property-set : sources * )
|
|
{
|
|
local f = [ $(property-set).get <file> ] ;
|
|
unix.set-library-order-aux $(f) : $(sources) ;
|
|
return $(f) $(sources) ;
|
|
}
|
|
}
|
|
|
|
generators.register
|
|
[ new unix-prebuilt-lib-generator unix.prebuilt : : LIB
|
|
: <file> <toolset>unix ] ;
|
|
|
|
generators.override unix.prebuilt : builtin.lib-generator ;
|
|
|
|
|
|
# Declare generators
|
|
generators.register [ new unix-linking-generator unix.link : LIB OBJ : EXE
|
|
: <toolset>unix ] ;
|
|
|
|
generators.register [ new unix-archive-generator unix.archive : OBJ : STATIC_LIB
|
|
: <toolset>unix ] ;
|
|
|
|
generators.register [ new unix-linking-generator unix.link.dll : LIB OBJ : SHARED_LIB
|
|
: <toolset>unix ] ;
|
|
|
|
generators.register [ new unix-searched-lib-generator
|
|
unix.searched-lib-generator : : SEARCHED_LIB : <toolset>unix ] ;
|
|
|
|
|
|
# The derived toolset must specify their own actions.
|
|
actions link {
|
|
}
|
|
|
|
actions link.dll {
|
|
}
|
|
|
|
actions archive {
|
|
}
|
|
|
|
actions searched-lib-generator {
|
|
}
|
|
|
|
actions prebuilt {
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.order = [ new order ] ;
|
|
|
|
rule set-library-order-aux ( from * : to * )
|
|
{
|
|
for local f in $(from)
|
|
{
|
|
for local t in $(to)
|
|
{
|
|
if $(f) != $(t)
|
|
{
|
|
$(.order).add-pair $(f) $(t) ;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
rule set-library-order ( sources * : property-set : result * )
|
|
{
|
|
local used-libraries ;
|
|
local deps = [ $(property-set).dependency ] ;
|
|
for local l in $(sources) $(deps:G=)
|
|
{
|
|
if [ $(l).type ] && [ type.is-derived [ $(l).type ] LIB ]
|
|
{
|
|
used-libraries += $(l) ;
|
|
}
|
|
}
|
|
|
|
local created-libraries ;
|
|
for local l in $(result)
|
|
{
|
|
if [ $(l).type ] && [ type.is-derived [ $(l).type ] LIB ]
|
|
{
|
|
created-libraries += $(l) ;
|
|
}
|
|
}
|
|
|
|
created-libraries = [ set.difference $(created-libraries) : $(used-libraries) ] ;
|
|
set-library-order-aux $(created-libraries) : $(used-libraries) ;
|
|
}
|
|
|
|
rule order-libraries ( libraries * )
|
|
{
|
|
local r = [ $(.order).order $(libraries) ] ;
|
|
return $(r) ;
|
|
}
|
|
|