From 40d121d33ee10004c0018df2f8ec2665569ff2db Mon Sep 17 00:00:00 2001 From: Christoph Behle Date: Sun, 10 Jun 2018 21:32:45 +0200 Subject: get_define can concatenate string literals. Added method concatenate_string_literals to CCompiler. Will concatenate string literals. Added keyword argument 'concatenate_string_literals' to Compiler.get_define. If used will apply concatenate_string_literals to its return value. --- mesonbuild/compilers/c.py | 11 ++++++++++- mesonbuild/interpreter.py | 4 ++++ test cases/common/140 get define/meson.build | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/mesonbuild/compilers/c.py b/mesonbuild/compilers/c.py index 61455742b..dc7a9f5a6 100644 --- a/mesonbuild/compilers/c.py +++ b/mesonbuild/compilers/c.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -import subprocess, os.path +import subprocess, os.path, re from .. import mlog from .. import coredata @@ -934,6 +934,15 @@ class CCompiler(Compiler): code = 'int main(int argc, char **argv) { return 0; }' return self.has_arguments(args, env, code, mode='link') + def concatenate_string_literals(self, s): + pattern = re.compile(r'(?P
.*([^\\]")|^")(?P([^\\"]|\\.)*)"\s+"(?P([^\\"]|\\.)*)(?P".*)')
+        ret = s
+        m = pattern.match(ret)
+        while m:
+            ret = ''.join(m.group('pre', 'str1', 'str2', 'post'))
+            m = pattern.match(ret)
+        return ret
+
 class ClangCCompiler(ClangCompiler, CCompiler):
     def __init__(self, exelist, version, clang_type, is_cross, exe_wrapper=None, **kwargs):
         CCompiler.__init__(self, exelist, version, is_cross, exe_wrapper, **kwargs)
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index 421ddd950..e4ba63c89 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -1174,6 +1174,7 @@ class CompilerHolder(InterpreterObject):
         'include_directories',
         'args',
         'dependencies',
+        'concatenate_string_literals',
     })
     def get_define_method(self, args, kwargs):
         if len(args) != 1:
@@ -1181,12 +1182,15 @@ class CompilerHolder(InterpreterObject):
         check_stringlist(args)
         element = args[0]
         prefix = kwargs.get('prefix', '')
+        concatenate = kwargs.pop('concatenate_string_literals', False)
         if not isinstance(prefix, str):
             raise InterpreterException('Prefix argument of get_define() must be a string.')
         extra_args = self.determine_args(kwargs)
         deps = self.determine_dependencies(kwargs)
         value = self.compiler.get_define(element, prefix, self.environment, extra_args, deps)
         mlog.log('Fetching value of define "%s": %s' % (element, value))
+        if concatenate:
+            value = self.compiler.concatenate_string_literals(value)
         return value
 
     @permittedKwargs({
diff --git a/test cases/common/140 get define/meson.build b/test cases/common/140 get define/meson.build
index 761057bfb..5d7f858f2 100644
--- a/test cases/common/140 get define/meson.build	
+++ b/test cases/common/140 get define/meson.build	
@@ -82,6 +82,6 @@ foreach lang : ['c', 'cpp']
   endif
 
   have = cc.get_define('TEST_VERSION_STR',
-        prefix : '#include ', include_directories: include_directories('.'))
+        prefix : '#include ', include_directories: include_directories('.'), concatenate_string_literals: true)
   assert(have == '"6.0.0"', 'TEST_VERSION_STR value is "@0@" instead of ""6.0.0""'.format(have))
 endforeach
-- 
cgit v1.2.3