|
|
|
|
|
|
|
|
|
|
|
|
|
import property-set ; |
|
import path ; |
|
import modules ; |
|
import "class" ; |
|
import errors ; |
|
import configure ; |
|
|
|
rule find-include-path ( variable : properties : header |
|
: 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) ] ; |
|
includes = $(provided-path) ; |
|
includes += [ $(properties).get <include> ] ; |
|
if [ $(properties).get <target-os> ] != windows |
|
{ |
|
|
|
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 |
|
{ |
|
|
|
|
|
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) |
|
{ |
|
|
|
} |
|
else |
|
{ |
|
for i in 1 2 3 4 5 6 7 8 9 |
|
{ |
|
|
|
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 ) |
|
{ |
|
|
|
local libnames = $(library-name) ; |
|
if ! $(libnames) && ! $(include-path) && ! $(library-path) |
|
{ |
|
libnames = [ modules.peek : $(name:U)_NAME ] ; |
|
|
|
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" ; |
|
} |
|
} |
|
} |
|
|
|
|