diff options
-rw-r--r-- | compilers.py | 8 | ||||
-rw-r--r-- | interpreter.py | 17 | ||||
-rw-r--r-- | test cases/common/83 has type/meson.build | 11 | ||||
-rw-r--r-- | wrap.py | 8 |
4 files changed, 44 insertions, 0 deletions
diff --git a/compilers.py b/compilers.py index 5e66b23..b86c6c9 100644 --- a/compilers.py +++ b/compilers.py @@ -401,6 +401,14 @@ void bar() { ''' return self.compiles(templ % (prefix, typename, membername)) + def has_type(self, typename, prefix): + templ = '''%s +void bar() { + sizeof(%s); +}; +''' + return self.compiles(templ % (prefix, typename)) + def thread_flags(self): return ['-pthread'] diff --git a/interpreter.py b/interpreter.py index e8bfecf..63f343f 100644 --- a/interpreter.py +++ b/interpreter.py @@ -502,6 +502,7 @@ class CompilerHolder(InterpreterObject): 'run' : self.run_method, 'has_function' : self.has_function_method, 'has_member' : self.has_member_method, + 'has_type' : self.has_type_method, 'alignment' : self.alignment_method, 'version' : self.version_method, 'cmd_array' : self.cmd_array_method, @@ -578,6 +579,22 @@ class CompilerHolder(InterpreterObject): mlog.log('Checking for function "', mlog.bold(funcname), '": ', hadtxt, sep='') return had + def has_type_method(self, args, kwargs): + if len(args) != 1: + raise InterpreterException('Has_type takes exactly one argument.') + check_stringlist(args) + typename = args[0] + prefix = kwargs.get('prefix', '') + if not isinstance(prefix, str): + raise InterpreterException('Prefix argument of has_type must be a string.') + had = self.compiler.has_type(typename, prefix) + if had: + hadtxt = mlog.green('YES') + else: + hadtxt = mlog.red('NO') + mlog.log('Checking for type "', mlog.bold(typename), '": ', hadtxt, sep='') + return had + def sizeof_method(self, args, kwargs): if len(args) != 1: raise InterpreterException('Sizeof takes exactly one argument.') diff --git a/test cases/common/83 has type/meson.build b/test cases/common/83 has type/meson.build new file mode 100644 index 0000000..002f150 --- /dev/null +++ b/test cases/common/83 has type/meson.build @@ -0,0 +1,11 @@ +project('has type', 'c') + +cc = meson.get_compiler('c') + +if not cc.has_type('time_t', prefix : '#include<time.h>') + error('Did not detect type that exists.') +endif + +if cc.has_type('no_time_t', prefix : '#include<time.h>') + error('Not existing type found.') +endif @@ -15,6 +15,7 @@ import mlog import urllib.request, os, hashlib, shutil import subprocess +import sys class PackageDefinition: def __init__(self, fname): @@ -121,6 +122,13 @@ class Resolver: open(ofname, 'wb').write(srcdata) def extract_package(self, package): + if sys.version_info < (3, 5): + try: + import lzma + del lzma + shutil.register_unpack_format('xztar', ['.tar.xz', '.txz'], shutil._unpack_tarfile, [], "xz'ed tar-file") + except ImportError: + pass if os.path.isdir(os.path.join(self.subdir_root, package.get('directory'))): return shutil.unpack_archive(os.path.join(self.cachedir, package.get('source_filename')), self.subdir_root) |