#!/usr/bin/python

# Copyright 2003 Dave Abrahams
# Copyright 2002, 2003, 2005 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 we can change build directory using the 'build-dir' project
# attribute.

import BoostBuild
import string
import os

t = BoostBuild.Tester()


# Test that top-level project can affect build dir.
t.write("jamroot.jam", "import gcc ;")
t.write("jamfile.jam", """
project : build-dir build ;
exe a : a.cpp ;
build-project src ;
""")

t.write("a.cpp", "int main() {}\n")

t.write("src/jamfile.jam", "exe b : b.cpp ; ")

t.write("src/b.cpp", "int main() {}\n")

t.run_build_system()

t.expect_addition(["build/$toolset/debug/a.exe",
                   "build/src/$toolset/debug/b.exe"])

# Test that building from child projects work.
t.run_build_system(subdir='src')
t.ignore("build/config.log")
t.expect_nothing_more()

# Test that project can override build dir.
t.write("jamfile.jam", """
exe a : a.cpp ;
build-project src ;
""")

t.write("src/jamfile.jam", """
project : build-dir build ;
exe b : b.cpp ;
""")

t.run_build_system()
t.expect_addition(["bin/$toolset/debug/a.exe",
                   "src/build/$toolset/debug/b.exe"])

# Now test the '--build-dir' option.
t.rm(".")
t.write("jamroot.jam", "")

# Test that we get an error when no project id is specified.
t.run_build_system("--build-dir=foo")
t.fail_test(string.find(t.stdout(),
                   "warning: the --build-dir option will be ignored") == -1)

t.write("jamroot.jam", """
project foo ;
exe a : a.cpp ;
build-project sub ;
""")
t.write("a.cpp", "int main() {}\n")
t.write("sub/jamfile.jam", "exe b : b.cpp ;\n")
t.write("sub/b.cpp", "int main() {}\n")

t.run_build_system("--build-dir=build")
t.expect_addition(["build/foo/$toolset/debug/a.exe",
                   "build/foo/sub/$toolset/debug/b.exe"])

t.write("jamroot.jam", """
project foo : build-dir bin.v2 ;
exe a : a.cpp ;
build-project sub ;
""")

t.run_build_system("--build-dir=build")
t.expect_addition(["build/foo/bin.v2/$toolset/debug/a.exe",
                   "build/foo/bin.v2/sub/$toolset/debug/b.exe"])

# Try building in subdir. We expect that the entire build tree with be in
# 'sub/build'. Today, I am not sure if this is what the user expects, but let it
# be.
t.rm('build')
t.run_build_system("--build-dir=build", subdir="sub")
t.expect_addition(["sub/build/foo/bin.v2/sub/$toolset/debug/b.exe"])

t.write("jamroot.jam", """
project foo : build-dir %s ;
exe a : a.cpp ;
build-project sub ;
""" % string.replace(os.getcwd(), '\\', '\\\\'))

t.run_build_system("--build-dir=build", status=1)
t.fail_test(string.find(t.stdout(),
    "Absolute directory specified via 'build-dir' project attribute") == -1)

t.cleanup()
