| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- #!/usr/bin/python
- # Copyright 2003, 2004, 2005, 2006 Vladimir Prus
- # Distributed under the Boost Software License, Version 1.0.
- # (See accompanying file LICENSE.txt or https://www.bfgroup.xyz/b2/LICENSE.txt)
- # Test that a chain of libraries works ok, no matter if we use static or shared
- # linking.
- import BoostBuild
- import os
- import string
- import sys
- t = BoostBuild.Tester(use_test_config=False)
- # Stage the binary, so that it will be relinked without hardcode-dll-paths.
- # That will check that we pass correct -rpath-link, even if not passing -rpath.
- t.write("jamfile.jam", """\
- 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 ( open(rsp).read().find("zzz") != -1 ):
- pass
- elif t.stdout().find("zzz") != -1:
- pass
- else:
- t.fail_test(1)
- # Test main -> libb -> liba chain in the case where liba is a file and not a
- # B2 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 sys.platform == 'win32':
- # This is a Windows import library.
- file = t.adjust_name("a.implib")
- else:
- file = t.adjust_name("a.dll")
- t.write("b/jamfile.jam", "lib b : b.cpp ../a/dist/%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()
|