1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
|
# Copyright (c) 2005 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)
# Provides mechanism for installing whole packages into a specific
# directory structure. This is opposed to the 'install' rule, that
# installs a number of targets to a single directory, and does not
# care about directory structure at all.
# Example usage:
#
# package.install boost : <properties>
# : <binaries>
# : <libraries>
# : <headers>
# ;
#
# This will install binaries, libraries and headers to the 'proper' location, given
# by command line options --prefix, --exec-prefix, --bindir, --libdir and
# --includedir.
#
# The rule is just a convenient wrapper, avoiding the need to define several
# 'install' targets.
#
# The only install-related feature is <install-source-root>. It will apply to
# headers only and if present, paths of headers relatively to source root will be
# retained after installing. If it's not specified, then "." is assumed, so
# relative paths in headers are always preserved.
import project ;
import targets ;
import "class" : new ;
import option ;
import errors ;
import stage ;
import property ;
rule install ( name : requirements * : binaries * : libraries * : headers * )
{
# If <install-source-root> is not specified, all headers are installed
# to prefix/include, no matter what their relative path is. Sometimes
# that's what needed.
local install-source-root
= [ property.select <install-source-root> : $(requirements) ] ;
requirements = [ property.change $(requirements) : <install-source-root> ] ;
#
local install-header-subdir
= [ property.select <install-header-subdir> : $(requirements) ] ;
install-header-subdir = /$(install-header-subdir:G=) ;
install-header-subdir ?= "" ;
requirements = [ property.change $(requirements) : <install-header-subdir> ] ;
# First, figure out all locations.
local prefix = [ option.get prefix : "" ] ;
if ! $(prefix)
{
if [ modules.peek : NT ] { prefix = C:\\$(name) ; }
else if [ modules.peek : UNIX ] { prefix = /usr/local ; }
}
# architecture dependent files
local exec-locate = [ option.get exec-prefix : $(prefix) ] ;
# binaries
local bin-locate = [ option.get bindir : $(prefix)/bin ] ;
# object code libraries
local lib-locate = [ option.get libdir : $(prefix)/lib ] ;
# source header files
local include-locate = [ option.get includedir : $(prefix)/include ] ;
stage.install $(name)-bin : $(binaries) : $(requirements) <location>$(bin-locate) ;
stage.install $(name)-lib :
$(binaries) $(libraries)
: $(requirements) <location>$(lib-locate)
<install-dependencies>on <install-type>LIB
;
stage.install $(name)-headers : $(headers) : $(requirements)
<location>$(include-locate)$(install-header-subdir)
<install-source-root>$(install-source-root) ;
alias $(name) : $(name)-bin $(name)-lib $(name)-headers ;
local c = [ project.current ] ;
local project-module = [ $(c).project-module ] ;
module $(project-module)
{
explicit $(1)-bin $(1)-lib $(1)-headers $(1) ;
}
}
|