aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2019-04-02 23:10:16 +0300
committerGitHub <noreply@github.com>2019-04-02 23:10:16 +0300
commitb1aa54bb2911ecf0f26391a9b1e0a6cd308913b5 (patch)
tree6ce41b5ac3e03f3cda19ee6dda5669789a5fcedd
parentff477d2b3f5ddc582140e6d357e52f1cb1da74ce (diff)
parent6da0df95c11fac6037d421ae8cf80af146d321da (diff)
downloadmeson-b1aa54bb2911ecf0f26391a9b1e0a6cd308913b5.zip
meson-b1aa54bb2911ecf0f26391a9b1e0a6cd308913b5.tar.gz
meson-b1aa54bb2911ecf0f26391a9b1e0a6cd308913b5.tar.bz2
Merge pull request #5197 from mensinda/introDepBugFix
mintro: Fix crash when required is a function (closes #5177)
-rw-r--r--mesonbuild/ast/interpreter.py24
-rw-r--r--mesonbuild/ast/introspection.py6
-rwxr-xr-xrun_unittests.py8
-rw-r--r--test cases/unit/55 introspection/meson.build8
-rw-r--r--test cases/unit/55 introspection/meson_options.txt2
5 files changed, 45 insertions, 3 deletions
diff --git a/mesonbuild/ast/interpreter.py b/mesonbuild/ast/interpreter.py
index 01277f0..f1602c0 100644
--- a/mesonbuild/ast/interpreter.py
+++ b/mesonbuild/ast/interpreter.py
@@ -153,8 +153,20 @@ class AstInterpreter(interpreterbase.InterpreterBase):
return True
def evaluate_arithmeticstatement(self, cur):
+ self.evaluate_statement(cur.left)
+ self.evaluate_statement(cur.right)
return 0
+ def evaluate_uminusstatement(self, cur):
+ self.evaluate_statement(cur.value)
+ return 0
+
+ def evaluate_ternary(self, node):
+ assert(isinstance(node, mparser.TernaryNode))
+ self.evaluate_statement(node.condition)
+ self.evaluate_statement(node.trueblock)
+ self.evaluate_statement(node.falseblock)
+
def evaluate_plusassign(self, node):
assert(isinstance(node, mparser.PlusAssignmentNode))
if node.var_name not in self.assignments:
@@ -177,6 +189,18 @@ class AstInterpreter(interpreterbase.InterpreterBase):
return args.arguments, args.kwargs
def evaluate_comparison(self, node):
+ self.evaluate_statement(node.left)
+ self.evaluate_statement(node.right)
+ return False
+
+ def evaluate_andstatement(self, cur):
+ self.evaluate_statement(cur.left)
+ self.evaluate_statement(cur.right)
+ return False
+
+ def evaluate_orstatement(self, cur):
+ self.evaluate_statement(cur.left)
+ self.evaluate_statement(cur.right)
return False
def evaluate_foreach(self, node):
diff --git a/mesonbuild/ast/introspection.py b/mesonbuild/ast/introspection.py
index 5745d29..5a12e29 100644
--- a/mesonbuild/ast/introspection.py
+++ b/mesonbuild/ast/introspection.py
@@ -20,7 +20,7 @@ from .. import compilers, environment, mesonlib, optinterpreter
from .. import coredata as cdata
from ..interpreterbase import InvalidArguments
from ..build import Executable, Jar, SharedLibrary, SharedModule, StaticLibrary
-from ..mparser import ArithmeticNode, ArrayNode, ElementaryNode, IdNode, FunctionNode, StringNode
+from ..mparser import BaseNode, ArithmeticNode, ArrayNode, ElementaryNode, IdNode, FunctionNode, StringNode
import os
build_target_functions = ['executable', 'jar', 'library', 'shared_library', 'shared_module', 'static_library', 'both_libraries']
@@ -142,6 +142,8 @@ class IntrospectionInterpreter(AstInterpreter):
condition_level = node.condition_level if hasattr(node, 'condition_level') else 0
if isinstance(required, ElementaryNode):
required = required.value
+ if not isinstance(required, bool):
+ required = False
self.dependencies += [{
'name': name,
'required': required,
@@ -189,6 +191,8 @@ class IntrospectionInterpreter(AstInterpreter):
# Make sure nothing can crash when creating the build class
kwargs_reduced = {k: v for k, v in kwargs.items() if k in targetclass.known_kwargs and k in ['install', 'build_by_default', 'build_always']}
+ kwargs_reduced = {k: v.value if isinstance(v, ElementaryNode) else v for k, v in kwargs_reduced.items()}
+ kwargs_reduced = {k: v for k, v in kwargs_reduced.items() if not isinstance(v, BaseNode)}
is_cross = False
objects = []
empty_sources = [] # Passing the unresolved sources list causes errors
diff --git a/run_unittests.py b/run_unittests.py
index 7ceb553..bc28eea 100755
--- a/run_unittests.py
+++ b/run_unittests.py
@@ -3408,7 +3408,7 @@ recommended as it is not supported on some platforms''')
self.assertDictEqual(buildopts_to_find, {})
# Check buildsystem_files
- bs_files = ['meson.build', 'sharedlib/meson.build', 'staticlib/meson.build']
+ bs_files = ['meson.build', 'meson_options.txt', 'sharedlib/meson.build', 'staticlib/meson.build']
bs_files = [os.path.join(testdir, x) for x in bs_files]
self.assertPathListEqual(list(sorted(res['buildsystem_files'])), list(sorted(bs_files)))
@@ -3560,6 +3560,12 @@ recommended as it is not supported on some platforms''')
'conditional': False
},
{
+ 'name': 'bugDep1',
+ 'required': False,
+ 'has_fallback': False,
+ 'conditional': False
+ },
+ {
'name': 'somethingthatdoesnotexist',
'required': True,
'has_fallback': False,
diff --git a/test cases/unit/55 introspection/meson.build b/test cases/unit/55 introspection/meson.build
index 98f6f22..588f71c 100644
--- a/test cases/unit/55 introspection/meson.build
+++ b/test cases/unit/55 introspection/meson.build
@@ -2,6 +2,12 @@ project('introspection', ['c', 'cpp'], version: '1.2.3', default_options: ['cpp_
dep1 = dependency('threads')
dep2 = dependency('zlib', required: false)
+dep3 = dependency('bugDep1', required: get_option('test_opt1'))
+
+b1 = get_option('test_opt1')
+b2 = get_option('test_opt2')
+test_bool = b1 or b2
+test_bool = b1 and b2
if false
dependency('somethingthatdoesnotexist', required: true)
@@ -11,7 +17,7 @@ endif
subdir('sharedlib')
subdir('staticlib')
-t1 = executable('test1', 't1.cpp', link_with: [sharedlib], install: true)
+t1 = executable('test1', 't1.cpp', link_with: [sharedlib], install: true, build_by_default: get_option('test_opt2'))
t2 = executable('test2', 't2.cpp', link_with: [staticlib])
t3 = executable('test3', 't3.cpp', link_with: [sharedlib, staticlib], dependencies: [dep1])
diff --git a/test cases/unit/55 introspection/meson_options.txt b/test cases/unit/55 introspection/meson_options.txt
new file mode 100644
index 0000000..fc5cb4d
--- /dev/null
+++ b/test cases/unit/55 introspection/meson_options.txt
@@ -0,0 +1,2 @@
+option('test_opt1', type: 'boolean', value: false, description: 'simple boolean flag')
+option('test_opt2', type: 'boolean', value: true, description: 'simple boolean flag')