| # Copyright 2001, 2002, 2003, 2005 Dave Abrahams |
| # Copyright 2006 Rene Rivera |
| # Copyright 2003, 2005 Vladimir Prus |
| # Distributed under the Boost Software License, Version 1.0. |
| # (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) |
| |
| import modules ; |
| import string ; |
| |
| |
| # Return the value(s) of the given environment variable(s) at the time bjam was |
| # invoked. |
| rule environ ( variable-names + ) |
| { |
| return [ modules.peek .ENVIRON : $(variable-names) ] ; |
| } |
| |
| .name = [ modules.peek : OS ] ; |
| .platform = [ modules.peek : OSPLAT ] ; |
| .version = [ modules.peek : OSVER ] ; |
| |
| |
| local rule constant ( c : os ? ) |
| { |
| os ?= $(.name) ; |
| # First look for a platform-specific name, then the general value. |
| local variables = .$(c)-$(os) .$(c) ; |
| local result = $($(variables)) ; |
| return $(result[1]) ; |
| } |
| |
| rule get-constant ( os ? ) |
| { |
| # Find the name of the constant being accessed, which is equal to the name |
| # used to invoke us. |
| local bt = [ BACKTRACE 1 ] ; |
| local rulename = [ MATCH ([^.]*)$ : $(bt[4]) ] ; |
| return [ constant $(rulename) : $(os) ] ; |
| } |
| |
| |
| # export all the common constants |
| .constants = name platform version shared-library-path-variable path-separator executable-path-variable executable-suffix ; |
| for local constant in $(.constants) |
| { |
| IMPORT $(__name__) : get-constant : $(__name__) : $(constant) ; |
| } |
| EXPORT $(__name__) : $(.constants) ; |
| |
| .executable-path-variable-NT = PATH ; |
| # On Windows the case and capitalization of PATH is not always predictable, so |
| # let's find out what variable name was really set. |
| if $(.name) = NT |
| { |
| for local n in [ VARNAMES .ENVIRON ] |
| { |
| if $(n:L) = path |
| { |
| .executable-path-variable-NT = $(n) ; |
| } |
| } |
| } |
| |
| # Specific constants for various platforms. There's no need to define any |
| # constant whose value would be the same as the default, below. |
| .shared-library-path-variable-NT = $(.executable-path-variable-NT) ; |
| .path-separator-NT = ";" ; |
| .expand-variable-prefix-NT = % ; |
| .expand-variable-suffix-NT = % ; |
| .executable-suffix-NT = .exe ; |
| |
| .shared-library-path-variable-CYGWIN = PATH ; |
| |
| .shared-library-path-variable-MACOSX = DYLD_LIBRARY_PATH ; |
| |
| .shared-library-path-variable-AIX = LIBPATH ; |
| |
| # Default constants |
| .shared-library-path-variable = LD_LIBRARY_PATH ; |
| .path-separator = ":" ; |
| .expand-variable-prefix = $ ; |
| .expand-variable-suffix = "" ; |
| .executable-path-variable = PATH ; |
| .executable-suffix = "" ; |
| |
| |
| # Return a list of the directories in the PATH. Yes, that information is (sort |
| # of) available in the global module, but jam code can change those values, and |
| # it isn't always clear what case/capitalization to use when looking. This rule |
| # is a more reliable way to get there. |
| rule executable-path ( ) |
| { |
| return [ string.words [ environ [ constant executable-path-variable ] ] |
| : [ constant path-separator ] ] ; |
| } |
| |
| |
| # Initialize the list of home directories for the current user depending on the |
| # OS. |
| if $(.name) = NT |
| { |
| local home = [ environ HOMEDRIVE HOMEPATH ] ; |
| .home-directories = $(home[1])$(home[2]) [ environ HOME ] [ environ USERPROFILE ] ; |
| } |
| else |
| { |
| .home-directories = [ environ HOME ] ; |
| } |
| |
| |
| # Can't use 'constant' mechanism because it only returns 1-element values. |
| rule home-directories ( ) |
| { |
| return $(.home-directories) ; |
| } |
| |
| |
| # Return the string needed to represent the expansion of the named shell |
| # variable. |
| rule expand-variable ( variable ) |
| { |
| local prefix = [ constant expand-variable-prefix ] ; |
| local suffix = [ constant expand-variable-suffix ] ; |
| return $(prefix)$(variable)$(suffix) ; |
| } |
| |
| |
| # Returns true if running on windows, whether in cygwin or not. |
| rule on-windows ( ) |
| { |
| local result ; |
| if [ modules.peek : NT ] |
| { |
| result = true ; |
| } |
| else if [ modules.peek : UNIX ] |
| { |
| switch [ modules.peek : JAMUNAME ] |
| { |
| case CYGWIN* : |
| { |
| result = true ; |
| } |
| } |
| } |
| return $(result) ; |
| } |
| |
| |
| if ! [ on-windows ] |
| { |
| .on-unix = 1 ; |
| } |
| |
| |
| rule on-unix |
| { |
| return $(.on-unix) ; |
| } |
| |
| |
| rule __test__ |
| { |
| import assert ; |
| if ! ( --quiet in [ modules.peek : ARGV ] ) |
| { |
| ECHO os: name= [ name ] ; |
| ECHO os: version= [ version ] ; |
| } |
| assert.true name ; |
| } |