# copyright John Maddock 2006
# 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)

import type ;

type.register AUTOLINK_LIB ;

import generators ;
import "class" : new ;

# This generator creates library using standard generators,
# and then add <library-path> usage requirements with the
# path of the created library.
class autolink-generator : generator
{
    import generators ;
    import "class" ;
    import property-set ;
    import path ;

    rule run ( project name ? : property-set : sources + )
    {
        local result = [ generators.construct $(project) $(name)
            : LIB : $(property-set) : $(sources) ] ;
                            
        local targets ;
        local usage-requirements ;
        
        if [ class.is-a $(result[1]) : property-set ]
        {
            usage-requirements = $(result[1]) ;
            targets = $(result[2-]) ;
        }
        else
        {
            usage-requirements = [ property-set.empty ] ;
            targets = $(result) ;
        }
        
        local extra ;
        local paths ;
        local pwd = [ path.pwd ] ;
        for local t in $(targets)
        {
            if [ type.is-derived [ $(t).type ] LIB ] 
            {
                paths += [ path.root [ path.make [ $(t).path ] ] $(pwd) ] ;
            }                                            
        }
        extra += $(paths:G=<library-path>) ;
        if $(extra)
        {
            extra = [ sequence.unique $(extra) ] ;
            usage-requirements = [ $(usage-requirements).add-raw $(extra) ] ;
        }
        return $(usage-requirements) $(targets) ;
    }
}

generators.register [ 
  new autolink-generator $(__name__).autolink  : : AUTOLINK_LIB ] ;

project : requirements -<threading>multi <hardcode-dll-paths>false ;

autolink-lib link_test : ../link_test.cpp 
    : <link>shared:<define>BOOST_DYN_LINK=1
    : 
    ;
    
   
explicit link_test ;

run ../main.cpp link_test
  : : : <toolset>msvc-8.0:<build>no <toolset>msvc-9.0:<build>no <toolset>msvc-10.0:<build>no <link>static <runtime-link>static <threading>single debug : link_test_ssd ;

run ../main.cpp link_test
  : : : <toolset>msvc-8.0:<build>no <toolset>msvc-9.0:<build>no <toolset>msvc-10.0:<build>no <link>static <runtime-link>static <threading>single release : link_test_ssr ;

run ../main.cpp link_test
  : : : <link>static <runtime-link>static <threading>multi debug : link_test_smd ;

run ../main.cpp link_test
  : : : <link>static <runtime-link>static <threading>multi release : link_test_smr ;

run ../main.cpp link_test
  : : : <link>static <runtime-link>shared <threading>multi debug : link_test_dmd ;

run ../main.cpp link_test
  : : : <link>static <runtime-link>shared <threading>multi release : link_test_dmr ;

run ../main.cpp link_test
  : : : <link>static <runtime-link>shared <threading>single debug : link_test_dsd ;

run ../main.cpp link_test
  : : : <link>static <runtime-link>shared <threading>single release : link_test_dsr ;

run ../main.cpp link_test
  : : : <define>BOOST_DYN_LINK=1 <link>shared <runtime-link>shared <threading>multi debug : link_test_dll_dmd ;

run ../main.cpp link_test
  : : : <define>BOOST_DYN_LINK=1 <link>shared <runtime-link>shared <threading>multi release : link_test_dll_dmr ;

run ../main.cpp link_test
  : : : <define>BOOST_DYN_LINK=1 <link>shared <runtime-link>shared <threading>single debug : link_test_dll_dsd ;

run ../main.cpp link_test
  : : : <define>BOOST_DYN_LINK=1 <link>shared <runtime-link>shared <threading>single release : link_test_dll_dsr ;








