diff options
author | Christoph Behle <behlec@gmail.com> | 2018-06-10 21:32:45 +0200 |
---|---|---|
committer | Nirbheek Chauhan <nirbheek.chauhan@gmail.com> | 2018-06-12 00:14:54 +0000 |
commit | 40d121d33ee10004c0018df2f8ec2665569ff2db (patch) | |
tree | fdefbdb24a93ac457467b55746bba65fbcf6b26c | |
parent | bbb893f39e0bf7424a7104dcc15b449c69b9103e (diff) | |
download | meson-40d121d33ee10004c0018df2f8ec2665569ff2db.zip meson-40d121d33ee10004c0018df2f8ec2665569ff2db.tar.gz meson-40d121d33ee10004c0018df2f8ec2665569ff2db.tar.bz2 |
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.
-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 |