diff options
author | Nirbheek Chauhan <nirbheek@centricular.com> | 2017-02-13 21:12:59 +0530 |
---|---|---|
committer | Nirbheek Chauhan <nirbheek@centricular.com> | 2017-02-20 23:32:03 +0530 |
commit | f3ff8fe6b724ecbad8006dade1df56da730f2e48 (patch) | |
tree | ef12218c07dfa6e62b2c64c607ce1433d46a4a6a /mesonbuild/build.py | |
parent | 73b2ee08a884d6baa7b8e3c35c6da8f17aa9a875 (diff) | |
download | meson-f3ff8fe6b724ecbad8006dade1df56da730f2e48.zip meson-f3ff8fe6b724ecbad8006dade1df56da730f2e48.tar.gz meson-f3ff8fe6b724ecbad8006dade1df56da730f2e48.tar.bz2 |
custom_target: Substitute input into output
This means replacing @PLAINNAME@ and @BASENAME@ in the outputs. This is
the same feature as generator().
This is only allowed when there is only one input file for obvious
reasons + failing test for this.
Diffstat (limited to 'mesonbuild/build.py')
-rw-r--r-- | mesonbuild/build.py | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 395321c..91a3dd8 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -16,7 +16,9 @@ from . import environment from . import dependencies from . import mlog import copy, os, re -from .mesonlib import File, flatten, MesonException, stringlistify, classify_unity_sources +from .mesonlib import File, MesonException +from .mesonlib import flatten, stringlistify, classify_unity_sources +from .mesonlib import get_filenames_templates_dict, substitute_values from .environment import for_windows, for_darwin from .compilers import is_object, clike_langs, lang_suffixes @@ -1331,11 +1333,25 @@ class CustomTarget(Target): self.output = kwargs['output'] if not isinstance(self.output, list): self.output = [self.output] + # This will substitute values from the input into output and return it. + inputs = get_sources_string_names(self.sources) + values = get_filenames_templates_dict(inputs, []) for i in self.output: if not(isinstance(i, str)): raise InvalidArguments('Output argument not a string.') if '/' in i: raise InvalidArguments('Output must not contain a path segment.') + if '@INPUT@' in i or '@INPUT0@' in i: + m = 'Output cannot contain @INPUT@ or @INPUT0@, did you ' \ + 'mean @PLAINNAME@ or @BASENAME@?' + raise InvalidArguments(m) + # We already check this during substitution, but the error message + # will be unclear/confusing, so check it here. + if len(inputs) != 1 and ('@PLAINNAME@' in i or '@BASENAME@' in i): + m = "Output cannot contain @PLAINNAME@ or @BASENAME@ when " \ + "there is more than one input (we can't know which to use)" + raise InvalidArguments(m) + self.output = substitute_values(self.output, values) self.capture = kwargs.get('capture', False) if self.capture and len(self.output) != 1: raise InvalidArguments('Capturing can only output to a single file.') @@ -1531,7 +1547,7 @@ class TestSetup: self.timeout_multiplier = timeout_multiplier self.env = env -def get_sources_output_names(sources): +def get_sources_string_names(sources): ''' For the specified list of @sources which can be strings, Files, or targets, get all the output basenames. |