diff --git a/mesonpy/__init__.py b/mesonpy/__init__.py index 05016a1c3..698719290 100644 --- a/mesonpy/__init__.py +++ b/mesonpy/__init__.py @@ -940,10 +940,22 @@ def _project(config_settings: Optional[Dict[Any, Any]] = None) -> Iterator[Proje build_dir = settings.get('build-dir') editable_verbose = bool(settings.get('editable-verbose')) - with contextlib.ExitStack() as ctx: - if build_dir is None: - build_dir = ctx.enter_context(tempfile.TemporaryDirectory(prefix='.mesonpy-', dir=source_dir)) - yield Project(source_dir, build_dir, meson_args, editable_verbose) + try: + with contextlib.ExitStack() as ctx: + if build_dir is None: + build_dir = ctx.enter_context(tempfile.TemporaryDirectory( + prefix='.mesonpy-', dir=source_dir)) + yield Project(source_dir, build_dir, meson_args, editable_verbose) + except PermissionError as exc: + # Cleanup may fail on Windows due to background processes (gh-559) + str_err = str(exc) + if '[WinError 32]' in str_err: + prefix = f'{style.ERROR}meson-python: warning:{style.RESET} ' + str_err = '\n'.join([str_err, + 'Clean up build directory manually, if desired.']) + _log('\n' + textwrap.indent(str_err, prefix)) + else: + raise RuntimeError from exc def _parse_version_string(string: str) -> Tuple[int, ...]: