# 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
  ;
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
            static:BOOST_PYTHON_STATIC_LIB 
            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 ] : /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 ] : no ]
            config-warning
            on:BOOST_DEBUG_PYTHON
            [ cond $(is-py3) : $(py3-version) ]
            -@$(BOOST_JAMROOT_MODULE)%$(BOOST_JAMROOT_MODULE).tag
            @$(BOOST_JAMROOT_MODULE)%$(BOOST_JAMROOT_MODULE).python-tag
        :   # default build
            shared
        :   # usage requirements
            static:BOOST_PYTHON_STATIC_LIB
            on:BOOST_DEBUG_PYTHON
        ;
}
rule lib_boost_numpy ( is-py3 ? )
{
    numpy-include = [ python.numpy-include ] ;
    lib [ cond $(is-py3) : boost_numpy3 : boost_numpy ]
        : # sources
        numpy/dtype.cpp
        numpy/matrix.cpp
        numpy/ndarray.cpp
	numpy/numpy.cpp
	numpy/scalars.cpp
	numpy/ufunc.cpp
        :   # requirements
            [ cond [ python.numpy ] : /python//python_for_extensions ]
            [ unless [ python.numpy ] : no ]
	    $(numpy-include)
	    boost_python
            on:BOOST_DEBUG_PYTHON
            [ cond $(is-py3) : $(py3-version) ]
            -@$(BOOST_JAMROOT_MODULE)%$(BOOST_JAMROOT_MODULE).tag
            @$(BOOST_JAMROOT_MODULE)%$(BOOST_JAMROOT_MODULE).python-tag
        :   # default build
            shared
        :   # usage requirements
            on:BOOST_DEBUG_PYTHON
        ;
}
libraries = boost_python ;
libraries3 = boost_python3 ;
if [ python.numpy ]
{
    libraries += boost_numpy ;
    libraries3 += boost_numpy3 ;
}
lib_boost_python ;
lib_boost_numpy ;
if $(py3-version)
{
    lib_boost_python yes ;
    lib_boost_numpy yes ;
    libraries += $(libraries3) ;
}
boost-install $(libraries) ;