# Boost.Build support specific for the Boost C++ Libraries.
# Copyright Vladimir Prus 2002-2010.
# Copyright Dave Abrahams 2005-2006.
# Copyright Rene Rivera 2005-2007.
# Copyright Douglas Gregor 2005.
#
# Distributed under the Boost Software License, Version 1.0.
#    (See accompanying file LICENSE_1_0.txt or copy at
#          http://www.boost.org/LICENSE_1_0.txt)

import option ;
import regex ;
import common ;

import modules ;
import os ;
import path ;
import build-system ;
import configure ;
import set ;
import package ;
import project ;
import targets ;
import generate ;
import package ;

##############################################################################
# 
# 0. General setup. Parse options, check them.
#
##############################################################################  

BOOST_ROOT = [ modules.binding $(__name__) ] ;
BOOST_ROOT = $(BOOST_ROOT:D) ;

rule set-version ( version )
{
    BOOST_VERSION = $(version) ;
    
    local version-tag = [ MATCH "^([^.]+)[.]([^.]+)[.]([^.]+)" : $(BOOST_VERSION) ]
      ;
    if $(version-tag[3]) = 0
    {
        version-tag = $(version-tag[1-2]) ;
    }
    
    BOOST_VERSION_TAG = $(version-tag:J="_") ;
}

# Option to choose how many variants to build. The default is "minimal".
build-type = [ option.get "build-type" ] ;
build-type ?= minimal ;
if ! ( $(build-type) in minimal complete )
{
    ECHO "The value of the --build-type option should be either 'complete' or 'minimal'" ;
    EXIT ;
}

# What kind of layout are we doing?
layout = [ option.get layout : "" ] ;
# On Windows, we used versioned layout by default in order to
# be compatible with autolink. On other systems, we use system
# layout which is what every other program uses. Note that windows
# check is static, and won't 
if ! $(layout)
{
    if [ os.name ] = NT
    {
        layout = versioned ;
    }
    else
    {
        layout = system ;
    }
}
layout-$(layout) = true ;

if $(layout) = system && $(build-type) = complete
{
    ECHO "error: Cannot use --layout=system with --build-type complete." ;
    ECHO "error: Please used either --layout=versioned or --layout=tagged " ;
    ECHO "error: if you wish to build multiple variants." ;
    if ! [ os.name ] = NT
    {        
        ECHO "error: Note that --layout=system is default on Unix starting with Boost 1.40." ;
    }    
    EXIT ;
}

# Possible stage only location.
stage-locate = [ option.get "stagedir" ] ;
stage-locate ?= stage ;
BOOST_STAGE_LOCATE = $(stage-locate) ;

# Custom build ID.
build-id = [ option.get "buildid" ] ;
if $(build-id)
{
    BUILD_ID = [ regex.replace $(build-id) "[*\\/:.\"\' ]" "_" ] ;
}

# Python build id (only for Python libraries)
python-id = [ option.get "python-buildid" ] ;
if $(python-id)
{
    PYTHON_ID = [ regex.replace $(python-id) "[*\\/:.\"\']" "_" ] ;
}

##############################################################################
#
# 1. The 'tag' function that adds decoration suitable to the properties if
# versioned or tagged layout is requested. This function is called from 
# Jamroot
#
##############################################################################  

rule tag ( name : type ? : property-set )
{
    if $(type) in STATIC_LIB SHARED_LIB IMPORT_LIB
    {
        local result ;
        if $(layout) = versioned
        {
            result = [ common.format-name
                <base> <toolset> <threading> <runtime> -$(BOOST_VERSION_TAG)
                -$(BUILD_ID)
                : $(name) : $(type) : $(property-set) ] ;
        }        
        else if $(layout) = tagged
        {
            result = [ common.format-name
                <base> <threading> <runtime>
                -$(BUILD_ID)
                : $(name) : $(type) : $(property-set) ] ;            
        }
        else if $(layout) = system
        {
            result = [ common.format-name
                <base> 
                -$(BUILD_ID)
                : $(name) : $(type) : $(property-set) ] ;
        }
        else
        {
            ECHO "error: invalid layout '$(layout:E=)'" ;
            EXIT ;               
        }
                
        # Optionally add version suffix. On NT, library with version suffix
        # will not be recognized by linkers. On CYGWIN, we get strage
        # duplicate symbol errors when library is generated with version
        # suffix. On OSX, version suffix is not needed -- the linker expects
        # the libFoo.1.2.3.dylib format. AIX linkers do not accept version
        # suffixes either. Pgi compilers can not accept library with version
        # suffix.
        if $(type) = SHARED_LIB &&
          ( ! ( [ $(property-set).get <target-os> ] in windows cygwin darwin aix ) &&
            ! ( [ $(property-set).get <toolset> ] in pgi ) )
        {
            result = $(result).$(BOOST_VERSION)  ;
        }

        return $(result) ;
    }    
}

