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
cause Meson to detect that the build setup has changed and do all the
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.
import os
from . import (coredata, mesonlib, build)
from . import mintro
from . import coredata, environment, mesonlib, build, mintro, mlog
def add_arguments(parser):
coredata.register_builtin_arguments(parser)
@ -38,11 +37,28 @@ class ConfException(mesonlib.MesonException):
class Conf:
def __init__(self, build_dir):
self.build_dir = build_dir
if not os.path.isdir(os.path.join(build_dir, 'meson-private')):
raise ConfException('Directory %s does not seem to be a Meson build directory.' % build_dir)
self.build_dir = os.path.abspath(os.path.realpath(build_dir))
if self.build_dir.endswith('/meson.build') or self.build_dir.endswith('\\meson.build') or self.build_dir == 'meson.build':
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.source_dir = self.build.environment.get_source_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):
self.coredata.deps = {}
@ -51,18 +67,22 @@ class Conf:
self.coredata.set_options(options)
def save(self):
# Do nothing when using introspection
if self.default_values_only:
return
# Only called if something has changed so overwrite unconditionally.
coredata.save(self.coredata, self.build_dir)
# We don't write the build file because any changes to it
# are erased when Meson is executed the next time, i.e. when
# Ninja is run.
@staticmethod
def print_aligned(arr):
def print_aligned(self, arr):
if not arr:
return
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'])]
value_col = [titles['value'], '-' * len(titles['value'])]
@ -111,9 +131,18 @@ class Conf:
self.print_aligned(arr)
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(' Source dir', self.build.environment.source_dir)
print(' Build dir ', self.build.environment.build_dir)
print(' Source dir', self.source_dir)
if not self.default_values_only:
print(' Build dir ', self.build_dir)
dir_option_names = ['bindir',
'datadir',
@ -144,6 +173,10 @@ class Conf:
self.print_options('Project options', self.coredata.user_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):
coredata.parse_cmd_line_options(options)
@ -152,16 +185,16 @@ def run(options):
try:
c = Conf(builddir)
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)
coredata.update_cmd_line_file(builddir, options)
save = True
elif options.clearcache:
elif options.clearcache and not c.default_values_only:
c.clear_cache()
save = True
else:
c.print_conf()
if save:
if save and not c.default_values_only:
c.save()
mintro.update_build_options(c.coredata, c.build.environment.info_dir)
mintro.write_meson_info_file(c.build, [])

Loading…
Cancel
Save