Initial automatic target file generation

pull/4547/head
Daniel Mensinger 6 years ago
parent a6034d1f19
commit f4285f350e
No known key found for this signature in database
GPG Key ID: 54DD94C131E277D4
  1. 10
      mesonbuild/backend/backends.py
  2. 64
      mesonbuild/mintro.py
  3. 4
      mesonbuild/msetup.py

@ -974,9 +974,7 @@ class Backend:
cmd = s['exe'] + s['args']
subprocess.check_call(cmd, env=child_env)
def create_install_data_files(self):
install_data_file = os.path.join(self.environment.get_scratch_dir(), 'install.dat')
def create_install_data(self):
strip_bin = self.environment.binaries.host.lookup_entry('strip')
if strip_bin is None:
if self.environment.is_cross_build():
@ -997,8 +995,12 @@ class Backend:
self.generate_data_install(d)
self.generate_custom_install_script(d)
self.generate_subdir_install(d)
return d
def create_install_data_files(self):
install_data_file = os.path.join(self.environment.get_scratch_dir(), 'install.dat')
with open(install_data_file, 'wb') as ofile:
pickle.dump(d, ofile)
pickle.dump(self.create_install_data(), ofile)
def generate_target_install(self, d):
for t in self.build.get_targets().values():

@ -36,6 +36,8 @@ import sys, os
import pathlib
import re
INTROSPECTION_OUTPUT_FILE = 'meson-introspection.json'
def add_arguments(parser):
parser.add_argument('--targets', action='store_true', dest='list_targets', default=False,
help='List top level targets.')
@ -95,7 +97,7 @@ def list_installed(installdata):
res[path] = os.path.join(installdata.prefix, installdir, os.path.basename(path))
for path, installpath, unused_custom_install_mode in installdata.man:
res[path] = os.path.join(installdata.prefix, installpath)
return res
return ('installed', res)
def include_dirs_to_path(inc_dirs, src_root, build_root):
result = []
@ -241,7 +243,7 @@ def list_targets(coredata, builddata, installdata):
t['installed'] = False
t['build_by_default'] = target.build_by_default
tlist.append(t)
return tlist
return ('targets', tlist)
def list_target_files(target_name, coredata, builddata):
try:
@ -255,7 +257,7 @@ def list_target_files(target_name, coredata, builddata):
if isinstance(i, mesonlib.File):
i = os.path.join(i.subdir, i.fname)
out.append(i)
return out
return ('target_files', out)
class BuildoptionsOptionHelper:
# mimic an argparse namespace
@ -435,7 +437,7 @@ def list_buildoptions(coredata):
add_keys(optlist, dir_options, 'directory')
add_keys(optlist, coredata.user_options, 'user')
add_keys(optlist, test_options, 'test')
return optlist
return ('buildoptions', optlist)
def add_keys(optlist, options, section):
keys = list(options.keys())
@ -467,7 +469,7 @@ def find_buildsystem_files_list(src_dir):
for f in files:
if f == 'meson.build' or f == 'meson_options.txt':
filelist.append(os.path.relpath(os.path.join(root, f), src_dir))
return filelist
return ('buildsystem_files', filelist)
def list_buildsystem_files(builddata):
src_dir = builddata.environment.get_source_dir()
@ -481,9 +483,9 @@ def list_deps(coredata):
result += [{'name': d.name,
'compile_args': d.get_compile_args(),
'link_args': d.get_link_args()}]
return result
return ('dependencies', result)
def list_tests(testdata):
def get_test_list(testdata):
result = []
for t in testdata:
to = {}
@ -504,6 +506,12 @@ def list_tests(testdata):
result.append(to)
return result
def list_tests(testdata):
return ('tests', get_test_list(testdata))
def list_benchmarks(benchdata):
return ('benchmarks', get_test_list(benchdata))
def list_projinfo(builddata):
result = {'version': builddata.project_version,
'descriptive_name': builddata.project_name}
@ -514,7 +522,7 @@ def list_projinfo(builddata):
'descriptive_name': builddata.projects.get(k)}
subprojects.append(c)
result['subprojects'] = subprojects
return result
return ('projectinfo', result)
class ProjectInfoInterperter(astinterpreter.AstInterpreter):
def __init__(self, source_root, subdir):
@ -602,23 +610,23 @@ def run(options):
results = []
if options.all or options.list_targets:
results += [('targets', list_targets(coredata, builddata, installdata))]
results += [list_targets(coredata, builddata, installdata)]
if options.all or options.list_installed:
results += [('installed', list_installed(installdata))]
results += [list_installed(installdata)]
if options.target_files is not None:
results += [('target_files', list_target_files(options.target_files, coredata, builddata))]
results += [list_target_files(options.target_files, coredata, builddata)]
if options.all or options.buildsystem_files:
results += [('buildsystem_files', list_buildsystem_files(builddata))]
results += [list_buildsystem_files(builddata)]
if options.all or options.buildoptions:
results += [('buildoptions', list_buildoptions(coredata))]
results += [list_buildoptions(coredata)]
if options.all or options.tests:
results += [('tests', list_tests(testdata))]
results += [list_tests(testdata)]
if options.all or options.benchmarks:
results += [('benchmarks', list_tests(benchmarkdata))]
results += [list_benchmarks(benchmarkdata)]
if options.all or options.dependencies:
results += [('dependencies', list_deps(coredata))]
results += [list_deps(coredata)]
if options.all or options.projectinfo:
results += [('projectinfo', list_projinfo(builddata))]
results += [list_projinfo(builddata)]
indent = options.indent if options.indent > 0 else None
@ -634,3 +642,25 @@ def run(options):
out[i[0]] = i[1]
print(json.dumps(out, indent=indent))
return 0
def generate_introspection_file(coredata, builddata, testdata, benchmarkdata, installdata):
intro_info = [
#list_benchmarks(benchmarkdata),
list_buildoptions(coredata, builddata),
list_buildsystem_files(builddata),
list_deps(coredata),
list_installed(installdata),
list_projinfo(builddata),
list_targets(coredata, builddata, installdata),
#list_tests(testdata)
]
outdict = {}
for i in intro_info:
outdict[i[0]] = i[1]
outfile = os.path.join(builddata.environment.get_build_dir(), INTROSPECTION_OUTPUT_FILE)
outfile = os.path.abspath(outfile)
with open(outfile, 'w') as fp:
json.dump(outdict, fp, indent=2)

@ -23,6 +23,7 @@ import argparse
from . import environment, interpreter, mesonlib
from . import build
from . import mlog, coredata
from . import mintro
from .mesonlib import MesonException
def add_arguments(parser):
@ -215,6 +216,9 @@ class MesonApp:
coredata.write_cmd_line_file(self.build_dir, self.options)
else:
coredata.update_cmd_line_file(self.build_dir, self.options)
# Generate an IDE introspection file with the exact same syntax as the introspection API defined in mintro
mintro.generate_introspection_file(b.environment.get_coredata(), b, b.get_tests(), b.get_benchmarks(), intr.backend.create_install_data())
except:
if 'cdf' in locals():
old_cdf = cdf + '.prev'

Loading…
Cancel
Save