#!/usr/bin/python

# Copyright (C) Vladimir Prus 2003. Permission to copy, use, modify, sell and
# distribute this software is granted provided this copyright notice appears in
# all copies. This software is provided "as is" without express or implied
# warranty, and with no claim as to its suitability for any purpose.

# Test that the <dll-path> property is correctly set when using
# <hardcode-dll-paths>true.

import BoostBuild

t = BoostBuild.Tester()

# The point of this test is to have exe "main" which uses library "b", which
# uses library "a". When "main" is built with <hardcode-dll-paths>true, paths to
# both libraries should be present as values of <dll-path> feature. We create a
# special target type which reports <dll-path> values on its sources and compare
# the list of found values with out expectations.

t.write("jamfile.jam", """
exe main : main.cpp b//b ;
explicit main ;
path-list mp : main ;
""")

t.write("main.cpp", """
int main() {}
""")

t.write("jamroot.jam", """
using dll-paths ;
""")

t.write("dll-paths.jam", """
import type ;
import generators ;
import feature ;
import sequence ;
import print ;
import "class" : new ;

rule init ( )
{
    type.register PATH_LIST : pathlist ;

    class dll-paths-list-generator : generator
    {
        rule __init__ ( )
        {
            generator.__init__ dll-paths.list : EXE : PATH_LIST ;
        }

        rule generated-targets ( sources + : property-set : project name ? )
        {
            local dll-paths ;
            for local s in $(sources)
            {
                local a = [ $(s).action ] ;
                if $(a)
                {
                    local p = [ $(a).properties ] ;
                    dll-paths += [ $(p).get <dll-path> ] ;
                }
            }
            return [ generator.generated-targets $(sources) :
                [ $(property-set).add-raw $(dll-paths:G=<dll-path>) ] :
                $(project) $(name) ] ;

        }
    }
    generators.register [ new dll-paths-list-generator ] ;
}

rule list ( target : sources * : properties * )
{
    local paths = [ feature.get-values <dll-path> : $(properties) ] ;
    paths = [ sequence.insertion-sort $(paths) ] ;
    print.output $(target) ;
    print.text $(paths) ;
}
""")

t.write("a/a.cpp", """
void
#if defined(_WIN32)
__declspec(dllexport)
#endif
foo() {}
""")

t.write("a/jamfile.jam", """
lib a : a.cpp ;
""")

t.write("b/b.cpp", """
void
#if defined(_WIN32)
__declspec(dllexport)
#endif
bar() {}
""")

t.write("b/jamfile.jam", """
lib b : b.cpp ../a//a ;
""")

t.run_build_system("hardcode-dll-paths=true")

t.expect_addition("bin/$toolset/debug/mp.pathlist")

es1 = t.adjust_names(["a/bin/$toolset/debug"])[0]
es2 = t.adjust_names(["b/bin/$toolset/debug"])[0]

t.expect_content_line("bin/$toolset/debug/mp.pathlist", "*" + es1);
t.expect_content_line("bin/$toolset/debug/mp.pathlist", "*" + es2);

t.cleanup()