##############################################################################
#
# 2. Declare targets that build and install all libraries. Specifically:
#
#    - 'stage-proper' that puts all libraries in stage/lib
#    - 'install-proper' that install libraries and headers to system location
#    - 'stage-unversioned' that creates links to libraries without boost veriosn
#       in name
#    - 'install-unversioned' which creates unversioned linked to installed
#       libraries.
#
##############################################################################  

# Worker function suitable to the 'generate' metatarget. Creates a link
# to 'source', striping any version number from the name.
rule make-unversioned-links ( project name ? : property-set : sources * )
{
    local result ;
    local filtered ;
    local pattern ;
    local nt = [ modules.peek : NT ] ;

    # Collect the libraries that have the version number in 'filtered'.
    for local s in $(sources)
    {
        local m ;
        if $(nt)
        {
            m = [ MATCH "(.*[.]lib)" : [ $(s).name ] ] ;
        }
        else
        {
            m = [ MATCH "(.*[.]so[.0-9]+)" "(.*[.]dylib)" "(.*[.]a)" :
              [ $(s).name ] ] ;
        }
        if $(m)
        {
            filtered += $(s) ;
        }
    }

    # Create links without version.
    for local s in $(filtered)
    {
        local name = [ $(s).name ] ;
        local ea = [ $(s).action ] ;
        local ep = [ $(ea).properties ] ;
        local a  = [ new non-scanning-action $(s) : symlink.ln : $(ep) ] ;

        local noversion-file ;
        if $(nt)
        {
            noversion-file = [ MATCH "(.*)-[0-9_]+(.*[.]lib)" : $(name) ] ;
        }
        else
        {
            noversion-file =
              [ MATCH "(.*)-[0-9_]+(.*[.]so)[.0-9]*" : $(name) ]
                [ MATCH "(.*)-[0-9_]+(.*[.]dylib)" : $(name) ]
                  [ MATCH "(.*)-[0-9_]+(.*[.]a)" : $(name) ]
                    [ MATCH "(.*)-[0-9_]+(.*[.]dll[.]a)" : $(name) ] ;
        }

        local new-name =
          $(noversion-file[1])$(noversion-file[2]) ;
        result += [ new file-target $(new-name) exact : [ $(s).type ] : $(project)
          : $(a) ] ;

    }
    return $(result) ;
}

rule declare_install_and_stage_proper_targets ( libraries * : headers * )
{
    install-requirements = <install-source-root>$(BOOST_ROOT)/boost ;

    if $(layout-versioned)
    {
        install-requirements += <install-header-subdir>boost-$(BOOST_VERSION_TAG)/boost ;
    }
    else
    {
        install-requirements += <install-header-subdir>boost ;
    }
    
    if [ os.name ] = NT
    {
        install-requirements += <install-default-prefix>C:/Boost ;
    }
    else
    {
        install-requirements += <install-default-prefix>/usr/local ;
    }
    
    p = [ project.current ] ;
    
    # Complete install.
    package.install install-proper
      : $(install-requirements) <install-no-version-symlinks>on
      :
      : libs/$(libraries)/build
      : $(headers)
      ;
    
    $(p).mark-target-as-explicit install-proper ;

    # Install just library.
    install stage-proper
      : libs/$(libraries)/build
      : <location>$(stage-locate)/lib
        <install-dependencies>on <install-type>LIB
        <install-no-version-symlinks>on
      ;
    $(p).mark-target-as-explicit stage-proper ;

    if $(layout-versioned) && ( [ modules.peek : NT ] || [ modules.peek : UNIX ] )
    {
        generate stage-unversioned : stage-proper :
          <generating-rule>boostcpp.make-unversioned-links ;
        $(p).mark-target-as-explicit stage-unversioned ;

        generate install-unversioned : install-proper :
          <generating-rule>boostcpp.make-unversioned-links ;
        $(p).mark-target-as-explicit  explicit install-unversioned ;
    }
    else
    {
        # Create do-nothing aliases.
        alias stage-unversioned ;
        $(p).mark-target-as-explicit stage-unversioned ;
        alias install-unversioned ;
        $(p).mark-target-as-explicit install-unversioned ;
    }
}

##############################################################################  
#
#  3. Declare top-level targets 'stage' and 'install'. These examine
#  the --build-type option and, in case it's 'complete', build the
#  'install-proper' and 'stage-proper' targets with a number of
#  property sets.
#
##############################################################################  

class top-level-target : alias-target-class
{
    import modules ;
    import errors ; 
    
    rule __init__ ( name : project : sources * : requirements *
        : default-build * : usage-requirements * )
    {
        alias-target-class.__init__ $(name) : $(project) : $(sources) :
            $(requirements) : $(default-build) : $(usage-requirements) ;
        
        self.build-type = [ modules.peek boostcpp : build-type ] ;
        # On Linux, we build release variant by default, since few users will
        # ever want to debug C++ Boost libraries, and there's no ABI
        # incompatibility between debug and release variants. We build
        # shared and static libraries since that's what most packages
        # seem to provide (.so in libfoo and .a in libfoo-dev).
        self.minimal-properties = [ property-set.create 
            <variant>release <threading>multi <link>shared <link>static <runtime-link>shared ] ;
        # On Windows, new IDE projects use:
        #
        #   runtime-link=dynamic, threading=multi, variant=(debug|release)
        #
        # and in addition, C++ Boost's autolink defaults to static linking.
        self.minimal-properties-win = [ property-set.create 
            <variant>debug <variant>release <threading>multi <link>static <runtime-link>shared ] ;

        self.complete-properties = [ property-set.create
            <variant>debug <variant>release
            <threading>single <threading>multi
            <link>shared <link>static
            <runtime-link>shared <runtime-link>static ] ;
    }
    
    rule generate ( property-set )
    {
        local x = [ modules.peek : top-level-targets ] ;
        x += $(self.name) ;
        modules.poke : top-level-targets : $(x) ;
        if $(self.build-type) = minimal
        {
            local expanded ;
            
            local os = [ $(property-set).get <target-os> ] ;
            # Because we completely override parent's 'generate'
            # we need to check for default value of feature ourself.
            if ! $(os)
            {
                os = [ feature.defaults <target-os> ] ;
                os = $(os:G=) ;
            }
            
            if $(os) = windows
            {                
                expanded = [ targets.apply-default-build $(property-set)
                  : $(self.minimal-properties-win) ] ;
            }
            else
            {
                expanded = [ targets.apply-default-build $(property-set)
                  : $(self.minimal-properties) ] ;
            }            
            return [ build-multiple $(expanded) ] ;
        }
        else if $(self.build-type) = complete
        {                                    
            local expanded = [ targets.apply-default-build $(property-set)
              : $(self.complete-properties) ] ;
            
            # Filter inappopriate combinations
            local filtered ;
            for local p in $(expanded)
            {
                # See comment in handle-static-runtime regarding this logic.
                if [ $(p).get <link> ] = shared && [ $(p).get <runtime-link> ] = static
                   && [ $(p).get <toolset> ] != cw
                {
                    # Skip this
                }
                else
                {
                    filtered += $(p) ;
                }
            }            
            return [ build-multiple $(filtered) ] ;            
        }
        else
        {
            errors.error "Unknown build type" ; 
        }               
    }
    
    rule build-multiple ( property-sets * )
    {
        local usage-requirements = [ property-set.empty ] ;
        local result ;
        for local p in $(property-sets)
        {
            local r = [ alias-target-class.generate $(p) ] ;
            if $(r)
            {
                usage-requirements = [ $(usage-requirements).add $(r[1]) ] ;
                result += $(r[2-]) ;
            }
        }
        return $(usage-requirements) [ sequence.unique $(result) ] ;
    }    
}

