File: package.jam

package info (click to toggle)
boost-build 2.0-m11-2
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 4,624 kB
  • ctags: 2,387
  • sloc: ansic: 12,978; python: 5,209; xml: 4,782; cpp: 555; yacc: 456; sh: 237; makefile: 71
file content (95 lines) | stat: -rw-r--r-- 3,453 bytes parent folder | download
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) ;
    }
}