summaryrefslogtreecommitdiff
path: root/tools/build/v2/test/library_chain.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/build/v2/test/library_chain.py')
-rw-r--r--tools/build/v2/test/library_chain.py166
1 files changed, 166 insertions, 0 deletions
diff --git a/tools/build/v2/test/library_chain.py b/tools/build/v2/test/library_chain.py
new file mode 100644
index 0000000000..a51056ef95
--- /dev/null
+++ b/tools/build/v2/test/library_chain.py
@@ -0,0 +1,166 @@
+#!/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()