1#!/usr/bin/python 2 3# Copyright 2003 Dave Abrahams 4# Copyright 2003, 2004, 2005, 2006 Vladimir Prus 5# Distributed under the Boost Software License, Version 1.0. 6# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) 7 8# Test usage of searched-libs: one which are found via -l 9# switch to the linker/compiler. 10 11import BoostBuild 12import os 13import string 14 15t = BoostBuild.Tester(use_test_config=False) 16 17 18# To start with, we have to prepare a library to link with. 19t.write("lib/jamroot.jam", "") 20t.write("lib/jamfile.jam", "lib test_lib : test_lib.cpp ;") 21t.write("lib/test_lib.cpp", """\ 22#ifdef _WIN32 23__declspec(dllexport) 24#endif 25void foo() {} 26"""); 27 28t.run_build_system(subdir="lib") 29t.expect_addition("lib/bin/$toolset/debug*/test_lib.dll") 30 31 32# Auto adjusting of suffixes does not work, since we need to 33# change dll to lib. 34if ( ( os.name == "nt" ) or os.uname()[0].lower().startswith("cygwin") ) and \ 35 ( BoostBuild.get_toolset() != "gcc" ): 36 t.copy("lib/bin/$toolset/debug*/test_lib.implib", "lib/test_lib.implib") 37 t.copy("lib/bin/$toolset/debug*/test_lib.dll", "lib/test_lib.dll") 38else: 39 t.copy("lib/bin/$toolset/debug*/test_lib.dll", "lib/test_lib.dll") 40 41 42# Test that the simplest usage of searched library works. 43t.write("jamroot.jam", "") 44 45t.write("jamfile.jam", """\ 46import path ; 47import project ; 48exe main : main.cpp helper ; 49lib helper : helper.cpp test_lib ; 50lib test_lib : : <name>test_lib <search>lib ; 51""") 52 53t.write("main.cpp", """\ 54void helper(); 55int main() { helper(); } 56""") 57 58t.write("helper.cpp", """\ 59void foo(); 60void 61#if defined(_WIN32) 62__declspec(dllexport) 63#endif 64helper() { foo(); } 65""") 66 67t.run_build_system(["-d2"]) 68t.expect_addition("bin/$toolset/debug*/main.exe") 69t.rm("bin/$toolset/debug/main.exe") 70t.rm("bin/$toolset/debug/*/main.exe") 71 72 73# Test that 'unit-test' will correctly add runtime paths to searched libraries. 74t.write("jamfile.jam", """\ 75import path ; 76import project ; 77import testing ; 78 79project : requirements <hardcode-dll-paths>false ; 80 81unit-test main : main.cpp helper ; 82lib helper : helper.cpp test_lib ; 83lib test_lib : : <name>test_lib <search>lib ; 84""") 85 86t.run_build_system() 87t.expect_addition("bin/$toolset/debug*/main.passed") 88t.rm("bin/$toolset/debug/main.exe") 89t.rm("bin/$toolset/debug/*/main.exe") 90 91 92# Now try using searched lib from static lib. Request shared version of searched 93# lib, since we do not have a static one handy. 94t.write("jamfile.jam", """\ 95exe main : main.cpp helper ; 96lib helper : helper.cpp test_lib/<link>shared : <link>static ; 97lib test_lib : : <name>test_lib <search>lib ; 98""") 99 100t.run_build_system(stderr=None) 101t.expect_addition("bin/$toolset/debug*/main.exe") 102t.expect_addition("bin/$toolset/debug/link-static*/helper.lib") 103t.rm("bin/$toolset/debug/main.exe") 104t.rm("bin/$toolset/debug/*/main.exe") 105 106# A regression test: <library>property referring to searched-lib was being 107# mishandled. As the result, we were putting target name to the command line! 108# Note that 109# g++ ...... <.>z 110# works nicely in some cases, sending output from compiler to file 'z'. This 111# problem shows up when searched libs are in usage requirements. 112t.write("jamfile.jam", "exe main : main.cpp d/d2//a ;") 113t.write("main.cpp", """\ 114void foo(); 115int main() { foo(); } 116""") 117 118t.write("d/d2/jamfile.jam", """\ 119lib test_lib : : <name>test_lib <search>../../lib ; 120lib a : a.cpp : : : <library>test_lib ; 121""") 122 123t.write("d/d2/a.cpp", """\ 124#ifdef _WIN32 125__declspec(dllexport) int force_library_creation_for_a; 126#endif 127""") 128 129t.run_build_system() 130 131 132# A regression test. Searched targets were not associated with any properties. 133# For that reason, if the same searched lib is generated with two different 134# properties, we had an error saying they are actualized to the same Jam target 135# name. 136t.write("jamroot.jam", "") 137 138t.write("a.cpp", "") 139 140# The 'l' library will be built in two variants: 'debug' (directly requested) 141# and 'release' (requested from 'a'). 142t.write("jamfile.jam", """\ 143exe a : a.cpp l/<variant>release ; 144lib l : : <name>l_d <variant>debug ; 145lib l : : <name>l_r <variant>release ; 146""") 147 148t.run_build_system(["-n"]) 149 150 151# A regression test. Two virtual target with the same properties were created 152# for 'l' target, which caused and error to be reported when actualizing 153# targets. The final error is correct, but we should not create two duplicated 154# targets. Thanks to Andre Hentz for finding this bug. 155t.write("jamroot.jam", "") 156t.write("a.cpp", "") 157t.write("jamfile.jam", """\ 158project a : requirements <runtime-link>static ; 159static-lib a : a.cpp l ; 160lib l : : <name>l_f ; 161""") 162 163t.run_build_system(["-n"]) 164 165 166# Make sure plain "lib foobar ; " works. 167t.write("jamfile.jam", """\ 168exe a : a.cpp foobar ; 169lib foobar ; 170""") 171 172t.run_build_system(["-n", "-d2"]) 173t.fail_test(t.stdout().find("foobar") == -1) 174 175 176# Make sure plain "lib foo bar ; " works. 177t.write("jamfile.jam", """\ 178exe a : a.cpp foo bar ; 179lib foo bar ; 180""") 181 182t.run_build_system(["-n", "-d2"]) 183t.fail_test(t.stdout().find("foo") == -1) 184t.fail_test(t.stdout().find("bar") == -1) 185 186t.cleanup() 187