aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS2
-rw-r--r--build2/algorithm.ixx8
-rw-r--r--build2/cxx/compile.cxx7
-rw-r--r--build2/cxx/link.cxx8
4 files changed, 15 insertions, 10 deletions
diff --git a/NEWS b/NEWS
index ddc2ef2..ccdcce6 100644
--- a/NEWS
+++ b/NEWS
@@ -64,7 +64,7 @@ Version 0.3.0
dependency (.d) files rather than being re-extracted on every run. This
speeds up the up-to-date check significantly.
- * Revert back to only cleaning targets in subdirectories.
+ * Revert back to only cleaning prerequisites if they are in the same project.
Cleaning everything as long as it is in the same strong amalgamation had
some undesirable side effects. For example, in bpkg, upgrading a package
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