diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2017-02-20 14:27:06 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-02-20 14:27:06 -0500 |
commit | 98af711ca6f166bacf2b9c6e697026f5b323827a (patch) | |
tree | 10f6507a9c6e01bce546a08201b6f655da54fd78 /mesonbuild/build.py | |
parent | c8042b5574e272fff9735a6978a10a20013c9480 (diff) | |
parent | 2a64a2d00c278b42b544f32e299547753ed22e36 (diff) | |
download | meson-98af711ca6f166bacf2b9c6e697026f5b323827a.zip meson-98af711ca6f166bacf2b9c6e697026f5b323827a.tar.gz meson-98af711ca6f166bacf2b9c6e697026f5b323827a.tar.bz2 |
Merge pull request #1403 from centricular/compile_resources
Make configure_file() great again
Diffstat (limited to 'mesonbuild/build.py')
-rw-r--r-- | mesonbuild/build.py | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 5f2de3b..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.') @@ -1530,3 +1546,22 @@ class TestSetup: self.gdb = gdb self.timeout_multiplier = timeout_multiplier self.env = env + +def get_sources_string_names(sources): + ''' + For the specified list of @sources which can be strings, Files, or targets, + get all the output basenames. + ''' + names = [] + for s in sources: + if hasattr(s, 'held_object'): + s = s.held_object + if isinstance(s, str): + names.append(s) + elif isinstance(s, (BuildTarget, CustomTarget, GeneratedList)): + names += s.get_outputs() + elif isinstance(s, File): + names.append(s.fname) + else: + raise AssertionError('Unknown source type: {!r}'.format(s)) + return names |