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
|
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__':
|
||||||
|
|||||||
Reference in New Issue
Block a user