summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNirbheek Chauhan <nirbheek@centricular.com>2017-08-14 05:10:19 +0530
committerNirbheek Chauhan <nirbheek@centricular.com>2017-09-20 13:36:42 +0530
commit59473e9ed7b1333ff42efab0d5268d8d74bcc3b0 (patch)
tree011932d7d5546c7f76afa9b975d7a61121b30114
parent276e9c15cc63d266c9f81301229128d02b229a6f (diff)
downloadmeson-59473e9ed7b1333ff42efab0d5268d8d74bcc3b0.tar.gz
Add a new compiler method: get_return_value()
This method accepts a single function that takes no arguments and returns a single value which can be a value that can be cast to a 64-bit signed integer, or a string, and returns that value. Mostly useful for running foolib_version() functions that return the currently-available version of libraries.
-rw-r--r--mesonbuild/compilers/c.py28
-rw-r--r--mesonbuild/interpreter.py2
2 files changed, 29 insertions, 1 deletions
diff --git a/mesonbuild/compilers/c.py b/mesonbuild/compilers/c.py
index ec1613497..80a0f3617 100644
--- a/mesonbuild/compilers/c.py
+++ b/mesonbuild/compilers/c.py
@@ -482,6 +482,34 @@ class CCompiler(Compiler):
# minus the extra newline at the end
return p.stdo.split(delim + '\n')[-1][:-1]
+ def get_return_value(self, fname, rtype, prefix, env, extra_args, dependencies):
+ if rtype == 'string':
+ fmt = '%s'
+ cast = '(char*)'
+ elif rtype == 'int':
+ fmt = '%lli'
+ cast = '(long long int)'
+ else:
+ raise AssertionError('BUG: Unknown return type {!r}'.format(rtype))
+ fargs = {'prefix': prefix, 'f': fname, 'cast': cast, 'fmt': fmt}
+ code = '''{prefix}
+ #include <stdio.h>
+ int main(int argc, char *argv[]) {{
+ printf ("{fmt}", {cast} {f}());
+ }}'''.format(**fargs)
+ res = self.run(code, env, extra_args, dependencies)
+ if not res.compiled:
+ m = 'Could not get return value of {}()'
+ raise EnvironmentException(m.format(fname))
+ if rtype == 'string':
+ return res.stdout
+ elif rtype == 'int':
+ try:
+ return int(res.stdout.strip())
+ except:
+ m = 'Return value of {}() is not an int'
+ raise EnvironmentException(m.format(fname))
+
@staticmethod
def _no_prototype_templ():
"""
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index 2bcf198a2..47a1501ee 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -882,7 +882,7 @@ class CompilerHolder(InterpreterObject):
extra_args = self.determine_args(kwargs)
deps = self.determine_dependencies(kwargs)
value = self.compiler.get_define(element, prefix, self.environment, extra_args, deps)
- mlog.log('Checking for value of define "%s": %s' % (element, value))
+ mlog.log('Fetching value of define "%s": %s' % (element, value))
return value
def compiles_method(self, args, kwargs):