Get sizeof info from cross file if it exists and write an error if it can not be determined.

pull/15/head
Jussi Pakkanen 11 years ago
parent 07f87b113e
commit 2117814826
  1. 8
      cross/ubuntu-armhf.txt
  2. 39
      environment.py
  3. 9
      interpreter.py
  4. 1
      run_cross_test.py

@ -0,0 +1,8 @@
name = 'linux'
c = '/usr/bin/arm-linux-gnueabihf-gcc'
cpp = '/usr/bin/arm-linux-gnueabihf-g++'
root = '/usr/arm-linux-gnueabihf'
pkg-config = '/usr/bin/arm-linux-gnueabihf-pkg-config'
sizeof_int = 4
sizeof_wchar_t = 4

@ -16,10 +16,15 @@ import subprocess, os.path, platform
import coredata import coredata
from glob import glob from glob import glob
import tempfile import tempfile
from coredata import MesonException
build_filename = 'meson.build' build_filename = 'meson.build'
class EnvironmentException(Exception): class EnvironmentException(MesonException):
def __init(self, *args, **kwargs):
Exception.__init__(self, *args, **kwargs)
class CrossNoRunException(Exception):
def __init(self, *args, **kwargs): def __init(self, *args, **kwargs):
Exception.__init__(self, *args, **kwargs) Exception.__init__(self, *args, **kwargs)
@ -166,7 +171,7 @@ class CCompiler():
def run(self, code): def run(self, code):
if self.is_cross and self.exe_wrapper is None: if self.is_cross and self.exe_wrapper is None:
raise EnvironmentException('Can not run test applications in this cross environment.') raise CrossNoRunException('Can not run test applications in this cross environment.')
(fd, srcname) = tempfile.mkstemp(suffix='.'+self.default_suffix) (fd, srcname) = tempfile.mkstemp(suffix='.'+self.default_suffix)
os.close(fd) os.close(fd)
ofile = open(srcname, 'w') ofile = open(srcname, 'w')
@ -190,7 +195,7 @@ class CCompiler():
os.remove(exename) os.remove(exename)
return RunResult(True, pe.returncode, so.decode(), se.decode()) return RunResult(True, pe.returncode, so.decode(), se.decode())
def sizeof(self, element, prefix): def sizeof(self, element, prefix, env):
templ = '''#include<stdio.h> templ = '''#include<stdio.h>
%s %s
@ -199,7 +204,23 @@ int main(int argc, char **argv) {
return 0; return 0;
}; };
''' '''
res = self.run(templ % (prefix, element)) varname = 'sizeof ' + element
varname = varname.replace(' ', '_')
if self.is_cross:
val = env.cross_info.get(varname)
if val is not None:
if isinstance(val, int):
return val
raise EnvironmentException('Cross variable {0} is not an integer.'.format(varname))
cross_failed = False
try:
res = self.run(templ % (prefix, element))
except CrossNoRunException:
cross_failed = True
if cross_failed:
message = '''Can not determine size of {0} because cross compiled binaries are not runnable.
Please define the corresponding variable {1} in your cross compilation definition file.'''.format(element, varname)
raise EnvironmentException(message)
if not res.compiled: if not res.compiled:
raise EnvironmentException('Could not compile sizeof test.') raise EnvironmentException('Could not compile sizeof test.')
if res.returncode != 0: if res.returncode != 0:
@ -1033,9 +1054,13 @@ class CrossBuildInfo():
if not 'name' in self: if not 'name' in self:
raise EnvironmentException('Cross file must specify "name".') raise EnvironmentException('Cross file must specify "name".')
def ok_type(self, i):
return isinstance(i, str) or isinstance(i, int)
def parse_datafile(self, filename): def parse_datafile(self, filename):
# This is a bit hackish at the moment. # This is a bit hackish at the moment.
for linenum, line in enumerate(open(filename)): for i, line in enumerate(open(filename)):
linenum = i+1
line = line.strip() line = line.strip()
if line == '': if line == '':
continue continue
@ -1049,11 +1074,11 @@ class CrossBuildInfo():
res = eval(value, {}) res = eval(value, {})
except Exception: except Exception:
raise EnvironmentException('Malformed line in cross file %s:%d.' % (filename, linenum)) raise EnvironmentException('Malformed line in cross file %s:%d.' % (filename, linenum))
if isinstance(res, str): if self.ok_type(res):
self.items[varname] = res self.items[varname] = res
elif isinstance(res, list): elif isinstance(res, list):
for i in res: for i in res:
if not isinstance(i, str): if not self.ok_type(i):
raise EnvironmentException('Malformed line in cross file %s:%d.' % (filename, linenum)) raise EnvironmentException('Malformed line in cross file %s:%d.' % (filename, linenum))
self.items[varname] = res self.items[varname] = res
else: else:

@ -654,9 +654,10 @@ class Test(InterpreterObject):
return self.name return self.name
class CompilerHolder(InterpreterObject): class CompilerHolder(InterpreterObject):
def __init__(self, compiler): def __init__(self, compiler, env):
InterpreterObject.__init__(self) InterpreterObject.__init__(self)
self.compiler = compiler self.compiler = compiler
self.environment = env
self.methods.update({'compiles': self.compiles_method, self.methods.update({'compiles': self.compiles_method,
'get_id': self.get_id_method, 'get_id': self.get_id_method,
'sizeof': self.sizeof_method, 'sizeof': self.sizeof_method,
@ -749,7 +750,7 @@ class CompilerHolder(InterpreterObject):
prefix = kwargs.get('prefix', '') prefix = kwargs.get('prefix', '')
if not isinstance(prefix, str): if not isinstance(prefix, str):
raise InterpreterException('Prefix argument of sizeof must be a string.') raise InterpreterException('Prefix argument of sizeof must be a string.')
esize = self.compiler.sizeof(element, prefix) esize = self.compiler.sizeof(element, prefix, self.environment)
mlog.log('Checking for size of "%s": %d' % (element, esize)) mlog.log('Checking for size of "%s": %d' % (element, esize))
return esize return esize
@ -794,14 +795,14 @@ class MesonMain(InterpreterObject):
InterpreterObject.__init__(self) InterpreterObject.__init__(self)
self.build = build self.build = build
self.methods.update({'get_compiler': self.get_compiler_method}) self.methods.update({'get_compiler': self.get_compiler_method})
def get_compiler_method(self, args, kwargs): def get_compiler_method(self, args, kwargs):
if len(args) != 1: if len(args) != 1:
raise InterpreterException('get_compiler_method must have one and only one argument.') raise InterpreterException('get_compiler_method must have one and only one argument.')
cname = args[0] cname = args[0]
for c in self.build.compilers: for c in self.build.compilers:
if c.get_language() == cname: if c.get_language() == cname:
return CompilerHolder(c) return CompilerHolder(c, self.build.environment)
raise InterpreterException('Tried to access compiler for unspecified language "%s".' % cname) raise InterpreterException('Tried to access compiler for unspecified language "%s".' % cname)

@ -78,6 +78,7 @@ def run_tests():
except OSError: except OSError:
pass pass
print('\nRunning cross compilation tests.\n') print('\nRunning cross compilation tests.\n')
commontests = commontests[:28] + commontests[28:]
[run_test(t) for t in commontests] [run_test(t) for t in commontests]
if __name__ == '__main__': if __name__ == '__main__':

Loading…
Cancel
Save