mirror of
https://gitlab.com/qemu-project/meson.git
synced 2025-11-09 02:21:48 +08:00
Get sizeof info from cross file if it exists and write an error if it can not be determined.
This commit is contained in:
8
cross/ubuntu-armhf.txt
Normal file
8
cross/ubuntu-armhf.txt
Normal file
@ -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
|
||||
from glob import glob
|
||||
import tempfile
|
||||
from coredata import MesonException
|
||||
|
||||
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):
|
||||
Exception.__init__(self, *args, **kwargs)
|
||||
|
||||
@ -166,7 +171,7 @@ class CCompiler():
|
||||
|
||||
def run(self, code):
|
||||
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)
|
||||
os.close(fd)
|
||||
ofile = open(srcname, 'w')
|
||||
@ -190,7 +195,7 @@ class CCompiler():
|
||||
os.remove(exename)
|
||||
return RunResult(True, pe.returncode, so.decode(), se.decode())
|
||||
|
||||
def sizeof(self, element, prefix):
|
||||
def sizeof(self, element, prefix, env):
|
||||
templ = '''#include<stdio.h>
|
||||
%s
|
||||
|
||||
@ -199,7 +204,23 @@ int main(int argc, char **argv) {
|
||||
return 0;
|
||||
};
|
||||
'''
|
||||
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:
|
||||
raise EnvironmentException('Could not compile sizeof test.')
|
||||
if res.returncode != 0:
|
||||
@ -1033,9 +1054,13 @@ class CrossBuildInfo():
|
||||
if not 'name' in self:
|
||||
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):
|
||||
# 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()
|
||||
if line == '':
|
||||
continue
|
||||
@ -1049,11 +1074,11 @@ class CrossBuildInfo():
|
||||
res = eval(value, {})
|
||||
except Exception:
|
||||
raise EnvironmentException('Malformed line in cross file %s:%d.' % (filename, linenum))
|
||||
if isinstance(res, str):
|
||||
if self.ok_type(res):
|
||||
self.items[varname] = res
|
||||
elif isinstance(res, list):
|
||||
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))
|
||||
self.items[varname] = res
|
||||
else:
|
||||
|
||||
@ -654,9 +654,10 @@ class Test(InterpreterObject):
|
||||
return self.name
|
||||
|
||||
class CompilerHolder(InterpreterObject):
|
||||
def __init__(self, compiler):
|
||||
def __init__(self, compiler, env):
|
||||
InterpreterObject.__init__(self)
|
||||
self.compiler = compiler
|
||||
self.environment = env
|
||||
self.methods.update({'compiles': self.compiles_method,
|
||||
'get_id': self.get_id_method,
|
||||
'sizeof': self.sizeof_method,
|
||||
@ -749,7 +750,7 @@ class CompilerHolder(InterpreterObject):
|
||||
prefix = kwargs.get('prefix', '')
|
||||
if not isinstance(prefix, str):
|
||||
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))
|
||||
return esize
|
||||
|
||||
@ -801,7 +802,7 @@ class MesonMain(InterpreterObject):
|
||||
cname = args[0]
|
||||
for c in self.build.compilers:
|
||||
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)
|
||||
|
||||
|
||||
|
||||
@ -78,6 +78,7 @@ def run_tests():
|
||||
except OSError:
|
||||
pass
|
||||
print('\nRunning cross compilation tests.\n')
|
||||
commontests = commontests[:28] + commontests[28:]
|
||||
[run_test(t) for t in commontests]
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
Reference in New Issue
Block a user