rewriter: Set and delete default options

pull/4939/head
Daniel Mensinger 6 years ago
parent 74bb79e26e
commit 9e247cb52e
No known key found for this signature in database
GPG Key ID: 54DD94C131E277D4
  1. 49
      mesonbuild/rewriter.py
  2. 28
      run_unittests.py
  3. 18
      test cases/rewrite/3 kwargs/defopts_delete.json
  4. 24
      test cases/rewrite/3 kwargs/defopts_set.json

@ -268,6 +268,10 @@ class MTypeIDList(MTypeList):
return [mparser.IdNode]
rewriter_keys = {
'default_options': {
'operation': (str, None, ['set', 'delete']),
'options': (dict, {}, None)
},
'kwargs': {
'function': (str, None, None),
'id': (str, None, None),
@ -325,6 +329,7 @@ class Rewriter:
self.to_remove_nodes = []
self.to_add_nodes = []
self.functions = {
'default_options': self.process_default_options,
'kwargs': self.process_kwargs,
'target': self.process_target,
}
@ -393,6 +398,50 @@ class Rewriter:
return dep
@RequiredKeys(rewriter_keys['default_options'])
def process_default_options(self, cmd):
# First, remove the old values
kwargs_cmd = {
'function': 'project',
'id': "",
'operation': 'remove_regex',
'kwargs': {
'default_options': ['{}=.*'.format(x) for x in cmd['options'].keys()]
}
}
self.process_kwargs(kwargs_cmd)
# Then add the new values
if cmd['operation'] != 'set':
return
kwargs_cmd['operation'] = 'add'
kwargs_cmd['kwargs']['default_options'] = []
cdata = self.interpreter.coredata
options = {
**cdata.builtins,
**cdata.backend_options,
**cdata.base_options,
**cdata.compiler_options.build,
**cdata.user_options
}
for key, val in cmd['options'].items():
if key not in options:
mlog.error('Unknown options', mlog.bold(key), '--> skipping')
continue
try:
val = options[key].validate_value(val)
except MesonException as e:
mlog.error('Unable to set', mlog.bold(key), mlog.red(str(e)), '--> skipping')
continue
kwargs_cmd['kwargs']['default_options'] += ['{}={}'.format(key, val)]
self.process_kwargs(kwargs_cmd)
@RequiredKeys(rewriter_keys['kwargs'])
def process_kwargs(self, cmd):
mlog.log('Processing function type', mlog.bold(cmd['function']), 'with id', mlog.cyan("'" + cmd['id'] + "'"))

@ -5327,6 +5327,34 @@ class RewriterTests(BasePlatformTests):
}
self.assertDictEqual(out, expected)
def test_default_options_set(self):
self.prime('3 kwargs')
self.rewrite(self.builddir, os.path.join(self.builddir, 'defopts_set.json'))
out = self.rewrite(self.builddir, os.path.join(self.builddir, 'info.json'))
out = self.extract_test_data(out)
expected = {
'kwargs': {
'project#': {'version': '0.0.1', 'default_options': ['buildtype=release', 'debug=True', 'cpp_std=c++11']},
'target#tgt1': {'build_by_default': True},
'dependency#dep1': {'required': False}
}
}
self.assertDictEqual(out, expected)
def test_default_options_delete(self):
self.prime('3 kwargs')
self.rewrite(self.builddir, os.path.join(self.builddir, 'defopts_delete.json'))
out = self.rewrite(self.builddir, os.path.join(self.builddir, 'info.json'))
out = self.extract_test_data(out)
expected = {
'kwargs': {
'project#': {'version': '0.0.1', 'default_options': ['cpp_std=c++17', 'debug=true']},
'target#tgt1': {'build_by_default': True},
'dependency#dep1': {'required': False}
}
}
self.assertDictEqual(out, expected)
class NativeFileTests(BasePlatformTests):
def setUp(self):

@ -0,0 +1,18 @@
[
{
"type": "kwargs",
"function": "project",
"id": "",
"operation": "set",
"kwargs": {
"default_options": ["cpp_std=c++17", "buildtype=release", "debug=true"]
}
},
{
"type": "default_options",
"operation": "delete",
"options": {
"buildtype": null
}
}
]

@ -0,0 +1,24 @@
[
{
"type": "default_options",
"operation": "set",
"options": {
"cpp_std": "c++17"
}
},
{
"type": "default_options",
"operation": "set",
"options": {
"buildtype": "release",
"debug": true
}
},
{
"type": "default_options",
"operation": "set",
"options": {
"cpp_std": "c++11"
}
}
]
Loading…
Cancel
Save