diff options
-rw-r--r-- | mesonbuild/compilers/c.py | 11 | ||||
-rw-r--r-- | mesonbuild/interpreter.py | 4 | ||||
-rw-r--r-- | 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 6145574..dc7a9f5 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<pre>.*([^\\]")|^")(?P<str1>([^\\"]|\\.)*)"\s+"(?P<str2>([^\\"]|\\.)*)(?P<post>".*)') + 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 421ddd9..e4ba63c 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 761057b..5d7f858 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 <concat.h>', include_directories: include_directories('.')) + prefix : '#include <concat.h>', 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 |