diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2017-12-18 20:08:00 +0200 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2017-12-18 20:58:43 +0200 |
commit | 658442bef43c92da9efb1213e7fb25be85532eb1 (patch) | |
tree | 63ae4f79b6f73bc86b43bb3c7b605187244bf719 | |
parent | b949c4792d5893dabbc0cb3dcc2f58aa173d8efc (diff) | |
download | meson-658442bef43c92da9efb1213e7fb25be85532eb1.zip meson-658442bef43c92da9efb1213e7fb25be85532eb1.tar.gz meson-658442bef43c92da9efb1213e7fb25be85532eb1.tar.bz2 |
Can declare file generation in one dir and use the output in another.
-rw-r--r-- | mesonbuild/backend/ninjabackend.py | 10 | ||||
-rw-r--r-- | mesonbuild/backend/vs2010backend.py | 2 | ||||
-rw-r--r-- | mesonbuild/build.py | 11 | ||||
-rw-r--r-- | test cases/frameworks/5 protocol buffers/meson.build | 3 | ||||
-rw-r--r-- | test cases/frameworks/5 protocol buffers/sidedir/meson.build | 7 | ||||
-rw-r--r-- | test cases/frameworks/5 protocol buffers/sidedir/sideprog.cpp | 16 | ||||
-rw-r--r-- | test cases/frameworks/5 protocol buffers/withpath/meson.build | 8 |
7 files changed, 42 insertions, 15 deletions
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index 1057892..3fb37ea 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -1787,8 +1787,11 @@ rule FORTRAN_DEP_HACK continue self.generate_genlist_for_target(genlist, target, outfile) - def replace_paths(self, target, args): - source_target_dir = self.get_target_source_dir(target) + def replace_paths(self, target, args, override_subdir=None): + if override_subdir: + source_target_dir = os.path.join(self.build_to_src, override_subdir) + else: + source_target_dir = self.get_target_source_dir(target) relout = self.get_target_private_dir(target) args = [x.replace("@SOURCE_DIR@", self.build_to_src).replace("@BUILD_DIR@", relout) for x in args] @@ -1799,6 +1802,7 @@ rule FORTRAN_DEP_HACK def generate_genlist_for_target(self, genlist, target, outfile): generator = genlist.get_generator() + subdir = genlist.subdir exe = generator.get_exe() exe_arr = self.exe_object_to_cmd_array(exe) infilelist = genlist.get_inputs() @@ -1830,7 +1834,7 @@ rule FORTRAN_DEP_HACK if sole_output == '': outfilelist = outfilelist[len(generator.outputs):] relout = self.get_target_private_dir(target) - args = self.replace_paths(target, args) + args = self.replace_paths(target, args, override_subdir=subdir) cmdlist = exe_arr + self.replace_extra_args(args, genlist) if generator.capture: exe_data = self.serialize_executable( diff --git a/mesonbuild/backend/vs2010backend.py b/mesonbuild/backend/vs2010backend.py index e872a04..1720569 100644 --- a/mesonbuild/backend/vs2010backend.py +++ b/mesonbuild/backend/vs2010backend.py @@ -88,7 +88,6 @@ class Vs2010Backend(backends.Backend): custom_target_include_dirs = [] custom_target_output_files = [] target_private_dir = self.relpath(self.get_target_private_dir(target), self.get_target_dir(target)) - source_target_dir = self.get_target_source_dir(target) down = self.target_to_build_root(target) for genlist in target.get_generated_sources(): if isinstance(genlist, (build.CustomTarget, build.CustomTargetIndex)): @@ -104,6 +103,7 @@ class Vs2010Backend(backends.Backend): exe = generator.get_exe() infilelist = genlist.get_inputs() outfilelist = genlist.get_outputs() + source_dir = os.path.join(self.environment.get_source_dir(), genlist.subdir) exe_arr = self.exe_object_to_cmd_array(exe) idgroup = ET.SubElement(parent_node, 'ItemGroup') for i in range(len(infilelist)): diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 2b5412d..974643d 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -14,7 +14,7 @@ import copy, os, re from collections import OrderedDict -import itertools +import itertools, pathlib from . import environment from . import dependencies @@ -1092,11 +1092,11 @@ class Generator: return [x.replace('@BASENAME@', basename).replace('@PLAINNAME@', plainname) for x in self.arglist] def is_parent_path(self, parent, trial): - relpath = os.path.relpath(os.path.normpath(trial), os.path.normpath(parent)) - return not relpath.startswith('..') # For subdirs we can only go "down". + relpath = pathlib.PurePath(trial).relative_to(parent) + return relpath.parts[0] != '..' # For subdirs we can only go "down". def process_files(self, name, files, state, preserve_path_from=None, extra_args=[]): - output = GeneratedList(self, preserve_path_from, extra_args=extra_args) + output = GeneratedList(self, state.subdir, 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) @@ -1111,11 +1111,12 @@ class Generator: class GeneratedList: - def __init__(self, generator, preserve_path_from=None, extra_args=[]): + def __init__(self, generator, subdir, preserve_path_from=None, extra_args=[]): if hasattr(generator, 'held_object'): generator = generator.held_object self.generator = generator self.name = self.generator.exe + self.subdir = subdir self.infilelist = [] self.outfilelist = [] self.outmap = {} diff --git a/test cases/frameworks/5 protocol buffers/meson.build b/test cases/frameworks/5 protocol buffers/meson.build index f8ca7b1..94fa980 100644 --- a/test cases/frameworks/5 protocol buffers/meson.build +++ b/test cases/frameworks/5 protocol buffers/meson.build @@ -10,7 +10,7 @@ endif gen = generator(protoc, \ output : ['@BASENAME@.pb.cc', '@BASENAME@.pb.h'], - arguments : ['--proto_path=@SOURCE_DIR@', '--cpp_out=@BUILD_DIR@', '@INPUT@']) + arguments : ['--proto_path=@CURRENT_SOURCE_DIR@', '--cpp_out=@BUILD_DIR@', '@INPUT@']) generated = gen.process('defs.proto') e = executable('prog', 'main.cpp', generated, @@ -19,3 +19,4 @@ test('prototest', e) subdir('asubdir') subdir('withpath') +subdir('sidedir') diff --git a/test cases/frameworks/5 protocol buffers/sidedir/meson.build b/test cases/frameworks/5 protocol buffers/sidedir/meson.build new file mode 100644 index 0000000..ce9b7be --- /dev/null +++ b/test cases/frameworks/5 protocol buffers/sidedir/meson.build @@ -0,0 +1,7 @@ +# Generated source defined in one directory but +# used in another. + +e = executable('sideprog', 'sideprog.cpp', generated, + override_options : ['unity=off'], + dependencies : dep) +test('sideprog', e) diff --git a/test cases/frameworks/5 protocol buffers/sidedir/sideprog.cpp b/test cases/frameworks/5 protocol buffers/sidedir/sideprog.cpp new file mode 100644 index 0000000..83af4b2 --- /dev/null +++ b/test cases/frameworks/5 protocol buffers/sidedir/sideprog.cpp @@ -0,0 +1,16 @@ +#include"com/mesonbuild/simple.pb.h" +#include"com/mesonbuild/subsite/complex.pb.h" + +#include<memory> + +int main(int argc, char **argv) { + GOOGLE_PROTOBUF_VERIFY_VERSION; + { + subdirectorial::SimpleMessage *s = new subdirectorial::SimpleMessage(); + s->set_the_integer(3); + subdirectorial::ComplexMessage c; + c.set_allocated_sm(s); + } + google::protobuf::ShutdownProtobufLibrary(); + return 0; +} diff --git a/test cases/frameworks/5 protocol buffers/withpath/meson.build b/test cases/frameworks/5 protocol buffers/withpath/meson.build index a269c97..68a7381 100644 --- a/test cases/frameworks/5 protocol buffers/withpath/meson.build +++ b/test cases/frameworks/5 protocol buffers/withpath/meson.build @@ -2,14 +2,12 @@ # and must preserve their path segments in output files # because protoc will always put it in there. -gen = generator(protoc, \ - output : ['@BASENAME@.pb.cc', '@BASENAME@.pb.h'], - arguments : ['--proto_path=@CURRENT_SOURCE_DIR@', '--cpp_out=@BUILD_DIR@', '@INPUT@']) - generated = gen.process('com/mesonbuild/simple.proto', 'com/mesonbuild/subsite/complex.proto', preserve_path_from : meson.current_source_dir(), ) + e = executable('pathprog', 'pathprog.cpp', generated, - dependencies : dep) + override_options : ['unity=off'], + dependencies : dep) test('pathprog', e) |