|
|
|
@ -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, []) |
|
|
|
|