diff options
-rw-r--r-- | mesonbuild/compilers/c.py | 31 | ||||
-rw-r--r-- | mesonbuild/compilers/compilers.py | 2 | ||||
-rw-r--r-- | mesonbuild/compilers/cpp.py | 11 | ||||
-rw-r--r-- | mesonbuild/dependencies/misc.py | 2 | ||||
-rw-r--r-- | mesonbuild/dependencies/ui.py | 2 | ||||
-rw-r--r-- | mesonbuild/interpreter.py | 92 | ||||
-rw-r--r-- | mesonbuild/modules/unstable_simd.py | 2 |
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')) |