aboutsummaryrefslogtreecommitdiff
path: root/build2/algorithm.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'build2/algorithm.cxx')
-rw-r--r--build2/algorithm.cxx34
1 files changed, 23 insertions, 11 deletions
diff --git a/build2/algorithm.cxx b/build2/algorithm.cxx
index 14c1960..72e6bda 100644
--- a/build2/algorithm.cxx
+++ b/build2/algorithm.cxx
@@ -1279,9 +1279,9 @@ namespace build2
bool ed (false);
path ep;
- auto clean = [&er, &ed, &ep] (const file& f,
- const path* fp,
- initializer_list<const char*> es)
+ auto clean_extra = [&er, &ed, &ep] (const file& f,
+ const path* fp,
+ initializer_list<const char*> es)
{
for (const char* e: es)
{
@@ -1357,7 +1357,16 @@ namespace build2
auto ei (extra.begin ()), ee (extra.end ());
if (ei != ee)
- clean (ft, nullptr, *ei++);
+ clean_extra (ft, nullptr, *ei++);
+
+ // Check if we were asked not to actually remove the files. The extras are
+ // tricky: some of them, like depdb should definitely be removed. But
+ // there could also be those that shouldn't. Currently we only use this
+ // for auto-generated source code where the only extra file, if any, is
+ // depdb so for now we treat them as "to remove" but in the future we may
+ // need to have two lists.
+ //
+ bool clean (cast_true<bool> (ft[var_clean]));
// Now clean the ad hoc group file members, if any.
//
@@ -1370,9 +1379,9 @@ namespace build2
continue;
if (ei != ee)
- clean (*fm, fp, *ei++);
+ clean_extra (*fm, fp, *ei++);
- target_state r (rmfile (*fp, 3)
+ target_state r (clean && rmfile (*fp, 3)
? target_state::changed
: target_state::unchanged);
@@ -1385,7 +1394,7 @@ namespace build2
// Now clean the primary target and its prerequisited in the reverse order
// of update: first remove the file, then clean the prerequisites.
//
- target_state tr (rmfile (ft.path (), ft) // Path must be assigned.
+ target_state tr (clean && rmfile (ft.path (), ft) // Path must be assigned.
? target_state::changed
: target_state::unchanged);
@@ -1443,12 +1452,15 @@ namespace build2
// Similar logic to clean_extra() above.
//
target_state r (target_state::unchanged);
- for (size_t i (0); i != gv.count; ++i)
+ if (cast_true<bool> (g[var_clean]))
{
- if (const target* m = gv.members[i])
+ for (size_t i (0); i != gv.count; ++i)
{
- if (rmfile (m->as<file> ().path (), *m))
- r |= target_state::changed;
+ if (const target* m = gv.members[i])
+ {
+ if (rmfile (m->as<file> ().path (), *m))
+ r |= target_state::changed;
+ }
}
}