From 763d52aa587ff39b5a4d447c435a866a51963f38 Mon Sep 17 00:00:00 2001 From: Vladimir Prus Date: Mon, 23 Jan 2006 09:41:18 +0000 Subject: [PATCH] When resolving target id, first look for target in Jamfile, then for file in current dir. This partially reverts rev 1.117 of build/targets.jam. See test for further explanations. [SVN r32377] --- v2/build/targets.jam | 30 ++++++++++++++++++------------ v2/test/resolution.py | 38 ++++++++++++++++++++++++++++++++++++++ v2/test/test_all.py | 1 + 3 files changed, 57 insertions(+), 12 deletions(-) create mode 100644 v2/test/resolution.py diff --git a/v2/build/targets.jam b/v2/build/targets.jam index 4a5a543f1..bf67e0acd 100644 --- a/v2/build/targets.jam +++ b/v2/build/targets.jam @@ -364,22 +364,28 @@ class project-target : abstract-target } else { - # Interpret as filename - result = [ new file-reference [ path.make $(id) ] : $(project) ] ; - - if ! [ $(result).exists ] - { - # File actually does not exist. - # Reset 'target' so that an error is issued. - result = ; - } - # Interpret target-name as name of main target + # Need to do this before checking for file. Consider this: + # + # exe test : test.cpp ; + # install s : test : . ; + # + # After first build we'll have target 'test' in Jamfile and file + # 'test' on the disk. We need target to override the file. + result = [ main-target $(id) ] ; + if ! $(result) { - result = [ main-target $(id) ] ; + result = [ new file-reference [ path.make $(id) ] : $(project) ] ; + + if ! [ $(result).exists ] + { + # File actually does not exist. + # Reset 'target' so that an error is issued. + result = ; + } } - + # Interpret id as project-id if ! $(result) { diff --git a/v2/test/resolution.py b/v2/test/resolution.py new file mode 100644 index 000000000..93c520b26 --- /dev/null +++ b/v2/test/resolution.py @@ -0,0 +1,38 @@ +#!/usr/bin/python + +# Copyright (C) Vladimir Prus 2006. +# Distributed under the Boost Software License, Version 1.0. (See +# accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +# Tests for the target id resolution process. +from BoostBuild import Tester, List + +# Create a temporary working directory +t = Tester() + +# Create the needed files +t.write("Jamroot", """ +exe hello : hello.cpp ; +# This should use the 'hello' target, even if there's +# 'hello' file in current dir. +install s : hello : . ; +""") +t.write("hello.cpp", """ +int main() +{ + return 0; +} +""") + +t.run_build_system() + +t.expect_addition("bin/$toolset/debug/hello.obj") + +t.touch("hello.cpp") +t.run_build_system("s") +# If 'hello' in the 's' target resolved to file in +# current dir, nothing will be rebuilt. +t.expect_touch("bin/$toolset/debug/hello.obj") + +t.cleanup() diff --git a/v2/test/test_all.py b/v2/test/test_all.py index 35d490f40..04c24e909 100644 --- a/v2/test/test_all.py +++ b/v2/test/test_all.py @@ -132,6 +132,7 @@ tests = [ "rebuilds", "out_of_tree", "notfile", "project_root_rule", + "resolution", ] if os.name == 'posix':