coredata: Centralize builtin option descriptions and definitions.
This commit is contained in:
parent
336904b553
commit
af6f4c9b9c
|
@ -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,
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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:')
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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():
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue