# $Id: boost.jam 63913 2010-07-12 07:37:43Z vladimir_prus $
# Copyright 2008 Roland Schwarz
# 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)

# Boost library support module.
# 
# This module allows to use the boost library from boost-build projects.
# The location of a boost source tree or the path to a pre-built
# version of the library can be configured from either site-config.jam
# or user-config.jam. If no location  is configured the module looks for
# a BOOST_ROOT environment variable, which should point to a boost source
# tree. As a last resort it tries to use pre-built libraries from the standard
# search path of the compiler.
#
# If the location to a source tree is known, the module can be configured 
# from the *-config.jam files:
#
# using boost : 1.35 : <root>/path-to-boost-root ;
#
# If the location to a pre-built version is known:
#
# using boost : 1.34 
#   : <include>/usr/local/include/boost_1_34 
#     <library>/usr/local/lib
#   ;
#
# It is legal to configure more than one boost library version in the config
# files. The version identifier is used to disambiguate between them.
# The first configured version becomes the default.
#
# To use a boost library you need to put a 'use' statement into your
# Jamfile:
#
# import boost ;
#
# boost.use-project 1.35 ;
#
# If you don't care about a specific version you just can omit the version
# part, in which case the default is picked up:
#
# boost.use-project ;
#
# The library can be referenced with the project identifier '/boost'. To 
# reference the program_options you would specify:
#
# exe myexe : mysrc.cpp : <library>/boost//program_options ;
#
# Note that the requirements are automatically transformed into suitable
# tags to find the correct pre-built library.
#

import modules ;
import errors ;
import project ;
import string ;
import toolset ;
import property-set ;
import regex ;
import common ;
import option ;
import numbers ;

.boost.auto_config = [ property-set.create <layout>system ] ;

if [ MATCH (--debug-configuration) : [ modules.peek : ARGV ] ]
{
    .debug-configuration = true ;
}

# Configuration of the boost library to use.
#
# This can either be a boost source tree or
# pre-built libraries. The 'version' parameter must be a valid boost
# version number, e.g. 1.35, if specifying a pre-built version with
# versioned layout. It may be a symbolic name, e.g. 'trunk' if specifying
# a source tree. The options are specified as named parameters (like
# properties). The following paramters are available:
#
# <root>/path-to-boost-root: Specify a source tree.
#
# <include>/path-to-include: The include directory to search.
#
# <library>/path-to-library: The library directory to search.
# 
# <layout>system or <layout>versioned.
# 
# <build-id>my_build_id: The custom build id to use.
#
rule init 
( 
    version     # Version identifier.
    : options * # Set the option properties.
)
{
    if $(.boost.$(version)) {
        errors.user-error 
            "Boost " $(version) "already configured." ;
    }
    else {
        if $(.debug-configuration) {
            if ! $(.boost_default) {
                echo notice: configuring default boost library $(version) ;
            }
            echo notice: configuring boost library $(version) ;
        }
        .boost_default ?= $(version) ; # the first configured is default
        .boost.$(version) = [ property-set.create $(options) ] ;
    }
}

# Use a certain version of the library.
#
# The use-project rule causes the module to define a boost project of
# searchable pre-built boost libraries, or references a source tree
# of the boost library. If the 'version' parameter is omitted either
# the configured default (first in config files) is used or an auto
# configuration will be attempted.
# 
rule use-project 
( 
    version ? # The version of the library to use.
)
{
    project.push-current [ project.current ] ;
    version ?= $(.boost_default) ;
    version ?= auto_config ;
    
    if $(.initialized) {
        if $(.initialized) != $(version) {
            errors.user-error
                "Attempt to use" $(__name__) "with different parameters" ;
        }
    }
    else {
        if $(.boost.$(version)) {
            local opt  = $(.boost.$(version)) ;
            local root = [ $(opt).get <root> ] ;
            local inc  = [ $(opt).get <include> ] ;
            local lib  = [ $(opt).get <library> ] ;
            
            if $(.debug-configuration) {
                echo notice: using boost library $(version) [ $(opt).raw ] ;
            }
            
            .layout = [ $(opt).get <layout> ] ;
            .layout ?= versioned ;
            .build_id = [ $(opt).get <build-id> ] ;
            .version_tag = [ regex.replace $(version) "[*\\/:.\"\' ]" "_" ] ;
            .initialized = $(version) ;

            if  ( $(root) && $(inc) ) 
                || ( $(root) && $(lib) )
                || ( $(lib) && ! $(inc) )
                || ( ! $(lib) && $(inc) ) {
                errors.user-error
                    "Ambiguous parameters,"
                    "use either <root> or <inlude> with <library>." ;
            }
            else if ! $(root) && ! $(inc) {
                root = [ modules.peek : BOOST_ROOT ] ;
            }

            local prj = [ project.current ] ;
            local mod = [ $(prj).project-module ] ;

            if $(root) {
                modules.call-in $(mod) : use-project boost : $(root) ;
            }
            else {
                project.initialize $(__name__) ;
                # It is possible to overide the setup of the searched
                # libraries per version. The (unlikely) tag 0.0.1 is
                # meant as an example template only.
                switch $(version) {
                    case 0.0.1 : boost_0_0_1 $(inc) $(lib) ;
                    case *    : boost_std $(inc) $(lib) ;
                }
            }
        }
        else {
            errors.user-error 
                "Reference to unconfigured boost version." ;
        }
    }
    project.pop-current ;
}

