diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2022-10-16 15:11:29 +0300 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2022-10-16 15:11:29 +0300 |
commit | 5937bbf6ee99d31b2f7d47d4e5cae7892bcb88d8 (patch) | |
tree | 36d1d43531cfec22c138cd89b4b3c35b33e96b30 | |
parent | 2e83145c9e6f5f4e3c9311fe9517ce7862251816 (diff) | |
download | meson-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.py | 15 | ||||
-rw-r--r-- | mesonbuild/scripts/cleantrees.py | 9 |
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 |