From c971d2d3593def66c5627f47c575c2ed7ce04fec Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 13 Feb 2019 10:42:56 +0100 Subject: [PATCH] CMake: pro2cmake.py: Handle values with () in assignments Change-Id: I0f59c7fa57cd6c64b151f439d4eea4ae56dca288 Reviewed-by: Albert Astals Cid --- util/cmake/pro2cmake.py | 11 +++++++++-- util/cmake/tests/data/complex_assign.pro | 2 ++ util/cmake/tests/test_parsing.py | 6 ++++++ 3 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 util/cmake/tests/data/complex_assign.pro 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])