diff options
author | Daniel Mensinger <daniel@mensinger-ka.de> | 2019-01-25 12:21:32 +0100 |
---|---|---|
committer | Daniel Mensinger <daniel@mensinger-ka.de> | 2019-01-25 12:21:32 +0100 |
commit | 90bc125d2952e281ec47c366b83f034f8a1f6993 (patch) | |
tree | d1dc2ba002cbb0f08a5aca78b37ab5cc77ec3d63 | |
parent | 28edc7ef61f6c4cdc74f68128a4b3f97bda060a6 (diff) | |
download | meson-90bc125d2952e281ec47c366b83f034f8a1f6993.zip meson-90bc125d2952e281ec47c366b83f034f8a1f6993.tar.gz meson-90bc125d2952e281ec47c366b83f034f8a1f6993.tar.bz2 |
mconf: Use introspection to print the project default options (fixes #2543)
-rw-r--r-- | docs/markdown/Configuring-a-build-directory.md | 5 | ||||
-rw-r--r-- | docs/markdown/snippets/configure_default_opts.md | 6 | ||||
-rw-r--r-- | mesonbuild/mconf.py | 61 |
3 files changed, 58 insertions, 14 deletions
diff --git a/docs/markdown/Configuring-a-build-directory.md b/docs/markdown/Configuring-a-build-directory.md index 0c7487f..91ad6f7 100644 --- a/docs/markdown/Configuring-a-build-directory.md +++ b/docs/markdown/Configuring-a-build-directory.md @@ -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. diff --git a/docs/markdown/snippets/configure_default_opts.md b/docs/markdown/snippets/configure_default_opts.md new file mode 100644 index 0000000..4b88bdf --- /dev/null +++ b/docs/markdown/snippets/configure_default_opts.md @@ -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. diff --git a/mesonbuild/mconf.py b/mesonbuild/mconf.py index b8fb3c6..da51160 100644 --- a/mesonbuild/mconf.py +++ b/mesonbuild/mconf.py @@ -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 = build.load(self.build_dir) - self.coredata = coredata.load(self.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, []) |