aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild
diff options
context:
space:
mode:
authorHaakon Sporsheim <haakon.sporsheim@gmail.com>2017-03-09 14:25:24 +0100
committerHaakon Sporsheim <haakon.sporsheim@gmail.com>2017-03-09 14:31:38 +0100
commit52f23f8c34bd9f6eacd31e8dff70066ca2aeb4e1 (patch)
tree102e38a99f6a934f91df8c28a125f1fc8b439e29 /mesonbuild
parent1713aef364560c9de922991716880e4db32f88a5 (diff)
downloadmeson-52f23f8c34bd9f6eacd31e8dff70066ca2aeb4e1.zip
meson-52f23f8c34bd9f6eacd31e8dff70066ca2aeb4e1.tar.gz
meson-52f23f8c34bd9f6eacd31e8dff70066ca2aeb4e1.tar.bz2
compiler: Add compute_int functionality.
Fixes #435
Diffstat (limited to 'mesonbuild')
-rw-r--r--mesonbuild/compilers.py28
-rw-r--r--mesonbuild/interpreter.py15
2 files changed, 43 insertions, 0 deletions
diff --git a/mesonbuild/compilers.py b/mesonbuild/compilers.py
index 8c2bb92..d1a564b 100644
--- a/mesonbuild/compilers.py
+++ b/mesonbuild/compilers.py
@@ -1010,6 +1010,34 @@ class CCompiler(Compiler):
return i
raise EnvironmentException('Cross-compile check overflowed')
+ def cross_compute_int(self, fragment, prefix, env, extra_args=None, dependencies=None):
+ if extra_args is None:
+ extra_args = []
+ fargs = {'prefix': prefix, 'fragment': fragment}
+ t = '''#include <stdio.h>
+ {prefix}
+ int temparray[{size}-({fragment})];'''
+ return self._bisect_compiles(t, fargs, env, extra_args, dependencies)
+
+ def compute_int(self, fragment, prefix, env, extra_args=None, dependencies=None):
+ if extra_args is None:
+ extra_args = []
+ fargs = {'prefix': prefix, 'fragment': fragment}
+ if self.is_cross:
+ return self.cross_compute_int(fragment, prefix, env, extra_args, dependencies)
+ t = '''#include<stdio.h>
+ {prefix}
+ int main(int argc, char **argv) {{
+ printf("%ld\\n", (long)({fragment}));
+ return 0;
+ }};'''
+ res = self.run(t.format(**fargs), env, extra_args, dependencies)
+ if not res.compiled:
+ return -1
+ if res.returncode != 0:
+ raise EnvironmentException('Could not run compute_int test binary.')
+ return int(res.stdout)
+
def cross_sizeof(self, element, prefix, env, extra_args=None, dependencies=None):
if extra_args is None:
extra_args = []
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index 07b5c40..dca7934 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -631,6 +631,7 @@ class CompilerHolder(InterpreterObject):
self.methods.update({'compiles': self.compiles_method,
'links': self.links_method,
'get_id': self.get_id_method,
+ 'compute_int': self.compute_int_method,
'sizeof': self.sizeof_method,
'has_header': self.has_header_method,
'has_header_symbol': self.has_header_symbol_method,
@@ -822,6 +823,20 @@ class CompilerHolder(InterpreterObject):
mlog.log('Checking for type "', mlog.bold(typename), '": ', hadtxt, sep='')
return had
+ def compute_int_method(self, args, kwargs):
+ if len(args) != 1:
+ raise InterpreterException('Compute_int takes exactly one argument.')
+ check_stringlist(args)
+ fragment = args[0]
+ prefix = kwargs.get('prefix', '')
+ if not isinstance(prefix, str):
+ raise InterpreterException('Prefix argument of compute_int must be a string.')
+ extra_args = self.determine_args(kwargs)
+ deps = self.determine_dependencies(kwargs)
+ res = self.compiler.compute_int(fragment, prefix, self.environment, extra_args, deps)
+ mlog.log('Computing int of "%s": %d' % (fragment, res))
+ return res
+
def sizeof_method(self, args, kwargs):
if len(args) != 1:
raise InterpreterException('Sizeof takes exactly one argument.')