msetup: Allow (re)configure of not empty builddir

Also prevent from using a parent directory as builddir by mistake.

Co-authored-by: Volker Weißmann <volker.weissmann@gmx.de>
Co-authored-by: Charles Brunet <charles.brunet@optelgroup.com>
pull/11619/head
Xavier Claessens 2 years ago committed by Eli Schwartz
parent 0418a40e68
commit 9c526974dc
No known key found for this signature in database
GPG Key ID: CEB167EFB5722BD6
  1. 5
      mesonbuild/msetup.py
  2. 1
      unittests/allplatformstests.py
  3. 35
      unittests/platformagnostictests.py

@ -24,6 +24,7 @@ import argparse
import tempfile
import shutil
import glob
from pathlib import Path
from . import environment, interpreter, mesonlib
from . import build
@ -157,6 +158,8 @@ class MesonApp:
def validate_dirs(self, dir1: str, dir2: str, reconfigure: bool, wipe: bool) -> T.Tuple[str, str]:
(src_dir, build_dir) = self.validate_core_dirs(dir1, dir2)
if Path(build_dir) in Path(src_dir).parents:
raise MesonException(f'Build directory {build_dir} cannot be a parent of source directory {src_dir}')
if not os.listdir(build_dir):
self.add_vcs_ignore_files(build_dir)
return src_dir, build_dir
@ -178,7 +181,7 @@ class MesonApp:
# Note that making this an error would not be backward compatible (and also isn't
# universally agreed on): https://github.com/mesonbuild/meson/pull/4249.
raise SystemExit(0)
elif not has_partial_build and 'MESON_RUNNING_IN_PROJECT_TESTS' not in os.environ:
elif not has_partial_build and wipe:
raise MesonException(f'Directory is not empty and does not contain a previous build:\n{build_dir}')
return src_dir, build_dir

@ -2046,6 +2046,7 @@ class AllPlatformTests(BasePlatformTests):
self.assertFalse(os.path.isfile(promoted_wrap))
subprocess.check_call(self.wrap_command + ['promote', 'athing'], cwd=workdir)
self.assertTrue(os.path.isfile(promoted_wrap))
self.new_builddir() # Ensure builddir is not parent or workdir
self.init(workdir)
self.build()

@ -163,3 +163,38 @@ class PlatformAgnosticTests(BasePlatformTests):
# Wipe with a different backend is allowed
self.init(testdir, extra_args=['--wipe', '--backend=none'])
def test_validate_dirs(self):
testdir = os.path.join(self.common_test_dir, '1 trivial')
# Using parent as builddir should fail
self.builddir = os.path.dirname(self.builddir)
with self.assertRaises(subprocess.CalledProcessError) as cm:
self.init(testdir)
self.assertIn('cannot be a parent of source directory', cm.exception.stdout)
# Reconfigure of empty builddir should work
self.new_builddir()
self.init(testdir, extra_args=['--reconfigure'])
# Reconfigure of not empty builddir should work
self.new_builddir()
Path(self.builddir, 'dummy').touch()
self.init(testdir, extra_args=['--reconfigure'])
# Wipe of empty builddir should work
self.new_builddir()
self.init(testdir, extra_args=['--wipe'])
# Wipe of partial builddir should work
self.new_builddir()
Path(self.builddir, 'meson-private').mkdir()
Path(self.builddir, 'dummy').touch()
self.init(testdir, extra_args=['--wipe'])
# Wipe of not empty builddir should fail
self.new_builddir()
Path(self.builddir, 'dummy').touch()
with self.assertRaises(subprocess.CalledProcessError) as cm:
self.init(testdir, extra_args=['--wipe'])
self.assertIn('Directory is not empty', cm.exception.stdout)

Loading…
Cancel
Save