1# Copyright 2001, 2002, 2003, 2005 Dave Abrahams
2# Copyright 2006 Rene Rivera
3# Copyright 2003, 2005 Vladimir Prus
4# Distributed under the Boost Software License, Version 1.0.
5# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
6
7import modules ;
8import string ;
9
10
11# Return the value(s) of the given environment variable(s) at the time bjam was
12# invoked.
13rule environ ( variable-names + )
14{
15    local result ;
16    for local var-name in $(variable-names)
17    {
18        # We check the various cases of the var name for a value to account
19        # for programs that change the casing of env vars. One such program
20        # is Python that upper-cases env var names on import, and resports
21        # them as upper-case instead of keeping the original case.
22        local value ;
23        value ?= [ modules.peek .ENVIRON : $(var-name) ] ;
24        value ?= [ modules.peek .ENVIRON : $(var-name:U) ] ;
25        value ?= [ modules.peek .ENVIRON : $(var-name:L) ] ;
26        result += $(value) ;
27    }
28    return $(result) ;
29}
30
31.name = [ modules.peek : OS ] ;
32.platform = [ modules.peek : OSPLAT ] ;
33.version = [ modules.peek : OSVER ] ;
34
35
36local rule constant ( c : os ? )
37{
38    os ?= $(.name) ;
39    # First look for a platform-specific name, then the general value.
40    local variables = .$(c)-$(os) .$(c) ;
41    local result = $($(variables)) ;
42    return $(result[1]) ;
43}
44
45rule get-constant ( os ? )
46{
47    # Find the name of the constant being accessed, which is equal to the name
48    # used to invoke us.
49    local bt = [ BACKTRACE 1 ] ;
50    local rulename = [ MATCH "([^.]*)$" : $(bt[4]) ] ;
51    return [ constant $(rulename) : $(os) ] ;
52}
53
54
55# export all the common constants
56.constants = name platform version shared-library-path-variable path-separator executable-path-variable executable-suffix ;
57for local constant in $(.constants)
58{
59    IMPORT $(__name__) : get-constant : $(__name__) : $(constant) ;
60}
61EXPORT $(__name__) : $(.constants) ;
62
63.executable-path-variable-NT = PATH ;
64# On Windows the case and capitalization of PATH is not always predictable, so
65# let's find out what variable name was really set.
66if $(.name) = NT
67{
68    for local n in [ VARNAMES .ENVIRON ]
69    {
70        if $(n:L) = path
71        {
72            .executable-path-variable-NT = $(n) ;
73        }
74    }
75}
76
77# Specific constants for various platforms.  There's no need to define any
78# constant whose value would be the same as the default, below.
79.shared-library-path-variable-NT = $(.executable-path-variable-NT) ;
80.path-separator-NT = ";" ;
81.path-separator-VXWORKS = ";" ;
82.expand-variable-prefix-NT = % ;
83.expand-variable-suffix-NT = % ;
84.executable-suffix-NT = .exe ;
85
86.shared-library-path-variable-CYGWIN = PATH ;
87
88.shared-library-path-variable-MACOSX = DYLD_LIBRARY_PATH ;
89
90.shared-library-path-variable-AIX = LIBPATH ;
91
92.shared-library-path-variable-HAIKU = LIBRARY_PATH ;
93
94.shared-library-path-variable-VMS = PATH ;
95.path-separator-VMS = "," ;
96.expand-variable-prefix-VMS = '' ;
97.expand-variable-suffix-VMS = ' ;
98.executable-suffix-VMS = .exe ;
99
100# VxWorks uses the default LD_LIBRARY_PATH, but we need an alternate
101# name on the cross build host to propagate to the target system
102.shared-library-path-variable-VXWORKS = VSB_LD_LIBRARY_PATH ;
103
104# Default constants
105.shared-library-path-variable = LD_LIBRARY_PATH ;
106.path-separator = ":" ;
107.expand-variable-prefix = $ ;
108.expand-variable-suffix = "" ;
109.executable-path-variable = PATH ;
110.executable-suffix = "" ;
111
112
113# Return a list of the directories in the PATH. Yes, that information is (sort
114# of) available in the global module, but jam code can change those values, and
115# it isn't always clear what case/capitalization to use when looking. This rule
116# is a more reliable way to get there.
117rule executable-path ( )
118{
119    return [ string.words [ environ [ constant executable-path-variable ] ]
120        : [ constant path-separator ] ] ;
121}
122
123
124# Initialize the list of home directories for the current user depending on the
125# OS.
126if $(.name) = NT
127{
128    local home = [ environ HOMEDRIVE HOMEPATH ] ;
129    .home-directories = $(home[1])$(home[2]) [ environ HOME ] [ environ USERPROFILE ] ;
130}
131else
132{
133    .home-directories = [ environ HOME ] ;
134}
135
136
137# Can't use 'constant' mechanism because it only returns 1-element values.
138rule home-directories ( )
139{
140    return $(.home-directories) ;
141}
142
143
144# Return the string needed to represent the expansion of the named shell
145# variable.
146rule expand-variable ( variable )
147{
148    local prefix = [ constant expand-variable-prefix ] ;
149    local suffix = [ constant expand-variable-suffix ] ;
150    return $(prefix)$(variable)$(suffix) ;
151}
152
153
154# Returns true if running on windows, whether in cygwin or not.
155rule on-windows ( )
156{
157    local result ;
158    if [ modules.peek : NT ]
159    {
160        result = true ;
161    }
162    else if [ modules.peek : UNIX ]
163    {
164        switch [ modules.peek : JAMUNAME ]
165        {
166            case CYGWIN* :
167            {
168                result = true ;
169            }
170        }
171    }
172    return $(result) ;
173}
174
175
176rule on-vms ( )
177{
178    local result ;
179    if [ modules.peek : VMS ]
180    {
181        result = true ;
182    }
183    return $(result) ;
184}
185
186
187if ! [ on-windows ] && ! [ on-vms ]
188{
189    .on-unix = 1 ;
190}
191
192
193rule on-unix
194{
195    return $(.on-unix) ;
196}
197
198
199rule __test__
200{
201    import assert ;
202    if ! ( --quiet in [ modules.peek : ARGV ] )
203    {
204        ECHO "os:" name= [ name ] ;
205        ECHO "os:" version= [ version ] ;
206    }
207    assert.true name ;
208}
209