Guard against people running Meson on an already configured build dir.

pull/15/head
Jussi Pakkanen 12 years ago
parent 171fab8fea
commit d742f1be51
  1. 2
      backends.py
  2. 32
      meson.py

@ -501,7 +501,7 @@ class NinjaBackend(Backend):
ninja_quote(self.environment.get_build_command()), ninja_quote(self.environment.get_build_command()),
ninja_quote(self.environment.get_source_dir()), ninja_quote(self.environment.get_source_dir()),
ninja_quote(self.environment.get_build_dir())) ninja_quote(self.environment.get_build_dir()))
outfile.write(" command = '%s' '%s' '%s' '%s' --backend ninja\n" % c) outfile.write(" command = '%s' '%s' '%s' '%s' --backend ninja secret-handshake\n" % c)
outfile.write(' description = Regenerating build files\n') outfile.write(' description = Regenerating build files\n')
outfile.write(' generator = 1\n\n') outfile.write(' generator = 1\n\n')

@ -61,8 +61,8 @@ parser.add_option('--cross-file', default=None, dest='cross_file',
class MesonApp(): class MesonApp():
def __init__(self, dir1, dir2, script_file, options): def __init__(self, dir1, dir2, script_file, handshake, options):
(self.source_dir, self.build_dir) = self.validate_dirs(dir1, dir2) (self.source_dir, self.build_dir) = self.validate_dirs(dir1, dir2, handshake)
if not os.path.isabs(options.prefix): if not os.path.isabs(options.prefix):
raise RuntimeError('--prefix must be an absolute path.') raise RuntimeError('--prefix must be an absolute path.')
self.meson_script_file = script_file self.meson_script_file = script_file
@ -77,7 +77,7 @@ class MesonApp():
except IOError: except IOError:
return False return False
def validate_dirs(self, dir1, dir2): def validate_core_dirs(self, dir1, dir2):
ndir1 = os.path.abspath(dir1) ndir1 = os.path.abspath(dir1)
ndir2 = os.path.abspath(dir2) ndir2 = os.path.abspath(dir2)
if not stat.S_ISDIR(os.stat(ndir1).st_mode): if not stat.S_ISDIR(os.stat(ndir1).st_mode):
@ -94,7 +94,22 @@ class MesonApp():
if self.has_build_file(ndir2): if self.has_build_file(ndir2):
return (ndir2, ndir1) return (ndir2, ndir1)
raise RuntimeError('Neither directory contains a build file %s.' % environment.build_filename) raise RuntimeError('Neither directory contains a build file %s.' % environment.build_filename)
def validate_dirs(self, dir1, dir2, handshake):
(src_dir, build_dir) = self.validate_core_dirs(dir1, dir2)
priv_dir = os.path.join(build_dir, 'meson-private')
if os.path.exists(priv_dir):
if not handshake:
msg = '''Trying to run Meson on a build directory that has already been configured.
If you want to build it, just run your build command (e.g. ninja) inside the
build directory. Meson will autodetect any changes in your setup and regenerate
itself as required.'''
raise RuntimeError(msg)
else:
if handshake:
raise RuntimeError('Something went terribly wrong. Please file a bug.')
return (src_dir, build_dir)
def generate(self): def generate(self):
env = environment.Environment(self.source_dir, self.build_dir, self.meson_script_file, options) env = environment.Environment(self.source_dir, self.build_dir, self.meson_script_file, options)
mlog.initialize(env.get_log_dir()) mlog.initialize(env.get_log_dir())
@ -118,6 +133,11 @@ class MesonApp():
if __name__ == '__main__': if __name__ == '__main__':
(options, args) = parser.parse_args(sys.argv) (options, args) = parser.parse_args(sys.argv)
if args[-1] == 'secret-handshake':
args = args[:-1]
handshake = True
else:
handshake = False
if len(args) == 1 or len(args) > 3: if len(args) == 1 or len(args) > 3:
print('%s <source directory> <build directory>' % sys.argv[0]) print('%s <source directory> <build directory>' % sys.argv[0])
print('If you omit either directory, the current directory is substituted.') print('If you omit either directory, the current directory is substituted.')
@ -135,11 +155,11 @@ if __name__ == '__main__':
else: else:
this_file = resolved this_file = resolved
try: try:
app = MesonApp(dir1, dir2, this_file, options) app = MesonApp(dir1, dir2, this_file, handshake, options)
except Exception as e: except Exception as e:
# Log directory does not exist, so just print # Log directory does not exist, so just print
# to stdout. # to stdout.
print('Error validating working directories:\n') print('Error during basic setup:\n')
print(e) print(e)
sys.exit(1) sys.exit(1)
try: try:

Loading…
Cancel
Save