# Copyright David Abrahams 2001-2006. 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 os ;
import indirect ;
import modules ;
import feature ;

import python ;

if ! [ python.configured ] && ! ( --without-python in  [ modules.peek : ARGV ] )
{
    # Attempt default configuration of python
    import toolset : using ;
    using python ;
}

if [ python.configured ] || ( --without-python in  [ modules.peek : ARGV ] )
{
    alias config-warning ;
}
else
{
    message config-warning
        : "warning: No python installation configured and autoconfiguration"
        : "note: failed.  See http://www.boost.org/libs/python/doc/building.html"
        : "note: for configuration instructions or pass --without-python to"
        : "note: suppress this message and silently skip all Boost.Python targets"
        ;
}

rule find-py3-version
{
    local versions = [ feature.values python ] ;
    local py3ver ;
    for local v in $(versions)
    {
        if $(v) >= 3.0
        {
            py3ver = $(v) ;
        }
    }
    return $(py3ver) ;
}

py3-version = [ find-py3-version ] ;

project boost/python
  : source-location ../src
  : requirements
    -<tag>@$(BOOST_JAMROOT_MODULE)%$(BOOST_JAMROOT_MODULE).tag
    <tag>@$(__name__).tag
  ;

rule tag ( name : type ? : property-set )
{
    local result = $(name) ;
    if $(type) in STATIC_LIB SHARED_LIB IMPORT_LIB
    {
        if $(name) = boost_python && $(PYTHON_ID)
        {
            result = $(result)-$(PYTHON_ID) ;
        }
    }
    
    # forward to the boost tagging rule
    return  [ indirect.call $(BOOST_JAMROOT_MODULE)%$(BOOST_JAMROOT_MODULE).tag 
                $(result) : $(type) : $(property-set) ] ;
}

rule cond ( test ? : yes * : no * ) { if $(test) { return $(yes) ; } else { return $(no) ; } }
rule unless ( test ? : yes * : no * ) { if ! $(test) { return $(yes) ; } else { return $(no) ; } }

rule lib_boost_python ( is-py3 ? )
{

    lib [ cond $(is-py3) : boost_python3 : boost_python ]
        : # sources
        numeric.cpp
        list.cpp
        long.cpp
        dict.cpp
        tuple.cpp
        str.cpp
        slice.cpp

        converter/from_python.cpp
        converter/registry.cpp
        converter/type_id.cpp
        object/enum.cpp
        object/class.cpp
        object/function.cpp
        object/inheritance.cpp
        object/life_support.cpp
        object/pickle_support.cpp
        errors.cpp
        module.cpp
        converter/builtin_converters.cpp
        converter/arg_to_python_base.cpp
        object/iterator.cpp
        object/stl_iterator.cpp
        object_protocol.cpp
        object_operators.cpp
        wrapper.cpp
        import.cpp
        exec.cpp
        object/function_doc_signature.cpp
        :   # requirements
            <link>static:<define>BOOST_PYTHON_STATIC_LIB 
            <define>BOOST_PYTHON_SOURCE
          
            # On Windows, all code using Python has to link to the Python
            # import library.
            #
            # On *nix we never link libboost_python to libpython.  When
            # extending Python, all Python symbols are provided by the
            # Python interpreter executable.  When embedding Python, the
            # client executable is expected to explicitly link to
            # /python//python (the target representing libpython) itself.
            #
            # python_for_extensions is a target defined by Boost.Build to
            # provide the Python include paths, and on Windows, the Python
            # import library, as usage requirements.
            [ cond [ python.configured ] : <library>/python//python_for_extensions ]
            
            # we prevent building when there is no python available
            # as it's not possible anyway, and to cause dependents to
            # fail to build
            [ unless [ python.configured ] : <build>no ]
            <dependency>config-warning

            <python-debugging>on:<define>BOOST_DEBUG_PYTHON
            [ cond $(is-py3) : <python>$(py3-version) ]
        :   # default build
            <link>shared
        :   # usage requirements
            <link>static:<define>BOOST_PYTHON_STATIC_LIB
            <python-debugging>on:<define>BOOST_DEBUG_PYTHON
        ;

}

lib_boost_python ;
boost-install boost_python ;

if $(py3-version)
{
    lib_boost_python yes ;
    boost-install boost_python3 ;
}
