# Boost serialization Library Build Jamfile
#  (C) Copyright Robert Ramey 2002-2004.
#  Use, modification, and distribution are subject to 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)
#
#  See http://www.boost.org/libs/serialization for the library home page.

project boost/serialization
    : source-location ../src
    : requirements
      <conditional>@include-spirit
;

SPIRIT_ROOT = [ modules.peek : SPIRIT_ROOT ] ;
rule include-spirit ( properties * )
{
    local old-compiler ;
    if <toolset>borland in $(properties)
    {
        if ! <toolset-borland:version>6.1.0 in $(properties)  
        {  
            old-compiler = true ;  
        }  

    }
    else if <toolset>msvc in $(properties)
    {
        if <toolset-msvc:version>6.5 in $(properties)
          || <toolset-msvc:version>7.0 in $(properties)
        {            
            old-compiler = true ;
        }        
    }
        
    local result ;
    if $(old-compiler)
    {        
        if $(SPIRIT_ROOT)
        {
            # note - we can't use <include>$(SPIRIT_ROOT) because 
            # it puts -I$(SPIRIT_ROOT) AFTER the "../../.." in the command line.
            # so use these instead 
            result = <cxxflags>-I$(SPIRIT_ROOT) ;
        }
        else 
        {
            echo **** spirit 1.6x required to build library with this compiler **** ;
            result = <build>no ;
        }
    }    
    return $(result) ;
}

SOURCES = 
    archive_exception
    basic_archive
    basic_iarchive
    basic_iserializer
    basic_oarchive
    basic_oserializer
    basic_pointer_iserializer
    basic_pointer_oserializer
    basic_serializer_map
    basic_text_iprimitive
    basic_text_oprimitive
    basic_xml_archive
    binary_iarchive
    binary_oarchive
    extended_type_info
    extended_type_info_typeid
    extended_type_info_no_rtti
    polymorphic_iarchive
    polymorphic_oarchive
    stl_port
    text_iarchive
    text_oarchive
    polymorphic_text_iarchive
    polymorphic_text_oarchive
    polymorphic_binary_iarchive
    polymorphic_binary_oarchive
    polymorphic_xml_iarchive
    polymorphic_xml_oarchive
    void_cast
    xml_grammar
    xml_iarchive
    xml_archive_exception
    codecvt_null
 ;

SOURCES_HAS_STD_LOCALE = 
    xml_oarchive
    utf8_codecvt_facet
;

WSOURCES = 
    basic_text_wiprimitive
    basic_text_woprimitive
    text_wiarchive
    text_woarchive
    polymorphic_text_wiarchive
    polymorphic_text_woarchive
    xml_wgrammar
    xml_wiarchive
    xml_woarchive
    polymorphic_xml_wiarchive
    polymorphic_xml_woarchive
;

rule has-config-flag ( flag : properties * )
{
    if ( "<define>$(flag)" in $(properties) || "<define>$(flag)=1" in $(properties) )
    {
        return 1 ;
    }
    else
    {
        return ;
    }
}

rule select-define-specific-sources ( properties * )
{
    local result ;
    if ! [ has-config-flag BOOST_NO_STD_LOCALE : $(properties) ]
    {
        result += <source>$(SOURCES_HAS_STD_LOCALE).cpp ;
    }

    #ECHO additional sources $(result) ;

    return $(result) ;
}

rule should-build-wserialization ( properties * )
{
    local result ;
    if [ has-config-flag BOOST_NO_STD_LOCALE : $(properties) ]
    {
        result += <build>no ;
    }

    #ECHO should build wserialization $(result) ;

    return $(result) ;
}

lib boost_serialization 
    : ## sources ##
     $(SOURCES).cpp
    : ## requirements ##
    <conditional>@select-define-specific-sources
    <toolset>msvc:<cxxflags>/Gy
    <toolset>msvc:<define>_SCL_SECURE_NO_WARNINGS
    <toolset>msvc:<define>_CRT_SECURE_NO_WARNINGS
    <toolset>clang:<cxxflags>"-fvisibility=hidden -fvisibility-inlines-hidden"
    <toolset>gcc:<cxxflags>"-fvisibility=hidden -fvisibility-inlines-hidden"
    <toolset>darwin:<cxxflags>"-fvisibility=hidden -fvisibility-inlines-hidden"
    <toolset>gcc:<cxxflags>"-ftemplate-depth-255"
    <toolset>clang:<cxxflags>"-ftemplate-depth-255"
    <toolset>darwin:<cxxflags>"-ftemplate-depth-255"
    <link>shared:<define>BOOST_SERIALIZATION_DYN_LINK=1
    ;

lib boost_wserialization 
    : $(WSOURCES).cpp boost_serialization 
    : 
    <conditional>@should-build-wserialization
    <toolset>msvc:<cxxflags>/Gy 
    <toolset>msvc:<define>_SCL_SECURE_NO_WARNINGS
    <toolset>msvc:<define>_CRT_SECURE_NO_WARNINGS
    <toolset>clang:<cxxflags>"-fvisibility=hidden -fvisibility-inlines-hidden"
    <toolset>gcc:<cxxflags>"-fvisibility=hidden -fvisibility-inlines-hidden"
    <toolset>darwin:<cxxflags>"-fvisibility=hidden -fvisibility-inlines-hidden"
    <toolset>gcc:<cxxflags>"-ftemplate-depth-255"
    <toolset>clang:<cxxflags>"-ftemplate-depth-255"
    <toolset>darwin:<cxxflags>"-ftemplate-depth-255"
    # note: both serialization and wserialization are conditioned on the this
    # switch - don't change it to BOOST_WSERIALIZATION_DYN_LINK
    <link>shared:<define>BOOST_SERIALIZATION_DYN_LINK=1
    ;

boost-install boost_serialization boost_wserialization ;
