diff options
-rw-r--r-- | mesonbuild/coredata.py | 114 | ||||
-rw-r--r-- | mesonbuild/interpreter.py | 5 | ||||
-rw-r--r-- | mesonbuild/mconf.py | 39 | ||||
-rw-r--r-- | mesonbuild/mesonlib.py | 3 | ||||
-rw-r--r-- | mesonbuild/mesonmain.py | 70 | ||||
-rw-r--r-- | mesonbuild/optinterpreter.py | 2 |
6 files changed, 116 insertions, 117 deletions
diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py index 3ad0cd2..78eb6d4 100644 --- a/mesonbuild/coredata.py +++ b/mesonbuild/coredata.py @@ -13,33 +13,10 @@ # limitations under the License. import pickle, os, uuid -from .mesonlib import MesonException +from .mesonlib import MesonException, default_libdir, default_libexecdir, default_prefix version = '0.31.0.dev1' -build_types = ['plain', 'debug', 'debugoptimized', 'release'] -layouts = ['mirror', 'flat'] -warning_levels = ['1', '2', '3'] -libtypelist = ['shared', 'static'] - -builtin_options = {'buildtype': True, - 'strip': True, - 'coverage': True, - 'unity': True, - 'prefix': True, - 'libdir' : True, - 'libexecdir' : True, - 'bindir' : True, - 'includedir' : True, - 'datadir' : True, - 'mandir' : True, - 'localedir' : True, - 'werror' : True, - 'warning_level': True, - 'layout' : True, - 'default_library': True, - } - class UserOption: def __init__(self, name, description, choices): super().__init__() @@ -70,7 +47,7 @@ class UserStringOption(UserOption): class UserBooleanOption(UserOption): def __init__(self, name, description, value): - super().__init__(name, description, '[true, false]') + super().__init__(name, description, [ True, False ]) self.set_value(value) def tobool(self, thing): @@ -137,7 +114,6 @@ class CoreData(): self.regen_guid = str(uuid.uuid4()).upper() self.target_guids = {} self.version = version - self.builtin_options = {} self.init_builtins(options) self.user_options = {} self.compiler_options = {} @@ -155,36 +131,21 @@ class CoreData(): self.modules = {} def init_builtins(self, options): - self.builtin_options['prefix'] = UserStringOption('prefix', 'Installation prefix', options.prefix) - self.builtin_options['libdir'] = UserStringOption('libdir', 'Library dir', options.libdir) - self.builtin_options['libexecdir'] = UserStringOption('libexecdir', 'Library executables dir', options.libexecdir) - self.builtin_options['bindir'] = UserStringOption('bindir', 'Executable dir', options.bindir) - self.builtin_options['includedir'] = UserStringOption('includedir', 'Include dir', options.includedir) - self.builtin_options['datadir'] = UserStringOption('datadir', 'Data directory', options.datadir) - self.builtin_options['mandir'] = UserStringOption('mandir', 'Man page dir', options.mandir) - self.builtin_options['localedir'] = UserStringOption('localedir', 'Locale dir', options.localedir) - self.builtin_options['backend'] = UserStringOption('backend', 'Backend to use', options.backend) - self.builtin_options['buildtype'] = UserComboOption('buildtype', 'Build type', build_types, options.buildtype) - self.builtin_options['strip'] = UserBooleanOption('strip', 'Strip on install', options.strip) - self.builtin_options['unity'] = UserBooleanOption('unity', 'Unity build', options.unity) - self.builtin_options['warning_level'] = UserComboOption('warning_level', 'Warning level', warning_levels, options.warning_level) - self.builtin_options['werror'] = UserBooleanOption('werror', 'Warnings are errors', options.werror) - self.builtin_options['layout'] = UserComboOption('layout', 'Build dir layout', layouts, options.layout) - self.builtin_options['default_library'] = UserComboOption('default_library', 'Default_library type', libtypelist, options.default_library) + self.builtins = {} + for key in get_builtin_options(): + args = [key] + builtin_options[key][1:-1] + [ getattr(options, key, get_builtin_option_default(key)) ] + self.builtins[key] = builtin_options[key][0](*args) def get_builtin_option(self, optname): - if optname in self.builtin_options: - return self.builtin_options[optname].value - raise RuntimeError('Tried to get unknown builtin option %s' % optname) + if optname in self.builtins: + return self.builtins[optname].value + raise RuntimeError('Tried to get unknown builtin option %s.' % optname) def set_builtin_option(self, optname, value): - if optname in self.builtin_options: - self.builtin_options[optname].set_value(value) + if optname in self.builtins: + self.builtins[optname].set_value(value) else: - raise RuntimeError('Tried to set unknown builtin option %s' % optname) - - def is_builtin_option(self, optname): - return optname in self.builtin_options + raise RuntimeError('Tried to set unknown builtin option %s.' % optname) def load(filename): obj = pickle.load(open(filename, 'rb')) @@ -200,6 +161,57 @@ def save(obj, filename): raise RuntimeError('Fatal version mismatch corruption.') pickle.dump(obj, open(filename, 'wb')) +def get_builtin_options(): + return list(builtin_options.keys()) + +def is_builtin_option(optname): + return optname in get_builtin_options() + +def get_builtin_option_choices(optname): + if is_builtin_option(optname): + if builtin_options[optname][0] == UserStringOption: + return None + elif builtin_options[optname][0] == UserBooleanOption: + return [ True, False ] + else: + return builtin_options[optname][2] + else: + raise RuntimeError('Tried to get the supported values for an unknown builtin option \'%s\'.' % optname) + +def get_builtin_option_description(optname): + if is_builtin_option(optname): + return builtin_options[optname][1] + else: + raise RuntimeError('Tried to get the description for an unknown builtin option \'%s\'.' % optname) + +def get_builtin_option_default(optname): + if is_builtin_option(optname): + o = builtin_options[optname] + if o[0] == UserComboOption: + return o[3] + return o[2] + else: + raise RuntimeError('Tried to get the default value for an unknown builtin option \'%s\'.' % optname) + +builtin_options = { + 'buildtype' : [ UserComboOption, 'Build type to use.', [ 'plain', 'debug', 'debugoptimized', 'release' ], 'debug' ], + 'strip' : [ UserBooleanOption, 'Strip targets on install.', False ], + 'unity' : [ UserBooleanOption, 'Unity build.', False ], + 'prefix' : [ UserStringOption, 'Installation prefix.', default_prefix() ], + 'libdir' : [ UserStringOption, 'Library directory.', default_libdir() ], + 'libexecdir' : [ UserStringOption, 'Library executable directory.', default_libexecdir() ], + 'bindir' : [ UserStringOption, 'Executable directory.', 'bin' ], + 'includedir' : [ UserStringOption, 'Header file directory.', 'include' ], + 'datadir' : [ UserStringOption, 'Data file directory.', 'share' ], + 'mandir' : [ UserStringOption, 'Manual page directory.', 'share/man' ], + 'localedir' : [ UserStringOption, 'Locale data directory.', 'share/locale' ], + 'werror' : [ UserBooleanOption, 'Treat warnings as errors.', False ], + 'warning_level' : [ UserComboOption, 'Compiler warning level to use.', [ '1', '2', '3' ], '1'], + 'layout' : [ UserComboOption, 'Build directory layout.', ['mirror', 'flat' ], 'mirror' ], + 'default_library' : [ UserComboOption, 'Default library type.', [ 'shared', 'static' ], 'shared' ], + 'backend' : [ UserComboOption, 'Backend to use.', [ 'ninja', 'vs2010', 'xcode' ], 'ninja' ], + } + forbidden_target_names = {'clean': None, 'clean-gcno': None, 'clean-gcda': None, diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index 8eefd5f..cf53c53 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -1341,7 +1341,7 @@ class Interpreter(): return self.environment.coredata.compiler_options[optname].value except KeyError: pass - if optname not in coredata.builtin_options and self.is_subproject(): + if not coredata.is_builtin_option(optname) and self.is_subproject(): optname = self.subproject + ':' + optname try: return self.environment.coredata.user_options[optname].value @@ -1364,8 +1364,7 @@ class Interpreter(): if '=' not in option: raise InterpreterException('All default options must be of type key=value.') key, value = option.split('=', 1) - builtin_options = self.coredata.builtin_options - if key in builtin_options: + if coredata.is_builtin_option(key): if not self.environment.had_argument_for(key): self.coredata.set_builtin_option(key, value) # If this was set on the command line, do not override. diff --git a/mesonbuild/mconf.py b/mesonbuild/mconf.py index 30c2da3..5b963d5 100644 --- a/mesonbuild/mconf.py +++ b/mesonbuild/mconf.py @@ -18,7 +18,6 @@ import sys, os import pickle import argparse from . import coredata, mesonlib -from .coredata import build_types, warning_levels, libtypelist parser = argparse.ArgumentParser() @@ -62,7 +61,8 @@ class Conf: longest_name = max(longest_name, len(x[0])) longest_descr = max(longest_descr, len(x[1])) longest_value = max(longest_value, len(str(x[2]))) - longest_possible_value = max(longest_possible_value, len(x[3])) + if x[3]: + longest_possible_value = max(longest_possible_value, len(x[3])) if longest_possible_value > 0: titles[3] = 'Possible Values' @@ -71,10 +71,14 @@ class Conf: for i in arr: name = i[0] descr = i[1] - value = i[2] - if isinstance(value, bool): - value = 'true' if value else 'false' - possible_values = i[3] + value = i[2] if isinstance(i[2], str) else str(i[2]).lower() + possible_values = '' + if isinstance(i[3], list): + if len(i[3]) > 0: + i[3] = [s if isinstance(s, str) else str(s).lower() for s in i[3]] + possible_values = '[%s]' % ', '.join(map(str, i[3])) + elif i[3]: + possible_values = i[3] if isinstance(i[3], str) else str(i[3]).lower() namepad = ' '*(longest_name - len(name)) descrpad = ' '*(longest_descr - len(descr)) valuepad = ' '*(longest_value - len(str(value))) @@ -86,7 +90,7 @@ class Conf: if '=' not in o: raise ConfException('Value "%s" not of type "a=b".' % o) (k, v) = o.split('=', 1) - if self.coredata.is_builtin_option(k): + if coredata.is_builtin_option(k): self.coredata.set_builtin_option(k, v) elif k in self.coredata.user_options: tgt = self.coredata.user_options[k] @@ -123,13 +127,9 @@ class Conf: print('') print('Core options:') carr = [] - booleans = '[true, false]' - carr.append(['buildtype', 'Build type', self.coredata.get_builtin_option('buildtype'), build_types]) - carr.append(['warning_level', 'Warning level', self.coredata.get_builtin_option('warning_level'), warning_levels]) - carr.append(['werror', 'Treat warnings as errors', self.coredata.get_builtin_option('werror'), booleans]) - carr.append(['strip', 'Strip on install', self.coredata.get_builtin_option('strip'), booleans]) - carr.append(['unity', 'Unity build', self.coredata.get_builtin_option('unity'), booleans]) - carr.append(['default_library', 'Default library type', self.coredata.get_builtin_option('default_library'), libtypelist]) + for key in [ 'buildtype', 'warning_level', 'werror', 'strip', 'unity', 'default_library' ]: + carr.append([key, coredata.get_builtin_option_description(key), + self.coredata.get_builtin_option(key), coredata.get_builtin_option_choices(key)]) self.print_aligned(carr) print('') print('Base options:') @@ -164,14 +164,9 @@ class Conf: print('') print('Directories:') parr = [] - parr.append(['prefix', 'Install prefix', self.coredata.get_builtin_option('prefix'), '']) - parr.append(['libdir', 'Library directory', self.coredata.get_builtin_option('libdir'), '']) - parr.append(['libexecdir', 'Library executables directory', self.coredata.get_builtin_option('libexecdir'), '']) - parr.append(['bindir', 'Binary directory', self.coredata.get_builtin_option('bindir'), '']) - parr.append(['includedir', 'Header directory', self.coredata.get_builtin_option('includedir'), '']) - parr.append(['datadir', 'Data directory', self.coredata.get_builtin_option('datadir'), '']) - parr.append(['mandir', 'Man page directory', self.coredata.get_builtin_option('mandir'), '']) - parr.append(['localedir', 'Locale file directory', self.coredata.get_builtin_option('localedir'), '']) + for key in [ 'prefix', 'libdir', 'libexecdir', 'bindir', 'includedir', 'datadir', 'mandir', 'localedir' ]: + parr.append([key, coredata.get_builtin_option_description(key), + self.coredata.get_builtin_option(key), coredata.get_builtin_option_choices(key)]) self.print_aligned(parr) print('') print('Project options:') diff --git a/mesonbuild/mesonlib.py b/mesonbuild/mesonlib.py index 031bbc0..2ac0932 100644 --- a/mesonbuild/mesonlib.py +++ b/mesonbuild/mesonlib.py @@ -179,6 +179,9 @@ def default_libexecdir(): # There is no way to auto-detect this, so it must be set at build time return 'libexec' +def default_prefix(): + return 'c:/' if is_windows() else '/usr/local' + def get_library_dirs(): if is_windows(): return ['C:/mingw/lib'] # Fixme diff --git a/mesonbuild/mesonmain.py b/mesonbuild/mesonmain.py index af09e11..3b05afb 100644 --- a/mesonbuild/mesonmain.py +++ b/mesonbuild/mesonmain.py @@ -22,7 +22,6 @@ from . import build import platform from . import mlog, coredata from .mesonlib import MesonException -from .coredata import build_types, layouts, warning_levels, libtypelist backendlist = ['ninja', 'vs2010', 'xcode'] @@ -30,49 +29,40 @@ parser = argparse.ArgumentParser() default_warning = '1' -if mesonlib.is_windows(): - def_prefix = 'c:/' -else: - def_prefix = '/usr/local' +def add_builtin_argument(name, **kwargs): + k = kwargs.get('dest', name.replace('-', '_')) + c = coredata.get_builtin_option_choices(k) + b = True if kwargs.get('action', None) in [ 'store_true', 'store_false' ] else False + h = coredata.get_builtin_option_description(k) + if not b: + h = h.rstrip('.') + ' (default: %s).' % coredata.get_builtin_option_default(k) + if c and not b: + kwargs['choices'] = c + parser.add_argument('--' + name, default=coredata.get_builtin_option_default(k), help=h, **kwargs) -parser.add_argument('--prefix', default=def_prefix, dest='prefix', - help='the installation prefix (default: %(default)s)') -parser.add_argument('--libdir', default=mesonlib.default_libdir(), dest='libdir', - help='the installation subdir of libraries (default: %(default)s)') -parser.add_argument('--libexecdir', default=mesonlib.default_libexecdir(), dest='libexecdir', - help='the installation subdir of library executables (default: %(default)s)') -parser.add_argument('--bindir', default='bin', dest='bindir', - help='the installation subdir of executables (default: %(default)s)') -parser.add_argument('--includedir', default='include', dest='includedir', - help='relative path of installed headers (default: %(default)s)') -parser.add_argument('--datadir', default='share', dest='datadir', - help='relative path to the top of data file subdirectory (default: %(default)s)') -parser.add_argument('--mandir', default='share/man', dest='mandir', - help='relative path of man files (default: %(default)s)') -parser.add_argument('--localedir', default='share/locale', dest='localedir', - help='relative path of locale data (default: %(default)s)') -parser.add_argument('--backend', default='ninja', dest='backend', choices=backendlist, - help='backend to use (default: %(default)s)') -parser.add_argument('--buildtype', default='debug', choices=build_types, dest='buildtype', - help='build type go use (default: %(default)s)') -parser.add_argument('--strip', action='store_true', dest='strip', default=False,\ - help='strip targets on install (default: %(default)s)') -parser.add_argument('--unity', action='store_true', dest='unity', default=False,\ - help='unity build') -parser.add_argument('--werror', action='store_true', dest='werror', default=False,\ - help='Treat warnings as errors') -parser.add_argument('--layout', choices=layouts, dest='layout', default='mirror',\ - help='Build directory layout.') -parser.add_argument('--default-library', choices=libtypelist, dest='default_library', - default='shared', help='Default library type.') -parser.add_argument('--warnlevel', default=default_warning, dest='warning_level', choices=warning_levels,\ - help='Level of compiler warnings to use (larger is more, default is %(default)s)') -parser.add_argument('--cross-file', default=None, dest='cross_file', - help='file describing cross compilation environment') +add_builtin_argument('prefix') +add_builtin_argument('libdir') +add_builtin_argument('libexecdir') +add_builtin_argument('bindir') +add_builtin_argument('includedir') +add_builtin_argument('datadir') +add_builtin_argument('mandir') +add_builtin_argument('localedir') +add_builtin_argument('backend') +add_builtin_argument('buildtype') +add_builtin_argument('strip', action='store_true') +add_builtin_argument('unity', action='store_true') +add_builtin_argument('werror', action='store_true') +add_builtin_argument('layout') +add_builtin_argument('default-library') +add_builtin_argument('warnlevel', dest='warning_level') + +parser.add_argument('--cross-file', default=None, + help='File describing cross compilation environment.') parser.add_argument('-D', action='append', dest='projectoptions', default=[], help='Set project options.') parser.add_argument('-v', '--version', action='store_true', dest='print_version', default=False, - help='Print version.') + help='Print version information.') parser.add_argument('directories', nargs='*') class MesonApp(): diff --git a/mesonbuild/optinterpreter.py b/mesonbuild/optinterpreter.py index aaa99b0..409f9dc 100644 --- a/mesonbuild/optinterpreter.py +++ b/mesonbuild/optinterpreter.py @@ -17,7 +17,7 @@ from . import coredata from . import mesonlib import os, re -forbidden_option_names = coredata.builtin_options +forbidden_option_names = coredata.get_builtin_options() forbidden_prefixes = {'c_': True, 'cpp_': True, 'rust_': True, |