aboutsummaryrefslogtreecommitdiff
path: root/build2
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2016-03-16 16:21:07 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2016-03-16 16:21:07 +0200
commit7f9fda79a0e96bbeeaee4e6b05f9ae5e1738d88a (patch)
tree7a5594759f62f9136db32845fd4baf7268805d7a /build2
parentc76ff457079bf5901a6bb55377c14aeee856a354 (diff)
Change prerequisite cleaning "limit" from subdirectories to same project
One day we will get this right.
Diffstat (limited to 'build2')
-rw-r--r--build2/algorithm.ixx8
-rw-r--r--build2/cxx/compile.cxx7
-rw-r--r--build2/cxx/link.cxx8
3 files changed, 14 insertions, 9 deletions
diff --git a/build2/algorithm.ixx b/build2/algorithm.ixx
index a405c30..3f0bab9 100644
--- a/build2/algorithm.ixx
+++ b/build2/algorithm.ixx
@@ -101,7 +101,11 @@ namespace build2
search_and_match_prerequisites (action a, target& t)
{
search_and_match_prerequisites (
- a, t, a.operation () != clean_id ? dir_path () : t.dir);
+ a,
+ t,
+ (a.operation () != clean_id
+ ? dir_path ()
+ : t.root_scope ().out_path ()));
}
inline void
@@ -114,7 +118,7 @@ namespace build2
// through groups since the group target should clean eveything
// up. A bit of an optimization.
//
- search_and_match_prerequisites (a, t, t.dir);
+ search_and_match_prerequisites (a, t, t.root_scope ().out_path ());
}
target_state
diff --git a/build2/cxx/compile.cxx b/build2/cxx/compile.cxx
index b07019d..df2b798 100644
--- a/build2/cxx/compile.cxx
+++ b/build2/cxx/compile.cxx
@@ -81,8 +81,10 @@ namespace build2
// code (below) takes care of the ones it is adding.
//
// When cleaning, ignore prerequisites that are not in the same
- // or a subdirectory of ours.
+ // or a subdirectory of our project root.
//
+ scope& rs (t.root_scope ());
+
link::search_paths_cache lib_paths; // Extract lazily.
for (prerequisite_member p: group_prerequisite_members (a, t))
@@ -115,7 +117,7 @@ namespace build2
target& pt (p.search ());
- if (a.operation () == clean_id && !pt.dir.sub (t.dir))
+ if (a.operation () == clean_id && !pt.dir.sub (rs.out_path ()))
continue;
build2::match (a, pt);
@@ -128,7 +130,6 @@ namespace build2
//
if (a == perform_update_id)
{
- scope& rs (t.root_scope ());
const string& sys (as<string> (*rs["cxx.target.system"]));
// The cached prerequisite target should be the same as what is in
diff --git a/build2/cxx/link.cxx b/build2/cxx/link.cxx
index f9fa69d..5ed36b7 100644
--- a/build2/cxx/link.cxx
+++ b/build2/cxx/link.cxx
@@ -543,7 +543,7 @@ namespace build2
// files as well as search and match.
//
// When cleaning, ignore prerequisites that are not in the same
- // or a subdirectory of ours.
+ // or a subdirectory of our project root.
//
for (prerequisite_member p: group_prerequisite_members (a, t))
{
@@ -562,7 +562,7 @@ namespace build2
if (pt == nullptr)
pt = &p.search ();
- if (a.operation () == clean_id && !pt->dir.sub (t.dir))
+ if (a.operation () == clean_id && !pt->dir.sub (rs.out_path ()))
continue; // Skip.
// If this is the obj{} or lib{} target group, then pick the
@@ -624,9 +624,9 @@ namespace build2
target& ot (search (o_type, d, *cp.tk.name, nullptr, cp.scope));
// If we are cleaning, check that this target is in the same or
- // a subdirectory of ours.
+ // a subdirectory of our project root.
//
- if (a.operation () == clean_id && !ot.dir.sub (t.dir))
+ if (a.operation () == clean_id && !ot.dir.sub (rs.out_path ()))
{
// If we shouldn't clean obj{}, then it is fair to assume
// we shouldn't clean cxx{} either (generated source will