aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesonbuild/coredata.py114
-rw-r--r--mesonbuild/interpreter.py5
-rw-r--r--mesonbuild/mconf.py39
-rw-r--r--mesonbuild/mesonlib.py3
-rw-r--r--mesonbuild/mesonmain.py70
-rw-r--r--mesonbuild/optinterpreter.py2
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,