blob: 6768f358c22fc807b81aff06f9aac2fd79f57b02 [file] [log] [blame]
# Copyright (c) 2010 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)
import property-set ;
import path ;
import modules ;
import "class" ;
import errors ;
import configure ;
rule find-include-path ( variable : properties : header
: provided-path ? )
{
# FIXME: document which properties affect this function by
# default.
local target-os = [ $(properties).get <target-os> ] ;
properties = [ property-set.create <target-os>$(toolset) ] ;
if $($(variable)-$(properties))
{
return $($(variable)-$(properties)) ;
}
else
{
provided-path ?= [ modules.peek : $(variable) ] ;
includes = $(provided-path) ;
includes += [ $(properties).get <include> ] ;
if [ $(properties).get <target-os> ] != windows
{
# FIXME: use sysroot
includes += /usr/include ;
}
local result ;
while ! $(result) && $(includes)
{
local f = [ path.root $(header) $(includes[1]) ] ;
ECHO "Checking " $(f) ;
if [ path.exists $(f) ]
{
result = $(includes[1]) ;
}
else if $(provided-path)
{
errors.user-error "Could not find header" $(header)
: "in the user-specified directory" $(provided-path) ;
}
includes = $(includes[2-]) ;
}
$(variable)-$(properties) = $(result) ;
return $(result) ;
}
}
rule find-library ( variable : properties : names + : provided-path ? )
{
local target-os = [ $(properties).get <target-os> ] ;
properties = [ property-set.create <target-os>$(toolset) ] ;
if $($(variable)-$(properties))
{
return $($(variable)-$(properties)) ;
}
else
{
provided-path ?= [ modules.peek : $(variable) ] ;
paths = $(provided-path) ;
paths += [ $(properties).get <library-path> ] ;
if [ $(properties).get <target-os> ] != windows
{
paths += /usr/lib /usr/lib32 /usr/lib64 ;
}
local result ;
while ! $(result) && $(paths)
{
while ! $(result) && $(names)
{
local f ;
if $(target-os) = windows
{
f = $(paths[1])/$(names[1]).lib ;
if [ path.exists $(f) ]
{
result = $(f) ;
}
}
else
{
# FIXME: check for .a as well, depending on
# the 'link' feature.
f = $(paths[1])/lib$(names[1]).so ;
ECHO "CHECKING $(f) " ;
if [ path.exists $(f) ]
{
result = $(f) ;
}
}
if ! $(result) && $(provided-path)
{
errors.user-error "Could not find either of: " $(names)
: "in the user-specified directory" $(provided-path) ;
}
names = $(names[2-]) ;
}
paths = $(paths[2-]) ;
}
$(variable)-$(properties) = $(result) ;
return $(result) ;
}
}
class ac-library : basic-target
{
import errors ;
import indirect ;
import virtual-target ;
import ac ;
import configure ;
rule __init__ ( name : project : * : * )
{
basic-target.__init__ $(name) : $(project) : $(sources)
: $(requirements) ;
reconfigure $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
}
rule set-header ( header )
{
self.header = $(header) ;
}
rule set-default-names ( names + )
{
self.default-names = $(names) ;
}
rule reconfigure ( * : * )
{
ECHO "XXX" $(1) ;
if ! $(1)
{
# This is 'using xxx ;'. Nothing to configure, really.
}
else
{
for i in 1 2 3 4 5 6 7 8 9
{
# FIXME: this naming is inconsistent with XXX_INCLUDE/XXX_LIBRARY
if ! ( $($(i)[1]) in root include-path library-path library-name condition )
{
errors.user-error "Invalid named parameter" $($(i)[1]) ;
}
local name = $($(i)[1]) ;
local value = $($(i)[2-]) ;
if $($(name)) && $($(name)) != $(value)
{
errors.user-error "Attempt to change value of '$(name)'" ;
}
$(name) = $(value) ;
}
include-path ?= $(root)/include ;
library-path ?= $(root)/lib ;
}
}
rule construct ( name : sources * : property-set )
{
# FIXME: log results.
local libnames = $(library-name) ;
if ! $(libnames) && ! $(include-path) && ! $(library-path)
{
libnames = [ modules.peek : $(name:U)_NAME ] ;
# Backward compatibility only.
libnames ?= [ modules.peek : $(name:U)_BINARY ] ;
}
libnames ?= $(self.default-names) ;
local includes = [
ac.find-include-path $(name:U)_INCLUDE : $(property-set) : $(self.header) : $(include-path) ] ;
local library = [ ac.find-library $(name:U)_LIBRARY : $(property-set) : $(libnames) : $(library-path) ] ;
if $(includes) && $(library)
{
library = [ virtual-target.from-file $(library) : . : $(self.project) ] ;
configure.log-library-search-result $(name) : "found" ;
return [ property-set.create <include>$(includes) <source>$(library) ] ;
}
else
{
configure.log-library-search-result $(name) : "no found" ;
}
}
}