# 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 ] ; properties = [ property-set.create $(toolset) ] ; if $($(variable)-$(properties)) { return $($(variable)-$(properties)) ; } else { provided-path ?= [ modules.peek : $(variable) ] ; includes = $(provided-path) ; includes += [ $(properties).get ] ; if [ $(properties).get ] != 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 ] ; properties = [ property-set.create $(toolset) ] ; if $($(variable)-$(properties)) { return $($(variable)-$(properties)) ; } else { provided-path ?= [ modules.peek : $(variable) ] ; paths = $(provided-path) ; paths += [ $(properties).get ] ; if [ $(properties).get ] != 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 $(includes) $(library) ] ; } else { configure.log-library-search-result $(name) : "no found" ; } } }