mirror of
https://github.com/boostorg/build.git
synced 2026-02-14 12:42:11 +00:00
Basic modular automatic configuration.
This commit is contained in:
136
src/contrib/modular.jam
Normal file
136
src/contrib/modular.jam
Normal file
@@ -0,0 +1,136 @@
|
||||
# Copyright Rene Rivera 2015
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at
|
||||
# http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#alias library
|
||||
# :
|
||||
# : : : <include>include
|
||||
# ;
|
||||
|
||||
import path ;
|
||||
import project ;
|
||||
import modules ;
|
||||
import regex ;
|
||||
|
||||
rule find ( target-refs + )
|
||||
{
|
||||
process-args ;
|
||||
|
||||
local caller-mod = [ CALLER_MODULE ] ;
|
||||
local caller-dir = [ modules.peek $(caller-mod) : __file__ ] ;
|
||||
caller-dir = $(caller-dir:D) ;
|
||||
caller-dir = [ path.root $(caller-dir) [ path.pwd ] ] ;
|
||||
|
||||
for local target-ref in $(target-refs)
|
||||
{
|
||||
local ref = [ MATCH ^(.*)//.* : $(target-ref:G=) ] ;
|
||||
local search-prefix ;
|
||||
local search-sub ;
|
||||
for local prefix in $(.search-path-prefix)
|
||||
{
|
||||
if ! $(search-prefix)
|
||||
{
|
||||
local search-match = [ MATCH ^($(prefix))/(.*)$ : $(ref) ] ;
|
||||
search-prefix = $(search-match[1]) ;
|
||||
search-sub = $(search-match[2]) ;
|
||||
}
|
||||
}
|
||||
local found = [ path.glob $(.search-path.$(search-prefix)) : $(search-sub) ] ;
|
||||
found = $(found[1]) ;
|
||||
if $(found)
|
||||
{
|
||||
local lib-ref = [ regex.split $(search-sub) / ] ;
|
||||
lib-ref = $(search-prefix)/$(lib-ref[1]) ;
|
||||
local lib-path = [ path.relative-to $(caller-dir) $(found) ] ;
|
||||
library $(lib-ref) $(caller-mod) : $(lib-path) ;
|
||||
}
|
||||
}
|
||||
|
||||
return $(target-refs) ;
|
||||
}
|
||||
|
||||
rule library ( name caller-module ? : root )
|
||||
{
|
||||
process-args ;
|
||||
|
||||
# Dir path of caller to base paths from.
|
||||
caller-module ?= [ CALLER_MODULE ] ;
|
||||
local caller-dir = [ modules.peek $(caller-module) : __file__ ] ;
|
||||
caller-dir = $(caller-dir:D) ;
|
||||
|
||||
# Find the various parts of the library.
|
||||
local lib-dir = [ path.root [ path.root $(root) $(caller-dir) ] [ path.pwd ] ] ;
|
||||
local lib-contents = [ path.glob $(lib-dir) : "include" "build" ] ;
|
||||
lib-contents = $(lib-contents:D=) ;
|
||||
# "include" dir for library..
|
||||
local include-dir ;
|
||||
if "include" in $(lib-contents)
|
||||
{
|
||||
include-dir = include ;
|
||||
}
|
||||
|
||||
# Does it look like a library?
|
||||
if $(include-dir)
|
||||
{
|
||||
# Load/create/declare library project.
|
||||
local lib-module = [ project.find $(root) : $(caller-dir) ] ;
|
||||
local lib-target = [ project.target $(lib-module) ] ;
|
||||
|
||||
# We move to the library project module to define the various
|
||||
# targets others use for the library.
|
||||
if ! [ modules.peek $(lib-module) : __library__ ]
|
||||
{
|
||||
modules.poke $(lib-module) : __library__ : $(name) ;
|
||||
project.push-current $(lib-target) ;
|
||||
|
||||
# Declare the library alias.
|
||||
modules.call-in $(lib-module) : alias library
|
||||
: # Sources
|
||||
: # Requirements
|
||||
: # Default Build
|
||||
: # Usage Requirements
|
||||
<include>$(include-dir)
|
||||
;
|
||||
|
||||
project.pop-current ;
|
||||
}
|
||||
|
||||
# Declare project alternate ID.
|
||||
modules.call-in $(caller-module) : use-project $(name) : $(root) ;
|
||||
}
|
||||
}
|
||||
|
||||
# Add a location, i.e. directory, where to search for libraries.
|
||||
# The optional 'prefix' indicates which rooted-prefixes the new
|
||||
# search dir applies to. The prefix defaults to '/'.
|
||||
rule add-location ( dir prefix ? : base-dir ? )
|
||||
{
|
||||
process-args ;
|
||||
|
||||
prefix ?= "/" ;
|
||||
|
||||
# Dir path of caller to base paths from.
|
||||
caller-module ?= [ CALLER_MODULE ] ;
|
||||
local caller-dir = [ modules.peek $(caller-module) : __file__ ] ;
|
||||
caller-dir = $(caller-dir:D) ;
|
||||
|
||||
base-dir ?= $(caller-dir) ;
|
||||
|
||||
.search-path-prefix += $(prefix) ;
|
||||
.search-path.$(prefix) += [ path.root [ path.root $(dir) $(base-dir) ] [ path.pwd ] ] ;
|
||||
}
|
||||
|
||||
local rule process-args ( )
|
||||
{
|
||||
if ! $(.did-process-args)
|
||||
{
|
||||
.did-process-args = yes ;
|
||||
local argv = [ modules.peek : ARGV ] ;
|
||||
local dirs = [ MATCH ^--modular-search-dir=(.*)$ : $(argv) ] ;
|
||||
for local dir in $(dirs)
|
||||
{
|
||||
add-location $(dir) : [ path.pwd ] ;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user