From b949c4792d5893dabbc0cb3dcc2f58aa173d8efc Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sun, 17 Dec 2017 22:42:20 +0200 Subject: [PATCH] Preserve_path_from should be a kwarg of process(), not generator(). --- mesonbuild/build.py | 27 +++++++------------ mesonbuild/interpreter.py | 13 ++++++++- .../common/173 preserve gendir/meson.build | 5 ++-- .../5 protocol buffers/withpath/meson.build | 5 ++-- 4 files changed, 27 insertions(+), 23 deletions(-) diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 59382a43a..2b5412de5 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -1072,16 +1072,6 @@ class Generator: if not isinstance(capture, bool): raise InvalidArguments('Capture must be boolean.') self.capture = capture - if 'preserve_path_from' in kwargs: - self.preserve_path_from = kwargs['preserve_path_from'] - if not isinstance(self.preserve_path_from, str): - raise InvalidArguments('Preserve_path_from must be a string.') - self.preserve_path_from = os.path.normpath(self.preserve_path_from) - if not os.path.isabs(self.preserve_path_from): - # This is a bit of a hack. Fix properly before merging. - raise InvalidArguments('Preserve_path_from must be an absolute path for now. Sorry.') - else: - self.preserve_path_from = None def get_base_outnames(self, inname): plainname = os.path.split(inname)[1] @@ -1105,23 +1095,23 @@ class Generator: relpath = os.path.relpath(os.path.normpath(trial), os.path.normpath(parent)) return not relpath.startswith('..') # For subdirs we can only go "down". - def process_files(self, name, files, state, extra_args=[]): - output = GeneratedList(self, extra_args=extra_args) + def process_files(self, name, files, state, preserve_path_from=None, extra_args=[]): + output = GeneratedList(self, preserve_path_from, extra_args=extra_args) for f in files: if isinstance(f, str): f = File.from_source_file(state.environment.source_dir, state.subdir, f) elif not isinstance(f, File): raise InvalidArguments('{} arguments must be strings or files not {!r}.'.format(name, f)) - if self.preserve_path_from: + if preserve_path_from: abs_f = f.absolute_path(state.environment.source_dir, state.environment.build_dir) - if not self.is_parent_path(self.preserve_path_from, abs_f): + if not self.is_parent_path(preserve_path_from, abs_f): raise InvalidArguments('When using preserve_path_from, all input files must be in a subdirectory of the given dir.') output.add_file(f, state) return output class GeneratedList: - def __init__(self, generator, extra_args=[]): + def __init__(self, generator, preserve_path_from=None, extra_args=[]): if hasattr(generator, 'held_object'): generator = generator.held_object self.generator = generator @@ -1130,13 +1120,14 @@ class GeneratedList: self.outfilelist = [] self.outmap = {} self.extra_depends = [] + self.preserve_path_from = preserve_path_from self.extra_args = extra_args def add_preserved_path_segment(self, infile, outfiles, state): result = [] in_abs = infile.absolute_path(state.environment.source_dir, state.environment.build_dir) - assert(os.path.isabs(self.generator.preserve_path_from)) - rel = os.path.relpath(in_abs, self.generator.preserve_path_from) + assert(os.path.isabs(self.preserve_path_from)) + rel = os.path.relpath(in_abs, self.preserve_path_from) path_segment = os.path.split(rel)[0] for of in outfiles: result.append(os.path.join(path_segment, of)) @@ -1145,7 +1136,7 @@ class GeneratedList: def add_file(self, newfile, state): self.infilelist.append(newfile) outfiles = self.generator.get_base_outnames(newfile.fname) - if self.generator.preserve_path_from: + if self.preserve_path_from: outfiles = self.add_preserved_path_segment(newfile, outfiles, state) self.outfilelist += outfiles self.outmap[newfile] = outfiles diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index ea741a07d..a5aa5fa0e 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -375,7 +375,18 @@ class GeneratorHolder(InterpreterObject, ObjectHolder): def process_method(self, args, kwargs): extras = mesonlib.stringlistify(kwargs.get('extra_args', [])) - gl = self.held_object.process_files('Generator', args, self.interpreter, extra_args=extras) + if 'preserve_path_from' in kwargs: + preserve_path_from = kwargs['preserve_path_from'] + if not isinstance(preserve_path_from, str): + raise InvalidArguments('Preserve_path_from must be a string.') + preserve_path_from = os.path.normpath(preserve_path_from) + if not os.path.isabs(preserve_path_from): + # This is a bit of a hack. Fix properly before merging. + raise InvalidArguments('Preserve_path_from must be an absolute path for now. Sorry.') + else: + preserve_path_from = None + gl = self.held_object.process_files('Generator', args, self.interpreter, + preserve_path_from, extra_args=extras) return GeneratedListHolder(gl) diff --git a/test cases/common/173 preserve gendir/meson.build b/test cases/common/173 preserve gendir/meson.build index b1a63b1f0..ce219f0d8 100644 --- a/test cases/common/173 preserve gendir/meson.build +++ b/test cases/common/173 preserve gendir/meson.build @@ -4,9 +4,10 @@ gprog = find_program('genprog.py') gen = generator(gprog, \ output : ['@BASENAME@.c', '@BASENAME@.h'], - preserve_path_from : meson.current_source_dir(), arguments : ['--searchdir=@CURRENT_SOURCE_DIR@', '--outdir=@BUILD_DIR@', '@INPUT@']) -generated = gen.process('base.inp', 'com/mesonbuild/subbie.inp') +generated = gen.process('base.inp', 'com/mesonbuild/subbie.inp', + preserve_path_from : meson.current_source_dir()) + e = executable('testprog', 'testprog.c', generated) test('testprog', e) diff --git a/test cases/frameworks/5 protocol buffers/withpath/meson.build b/test cases/frameworks/5 protocol buffers/withpath/meson.build index f5b453ecd..a269c9710 100644 --- a/test cases/frameworks/5 protocol buffers/withpath/meson.build +++ b/test cases/frameworks/5 protocol buffers/withpath/meson.build @@ -4,11 +4,12 @@ gen = generator(protoc, \ output : ['@BASENAME@.pb.cc', '@BASENAME@.pb.h'], - preserve_path_from : meson.current_source_dir(), arguments : ['--proto_path=@CURRENT_SOURCE_DIR@', '--cpp_out=@BUILD_DIR@', '@INPUT@']) generated = gen.process('com/mesonbuild/simple.proto', - 'com/mesonbuild/subsite/complex.proto') + 'com/mesonbuild/subsite/complex.proto', + preserve_path_from : meson.current_source_dir(), + ) e = executable('pathprog', 'pathprog.cpp', generated, dependencies : dep) test('pathprog', e)