summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Hunger <tobias.hunger@qt.io>2019-02-13 10:42:56 +0100
committerTobias Hunger <tobias.hunger@qt.io>2019-02-27 16:03:20 +0000
commitc971d2d3593def66c5627f47c575c2ed7ce04fec (patch)
tree74520e89e6f4620efa4b541b66a4eb9cf06a4ff5
parent22dc78f41749d76df38ef1e17d6dc8c272d7cab0 (diff)
CMake: pro2cmake.py: Handle values with () in assignments
Change-Id: I0f59c7fa57cd6c64b151f439d4eea4ae56dca288 Reviewed-by: Albert Astals Cid <albert.astals.cid@kdab.com>
-rwxr-xr-xutil/cmake/pro2cmake.py11
-rw-r--r--util/cmake/tests/data/complex_assign.pro2
-rwxr-xr-xutil/cmake/tests/test_parsing.py6
3 files changed, 17 insertions, 2 deletions
diff --git a/util/cmake/pro2cmake.py b/util/cmake/pro2cmake.py
index 1d48d2ba58..1f85e977aa 100755
--- a/util/cmake/pro2cmake.py
+++ b/util/cmake/pro2cmake.py
@@ -515,6 +515,12 @@ class QmakeParser:
Else = pp.Keyword('else')
DefineTest = pp.Keyword('defineTest')
Identifier = pp.Word(pp.alphas + '_', bodyChars=pp.alphanums+'_-./')
+ BracedValue = pp.nestedExpr(ignoreExpr=pp.quotedString \
+ | pp.QuotedString(quoteChar='$(',
+ endQuoteChar=')',
+ escQuote='\\',
+ unquoteResults=False)
+ ).setParseAction(lambda s, l, t: ['(', *t[0], ')'])
Substitution \
= pp.Combine(pp.Literal('$')
@@ -534,7 +540,8 @@ class QmakeParser:
| pp.Literal('$')))
Value = pp.NotAny(Else | pp.Literal('}') | EOL | pp.Literal('\\')) \
+ (pp.QuotedString(quoteChar='"', escChar='\\')
- | SubstitutionValue)
+ | SubstitutionValue
+ | BracedValue)
Values = pp.ZeroOrMore(Value + pp.Optional(LC))('value')
@@ -598,7 +605,7 @@ class QmakeParser:
'Else ElseBranch SingleLineElse MultiLineElse ' \
'SingleLineScope MultiLineScope ' \
'Identifier ' \
- 'Key Op Values Value ' \
+ 'Key Op Values Value BracedValue ' \
'Scope Block ' \
'StatementGroup StatementLine Statement '\
'Load Include Option DefineTest ForLoop ' \
diff --git a/util/cmake/tests/data/complex_assign.pro b/util/cmake/tests/data/complex_assign.pro
new file mode 100644
index 0000000000..d251afcdd5
--- /dev/null
+++ b/util/cmake/tests/data/complex_assign.pro
@@ -0,0 +1,2 @@
+qmake-clean.commands += (cd qmake && $(MAKE) clean ":-(==)-:" '(Foo)' )
+
diff --git a/util/cmake/tests/test_parsing.py b/util/cmake/tests/test_parsing.py
index e4f9680f60..c238c80c08 100755
--- a/util/cmake/tests/test_parsing.py
+++ b/util/cmake/tests/test_parsing.py
@@ -254,3 +254,9 @@ def test_realworld_contains_scope():
result = parse_file(_tests_path + '/data/contains_scope.pro')
assert len(result) == 2
+
+def test_realworld_complex_assign():
+ result = parse_file(_tests_path + '/data/complex_assign.pro')
+ assert len(result) == 1
+ validate_op('qmake-clean.commands', '+=', '( cd qmake && $(MAKE) clean ":-(==)-:" \'(Foo)\' )'.split(),
+ result[0])