rule boost_std ( inc ? lib ? )
{
#   The default definitions for pre-built libraries.

    project boost
        : usage-requirements <include>$(inc) <define>BOOST_ALL_NO_LIB
        : requirements <tag>@tag_std <search>$(lib)
        ;

    alias headers ;
    lib date_time        : : : : 
        <link>shared:<define>BOOST_DATE_TIME_DYN_LINK ;
    lib filesystem       : : : : 
        <link>shared:<define>BOOST_FILE_SYSTEM_DYN_LINK ;
    lib graph            : : : : 
        <link>shared:<define>BOOST_GRAPH_DYN_LINK ;
    lib graph_parallel   : : : : 
        <link>shared:<define>BOOST_GRAPH_DYN_LINK ;
    lib iostreams        : : : :
        <link>shared:<define>BOOST_IOSTREAMS_DYN_LINK ;
    lib math_tr1         : : : :
        <link>shared:<define>BOOST_MATH_TR1_DYN_LINK ;
    lib math_tr1f         : : : :
        <link>shared:<define>BOOST_MATH_TR1_DYN_LINK ;
    lib math_tr1l        : : : :
        <link>shared:<define>BOOST_MATH_TR1_DYN_LINK ;
    lib math_c99         : : : :
        <link>shared:<define>BOOST_MATH_TR1_DYN_LINK ;
    lib math_c99f         : : : :
        <link>shared:<define>BOOST_MATH_TR1_DYN_LINK ;
    lib math_c99l        : : : :
        <link>shared:<define>BOOST_MATH_TR1_DYN_LINK ;
    lib mpi              : : : : 
        <link>shared:<define>BOOST_MPI_DYN_LINK  ;    
    lib program_options  : : : : 
        <link>shared:<define>BOOST_PROGRAM_OPTIONS_DYN_LINK ;
    lib python           : : : : 
        <link>shared:<define>BOOST_PYTHON_DYN_LINK ;
    lib random           : : : :
        <link>shared:<define>BOOST_RANDOM_DYN_LINK ;
    lib regex            : : : : 
        <link>shared:<define>BOOST_REGEX_DYN_LINK  ;
    lib serialization    : : : :
        <link>shared:<define>BOOST_SERIALIZATION_DYN_LINK ;
    lib wserialization   : : : :
        <link>shared:<define>BOOST_SERIALIZATION_DYN_LINK ;
    lib signals          : : : : 
        <link>shared:<define>BOOST_SIGNALS_DYN_LINK  ;
    lib system           : : : : 
        <link>shared:<define>BOOST_SYSTEM_DYN_LINK  ;
    lib unit_test_framework : : : : 
        <link>shared:<define>BOOST_TEST_DYN_LINK  ;
    lib prg_exec_monitor : : : :
        <link>shared:<define>BOOST_TEST_DYN_LINK ;
    lib test_exec_monitor : : : :
        <link>shared:<define>BOOST_TEST_DYN_LINK ;
    lib thread           : : : : 
        <link>shared:<define>BOOST_THREAD_DYN_DLL  ;
    lib wave             : : : : 
        <link>shared:<define>BOOST_WAVE_DYN_LINK  ;
}

rule boost_0_0_1 ( inc ? lib ? )
{
    echo "You are trying to use an example placeholder for boost libs." ;
    # Copy this template to another place (in the file boost.jam)
    # and define a project and libraries modelled after the
    # boost_std rule. Please note that it is also possible to have
    # a per version taging rule in case they are different between
    # versions.
}

rule tag_std ( name : type ? : property-set )
{
    name = boost_$(name) ;
    if  ( [ $(property-set).get <link> ] in static ) &&
        ( [ $(property-set).get <target-os> ] in windows )
    {
        name = lib$(name) ;
    }

    local result ;
    if $(.layout) = system
    {
        local version = [ MATCH ^([0-9]+)_([0-9]+) : $(.version_tag) ] ;
        if $(version[1]) = "1" && [ numbers.less $(version[2]) 39 ]
        {
            result = [ tag_tagged $(name) : $(type) : $(property-set) ] ;
        }
        else
        {
            result = [ tag_system $(name) : $(type) : $(property-set) ] ;
        }
    }
    else if $(.layout) = tagged
    {
        result = [ tag_tagged $(name) : $(type) : $(property-set) ] ;
    }
    else if $(.layout) = versioned
    {
        result = [ tag_versioned $(name) : $(type) : $(property-set) ] ;
    }
    else
    {
        errors.error "Missing layout" ;
    }

    return $(result) ;
}

rule tag_system ( name : type ? : property-set )
{
    return [ common.format-name
             <base> 
             -$(.build_id)
             : $(name) : $(type) : $(property-set) ] ;
}

rule tag_tagged ( name : type ? : property-set )
{
    return [ common.format-name
             <base> <threading> <runtime>
             -$(.build_id)
             : $(name) : $(type) : $(property-set) ] ; 
}

rule tag_versioned ( name : type ? : property-set )
{
    return [ common.format-name
             <base> <toolset> <threading> <runtime> -$(.version_tag)
             -$(.build_id)
             : $(name) : $(type) : $(property-set) ] ;
}
