aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2022-10-16 15:11:29 +0300
committerJussi Pakkanen <jpakkane@gmail.com>2022-10-16 15:11:29 +0300
commit5937bbf6ee99d31b2f7d47d4e5cae7892bcb88d8 (patch)
tree36d1d43531cfec22c138cd89b4b3c35b33e96b30
parent2e83145c9e6f5f4e3c9311fe9517ce7862251816 (diff)
downloadmeson-5937bbf6ee99d31b2f7d47d4e5cae7892bcb88d8.zip
meson-5937bbf6ee99d31b2f7d47d4e5cae7892bcb88d8.tar.gz
meson-5937bbf6ee99d31b2f7d47d4e5cae7892bcb88d8.tar.bz2
Add functionality to restore top level of deleted fs trees.
-rw-r--r--mesonbuild/backend/ninjabackend.py15
-rw-r--r--mesonbuild/scripts/cleantrees.py9
2 files changed, 17 insertions, 7 deletions
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py
index 4f2981c..593c201 100644
--- a/mesonbuild/backend/ninjabackend.py
+++ b/mesonbuild/backend/ninjabackend.py
@@ -3299,16 +3299,17 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
except OSError:
mlog.debug("Library versioning disabled because we do not have symlink creation privileges.")
- def generate_custom_target_clean(self, trees: T.List[str]) -> str:
+ def generate_custom_target_clean(self, trees: T.List[str], gendir_trees: T.List[str]) -> str:
e = self.create_phony_target(self.all_outputs, 'clean-ctlist', 'CUSTOM_COMMAND', 'PHONY')
d = CleanTrees(self.environment.get_build_dir(), trees)
+ gd = CleanTrees(self.environment.get_build_dir(), gendir_trees)
d_file = os.path.join(self.environment.get_scratch_dir(), 'cleantrees.dat')
e.add_item('COMMAND', self.environment.get_build_command() + ['--internal', 'cleantrees', d_file])
e.add_item('description', 'Cleaning custom target directories')
self.add_build(e)
# Write out the data file passed to the script
with open(d_file, 'wb') as ofile:
- pickle.dump(d, ofile)
+ pickle.dump((d, gd), ofile)
return 'clean-ctlist'
def generate_gcov_clean(self):
@@ -3448,8 +3449,14 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
# Create a list of all custom target outputs
for o in t.get_outputs():
ctlist.append(os.path.join(self.get_target_dir(t), o))
- if ctlist:
- elem.add_dep(self.generate_custom_target_clean(ctlist))
+ # As above, but restore the top level directory after deletion.
+ for t in self.build.get_targets().values():
+ if isinstance(t, build.CustomTarget):
+ if False:
+ gendir_list.append('fake')
+
+ if ctlist or gendir_list:
+ elem.add_dep(self.generate_custom_target_clean(ctlist, gendir_list))
if OptionKey('b_coverage') in self.environment.coredata.options and \
self.environment.coredata.options[OptionKey('b_coverage')].value:
diff --git a/mesonbuild/scripts/cleantrees.py b/mesonbuild/scripts/cleantrees.py
index 1a38753..4afde79 100644
--- a/mesonbuild/scripts/cleantrees.py
+++ b/mesonbuild/scripts/cleantrees.py
@@ -18,7 +18,7 @@ import shutil
import pickle
import typing as T
-def rmtrees(build_dir: str, trees: T.List[str]) -> None:
+def rmtrees(build_dir: str, trees: T.List[str], restore_dir: bool) -> None:
for t in trees:
# Never delete trees outside of the builddir
if os.path.isabs(t):
@@ -28,6 +28,8 @@ def rmtrees(build_dir: str, trees: T.List[str]) -> None:
# Skip if it doesn't exist, or if it is not a directory
if os.path.isdir(bt):
shutil.rmtree(bt, ignore_errors=True)
+ if restore_dir:
+ os.makedirs(bt)
def run(args: T.List[str]) -> int:
if len(args) != 1:
@@ -35,8 +37,9 @@ def run(args: T.List[str]) -> int:
print('cleantrees.py <data-file>')
return 1
with open(args[0], 'rb') as f:
- data = pickle.load(f)
- rmtrees(data.build_dir, data.trees)
+ (del_trees, del_and_restore_trees) = pickle.load(f)
+ rmtrees(del_trees.build_dir, del_trees.trees, False)
+ rmtrees(del_and_restore_trees.build_dir, del_and_restore_trees.trees, True)
# Never fail cleaning
return 0