Merge pull request #4826 from mensinda/confDefOpts
mconf: Use introspection to print the project default options (fixes #2543)
This commit is contained in:
commit
a32f31fdfa
|
@ -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 'meson.build' in [os.path.basename(self.build_dir), self.build_dir]:
|
||||||
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 = 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',
|
||||||
|
@ -145,6 +174,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,6 +185,10 @@ def run(options):
|
||||||
c = None
|
c = None
|
||||||
try:
|
try:
|
||||||
c = Conf(builddir)
|
c = Conf(builddir)
|
||||||
|
if c.default_values_only:
|
||||||
|
c.print_conf()
|
||||||
|
return 0
|
||||||
|
|
||||||
save = False
|
save = False
|
||||||
if len(options.cmd_line_options) > 0:
|
if len(options.cmd_line_options) > 0:
|
||||||
c.set_options(options.cmd_line_options)
|
c.set_options(options.cmd_line_options)
|
||||||
|
|
|
@ -321,7 +321,7 @@ def run(options):
|
||||||
if options.builddir is not None:
|
if options.builddir is not None:
|
||||||
datadir = os.path.join(options.builddir, datadir)
|
datadir = os.path.join(options.builddir, datadir)
|
||||||
infodir = os.path.join(options.builddir, infodir)
|
infodir = os.path.join(options.builddir, infodir)
|
||||||
if options.builddir.endswith('/meson.build') or options.builddir.endswith('\\meson.build') or options.builddir == 'meson.build':
|
if 'meson.build' in [os.path.basename(options.builddir), options.builddir]:
|
||||||
sourcedir = '.' if options.builddir == 'meson.build' else options.builddir[:-11]
|
sourcedir = '.' if options.builddir == 'meson.build' else options.builddir[:-11]
|
||||||
if options.projectinfo:
|
if options.projectinfo:
|
||||||
list_projinfo_from_source(sourcedir, indent)
|
list_projinfo_from_source(sourcedir, indent)
|
||||||
|
|
Loading…
Reference in New Issue