diff options
author | Matthias Klumpp <matthias@tenstral.net> | 2021-02-25 19:53:41 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-02-25 20:53:41 +0200 |
commit | 4e5efd3897c5bd03fbcd32fcf43c82879ca8caf4 (patch) | |
tree | 6c04a3205817aedbbd98fcfc1c4f536e1f0aebc2 /mesonbuild | |
parent | 74ebb1ba59637487ecebf9666517bdef512df7fc (diff) | |
download | meson-4e5efd3897c5bd03fbcd32fcf43c82879ca8caf4.zip meson-4e5efd3897c5bd03fbcd32fcf43c82879ca8caf4.tar.gz meson-4e5efd3897c5bd03fbcd32fcf43c82879ca8caf4.tar.bz2 |
Allow custom target output to be processed by generators
Diffstat (limited to 'mesonbuild')
-rw-r--r-- | mesonbuild/backend/vs2010backend.py | 26 | ||||
-rw-r--r-- | mesonbuild/build.py | 34 |
2 files changed, 41 insertions, 19 deletions
diff --git a/mesonbuild/backend/vs2010backend.py b/mesonbuild/backend/vs2010backend.py index 7bbd2b6..82891cd 100644 --- a/mesonbuild/backend/vs2010backend.py +++ b/mesonbuild/backend/vs2010backend.py @@ -272,17 +272,25 @@ class Vs2010Backend(backends.Backend): all_deps[ldep.get_id()] = ldep for obj_id, objdep in self.get_obj_target_deps(target.objects): all_deps[obj_id] = objdep - for gendep in target.get_generated_sources(): - if isinstance(gendep, build.CustomTarget): - all_deps[gendep.get_id()] = gendep - elif isinstance(gendep, build.CustomTargetIndex): - all_deps[gendep.target.get_id()] = gendep.target - else: - gen_exe = gendep.generator.get_exe() - if isinstance(gen_exe, build.Executable): - all_deps[gen_exe.get_id()] = gen_exe else: raise MesonException('Unknown target type for target %s' % target) + + for gendep in target.get_generated_sources(): + if isinstance(gendep, build.CustomTarget): + all_deps[gendep.get_id()] = gendep + elif isinstance(gendep, build.CustomTargetIndex): + all_deps[gendep.target.get_id()] = gendep.target + else: + generator = gendep.get_generator() + gen_exe = generator.get_exe() + if isinstance(gen_exe, build.Executable): + all_deps[gen_exe.get_id()] = gen_exe + for d in generator.depends: + if isinstance(d, build.CustomTargetIndex): + all_deps[d.get_id()] = d.target + else: + all_deps[d.get_id()] = d + if not t or not recursive: return all_deps ret = self.get_target_deps(all_deps, recursive) diff --git a/mesonbuild/build.py b/mesonbuild/build.py index de8d94b..b6ded5e 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -1571,17 +1571,31 @@ class Generator: return relpath.parts[0] != '..' # For subdirs we can only go "down". def process_files(self, name, files, state, preserve_path_from=None, extra_args=None): + new = False output = GeneratedList(self, state.subdir, preserve_path_from, extra_args=extra_args if extra_args is not None else []) - 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 preserve_path_from: - abs_f = f.absolute_path(state.environment.source_dir, state.environment.build_dir) - 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) + for e in unholder(files): + fs = [e] + if isinstance(e, (CustomTarget, CustomTargetIndex, GeneratedList)): + self.depends.append(e) + fs = [] + for f in e.get_outputs(): + fs.append(File.from_built_file(state.subdir, f)) + new = True + elif isinstance(e, str): + fs = [File.from_source_file(state.environment.source_dir, state.subdir, e)] + elif not isinstance(e, File): + raise InvalidArguments('{} arguments must be strings, files or CustomTargets, not {!r}.'.format(name, e)) + + for f in fs: + if preserve_path_from: + abs_f = f.absolute_path(state.environment.source_dir, state.environment.build_dir) + if not self.is_parent_path(preserve_path_from, abs_f): + raise InvalidArguments('generator.process: When using preserve_path_from, all input files must be in a subdirectory of the given dir.') + output.add_file(f, state) + if new: + FeatureNew.single_use( + 'Calling "{}" with CustomTaget or Index of CustomTarget.'.format(name), + '0.57.0', state.subproject) return output |