#!/usr/bin/python # Copyright 2003 Dave Abrahams # Copyright 2002, 2003, 2004, 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) import BoostBuild t = BoostBuild.Tester() # Test that use requirements on main target work (and a propagated all the way # up, not only to direct dependants). t.write("jamroot.jam", "import gcc ;") # Note: 'lib cc ..', not 'lib c'. If using 'lib c: ...' the HP-CXX linker will # confuse it with the system C runtime. t.write("jamfile.jam", """ lib b : b.cpp : shared:SHARED_B : : FOO shared:SHARED_B ; lib cc : c.cpp b ; exe a : a.cpp cc ; """) t.write("b.cpp", """ void #if defined(_WIN32) && defined(SHARED_B) __declspec(dllexport) #endif foo() {}\n """) t.write("c.cpp", """ void #if defined(_WIN32) && defined(SHARED_B) __declspec(dllexport) #endif create_lib_please() {}\n """) t.write("a.cpp", """ #ifdef FOO void # if defined(_WIN32) && defined(SHARED_B) __declspec(dllexport) # endif foo() {} #endif int main() { foo(); } """) t.run_build_system() t.run_build_system("--clean") # Test that use requirements on main target work, when they are referred using # 'dependency' features. t.write("jamroot.jam", "import gcc ;") t.write("jamfile.jam", """ lib b : b.cpp : shared:SHARED_B : : FOO shared:SHARED_B ; exe a : a.cpp : b ; """) t.write("b.cpp", """ void #if defined(_WIN32) && defined(SHARED_B) __declspec(dllexport) #endif foo() {} """) t.write("a.cpp", """ #ifdef FOO int main() {} #endif """) t.run_build_system() t.run_build_system("--clean") # Test that usage requirements on a project work. t.write("jamfile.jam", "exe a : a.cpp lib//b ;") t.write("lib/jamfile.jam", """ project : requirements shared:SHARED_B : usage-requirements FOO shared:SHARED_B ; lib b : b.cpp ; """) t.write("lib/b.cpp", """ void #if defined(_WIN32) && defined(SHARED_B) __declspec(dllexport) #endif foo() {}\n """) t.run_build_system() # Test that use requirements are inherited correctly. t.write("jamfile.jam", "exe a : a.cpp lib/1//b ;") t.write("a.cpp", """ #if defined(FOO) && defined(ZOO) void foo() {} #endif int main() { foo(); } """) t.write("lib/jamfile.jam", """ project : requirements : usage-requirements FOO ; """) t.write("lib/1/jamfile.jam", """ project : requirements shared:SHARED_B : usage-requirements ZOO shared:SHARED_B ; lib b : b.cpp ; """) t.write("lib/1/b.cpp", """ void #if defined(_WIN32) && defined(SHARED_B) __declspec(dllexport) #endif foo() {}\n """) t.run_build_system() t.run_build_system("--clean") # Test that we correctly handle dependency features in use requirements on # target. t.write("jamfile.jam", """ lib b : b.cpp : shared:SHARED_B : : FOO shared:SHARED_B ; # Here's the test: we should correctly handle dependency feature and get usage # requirements from 'b'. lib cc : c.cpp : shared:SHARED_C : : b ; # This will build only if FOO was propagated from 'c'. exe a : a.cpp cc ; """) t.write("a.cpp", """ #ifdef FOO void # if defined(_WIN32) && defined(SHARED_B) __declspec(dllexport) # endif foo(); #endif int main() { foo(); } """) t.write("c.cpp", """ int #if defined(_WIN32) && defined(SHARED_C) __declspec(dllexport) #endif must_export_something; """) t.run_build_system() t.run_build_system("--clean") # Test correct handling of dependency features in project requirements. t.write("jamfile.jam", """ exe a : a.cpp lib1//cc ; """) t.write("lib1/jamfile.jam", """ project : requirements shared:SHARED_C : usage-requirements ../lib2//b shared:SHARED_C ; lib cc : c.cpp ; """) t.write("lib1/c.cpp", """ int #if defined(_WIN32) && defined(SHARED_C) __declspec(dllexport) #endif must_export_something; """) t.write("lib2/jamfile.jam", """ lib b : b.cpp : shared:SHARED_B : : FOO shared:SHARED_B ; """) t.copy("b.cpp", "lib2/b.cpp") t.run_build_system() # Test that dependency feature in use requirements are built with the correct # properties. t.rm(".") t.write("jamfile.jam", """ lib main : main.cpp : libs//lib1 : : libs//lib1 ; exe hello : hello.cpp main : ; """) t.write("main.cpp", """ void #if defined(_WIN32) && defined(SHARED_LIB1) __declspec(dllimport) #endif foo(); int main() { foo(); } """) t.write("hello.cpp", "\n") t.write("jamroot.jam", """ import gcc ; """) t.write("libs/a.cpp", """ void #if defined(_WIN32) && defined(SHARED_LIB1) __declspec(dllexport) #endif foo() {} """) # This library should be build with the same properties as 'main'. This is a # regression test for a bug when they were generated with empty properties, and # there were ambiguity between variants. t.write("libs/jamfile.jam", """ lib lib1 : a_d.cpp : debug shared:SHARED_LIB1 : : shared:SHARED_LIB1 ; lib lib1 : a.cpp : release shared:SHARED_LIB1 : : shared:SHARED_LIB1 ; """) t.write("libs/a_d.cpp", """ void #if defined(_WIN32) && defined(SHARED_LIB1) __declspec(dllexport) #endif foo() {} """) t.run_build_system("link=static") t.expect_addition("libs/bin/$toolset/debug/link-static/a_d.obj") # Test that indirect conditionals are respected in usage requirements. t.rm(".") t.write("jamroot.jam", """ rule has-foo ( properties * ) { return HAS_FOO ; } exe a : a.cpp b ; lib b : b.cpp : static : : @has-foo ; """) t.write("a.cpp", """ #ifdef HAS_FOO void foo(); int main() { foo(); } #endif """) t.write("b.cpp", """ void #if defined(_WIN32) && defined(SHARED_B) __declspec(dllexport) #endif foo() {}\n """) t.run_build_system() t.expect_addition("bin/$toolset/debug/a.exe") t.cleanup()