mconf: Use introspection to print the project default options (fixes #2543)

pull/4826/head
Daniel Mensinger 6 years ago
parent 28edc7ef61
commit 90bc125d29
No known key found for this signature in database
GPG Key ID: 54DD94C131E277D4
  1. 5
      docs/markdown/Configuring-a-build-directory.md
  2. 6
      docs/markdown/snippets/configure_default_opts.md
  3. 57
      mesonbuild/mconf.py

@ -111,3 +111,8 @@ you would issue the following command.
Then you would run your build command (usually `ninja`), which would Then you would run your build command (usually `ninja`), which would
cause Meson to detect that the build setup has changed and do all the cause Meson to detect that the build setup has changed and do all the
work required to bring your build tree up to date. work required to bring your build tree up to date.
Since 0.50.0, it is also possible to get a list of all build options
by invoking `meson configure` with the project source directory or
the path to the root `meson.build`. In this case, meson will print the
default values of all options similar to the example output from above.

@ -0,0 +1,6 @@
## meson configure can now print the default options of an unconfigured project
With this release, it is also possible to get a list of all build options
by invoking `meson configure` with the project source directory or
the path to the root `meson.build`. In this case, meson will print the
default values of all options.

@ -13,8 +13,7 @@
# limitations under the License. # limitations under the License.
import os import os
from . import (coredata, mesonlib, build) from . import coredata, environment, mesonlib, build, mintro, mlog
from . import mintro
def add_arguments(parser): def add_arguments(parser):
coredata.register_builtin_arguments(parser) coredata.register_builtin_arguments(parser)
@ -38,11 +37,28 @@ class ConfException(mesonlib.MesonException):
class Conf: class Conf:
def __init__(self, build_dir): def __init__(self, build_dir):
self.build_dir = build_dir self.build_dir = os.path.abspath(os.path.realpath(build_dir))
if not os.path.isdir(os.path.join(build_dir, 'meson-private')): if self.build_dir.endswith('/meson.build') or self.build_dir.endswith('\\meson.build') or self.build_dir == 'meson.build':
raise ConfException('Directory %s does not seem to be a Meson build directory.' % build_dir) self.build_dir = os.path.dirname(self.build_dir)
self.build: build.Build = None
if os.path.isdir(os.path.join(self.build_dir, 'meson-private')):
self.build = build.load(self.build_dir) self.build = build.load(self.build_dir)
self.source_dir = self.build.environment.get_source_dir()
self.coredata = coredata.load(self.build_dir) self.coredata = coredata.load(self.build_dir)
self.default_values_only = False
elif os.path.isfile(os.path.join(self.build_dir, environment.build_filename)):
# Make sure that log entries in other parts of meson don't interfere with the JSON output
mlog.disable()
self.source_dir = os.path.abspath(os.path.realpath(self.build_dir))
intr = mintro.IntrospectionInterpreter(self.source_dir, '', 'ninja')
intr.analyze()
# Reenable logging just in case
mlog.enable()
self.coredata = intr.coredata
self.default_values_only = True
else:
raise ConfException('Directory {} is neither a Meson build directory nor a project source directory.'.format(build_dir))
def clear_cache(self): def clear_cache(self):
self.coredata.deps = {} self.coredata.deps = {}
@ -51,18 +67,22 @@ class Conf:
self.coredata.set_options(options) self.coredata.set_options(options)
def save(self): def save(self):
# Do nothing when using introspection
if self.default_values_only:
return
# Only called if something has changed so overwrite unconditionally. # Only called if something has changed so overwrite unconditionally.
coredata.save(self.coredata, self.build_dir) coredata.save(self.coredata, self.build_dir)
# We don't write the build file because any changes to it # We don't write the build file because any changes to it
# are erased when Meson is executed the next time, i.e. when # are erased when Meson is executed the next time, i.e. when
# Ninja is run. # Ninja is run.
@staticmethod def print_aligned(self, arr):
def print_aligned(arr):
if not arr: if not arr:
return return
titles = {'name': 'Option', 'descr': 'Description', 'value': 'Current Value', 'choices': 'Possible Values'} titles = {'name': 'Option', 'descr': 'Description', 'value': 'Current Value', 'choices': 'Possible Values'}
if self.default_values_only:
titles['value'] = 'Default Value'
name_col = [titles['name'], '-' * len(titles['name'])] name_col = [titles['name'], '-' * len(titles['name'])]
value_col = [titles['value'], '-' * len(titles['value'])] value_col = [titles['value'], '-' * len(titles['value'])]
@ -111,9 +131,18 @@ class Conf:
self.print_aligned(arr) self.print_aligned(arr)
def print_conf(self): def print_conf(self):
def print_default_values_warning():
mlog.warning('The source directory instead of the build directory was specified.')
mlog.warning('Only the default values for the project are printed, and all command line parameters are ignored.')
if self.default_values_only:
print_default_values_warning()
print('')
print('Core properties:') print('Core properties:')
print(' Source dir', self.build.environment.source_dir) print(' Source dir', self.source_dir)
print(' Build dir ', self.build.environment.build_dir) if not self.default_values_only:
print(' Build dir ', self.build_dir)
dir_option_names = ['bindir', dir_option_names = ['bindir',
'datadir', 'datadir',
@ -144,6 +173,10 @@ class Conf:
self.print_options('Project options', self.coredata.user_options) self.print_options('Project options', self.coredata.user_options)
self.print_options('Testing options', test_options) self.print_options('Testing options', test_options)
# Print the warning twice so that the user shouldn't be able to miss it
if self.default_values_only:
print('')
print_default_values_warning()
def run(options): def run(options):
coredata.parse_cmd_line_options(options) coredata.parse_cmd_line_options(options)
@ -152,16 +185,16 @@ def run(options):
try: try:
c = Conf(builddir) c = Conf(builddir)
save = False save = False
if len(options.cmd_line_options) > 0: if len(options.cmd_line_options) > 0 and not c.default_values_only:
c.set_options(options.cmd_line_options) c.set_options(options.cmd_line_options)
coredata.update_cmd_line_file(builddir, options) coredata.update_cmd_line_file(builddir, options)
save = True save = True
elif options.clearcache: elif options.clearcache and not c.default_values_only:
c.clear_cache() c.clear_cache()
save = True save = True
else: else:
c.print_conf() c.print_conf()
if save: if save and not c.default_values_only:
c.save() c.save()
mintro.update_build_options(c.coredata, c.build.environment.info_dir) mintro.update_build_options(c.coredata, c.build.environment.info_dir)
mintro.write_meson_info_file(c.build, []) mintro.write_meson_info_file(c.build, [])

Loading…
Cancel
Save