#!/usr/bin/python

# Copyright 2003 Dave Abrahams
# Copyright 2002, 2003, 2004, 2006 Vladimir Prus
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)

import BoostBuild

t = BoostBuild.Tester()


# Test that use requirements on main target work (and a propagated all the way
# up, not only to direct dependants).
t.write("jamroot.jam", "import gcc ;")

# Note: 'lib cc ..', not 'lib c'. If using 'lib c: ...' the HP-CXX linker will
# confuse it with the system C runtime.
t.write("jamfile.jam", """
lib b : b.cpp : <link>shared:<define>SHARED_B : :
    <define>FOO <link>shared:<define>SHARED_B ;
lib cc : c.cpp b ;
exe a : a.cpp cc ;
""")

t.write("b.cpp", """
void
#if defined(_WIN32) && defined(SHARED_B)
__declspec(dllexport)
#endif
foo() {}\n
""")

t.write("c.cpp", """
void
#if defined(_WIN32) && defined(SHARED_B)
__declspec(dllexport)
#endif
create_lib_please() {}\n
""")

t.write("a.cpp", """
#ifdef FOO
void
# if defined(_WIN32) && defined(SHARED_B)
__declspec(dllexport)
# endif
foo() {}
#endif
int main() { foo(); }
""")

t.run_build_system()
t.run_build_system("--clean")


# Test that use requirements on main target work, when they are referred using
# 'dependency' features.
t.write("jamroot.jam", "import gcc ;")

t.write("jamfile.jam", """
lib b : b.cpp : <link>shared:<define>SHARED_B : : <define>FOO
    <link>shared:<define>SHARED_B ;
exe a : a.cpp : <use>b ;
""")

t.write("b.cpp", """
void
#if defined(_WIN32) && defined(SHARED_B)
__declspec(dllexport)
#endif
foo() {}
""")

t.write("a.cpp", """
#ifdef FOO
int main() {}
#endif
""")

t.run_build_system()

t.run_build_system("--clean")


# Test that usage requirements on a project work.
t.write("jamfile.jam", "exe a : a.cpp lib//b ;")

t.write("lib/jamfile.jam", """
project
   : requirements <link>shared:<define>SHARED_B
   : usage-requirements <define>FOO <link>shared:<define>SHARED_B ;
lib b : b.cpp ;
""")

t.write("lib/b.cpp", """
void
#if defined(_WIN32) && defined(SHARED_B)
__declspec(dllexport)
#endif
foo() {}\n
""")

t.run_build_system()


# Test that use requirements are inherited correctly.
t.write("jamfile.jam", "exe a : a.cpp lib/1//b ;")

t.write("a.cpp", """
#if defined(FOO) && defined(ZOO)
void foo() {}
#endif
int main() { foo(); }
""")

t.write("lib/jamfile.jam", """
project : requirements : usage-requirements <define>FOO ;
""")

t.write("lib/1/jamfile.jam", """
project
   : requirements <link>shared:<define>SHARED_B
   : usage-requirements <define>ZOO <link>shared:<define>SHARED_B ;
lib b : b.cpp ;
""")

t.write("lib/1/b.cpp", """
void
#if defined(_WIN32) && defined(SHARED_B)
__declspec(dllexport)
#endif
foo() {}\n
""")

t.run_build_system()
t.run_build_system("--clean")


# Test that we correctly handle dependency features in use requirements on
# target.
t.write("jamfile.jam", """
lib b : b.cpp : <link>shared:<define>SHARED_B : : <define>FOO
    <link>shared:<define>SHARED_B ;

# Here's the test: we should correctly handle dependency feature and get usage
# requirements from 'b'.
lib cc : c.cpp : <link>shared:<define>SHARED_C : : <library>b ;

# This will build only if <define>FOO was propagated from 'c'.
exe a : a.cpp cc ;
""")

t.write("a.cpp", """
#ifdef FOO
void
# if defined(_WIN32) && defined(SHARED_B)
__declspec(dllexport)
# endif
foo();
#endif

int main() { foo(); }
""")

t.write("c.cpp", """
int
#if defined(_WIN32) && defined(SHARED_C)
__declspec(dllexport)
#endif
must_export_something;
""")

t.run_build_system()
t.run_build_system("--clean")


# Test correct handling of dependency features in project requirements.
t.write("jamfile.jam", """
exe a : a.cpp lib1//cc ;
""")

t.write("lib1/jamfile.jam", """
project
    : requirements <link>shared:<define>SHARED_C
    : usage-requirements <library>../lib2//b <link>shared:<define>SHARED_C ;
lib cc : c.cpp ;
""")

t.write("lib1/c.cpp", """
int
#if defined(_WIN32) && defined(SHARED_C)
__declspec(dllexport)
#endif
must_export_something;
""")

t.write("lib2/jamfile.jam", """
lib b : b.cpp : <link>shared:<define>SHARED_B : : <define>FOO
    <link>shared:<define>SHARED_B ;
""")

t.copy("b.cpp", "lib2/b.cpp")

t.run_build_system()


# Test that dependency feature in use requirements are built with the correct
# properties.
t.rm(".")

t.write("jamfile.jam", """
lib main : main.cpp : <use>libs//lib1 : : <library>libs//lib1 ;
exe hello : hello.cpp main : ;
""")

t.write("main.cpp", """
void
#if defined(_WIN32) && defined(SHARED_LIB1)
__declspec(dllimport)
#endif
foo();

int main() { foo(); }
""")

t.write("hello.cpp", "\n")

t.write("jamroot.jam", """
import gcc ;
""")

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


# This library should be build with the same properties as 'main'. This is a
# regression test for a bug when they were generated with empty properties, and
# there were ambiguity between variants.
t.write("libs/jamfile.jam", """
lib lib1 : a_d.cpp : <variant>debug <link>shared:<define>SHARED_LIB1 : :
    <link>shared:<define>SHARED_LIB1 ;
lib lib1 : a.cpp : <variant>release <link>shared:<define>SHARED_LIB1 : :
    <link>shared:<define>SHARED_LIB1 ;
""")

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

t.run_build_system("link=static")
t.expect_addition("libs/bin/$toolset/debug/link-static/a_d.obj")


# Test that indirect conditionals are respected in usage requirements.
t.rm(".")

t.write("jamroot.jam", """
rule has-foo ( properties * )
{
    return <define>HAS_FOO ;
}

exe a : a.cpp b ;
lib b : b.cpp : <link>static : : <conditional>@has-foo ;
""")

t.write("a.cpp", """
#ifdef HAS_FOO
void foo();
int main() { foo(); }
#endif
""")

t.write("b.cpp", """
void
#if defined(_WIN32) && defined(SHARED_B)
__declspec(dllexport)
#endif
foo() {}\n
""")

t.run_build_system()
t.expect_addition("bin/$toolset/debug/a.exe")

t.cleanup()
