aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesonbuild/ast/interpreter.py4
-rw-r--r--mesonbuild/ast/introspection.py22
-rw-r--r--mesonbuild/rewriter.py367
-rwxr-xr-xrun_unittests.py96
-rw-r--r--test cases/rewrite/1 basic/addSrc.json18
-rw-r--r--test cases/rewrite/1 basic/info.json26
-rw-r--r--test cases/rewrite/1 basic/rmSrc.json18
-rw-r--r--test cases/rewrite/2 subdirs/addSrc.json2
-rw-r--r--test cases/rewrite/2 subdirs/info.json2
-rw-r--r--test cases/rewrite/3 kwargs/add.json29
-rw-r--r--test cases/rewrite/3 kwargs/delete.json20
-rw-r--r--test cases/rewrite/3 kwargs/info.json20
-rw-r--r--test cases/rewrite/3 kwargs/meson.build7
-rw-r--r--test cases/rewrite/3 kwargs/remove.json29
-rw-r--r--test cases/rewrite/3 kwargs/set.json34
15 files changed, 634 insertions, 60 deletions
diff --git a/mesonbuild/ast/interpreter.py b/mesonbuild/ast/interpreter.py
index 68c017a..ce4b93c 100644
--- a/mesonbuild/ast/interpreter.py
+++ b/mesonbuild/ast/interpreter.py
@@ -113,7 +113,7 @@ class AstInterpreter(interpreterbase.InterpreterBase):
prev_subdir = self.subdir
subdir = os.path.join(prev_subdir, args[0])
absdir = os.path.join(self.source_root, subdir)
- buildfilename = os.path.join(self.subdir, environment.build_filename)
+ buildfilename = os.path.join(subdir, environment.build_filename)
absname = os.path.join(self.source_root, buildfilename)
symlinkless_dir = os.path.realpath(absdir)
if symlinkless_dir in self.visited_subdirs:
@@ -128,7 +128,7 @@ class AstInterpreter(interpreterbase.InterpreterBase):
code = f.read()
assert(isinstance(code, str))
try:
- codeblock = mparser.Parser(code, self.subdir).parse()
+ codeblock = mparser.Parser(code, subdir).parse()
except mesonlib.MesonException as me:
me.file = buildfilename
raise me
diff --git a/mesonbuild/ast/introspection.py b/mesonbuild/ast/introspection.py
index 4a03e98..b6a523b 100644
--- a/mesonbuild/ast/introspection.py
+++ b/mesonbuild/ast/introspection.py
@@ -51,9 +51,12 @@ class IntrospectionInterpreter(AstInterpreter):
self.default_options = {'backend': self.backend}
self.project_data = {}
self.targets = []
+ self.dependencies = []
+ self.project_node = None
self.funcs.update({
'add_languages': self.func_add_languages,
+ 'dependency': self.func_dependency,
'executable': self.func_executable,
'jar': self.func_jar,
'library': self.func_library,
@@ -65,6 +68,9 @@ class IntrospectionInterpreter(AstInterpreter):
})
def func_project(self, node, args, kwargs):
+ if self.project_node:
+ raise InvalidArguments('Second call to project()')
+ self.project_node = node
if len(args) < 1:
raise InvalidArguments('Not enough arguments to project(). Needs at least the project name.')
@@ -125,6 +131,16 @@ class IntrospectionInterpreter(AstInterpreter):
if lang not in self.coredata.compilers:
self.environment.detect_compilers(lang, need_cross_compiler)
+ def func_dependency(self, node, args, kwargs):
+ args = self.flatten_args(args)
+ if not args:
+ return
+ name = args[0]
+ self.dependencies += [{
+ 'name': name,
+ 'node': node
+ }]
+
def build_target(self, node, args, kwargs, targetclass):
if not args:
return
@@ -159,10 +175,8 @@ class IntrospectionInterpreter(AstInterpreter):
if elemetary_nodes:
source_nodes += [curr]
- # Filter out kwargs from other target types. For example 'soversion'
- # passed to library() when default_library == 'static'.
- kwargs = {k: v for k, v in kwargs.items() if k in targetclass.known_kwargs}
-
+ # Make sure nothing can crash when creating the build class
+ kwargs = {}
is_cross = False
objects = []
empty_sources = [] # Passing the unresolved sources list causes errors
diff --git a/mesonbuild/rewriter.py b/mesonbuild/rewriter.py
index 277835c..60c762e 100644
--- a/mesonbuild/rewriter.py
+++ b/mesonbuild/rewriter.py
@@ -71,15 +71,224 @@ class RequiredKeys:
return wrapped
+class MTypeBase:
+ def __init__(self, node: mparser.BaseNode):
+ if node is None:
+ self.node = self._new_node()
+ else:
+ self.node = node
+ self.node_type = None
+ for i in self.supported_nodes():
+ if isinstance(self.node, i):
+ self.node_type = i
+
+ def _new_node(self):
+ # Overwrite in derived class
+ return mparser.BaseNode()
+
+ def can_modify(self):
+ return self.node_type is not None
+
+ def get_node(self):
+ return self.node
+
+ def supported_nodes(self):
+ # Overwrite in derived class
+ return []
+
+ def set_value(self, value):
+ # Overwrite in derived class
+ mlog.warning('Cannot set the value of type', mlog.bold(type(self).__name__), '--> skipping')
+
+ def add_value(self, value):
+ # Overwrite in derived class
+ mlog.warning('Cannot add a value of type', mlog.bold(type(self).__name__), '--> skipping')
+
+ def remove_value(self, value):
+ # Overwrite in derived class
+ mlog.warning('Cannot remove a value of type', mlog.bold(type(self).__name__), '--> skipping')
+
+class MTypeStr(MTypeBase):
+ def __init__(self, node: mparser.BaseNode):
+ super().__init__(node)
+
+ def _new_node(self):
+ return mparser.StringNode(mparser.Token('', '', 0, 0, 0, None, ''))
+
+ def supported_nodes(self):
+ return [mparser.StringNode]
+
+ def set_value(self, value):
+ self.node.value = str(value)
+
+class MTypeBool(MTypeBase):
+ def __init__(self, node: mparser.BaseNode):
+ super().__init__(node)
+
+ def _new_node(self):
+ return mparser.StringNode(mparser.Token('', '', 0, 0, 0, None, False))
+
+ def supported_nodes(self):
+ return [mparser.BooleanNode]
+
+ def set_value(self, value):
+ self.node.value = bool(value)
+
+class MTypeID(MTypeBase):
+ def __init__(self, node: mparser.BaseNode):
+ super().__init__(node)
+
+ def _new_node(self):
+ return mparser.StringNode(mparser.Token('', '', 0, 0, 0, None, ''))
+
+ def supported_nodes(self):
+ return [mparser.IdNode]
+
+ def set_value(self, value):
+ self.node.value = str(value)
+
+class MTypeList(MTypeBase):
+ def __init__(self, node: mparser.BaseNode):
+ super().__init__(node)
+
+ def _new_node(self):
+ return mparser.ArrayNode(mparser.ArgumentNode(mparser.Token('', '', 0, 0, 0, None, '')), 0, 0)
+
+ def _new_element_node(self, value):
+ # Overwrite in derived class
+ return mparser.BaseNode()
+
+ def _ensure_array_node(self):
+ if not isinstance(self.node, mparser.ArrayNode):
+ tmp = self.node
+ self.node = self._new_node()
+ self.node.args.arguments += [tmp]
+
+ def _check_is_equal(self, node, value):
+ # Overwrite in derived class
+ return False
+
+ def get_node(self):
+ if isinstance(self.node, mparser.ArrayNode):
+ if len(self.node.args.arguments) == 1:
+ return self.node.args.arguments[0]
+ return self.node
+
+ def supported_element_nodes(self):
+ # Overwrite in derived class
+ return []
+
+ def supported_nodes(self):
+ return [mparser.ArrayNode] + self.supported_element_nodes()
+
+ def set_value(self, value):
+ if not isinstance(value, list):
+ value = [value]
+ self._ensure_array_node()
+ self.node.args.arguments = [] # Remove all current nodes
+ for i in value:
+ self.node.args.arguments += [self._new_element_node(i)]
+
+ def add_value(self, value):
+ if not isinstance(value, list):
+ value = [value]
+ self._ensure_array_node()
+ for i in value:
+ self.node.args.arguments += [self._new_element_node(i)]
+
+ def remove_value(self, value):
+ def check_remove_node(node):
+ for j in value:
+ if self._check_is_equal(i, j):
+ return True
+ return False
+
+ if not isinstance(value, list):
+ value = [value]
+ self._ensure_array_node()
+ removed_list = []
+ for i in self.node.args.arguments:
+ if not check_remove_node(i):
+ removed_list += [i]
+ self.node.args.arguments = removed_list
+
+class MtypeStrList(MTypeList):
+ def __init__(self, node: mparser.BaseNode):
+ super().__init__(node)
+
+ def _new_element_node(self, value):
+ return mparser.StringNode(mparser.Token('', '', 0, 0, 0, None, str(value)))
+
+ def _check_is_equal(self, node, value):
+ if isinstance(node, mparser.StringNode):
+ return node.value == value
+ return False
+
+ def supported_element_nodes(self):
+ return [mparser.StringNode]
+
+class MTypeIDList(MTypeList):
+ def __init__(self, node: mparser.BaseNode):
+ super().__init__(node)
+
+ def _new_element_node(self, value):
+ return mparser.IdNode(mparser.Token('', '', 0, 0, 0, None, str(value)))
+
+ def _check_is_equal(self, node, value):
+ if isinstance(node, mparser.IdNode):
+ return node.value == value
+ return False
+
+ def supported_element_nodes(self):
+ return [mparser.IdNode]
+
rewriter_keys = {
+ 'kwargs': {
+ 'function': (str, None, None),
+ 'id': (str, None, None),
+ 'operation': (str, None, ['set', 'delete', 'add', 'remove', 'info']),
+ 'kwargs': (dict, {}, None)
+ },
'target': {
'target': (str, None, None),
- 'operation': (str, None, ['src_add', 'src_rm', 'test']),
+ 'operation': (str, None, ['src_add', 'src_rm', 'info']),
'sources': (list, [], None),
'debug': (bool, False, None)
}
}
+rewriter_func_kwargs = {
+ 'dependency': {
+ 'language': MTypeStr,
+ 'method': MTypeStr,
+ 'native': MTypeBool,
+ 'not_found_message': MTypeStr,
+ 'required': MTypeBool,
+ 'static': MTypeBool,
+ 'version': MtypeStrList,
+ 'modules': MtypeStrList
+ },
+ 'target': {
+ 'build_by_default': MTypeBool,
+ 'build_rpath': MTypeStr,
+ 'dependencies': MTypeIDList,
+ 'gui_app': MTypeBool,
+ 'link_with': MTypeIDList,
+ 'export_dynamic': MTypeBool,
+ 'implib': MTypeBool,
+ 'install': MTypeBool,
+ 'install_dir': MTypeStr,
+ 'install_rpath': MTypeStr,
+ 'pie': MTypeBool
+ },
+ 'project': {
+ 'meson_version': MTypeStr,
+ 'license': MtypeStrList,
+ 'subproject_dir': MTypeStr,
+ 'version': MTypeStr
+ }
+}
+
class Rewriter:
def __init__(self, sourcedir: str, generator: str = 'ninja'):
self.sourcedir = sourcedir
@@ -87,8 +296,10 @@ class Rewriter:
self.id_generator = AstIDGenerator()
self.modefied_nodes = []
self.functions = {
+ 'kwargs': self.process_kwargs,
'target': self.process_target,
}
+ self.info_dump = None
def analyze_meson(self):
mlog.log('Analyzing meson file:', mlog.bold(os.path.join(self.sourcedir, environment.build_filename)))
@@ -98,11 +309,152 @@ class Rewriter:
self.interpreter.ast.accept(AstIndentationGenerator())
self.interpreter.ast.accept(self.id_generator)
+ def add_info(self, cmd_type: str, cmd_id: str, data: dict):
+ if self.info_dump is None:
+ self.info_dump = {}
+ if cmd_type not in self.info_dump:
+ self.info_dump[cmd_type] = {}
+ self.info_dump[cmd_type][cmd_id] = data
+
+ def print_info(self):
+ if self.info_dump is None:
+ return
+ # Wrap the dump in magic strings
+ print('!!==JSON DUMP: BEGIN==!!')
+ print(json.dumps(self.info_dump, indent=2))
+ print('!!==JSON DUMP: END==!!')
+
def find_target(self, target: str):
- for i in self.interpreter.targets:
- if target == i['name'] or target == i['id']:
- return i
- return None
+ def check_list(name: str):
+ for i in self.interpreter.targets:
+ if name == i['name'] or name == i['id']:
+ return i
+ return None
+
+ tgt = check_list(target)
+ if tgt is not None:
+ return tgt
+
+ # Check the assignments
+ if target in self.interpreter.assignments:
+ node = self.interpreter.assignments[target][0]
+ if isinstance(node, mparser.FunctionNode):
+ if node.func_name in ['executable', 'jar', 'library', 'shared_library', 'shared_module', 'static_library', 'both_libraries']:
+ name = self.interpreter.flatten_args(node.args)[0]
+ tgt = check_list(name)
+
+ return tgt
+
+ def find_dependency(self, dependency: str):
+ def check_list(name: str):
+ for i in self.interpreter.dependencies:
+ if name == i['name']:
+ return i
+ return None
+
+ dep = check_list(dependency)
+ if dep is not None:
+ return dep
+
+ # Check the assignments
+ if dependency in self.interpreter.assignments:
+ node = self.interpreter.assignments[dependency][0]
+ if isinstance(node, mparser.FunctionNode):
+ if node.func_name in ['dependency']:
+ name = self.interpreter.flatten_args(node.args)[0]
+ dep = check_list(name)
+
+ return dep
+
+ @RequiredKeys(rewriter_keys['kwargs'])
+ def process_kwargs(self, cmd):
+ mlog.log('Processing function type', mlog.bold(cmd['function']), 'with id', mlog.cyan("'" + cmd['id'] + "'"))
+ if cmd['function'] not in rewriter_func_kwargs:
+ mlog.error('Unknown function type {} --> skipping'.format(cmd['function']))
+ return
+ kwargs_def = rewriter_func_kwargs[cmd['function']]
+
+ # Find the function node to modify
+ node = None
+ arg_node = None
+ if cmd['function'] == 'project':
+ node = self.interpreter.project_node
+ arg_node = node.args
+ elif cmd['function'] == 'target':
+ tmp = self.find_target(cmd['id'])
+ if tmp:
+ node = tmp['node']
+ arg_node = node.args
+ elif cmd['function'] == 'dependency':
+ tmp = self.find_dependency(cmd['id'])
+ if tmp:
+ node = tmp['node']
+ arg_node = node.args
+ if not node:
+ mlog.error('Unable to find the function node')
+ assert(isinstance(node, mparser.FunctionNode))
+ assert(isinstance(arg_node, mparser.ArgumentNode))
+
+ # Print kwargs info
+ if cmd['operation'] == 'info':
+ info_data = {}
+ for key, val in arg_node.kwargs.items():
+ info_data[key] = None
+ if isinstance(val, mparser.ElementaryNode):
+ info_data[key] = val.value
+ elif isinstance(val, mparser.ArrayNode):
+ data_list = []
+ for i in val.args.arguments:
+ element = None
+ if isinstance(i, mparser.ElementaryNode):
+ element = i.value
+ data_list += [element]
+ info_data[key] = data_list
+
+ self.add_info('kwargs', '{}#{}'.format(cmd['function'], cmd['id']), info_data)
+ return # Nothing else to do
+
+ # Modify the kwargs
+ num_changed = 0
+ for key, val in cmd['kwargs'].items():
+ if key not in kwargs_def:
+ mlog.error('Cannot modify unknown kwarg --> skipping', mlog.bold(key))
+ continue
+
+ # Remove the key from the kwargs
+ if cmd['operation'] == 'delete':
+ if key in arg_node.kwargs:
+ mlog.log(' -- Deleting', mlog.bold(key), 'from the kwargs')
+ del arg_node.kwargs[key]
+ num_changed += 1
+ else:
+ mlog.log(' -- Key', mlog.bold(key), 'is already deleted')
+ continue
+
+ if key not in arg_node.kwargs:
+ arg_node.kwargs[key] = None
+ modifyer = kwargs_def[key](arg_node.kwargs[key])
+ if not modifyer.can_modify():
+ mlog.log(' -- Skipping', mlog.bold(key), 'because it is to complex to modify')
+
+ # Apply the operation
+ val_str = str(val)
+ if cmd['operation'] == 'set':
+ mlog.log(' -- Setting', mlog.bold(key), 'to', mlog.yellow(val_str))
+ modifyer.set_value(val)
+ elif cmd['operation'] == 'add':
+ mlog.log(' -- Adding', mlog.yellow(val_str), 'to', mlog.bold(key))
+ modifyer.add_value(val)
+ elif cmd['operation'] == 'remove':
+ mlog.log(' -- Removing', mlog.yellow(val_str), 'from', mlog.bold(key))
+ modifyer.remove_value(val)
+
+ # Write back the result
+ arg_node.kwargs[key] = modifyer.get_node()
+ num_changed += 1
+
+ if num_changed > 0 and node not in self.modefied_nodes:
+ self.modefied_nodes += [node]
@RequiredKeys(rewriter_keys['target'])
def process_target(self, cmd):
@@ -191,7 +543,7 @@ class Rewriter:
if root not in self.modefied_nodes:
self.modefied_nodes += [root]
- elif cmd['operation'] == 'test':
+ elif cmd['operation'] == 'info':
# List all sources in the target
src_list = []
for i in target['sources']:
@@ -202,7 +554,7 @@ class Rewriter:
'name': target['name'],
'sources': src_list
}
- mlog.log(' !! target {}={}'.format(target['id'], json.dumps(test_data)))
+ self.add_info('target', target['id'], test_data)
def process(self, cmd):
if 'type' not in cmd:
@@ -314,4 +666,5 @@ def run(options):
rewriter.process(i)
rewriter.apply_changes()
+ rewriter.print_info()
return 0
diff --git a/run_unittests.py b/run_unittests.py
index 9dd734a..f63fc18 100755
--- a/run_unittests.py
+++ b/run_unittests.py
@@ -5053,7 +5053,7 @@ class PythonTests(BasePlatformTests):
class RewriterTests(BasePlatformTests):
- data_regex = re.compile(r'^\s*!!\s*(\w+)\s+([^=]+)=(.*)$')
+ data_regex = re.compile(r'.*\n!!==JSON DUMP: BEGIN==!!\n(.*)\n!!==JSON DUMP: END==!!\n', re.MULTILINE | re.DOTALL)
def setUp(self):
super().setUp()
@@ -5065,22 +5065,21 @@ class RewriterTests(BasePlatformTests):
def rewrite(self, directory, args):
if isinstance(args, str):
args = [args]
- out = subprocess.check_output(self.rewrite_command + ['--sourcedir', directory] + args,
- universal_newlines=True)
- return out
+ command = self.rewrite_command + ['--sourcedir', directory] + args
+ p = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
+ universal_newlines=True, timeout=60)
+ print(p.stdout)
+ if p.returncode != 0:
+ if 'MESON_SKIP_TEST' in p.stdout:
+ raise unittest.SkipTest('Project requested skipping.')
+ raise subprocess.CalledProcessError(p.returncode, command, output=p.stdout)
+ return p.stdout
def extract_test_data(self, out):
- lines = out.split('\n')
+ match = RewriterTests.data_regex.match(out)
result = {}
- for i in lines:
- match = RewriterTests.data_regex.match(i)
- if match:
- typ = match.group(1)
- id = match.group(2)
- data = json.loads(match.group(3))
- if typ not in result:
- result[typ] = {}
- result[typ][id] = data
+ if match:
+ result = json.loads(match.group(1))
return result
def test_target_source_list(self):
@@ -5162,6 +5161,75 @@ class RewriterTests(BasePlatformTests):
out = self.extract_test_data(out)
self.assertDictEqual(list(out['target'].values())[0], expected)
+ def test_kwargs_info(self):
+ self.prime('3 kwargs')
+ 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'},
+ 'target#tgt1': {'build_by_default': True},
+ 'dependency#dep1': {'required': False}
+ }
+ }
+ self.assertDictEqual(out, expected)
+
+ def test_kwargs_set(self):
+ self.prime('3 kwargs')
+ self.rewrite(self.builddir, os.path.join(self.builddir, '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.2', 'meson_version': '0.50.0', 'license': ['GPL', 'MIT']},
+ 'target#tgt1': {'build_by_default': False, 'build_rpath': '/usr/local', 'dependencies': 'dep1'},
+ 'dependency#dep1': {'required': True, 'method': 'cmake'}
+ }
+ }
+ self.assertDictEqual(out, expected)
+
+ def test_kwargs_add(self):
+ self.prime('3 kwargs')
+ self.rewrite(self.builddir, os.path.join(self.builddir, 'add.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', 'license': ['GPL', 'MIT', 'BSD']},
+ 'target#tgt1': {'build_by_default': True},
+ 'dependency#dep1': {'required': False}
+ }
+ }
+ self.assertDictEqual(out, expected)
+
+ def test_kwargs_remove(self):
+ self.prime('3 kwargs')
+ self.rewrite(self.builddir, os.path.join(self.builddir, 'remove.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', 'license': 'GPL'},
+ 'target#tgt1': {'build_by_default': True},
+ 'dependency#dep1': {'required': False}
+ }
+ }
+ self.assertDictEqual(out, expected)
+
+ def test_kwargs_delete(self):
+ self.prime('3 kwargs')
+ self.rewrite(self.builddir, os.path.join(self.builddir, 'delete.json'))
+ out = self.rewrite(self.builddir, os.path.join(self.builddir, 'info.json'))
+ out = self.extract_test_data(out)
+ expected = {
+ 'kwargs': {
+ 'project#': {},
+ 'target#tgt1': {},
+ 'dependency#dep1': {'required': False}
+ }
+ }
+ self.assertDictEqual(out, expected)
+
class NativeFileTests(BasePlatformTests):
def setUp(self):
diff --git a/test cases/rewrite/1 basic/addSrc.json b/test cases/rewrite/1 basic/addSrc.json
index 1a504bf..9d6dafd 100644
--- a/test cases/rewrite/1 basic/addSrc.json
+++ b/test cases/rewrite/1 basic/addSrc.json
@@ -44,46 +44,46 @@
{
"type": "target",
"target": "trivialprog1",
- "operation": "test"
+ "operation": "info"
},
{
"type": "target",
"target": "trivialprog2",
- "operation": "test"
+ "operation": "info"
},
{
"type": "target",
"target": "trivialprog3",
- "operation": "test"
+ "operation": "info"
},
{
"type": "target",
"target": "trivialprog4",
- "operation": "test"
+ "operation": "info"
},
{
"type": "target",
"target": "trivialprog5",
- "operation": "test"
+ "operation": "info"
},
{
"type": "target",
"target": "trivialprog6",
- "operation": "test"
+ "operation": "info"
},
{
"type": "target",
"target": "trivialprog7",
- "operation": "test"
+ "operation": "info"
},
{
"type": "target",
"target": "trivialprog8",
- "operation": "test"
+ "operation": "info"
},
{
"type": "target",
"target": "trivialprog9",
- "operation": "test"
+ "operation": "info"
}
]
diff --git a/test cases/rewrite/1 basic/info.json b/test cases/rewrite/1 basic/info.json
index be2a873..c791c8f 100644
--- a/test cases/rewrite/1 basic/info.json
+++ b/test cases/rewrite/1 basic/info.json
@@ -2,46 +2,46 @@
{
"type": "target",
"target": "trivialprog1",
- "operation": "test"
+ "operation": "info"
},
{
"type": "target",
- "target": "trivialprog2",
- "operation": "test"
+ "target": "exe2",
+ "operation": "info"
},
{
"type": "target",
"target": "trivialprog3",
- "operation": "test"
+ "operation": "info"
},
{
"type": "target",
- "target": "trivialprog4",
- "operation": "test"
+ "target": "exe4",
+ "operation": "info"
},
{
"type": "target",
"target": "trivialprog5",
- "operation": "test"
+ "operation": "info"
},
{
"type": "target",
- "target": "trivialprog6",
- "operation": "test"
+ "target": "exe6",
+ "operation": "info"
},
{
"type": "target",
"target": "trivialprog7",
- "operation": "test"
+ "operation": "info"
},
{
"type": "target",
- "target": "trivialprog8",
- "operation": "test"
+ "target": "exe8",
+ "operation": "info"
},
{
"type": "target",
"target": "trivialprog9",
- "operation": "test"
+ "operation": "info"
}
]
diff --git a/test cases/rewrite/1 basic/rmSrc.json b/test cases/rewrite/1 basic/rmSrc.json
index a8559a5..86880a9 100644
--- a/test cases/rewrite/1 basic/rmSrc.json
+++ b/test cases/rewrite/1 basic/rmSrc.json
@@ -38,46 +38,46 @@
{
"type": "target",
"target": "trivialprog1",
- "operation": "test"
+ "operation": "info"
},
{
"type": "target",
"target": "trivialprog2",
- "operation": "test"
+ "operation": "info"
},
{
"type": "target",
"target": "trivialprog3",
- "operation": "test"
+ "operation": "info"
},
{
"type": "target",
"target": "trivialprog4",
- "operation": "test"
+ "operation": "info"
},
{
"type": "target",
"target": "trivialprog5",
- "operation": "test"
+ "operation": "info"
},
{
"type": "target",
"target": "trivialprog6",
- "operation": "test"
+ "operation": "info"
},
{
"type": "target",
"target": "trivialprog7",
- "operation": "test"
+ "operation": "info"
},
{
"type": "target",
"target": "trivialprog8",
- "operation": "test"
+ "operation": "info"
},
{
"type": "target",
"target": "trivialprog9",
- "operation": "test"
+ "operation": "info"
}
]
diff --git a/test cases/rewrite/2 subdirs/addSrc.json b/test cases/rewrite/2 subdirs/addSrc.json
index 017476c..1a5c13e 100644
--- a/test cases/rewrite/2 subdirs/addSrc.json
+++ b/test cases/rewrite/2 subdirs/addSrc.json
@@ -8,6 +8,6 @@
{
"type": "target",
"target": "something",
- "operation": "test"
+ "operation": "info"
}
]
diff --git a/test cases/rewrite/2 subdirs/info.json b/test cases/rewrite/2 subdirs/info.json
index 0173333..7075fa8 100644
--- a/test cases/rewrite/2 subdirs/info.json
+++ b/test cases/rewrite/2 subdirs/info.json
@@ -2,6 +2,6 @@
{
"type": "target",
"target": "something",
- "operation": "test"
+ "operation": "info"
}
]
diff --git a/test cases/rewrite/3 kwargs/add.json b/test cases/rewrite/3 kwargs/add.json
new file mode 100644
index 0000000..e398b7b
--- /dev/null
+++ b/test cases/rewrite/3 kwargs/add.json
@@ -0,0 +1,29 @@
+[
+ {
+ "type": "kwargs",
+ "function": "project",
+ "id": "",
+ "operation": "set",
+ "kwargs": {
+ "license": "GPL"
+ }
+ },
+ {
+ "type": "kwargs",
+ "function": "project",
+ "id": "",
+ "operation": "add",
+ "kwargs": {
+ "license": ["MIT"]
+ }
+ },
+ {
+ "type": "kwargs",
+ "function": "project",
+ "id": "",
+ "operation": "add",
+ "kwargs": {
+ "license": "BSD"
+ }
+ }
+]
diff --git a/test cases/rewrite/3 kwargs/delete.json b/test cases/rewrite/3 kwargs/delete.json
new file mode 100644
index 0000000..2f75484
--- /dev/null
+++ b/test cases/rewrite/3 kwargs/delete.json
@@ -0,0 +1,20 @@
+[
+ {
+ "type": "kwargs",
+ "function": "project",
+ "id": "",
+ "operation": "delete",
+ "kwargs": {
+ "version": null
+ }
+ },
+ {
+ "type": "kwargs",
+ "function": "target",
+ "id": "helloWorld",
+ "operation": "delete",
+ "kwargs": {
+ "build_by_default": false
+ }
+ }
+]
diff --git a/test cases/rewrite/3 kwargs/info.json b/test cases/rewrite/3 kwargs/info.json
new file mode 100644
index 0000000..5fd1a64
--- /dev/null
+++ b/test cases/rewrite/3 kwargs/info.json
@@ -0,0 +1,20 @@
+[
+ {
+ "type": "kwargs",
+ "function": "project",
+ "id": "",
+ "operation": "info"
+ },
+ {
+ "type": "kwargs",
+ "function": "target",
+ "id": "tgt1",
+ "operation": "info"
+ },
+ {
+ "type": "kwargs",
+ "function": "dependency",
+ "id": "dep1",
+ "operation": "info"
+ }
+]
diff --git a/test cases/rewrite/3 kwargs/meson.build b/test cases/rewrite/3 kwargs/meson.build
new file mode 100644
index 0000000..13b336c
--- /dev/null
+++ b/test cases/rewrite/3 kwargs/meson.build
@@ -0,0 +1,7 @@
+project('rewritetest', 'cpp', version: '0.0.1')
+
+# Find ZLIB
+dep1 = dependency('zlib', required: false)
+
+# Make a test exe
+tgt1 = executable('helloWorld', 'main.cpp', build_by_default: true)
diff --git a/test cases/rewrite/3 kwargs/remove.json b/test cases/rewrite/3 kwargs/remove.json
new file mode 100644
index 0000000..bd7596f
--- /dev/null
+++ b/test cases/rewrite/3 kwargs/remove.json
@@ -0,0 +1,29 @@
+[
+ {
+ "type": "kwargs",
+ "function": "project",
+ "id": "",
+ "operation": "set",
+ "kwargs": {
+ "license": ["GPL", "MIT", "BSD"]
+ }
+ },
+ {
+ "type": "kwargs",
+ "function": "project",
+ "id": "",
+ "operation": "remove",
+ "kwargs": {
+ "license": ["MIT"]
+ }
+ },
+ {
+ "type": "kwargs",
+ "function": "project",
+ "id": "",
+ "operation": "remove",
+ "kwargs": {
+ "license": "BSD"
+ }
+ }
+]
diff --git a/test cases/rewrite/3 kwargs/set.json b/test cases/rewrite/3 kwargs/set.json
new file mode 100644
index 0000000..7d60c4f
--- /dev/null
+++ b/test cases/rewrite/3 kwargs/set.json
@@ -0,0 +1,34 @@
+[
+ {
+ "type": "kwargs",
+ "function": "project",
+ "id": "",
+ "operation": "set",
+ "kwargs": {
+ "version": "0.0.2",
+ "meson_version": "0.50.0",
+ "license": ["GPL", "MIT"]
+ }
+ },
+ {
+ "type": "kwargs",
+ "function": "target",
+ "id": "helloWorld",
+ "operation": "set",
+ "kwargs": {
+ "build_by_default": false,
+ "build_rpath": "/usr/local",
+ "dependencies": "dep1"
+ }
+ },
+ {
+ "type": "kwargs",
+ "function": "dependency",
+ "id": "zlib",
+ "operation": "set",
+ "kwargs": {
+ "required": true,
+ "method": "cmake"
+ }
+ }
+]