rule declare_top_level_targets ( libraries * : headers * )
{
    declare_install_and_stage_proper_targets $(libraries) : $(headers) ;
    
    targets.create-metatarget top-level-target : [ project.current ]
        : install
        : install-proper install-unversioned 
        ;
    targets.create-metatarget top-level-target : [ project.current ]
        : stage
        : stage-proper stage-unversioned 
        ;

    p = [ project.current ] ;
    $(p).mark-target-as-explicit install stage ;
    
    # This target is built by default, and will forward to 'stage'
    # after producing some explanations.
    targets.create-metatarget top-level-target : [ project.current ]
        : forward
        : explain stage
        ;
}


stage-abs = [ path.native [ path.root $(stage-locate)/lib [ path.pwd ] ] ] ;

##############################################################################
#
# 4. Add hook to report configuration before the build, and confirmation
# with setup instructions after the build
#
##############################################################################  

message explain :
"\nBuilding the Boost C++ Libraries.\n\n" ;
p = [ project.current ] ;
$(p).mark-target-as-explicit explain ;

rule pre-build ( )
{
    local tl = [ modules.peek : top-level-targets ] ;
    if stage in $(tl) || install in $(tl)
    {
        # FIXME: remove if when Boost regression tests use trunk
        # bjam.
        if PAD in [ RULENAMES ]
        {            
            configure.print-component-configuration ;
        }        
    }
}
IMPORT $(__name__) : pre-build : : $(__name__).pre-build ;
build-system.set-pre-build-hook $(__name__).pre-build ;

# FIXME: revive stage_abs
rule post-build ( ok ? ) 
{
    if forward in [ modules.peek : top-level-targets ] 
    {        
        if $(ok)
        {
        ECHO 
"\n\nThe Boost C++ Libraries were successfully built!
          
The following directory should be added to compiler include paths:
          
    $(BOOST_ROOT)
      
The following directory should be added to linker library paths:
      
    $(stage-abs)
" ;
        }    
    }    
}
IMPORT $(__name__) : post-build : : $(__name__).post-build ;
build-system.set-post-build-hook $(__name__).post-build ;


##############################################################################
# 
# 5. Top-level setup 
#
##############################################################################  


# Decides which libraries are to be installed by looking at --with-<library>
# --without-<library> arguments. Returns the list of directories under "libs"
# which must be built and installed.
#
rule libraries-to-install ( existing-libraries * )
{
   local argv = [ modules.peek : ARGV ] ;
   local with-parameter = [ MATCH --with-(.*) : $(argv) ] ;
   local without-parameter = [ MATCH --without-(.*) : $(argv) ] ;
   
   if ! $(with-parameter) && ! $(without-parameter)
   {
       # Nothing is specified on command line. See if maybe
       # project-config.jam has some choices. 
       local project-config-libs = [ modules.peek project-config : libraries ] ;
       with-parameter = [ MATCH --with-(.*) : $(project-config-libs) ] ;
       without-parameter = [ MATCH --without-(.*) : $(project-config-libs) ] ;
   }

   # Do some checks.
   if $(with-parameter) && $(without-parameter)
   {
       ECHO "error: both --with-<library> and --without-<library> specified" ;
       EXIT ;
   }

   local wrong = [ set.difference $(with-parameter) : $(existing-libraries) ] ;
   if $(wrong)
   {
       ECHO "error: wrong library name '$(wrong[1])' in the --with-<library> option." ;
       EXIT ;
   }
   local wrong = [ set.difference $(without-parameter) : $(existing-libraries) ] ;
   if $(wrong)
   {
       ECHO "error: wrong library name '$(wrong[1])' in the --without-<library> option." ;
       EXIT ;
   }

   if $(with-parameter)
   {
       return [ set.intersection $(existing-libraries) : $(with-parameter) ] ;
   }
   else
   {
       return [ set.difference $(existing-libraries) : $(without-parameter) ] ;
   }
}

rule declare-targets ( all-libraries * : headers * )
{
    configure.register-components $(all-libraries) ;
    
    # Select the libraries to install.
    libraries = [ libraries-to-install $(all-libraries) ] ;
    configure.components-building $(libraries) ;

    if [ option.get "show-libraries" : : true ]
    {
        ECHO "The following libraries require building:" ;
        for local l in $(libraries)
        {
            ECHO "    - $(l)" ;
        }
        EXIT ;
    }

    declare_top_level_targets $(libraries) : $(headers) ;
}
