#!/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 works for static linking. t.write("b/jamfile.jam", "lib b : b.cpp : ../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/shared : 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 : png ; lib z : : 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()