| #!/usr/bin/python |
| |
| # Copyright 2003, 2004, 2005, 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) |
| |
| # Test that a chain of libraries works ok, no matter if we use static or shared |
| # linking. |
| |
| import BoostBuild |
| import string |
| import os |
| |
| t = BoostBuild.Tester() |
| |
| t.write("jamfile.jam", """ |
| # Stage the binary, so that it will be relinked without hardcode-dll-paths. That |
| # will chech that we pass correct -rpath-link, even if not passing -rpath. |
| stage dist : main ; |
| exe main : main.cpp b ; |
| """) |
| |
| t.write("main.cpp", """ |
| void foo(); |
| int main() { foo(); } |
| """) |
| |
| t.write("jamroot.jam", """ |
| """) |
| |
| t.write("a/a.cpp", """ |
| void |
| #if defined(_WIN32) |
| __declspec(dllexport) |
| #endif |
| gee() {} |
| void |
| #if defined(_WIN32) |
| __declspec(dllexport) |
| #endif |
| geek() {} |
| """) |
| |
| t.write("a/jamfile.jam", """ |
| lib a : a.cpp ; |
| """) |
| |
| t.write("b/b.cpp", """ |
| void geek(); |
| void |
| #if defined(_WIN32) |
| __declspec(dllexport) |
| #endif |
| foo() { geek(); } |
| """) |
| |
| t.write("b/jamfile.jam", """ |
| lib b : b.cpp ../a//a ; |
| """) |
| |
| t.run_build_system("-d2", stderr=None) |
| t.expect_addition("bin/$toolset/debug/main.exe") |
| t.rm(["bin", "a/bin", "b/bin"]) |
| |
| t.run_build_system("link=static") |
| t.expect_addition("bin/$toolset/debug/link-static/main.exe") |
| t.rm(["bin", "a/bin", "b/bin"]) |
| |
| |
| # Check that <library> works for static linking. |
| t.write("b/jamfile.jam", """ |
| lib b : b.cpp : <library>../a//a ; |
| """) |
| |
| t.run_build_system("link=static") |
| t.expect_addition("bin/$toolset/debug/link-static/main.exe") |
| |
| t.rm(["bin", "a/bin", "b/bin"]) |
| |
| t.write("b/jamfile.jam", """ |
| lib b : b.cpp ../a//a/<link>shared : <link>static ; |
| """) |
| |
| t.run_build_system() |
| t.expect_addition("bin/$toolset/debug/main.exe") |
| |
| t.rm(["bin", "a/bin", "b/bin"]) |
| |
| |
| # Test that putting a library in sources of a searched library works. |
| t.write("jamfile.jam", """ |
| exe main : main.cpp png ; |
| lib png : z : <name>png ; |
| lib z : : <name>zzz ; |
| """) |
| |
| t.run_build_system("-a -d+2", status=None, stderr=None) |
| # Try to find the "zzz" string either in response file (for Windows compilers), |
| # or in the standard output. |
| rsp = t.adjust_names("bin/$toolset/debug/main.exe.rsp")[0] |
| if os.path.exists(rsp) and ( string.find(open(rsp).read(), "zzz") != -1 ): |
| pass |
| elif string.find(t.stdout(), "zzz") != -1: |
| pass |
| else: |
| t.fail_test(1) |
| |
| # Test main -> libb -> liba chain in the case where liba is a file and not a |
| # Boost.Build target. |
| t.rm(".") |
| |
| t.write("jamroot.jam", "") |
| |
| t.write("a/jamfile.jam", """ |
| lib a : a.cpp ; |
| install dist : a ; |
| """) |
| |
| t.write("a/a.cpp", """ |
| #if defined(_WIN32) |
| __declspec(dllexport) |
| #endif |
| void a() {} |
| """) |
| |
| t.run_build_system(subdir="a") |
| t.expect_addition("a/dist/a.dll") |
| |
| if ( ( os.name == 'nt' ) or os.uname()[0].lower().startswith('cygwin') ) and \ |
| ( BoostBuild.get_toolset() != 'gcc' ): |
| # This is windows import library -- we know the exact name. |
| file = "a/dist/a.lib" |
| else: |
| file = t.adjust_names(["a/dist/a.dll"])[0] |
| |
| t.write("b/jamfile.jam", """ |
| lib b : b.cpp ../%s ; |
| """ % file) |
| |
| t.write("b/b.cpp", """ |
| #if defined(_WIN32) |
| __declspec(dllimport) |
| #endif |
| void a(); |
| #if defined(_WIN32) |
| __declspec(dllexport) |
| #endif |
| void b() { a(); } |
| """) |
| |
| t.write("jamroot.jam", """ |
| exe main : main.cpp b//b ; |
| """) |
| |
| t.write("main.cpp", """ |
| #if defined(_WIN32) |
| __declspec(dllimport) |
| #endif |
| void b(); |
| int main() { b(); } |
| """) |
| |
| t.run_build_system() |
| t.expect_addition("bin/$toolset/debug/main.exe") |
| |
| t.cleanup() |