aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesonbuild/compilers/c.py31
-rw-r--r--mesonbuild/compilers/compilers.py2
-rw-r--r--mesonbuild/compilers/cpp.py11
-rw-r--r--mesonbuild/dependencies/misc.py2
-rw-r--r--mesonbuild/dependencies/ui.py2
-rw-r--r--mesonbuild/interpreter.py92
-rw-r--r--mesonbuild/modules/unstable_simd.py2
7 files changed, 79 insertions, 63 deletions
diff --git a/mesonbuild/compilers/c.py b/mesonbuild/compilers/c.py
index f0dc201..fe5a9ca 100644
--- a/mesonbuild/compilers/c.py
+++ b/mesonbuild/compilers/c.py
@@ -446,7 +446,7 @@ class CCompiler(Compiler):
def compiles(self, code, env, *, extra_args=None, dependencies=None, mode='compile'):
with self._build_wrapper(code, env, extra_args, dependencies, mode) as p:
- return p.returncode == 0
+ return p.returncode == 0, p.cached
def _build_wrapper(self, code, env, extra_args, dependencies=None, mode='compile', want_output=False):
args = self._get_compiler_check_args(env, extra_args, dependencies, mode)
@@ -487,7 +487,7 @@ class CCompiler(Compiler):
{prefix}
int main() {{ static int a[1-2*!({expression})]; a[0]=0; return 0; }}'''
return self.compiles(t.format(**fargs), env, extra_args=extra_args,
- dependencies=dependencies)
+ dependencies=dependencies)[0]
def cross_compute_int(self, expression, low, high, guess, prefix, env, extra_args, dependencies):
# Try user's guess first
@@ -567,7 +567,7 @@ class CCompiler(Compiler):
{type} something;
}}'''
if not self.compiles(t.format(**fargs), env, extra_args=extra_args,
- dependencies=dependencies):
+ dependencies=dependencies)[0]:
return -1
return self.cross_compute_int('sizeof(%s)' % typename, None, None, None, prefix, env, extra_args, dependencies)
@@ -602,7 +602,7 @@ class CCompiler(Compiler):
{type} something;
}}'''
if not self.compiles(t.format(**fargs), env, extra_args=extra_args,
- dependencies=dependencies):
+ dependencies=dependencies)[0]:
return -1
t = '''#include <stddef.h>
{prefix}
@@ -762,7 +762,7 @@ class CCompiler(Compiler):
val = env.properties.host.get(varname, None)
if val is not None:
if isinstance(val, bool):
- return val
+ return val, True
raise EnvironmentException('Cross variable {0} is not a boolean.'.format(varname))
fargs = {'prefix': prefix, 'func': funcname}
@@ -792,13 +792,14 @@ class CCompiler(Compiler):
head, main = self._no_prototype_templ()
templ = head + stubs_fail + main
- if self.links(templ.format(**fargs), env, extra_args=extra_args,
- dependencies=dependencies):
- return True
+ res, cached = self.links(templ.format(**fargs), env, extra_args=extra_args,
+ dependencies=dependencies)
+ if res:
+ return True, cached
# MSVC does not have compiler __builtin_-s.
if self.get_id() == 'msvc':
- return False
+ return False, False
# Detect function as a built-in
#
@@ -1020,7 +1021,7 @@ class CCompiler(Compiler):
libname in self.internal_libs):
args = ['-l' + libname]
largs = self.linker_to_compiler_args(self.get_allow_undefined_link_args())
- if self.links(code, env, extra_args=(args + largs)):
+ if self.links(code, env, extra_args=(args + largs))[0]:
return args
# Don't do a manual search for internal libs
if libname in self.internal_libs:
@@ -1109,7 +1110,7 @@ class CCompiler(Compiler):
# then we must also pass -L/usr/lib to pick up libSystem.dylib
extra_args = [] if allow_system else ['-Z', '-L/usr/lib']
link_args += ['-framework', name]
- if self.links(code, env, extra_args=(extra_args + link_args)):
+ if self.links(code, env, extra_args=(extra_args + link_args))[0]:
return link_args
def find_framework_impl(self, name, env, extra_dirs, allow_system):
@@ -1176,7 +1177,7 @@ class CCompiler(Compiler):
fatal_warnings_args = ['-Wl,--fatal-warnings']
if self.has_fatal_warnings_link_arg is None:
self.has_fatal_warnings_link_arg = False
- self.has_fatal_warnings_link_arg = self.has_multi_link_arguments(fatal_warnings_args, env)
+ self.has_fatal_warnings_link_arg = self.has_multi_link_arguments(fatal_warnings_args, env)[0]
if self.has_fatal_warnings_link_arg:
args = fatal_warnings_args + args
@@ -1348,7 +1349,7 @@ class ElbrusCCompiler(GnuCCompiler, ElbrusCompiler):
# So we should explicitly fail at this case.
def has_function(self, funcname, prefix, env, *, extra_args=None, dependencies=None):
if funcname == 'lchmod':
- return False
+ return False, False
else:
return super().has_function(funcname, prefix, env,
extra_args=extra_args,
@@ -1609,8 +1610,8 @@ class VisualStudioCCompiler(CCompiler):
args = args + ['-Werror=unknown-argument']
with self._build_wrapper(code, env, extra_args=args, mode=mode) as p:
if p.returncode != 0:
- return False
- return not(warning_text in p.stde or warning_text in p.stdo)
+ return False, p.cached
+ return not(warning_text in p.stde or warning_text in p.stdo), p.cached
def get_compile_debugfile_args(self, rel_obj, pch=False):
pdbarr = rel_obj.split('.')[:-1]
diff --git a/mesonbuild/compilers/compilers.py b/mesonbuild/compilers/compilers.py
index 169a973..e8d8358 100644
--- a/mesonbuild/compilers/compilers.py
+++ b/mesonbuild/compilers/compilers.py
@@ -1156,6 +1156,7 @@ class Compiler:
if not want_output:
if cdata is not None and key in cdata.compiler_check_cache:
p = cdata.compiler_check_cache[key]
+ p.cached = True
mlog.debug('Using cached compile:')
mlog.debug('Cached command line: ', ' '.join(p.commands), '\n')
mlog.debug('Code:\n', code)
@@ -1213,6 +1214,7 @@ class Compiler:
for i in todel:
delattr(p, i)
cdata.compiler_check_cache[key] = p
+ p.cached = False
yield p
except (PermissionError, OSError):
# On Windows antivirus programs and the like hold on to files so
diff --git a/mesonbuild/compilers/cpp.py b/mesonbuild/compilers/cpp.py
index 87e6ffc..3e0942d 100644
--- a/mesonbuild/compilers/cpp.py
+++ b/mesonbuild/compilers/cpp.py
@@ -65,10 +65,11 @@ class CPPCompiler(CCompiler):
def has_header_symbol(self, hname, symbol, prefix, env, *, extra_args=None, dependencies=None):
# Check if it's a C-like symbol
- if super().has_header_symbol(hname, symbol, prefix, env,
- extra_args=extra_args,
- dependencies=dependencies):
- return True
+ found, cached = super().has_header_symbol(hname, symbol, prefix, env,
+ extra_args=extra_args,
+ dependencies=dependencies)
+ if found:
+ return True, cached
# Check if it's a class or a template
if extra_args is None:
extra_args = []
@@ -264,7 +265,7 @@ class ElbrusCPPCompiler(GnuCPPCompiler, ElbrusCompiler):
# So we should explicitly fail at this case.
def has_function(self, funcname, prefix, env, *, extra_args=None, dependencies=None):
if funcname == 'lchmod':
- return False
+ return False, False
else:
return super().has_function(funcname, prefix, env,
extra_args=extra_args,
diff --git a/mesonbuild/dependencies/misc.py b/mesonbuild/dependencies/misc.py
index 55cb569..d266a37 100644
--- a/mesonbuild/dependencies/misc.py
+++ b/mesonbuild/dependencies/misc.py
@@ -376,7 +376,7 @@ class OpenMPDependency(ExternalDependency):
if openmp_date:
self.version = self.VERSIONS[openmp_date]
- if self.clib_compiler.has_header('omp.h', '', self.env, dependencies=[self]):
+ if self.clib_compiler.has_header('omp.h', '', self.env, dependencies=[self])[0]:
self.is_found = True
self.compile_args = self.link_args = self.clib_compiler.openmp_flags()
else:
diff --git a/mesonbuild/dependencies/ui.py b/mesonbuild/dependencies/ui.py
index ce1ca68..0a01ac4 100644
--- a/mesonbuild/dependencies/ui.py
+++ b/mesonbuild/dependencies/ui.py
@@ -641,7 +641,7 @@ class VulkanDependency(ExternalDependency):
else:
# simply try to guess it, usually works on linux
libs = self.clib_compiler.find_library('vulkan', environment, [])
- if libs is not None and self.clib_compiler.has_header('vulkan/vulkan.h', '', environment):
+ if libs is not None and self.clib_compiler.has_header('vulkan/vulkan.h', '', environment)[0]:
self.type_name = 'system'
self.is_found = True
for lib in libs:
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index 8ca7758..b0311a4 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -1134,16 +1134,17 @@ class CompilerHolder(InterpreterObject):
raise InterpreterException('Prefix argument of has_member must be a string.')
extra_args = functools.partial(self.determine_args, kwargs)
deps, msg = self.determine_dependencies(kwargs)
- had = self.compiler.has_members(typename, [membername], prefix,
- self.environment,
- extra_args=extra_args,
- dependencies=deps)
+ had, cached = self.compiler.has_members(typename, [membername], prefix,
+ self.environment,
+ extra_args=extra_args,
+ dependencies=deps)
+ cached = '(cached)' if cached else ''
if had:
hadtxt = mlog.green('YES')
else:
hadtxt = mlog.red('NO')
mlog.log('Checking whether type', mlog.bold(typename, True),
- 'has member', mlog.bold(membername, True), msg, hadtxt)
+ 'has member', mlog.bold(membername, True), msg, hadtxt, cached)
return had
@permittedKwargs({
@@ -1163,17 +1164,18 @@ class CompilerHolder(InterpreterObject):
raise InterpreterException('Prefix argument of has_members must be a string.')
extra_args = functools.partial(self.determine_args, kwargs)
deps, msg = self.determine_dependencies(kwargs)
- had = self.compiler.has_members(typename, membernames, prefix,
- self.environment,
- extra_args=extra_args,
- dependencies=deps)
+ had, cached = self.compiler.has_members(typename, membernames, prefix,
+ self.environment,
+ extra_args=extra_args,
+ dependencies=deps)
+ cached = '(cached)' if cached else ''
if had:
hadtxt = mlog.green('YES')
else:
hadtxt = mlog.red('NO')
members = mlog.bold(', '.join(['"{}"'.format(m) for m in membernames]))
mlog.log('Checking whether type', mlog.bold(typename, True),
- 'has members', members, msg, hadtxt)
+ 'has members', members, msg, hadtxt, cached)
return had
@permittedKwargs({
@@ -1193,14 +1195,15 @@ class CompilerHolder(InterpreterObject):
raise InterpreterException('Prefix argument of has_function must be a string.')
extra_args = self.determine_args(kwargs)
deps, msg = self.determine_dependencies(kwargs)
- had = self.compiler.has_function(funcname, prefix, self.environment,
+ had, cached = self.compiler.has_function(funcname, prefix, self.environment,
extra_args=extra_args,
dependencies=deps)
+ cached = '(cached)' if cached else ''
if had:
hadtxt = mlog.green('YES')
else:
hadtxt = mlog.red('NO')
- mlog.log('Checking for function', mlog.bold(funcname, True), msg, hadtxt)
+ mlog.log('Checking for function', mlog.bold(funcname, True), msg, hadtxt, cached)
return had
@permittedKwargs({
@@ -1220,13 +1223,14 @@ class CompilerHolder(InterpreterObject):
raise InterpreterException('Prefix argument of has_type must be a string.')
extra_args = functools.partial(self.determine_args, kwargs)
deps, msg = self.determine_dependencies(kwargs)
- had = self.compiler.has_type(typename, prefix, self.environment,
- extra_args=extra_args, dependencies=deps)
+ had, cached = self.compiler.has_type(typename, prefix, self.environment,
+ extra_args=extra_args, dependencies=deps)
+ cached = '(cached)' if cached else ''
if had:
hadtxt = mlog.green('YES')
else:
hadtxt = mlog.red('NO')
- mlog.log('Checking for type', mlog.bold(typename, True), msg, hadtxt)
+ mlog.log('Checking for type', mlog.bold(typename, True), msg, hadtxt, cached)
return had
@FeatureNew('compiler.compute_int', '0.40.0')
@@ -1332,15 +1336,16 @@ class CompilerHolder(InterpreterObject):
raise InterpreterException('Testname argument must be a string.')
extra_args = functools.partial(self.determine_args, kwargs)
deps, msg = self.determine_dependencies(kwargs, endl=None)
- result = self.compiler.compiles(code, self.environment,
- extra_args=extra_args,
- dependencies=deps)
+ result, cached = self.compiler.compiles(code, self.environment,
+ extra_args=extra_args,
+ dependencies=deps)
if len(testname) > 0:
if result:
h = mlog.green('YES')
else:
h = mlog.red('NO')
- mlog.log('Checking if', mlog.bold(testname, True), msg, 'compiles:', h)
+ cached = '(cached)' if cached else ''
+ mlog.log('Checking if', mlog.bold(testname, True), msg, 'compiles:', h, cached)
return result
@permittedKwargs({
@@ -1364,15 +1369,16 @@ class CompilerHolder(InterpreterObject):
raise InterpreterException('Testname argument must be a string.')
extra_args = functools.partial(self.determine_args, kwargs)
deps, msg = self.determine_dependencies(kwargs, endl=None)
- result = self.compiler.links(code, self.environment,
- extra_args=extra_args,
- dependencies=deps)
+ result, cached = self.compiler.links(code, self.environment,
+ extra_args=extra_args,
+ dependencies=deps)
+ cached = '(cached)' if cached else ''
if len(testname) > 0:
if result:
h = mlog.green('YES')
else:
h = mlog.red('NO')
- mlog.log('Checking if', mlog.bold(testname, True), msg, 'links:', h)
+ mlog.log('Checking if', mlog.bold(testname, True), msg, 'links:', h, cached)
return result
@FeatureNew('compiler.check_header', '0.47.0')
@@ -1392,16 +1398,17 @@ class CompilerHolder(InterpreterObject):
return False
extra_args = functools.partial(self.determine_args, kwargs)
deps, msg = self.determine_dependencies(kwargs)
- haz = self.compiler.check_header(hname, prefix, self.environment,
- extra_args=extra_args,
- dependencies=deps)
+ haz, cached = self.compiler.check_header(hname, prefix, self.environment,
+ extra_args=extra_args,
+ dependencies=deps)
+ cached = '(cached)' if cached else ''
if required and not haz:
raise InterpreterException('{} header {!r} not usable'.format(self.compiler.get_display_language(), hname))
elif haz:
h = mlog.green('YES')
else:
h = mlog.red('NO')
- mlog.log('Check usable header', mlog.bold(hname, True), msg, h)
+ mlog.log('Check usable header', mlog.bold(hname, True), msg, h, cached)
return haz
@FeatureNewKwargs('compiler.has_header', '0.50.0', ['required'])
@@ -1420,15 +1427,16 @@ class CompilerHolder(InterpreterObject):
return False
extra_args = functools.partial(self.determine_args, kwargs)
deps, msg = self.determine_dependencies(kwargs)
- haz = self.compiler.has_header(hname, prefix, self.environment,
- extra_args=extra_args, dependencies=deps)
+ haz, cached = self.compiler.has_header(hname, prefix, self.environment,
+ extra_args=extra_args, dependencies=deps)
+ cached = '(cached)' if cached else ''
if required and not haz:
raise InterpreterException('{} header {!r} not found'.format(self.compiler.get_display_language(), hname))
elif haz:
h = mlog.green('YES')
else:
h = mlog.red('NO')
- mlog.log('Has header', mlog.bold(hname, True), msg, h)
+ mlog.log('Has header', mlog.bold(hname, True), msg, h, cached)
return haz
@FeatureNewKwargs('compiler.has_header_symbol', '0.50.0', ['required'])
@@ -1447,16 +1455,17 @@ class CompilerHolder(InterpreterObject):
return False
extra_args = functools.partial(self.determine_args, kwargs)
deps, msg = self.determine_dependencies(kwargs)
- haz = self.compiler.has_header_symbol(hname, symbol, prefix, self.environment,
- extra_args=extra_args,
- dependencies=deps)
+ haz, cached = self.compiler.has_header_symbol(hname, symbol, prefix, self.environment,
+ extra_args=extra_args,
+ dependencies=deps)
if required and not haz:
raise InterpreterException('{} symbol {} not found in header {}'.format(self.compiler.get_display_language(), symbol, hname))
elif haz:
h = mlog.green('YES')
else:
h = mlog.red('NO')
- mlog.log('Header <{0}> has symbol'.format(hname), mlog.bold(symbol, True), msg, h)
+ cached = '(cached)' if cached else ''
+ mlog.log('Header <{0}> has symbol'.format(hname), mlog.bold(symbol, True), msg, h, cached)
return haz
def notfound_library(self, libname):
@@ -1518,15 +1527,16 @@ class CompilerHolder(InterpreterObject):
@permittedKwargs({})
def has_multi_arguments_method(self, args, kwargs):
args = mesonlib.stringlistify(args)
- result = self.compiler.has_multi_arguments(args, self.environment)
+ result, cached = self.compiler.has_multi_arguments(args, self.environment)
if result:
h = mlog.green('YES')
else:
h = mlog.red('NO')
+ cached = '(cached)' if cached else ''
mlog.log(
'Compiler for {} supports arguments {}:'.format(
self.compiler.get_display_language(), ' '.join(args)),
- h)
+ h, cached)
return result
@FeatureNew('compiler.get_supported_arguments', '0.43.0')
@@ -1560,7 +1570,8 @@ class CompilerHolder(InterpreterObject):
@permittedKwargs({})
def has_multi_link_arguments_method(self, args, kwargs):
args = mesonlib.stringlistify(args)
- result = self.compiler.has_multi_link_arguments(args, self.environment)
+ result, cached = self.compiler.has_multi_link_arguments(args, self.environment)
+ cached = '(cached)' if cached else ''
if result:
h = mlog.green('YES')
else:
@@ -1568,7 +1579,7 @@ class CompilerHolder(InterpreterObject):
mlog.log(
'Compiler for {} supports link arguments {}:'.format(
self.compiler.get_display_language(), ' '.join(args)),
- h)
+ h, cached)
return result
@FeatureNew('compiler.get_supported_link_arguments_method', '0.46.0')
@@ -1597,9 +1608,10 @@ class CompilerHolder(InterpreterObject):
args = mesonlib.stringlistify(args)
if len(args) != 1:
raise InterpreterException('has_func_attribute takes exactly one argument.')
- result = self.compiler.has_func_attribute(args[0], self.environment)
+ result, cached = self.compiler.has_func_attribute(args[0], self.environment)
+ cached = '(cached)' if cached else ''
h = mlog.green('YES') if result else mlog.red('NO')
- mlog.log('Compiler for {} supports function attribute {}:'.format(self.compiler.get_display_language(), args[0]), h)
+ mlog.log('Compiler for {} supports function attribute {}:'.format(self.compiler.get_display_language(), args[0]), h, cached)
return result
@FeatureNew('compiler.get_supported_function_attributes', '0.48.0')
diff --git a/mesonbuild/modules/unstable_simd.py b/mesonbuild/modules/unstable_simd.py
index 18a1099..2f2f67f 100644
--- a/mesonbuild/modules/unstable_simd.py
+++ b/mesonbuild/modules/unstable_simd.py
@@ -66,7 +66,7 @@ class SimdModule(ExtensionModule):
mlog.log('Compiler supports %s:' % iset, mlog.red('NO'))
continue
if args:
- if not compiler.has_multi_arguments(args, state.environment):
+ if not compiler.has_multi_arguments(args, state.environment)[0]:
mlog.log('Compiler supports %s:' % iset, mlog.red('NO'))
continue
mlog.log('Compiler supports %s:' % iset, mlog.green('YES'))