diff options
Diffstat (limited to 'mesonbuild/mintro.py')
-rw-r--r-- | mesonbuild/mintro.py | 66 |
1 files changed, 53 insertions, 13 deletions
diff --git a/mesonbuild/mintro.py b/mesonbuild/mintro.py index 0459b4e..5372b30 100644 --- a/mesonbuild/mintro.py +++ b/mesonbuild/mintro.py @@ -123,12 +123,16 @@ def extract_dependency_infromation(dep): def list_targets(coredata, builddata, installdata): tlist = [] for (idname, target) in builddata.get_targets().items(): + if not isinstance(target, build.Target): + raise RuntimeError('Something weird happened. File a bug.') + src_root = builddata.environment.get_source_dir() build_root = builddata.environment.get_build_dir() inc_dirs = [] extra_args = {} dep_args = [] + sources = {} def climb_stack(tgt, inc_dirs, extra_args, dep_args): if isinstance(tgt, build.BuildTarget): @@ -157,18 +161,54 @@ def list_targets(coredata, builddata, installdata): for i in tgt.link_targets: climb_stack(i, inc_dirs, extra_args, dep_args) - climb_stack(target, inc_dirs, extra_args, dep_args) - - # Add the dep_args, sort and remove duplicates - for i in extra_args: - extra_args[i] += dep_args - extra_args[i] = list(sorted(list(set(extra_args[i])))) - - # Remove duplicates, sort and make paths pretty - inc_dirs = list(sorted(list(set(inc_dirs)))) - inc_dirs = list(map(lambda x: os.path.realpath(x), inc_dirs)) - - t = {'name': target.get_basename(), 'id': idname, 'include_directories': inc_dirs, 'extra_args': extra_args} + if isinstance(target, build.BuildTarget): + climb_stack(target, inc_dirs, extra_args, dep_args) + + # Add the dep_args, sort and remove duplicates + for i in extra_args: + extra_args[i] += dep_args + extra_args[i] = list(sorted(list(set(extra_args[i])))) + + # Remove duplicates, sort and make paths pretty + inc_dirs = list(sorted(list(set(inc_dirs)))) + inc_dirs = list(map(lambda x: os.path.realpath(x), inc_dirs)) + + comp_list = target.compilers.values() + source_list = target.sources + target.extra_files + source_list = list(map(lambda x: (mesonlib.get_compiler_for_source(comp_list, x), x), source_list)) + + for comp, src in source_list: + if isinstance(comp, compilers.Compiler) and isinstance(src, mesonlib.File): + lang = comp.get_language() + if lang not in sources: + parameters = [] + + # Generate include directories + # Not all compilers have the get_include_args method + get_include_args = getattr(comp, 'get_include_args', None) + if callable(get_include_args): + for i in inc_dirs: + parameters += comp.get_include_args(i, False) + + # Extra args + if lang in extra_args: + parameters += extra_args[lang] + + sources[lang] = { + 'compiler': comp.get_exelist(), + 'parameters': parameters, + 'source_files': [] + } + + sources[lang]['source_files'] += [os.path.join(src.subdir, src.fname)] + + # Convert the dict to a list and add the language key. + # This list approach will also work if the gurantee is removed that all + # files in a target are compiled with the same parameters + # see https://github.com/mesonbuild/meson/pull/4547 + sources = list(map(lambda x: {'language': x[0], **x[1]}, sources.items())) + + t = {'name': target.get_basename(), 'id': idname, 'sources': sources} fname = target.get_filename() if isinstance(fname, list): fname = [os.path.join(target.subdir, x) for x in fname] @@ -195,7 +235,7 @@ def list_targets(coredata, builddata, installdata): t['installed'] = False t['build_by_default'] = target.build_by_default tlist.append(t) - print(json.dumps(tlist)) + print(json.dumps(tlist, indent=2)) def list_target_files(target_name, coredata, builddata): try: |