aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/mintro.py
diff options
context:
space:
mode:
authorDaniel Mensinger <daniel@mensinger-ka.de>2018-11-28 16:43:48 +0100
committerDaniel Mensinger <daniel@mensinger-ka.de>2019-01-06 12:19:28 +0100
commit74274e23ca42260e9be24c3cfaf7550c6c1505d2 (patch)
treef4d207484beb869056853f47286160345e5eb979 /mesonbuild/mintro.py
parent71d17b44e45c68b8d0b5189a8ebe8412ab99c622 (diff)
downloadmeson-74274e23ca42260e9be24c3cfaf7550c6c1505d2.zip
meson-74274e23ca42260e9be24c3cfaf7550c6c1505d2.tar.gz
meson-74274e23ca42260e9be24c3cfaf7550c6c1505d2.tar.bz2
Moved the source and compiler generation to the backend
Diffstat (limited to 'mesonbuild/mintro.py')
-rw-r--r--mesonbuild/mintro.py148
1 files changed, 15 insertions, 133 deletions
diff --git a/mesonbuild/mintro.py b/mesonbuild/mintro.py
index b6c00ec..449220c 100644
--- a/mesonbuild/mintro.py
+++ b/mesonbuild/mintro.py
@@ -20,7 +20,7 @@ Currently only works for the Ninja backend. Others use generated
project files and don't need this info."""
import json
-from . import build, mtest, coredata as cdata
+from . import build, coredata as cdata
from . import environment
from . import mesonlib
from . import astinterpreter
@@ -34,7 +34,6 @@ from .dependencies import base
from .compilers import compilers
import sys, os
import pathlib
-import re
INTROSPECTION_OUTPUT_FILE = 'meson-introspection.json'
@@ -99,138 +98,16 @@ def list_installed(installdata):
res[path] = os.path.join(installdata.prefix, installpath)
return ('installed', res)
-def include_dirs_to_path(inc_dirs, src_root, build_root):
- result = []
- if isinstance(inc_dirs, build.IncludeDirs):
- for i in inc_dirs.get_incdirs():
- abs_src = os.path.join(src_root, inc_dirs.get_curdir(), i)
- abs_build = os.path.join(build_root, inc_dirs.get_curdir(), i)
-
- if os.path.isdir(abs_src):
- result += [abs_src]
-
- if os.path.isdir(abs_build):
- result += [abs_build]
-
- return result
-
-def extract_dependency_infromation(dep):
- inc_dirs = []
- args = []
- if isinstance(dep, base.Dependency):
- reg = re.compile(r'-I(.*)')
- for i in dep.get_compile_args():
- match = reg.match(i)
- if match:
- inc_dirs += [match.group(1)]
- else:
- args += [i]
-
- return inc_dirs, args
-
-def list_targets(coredata, builddata, installdata):
+def list_targets(builddata: build.Build, installdata, backend: backends.Backend):
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):
- # The build directory is always in the include directories
- absbase_src = os.path.join(src_root, tgt.subdir)
- absbase_build = os.path.join(build_root, tgt.subdir)
- inc_dirs += [absbase_src, absbase_build]
-
- for i in tgt.include_dirs:
- inc_dirs += include_dirs_to_path(i, src_root, build_root)
-
- for i in tgt.external_deps:
- dep_inc_dirs, args = extract_dependency_infromation(i)
- inc_dirs += dep_inc_dirs
- dep_args += args
-
- for i, comp in tgt.compilers.items():
- if isinstance(comp, compilers.Compiler):
- if i not in extra_args:
- extra_args[i] = []
-
- extra_args[i] += tgt.get_extra_args(i)
- extra_args[i] += builddata.get_global_args(comp, tgt.is_cross)
- extra_args[i] += builddata.get_project_args(comp, tgt.subproject, tgt.is_cross)
-
- for i in tgt.link_targets:
- climb_stack(i, inc_dirs, extra_args, dep_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, True), x), source_list))
-
- for comp, src in source_list:
- if isinstance(src, mesonlib.File):
- src = os.path.join(src.subdir, src.fname)
- if isinstance(comp, compilers.Compiler) and isinstance(src, str):
- 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'] += [src]
- elif comp is None and isinstance(src, str):
- if 'unknown' not in sources:
- sources['unknown'] = {'compiler': [], 'parameters': [], 'source_files': []}
- sources['unknown']['source_files'] += [src]
- elif isinstance(target, build.CustomTarget):
- source_list_raw = target.sources + target.extra_files
- source_list = []
- for i in source_list_raw:
- if isinstance(i, mesonlib.File):
- source_list += [os.path.join(i.subdir, i.fname)]
- elif isinstance(i, str):
- source_list += [i]
-
- sources['unknown'] = {'compiler': [], 'parameters': [], 'source_files': source_list}
-
- # 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()))
+ if isinstance(backend, backends.Backend):
+ sources = backend.get_introspection_data(idname, target)
+ else:
+ raise RuntimeError('Parameter backend has an invalid type. This is a bug.')
t = {'name': target.get_basename(), 'id': idname, 'sources': sources}
fname = target.get_filename()
@@ -490,7 +367,7 @@ def find_buildsystem_files_list(src_dir):
filelist.append(os.path.relpath(os.path.join(root, f), src_dir))
return filelist
-def list_buildsystem_files(builddata):
+def list_buildsystem_files(builddata: build.Build):
src_dir = builddata.environment.get_source_dir()
filelist = find_buildsystem_files_list(src_dir)
return ('buildsystem_files', filelist)
@@ -531,7 +408,7 @@ def list_tests(testdata):
def list_benchmarks(benchdata):
return ('benchmarks', get_test_list(benchdata))
-def list_projinfo(builddata):
+def list_projinfo(builddata: build.Build):
result = {'version': builddata.project_version,
'descriptive_name': builddata.project_name}
subprojects = []
@@ -664,7 +541,12 @@ def run(options):
print(json.dumps(out, indent=indent))
return 0
-def generate_introspection_file(coredata, builddata, testdata, benchmarkdata, installdata):
+def generate_introspection_file(builddata: build.Build, backend: backends.Backend):
+ coredata = builddata.environment.get_coredata()
+ benchmarkdata = backend.create_test_serialisation(builddata.get_benchmarks())
+ testdata = backend.create_test_serialisation(builddata.get_tests())
+ installdata = backend.create_install_data()
+
intro_info = [
list_benchmarks(benchmarkdata),
list_buildoptions(coredata),
@@ -672,7 +554,7 @@ def generate_introspection_file(coredata, builddata, testdata, benchmarkdata, in
list_deps(coredata),
list_installed(installdata),
list_projinfo(builddata),
- list_targets(coredata, builddata, installdata),
+ list_targets(builddata, installdata, backend),
list_tests(testdata)
]