diff options
author | Daniel Mensinger <daniel@mensinger-ka.de> | 2019-02-19 19:34:20 +0100 |
---|---|---|
committer | Daniel Mensinger <daniel@mensinger-ka.de> | 2019-04-28 14:31:49 +0200 |
commit | c9bd84fd25dd24999ac2d20b616e91efb9038905 (patch) | |
tree | 75adff6c68e678cbf5ffb459dedafd2bfd8605c0 | |
parent | cbdf9d06471ed9b682e94f5d9f4084ee35358778 (diff) | |
download | meson-c9bd84fd25dd24999ac2d20b616e91efb9038905.zip meson-c9bd84fd25dd24999ac2d20b616e91efb9038905.tar.gz meson-c9bd84fd25dd24999ac2d20b616e91efb9038905.tar.bz2 |
Cache compile results in coredata
-rw-r--r-- | mesonbuild/compilers/c.py | 4 | ||||
-rw-r--r-- | mesonbuild/compilers/compilers.py | 21 | ||||
-rw-r--r-- | mesonbuild/compilers/d.py | 2 | ||||
-rw-r--r-- | mesonbuild/compilers/vala.py | 2 | ||||
-rw-r--r-- | mesonbuild/coredata.py | 1 |
5 files changed, 18 insertions, 12 deletions
diff --git a/mesonbuild/compilers/c.py b/mesonbuild/compilers/c.py index 94ef336..f0dc201 100644 --- a/mesonbuild/compilers/c.py +++ b/mesonbuild/compilers/c.py @@ -450,7 +450,7 @@ class CCompiler(Compiler): 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) - return self.compile(code, args, mode, want_output=want_output) + return self.compile(code, args, mode, want_output=want_output, cdata=env.coredata) def links(self, code, env, *, extra_args=None, dependencies=None): return self.compiles(code, env, extra_args=extra_args, @@ -652,7 +652,7 @@ class CCompiler(Compiler): {delim}\n{define}''' args = self._get_compiler_check_args(env, extra_args, dependencies, mode='preprocess').to_native() - with self.compile(code.format(**fargs), args, 'preprocess') as p: + with self.compile(code.format(**fargs), args, 'preprocess', cdata=env.coredata) as p: if p.returncode != 0: raise EnvironmentException('Could not get define {!r}'.format(dname)) # Get the preprocessed value after the delimiter, diff --git a/mesonbuild/compilers/compilers.py b/mesonbuild/compilers/compilers.py index 87a83e5..169a973 100644 --- a/mesonbuild/compilers/compilers.py +++ b/mesonbuild/compilers/compilers.py @@ -875,8 +875,6 @@ class Compiler: # Libraries that are internal compiler implementations, and must not be # manually searched. internal_libs = () - # Cache for the result of compiler checks which can be cached - compiler_check_cache = {} def __init__(self, exelist, version, **kwargs): if isinstance(exelist, str): @@ -1148,16 +1146,16 @@ class Compiler: return os.path.join(dirname, 'output.' + suffix) @contextlib.contextmanager - def compile(self, code, extra_args=None, mode='link', want_output=False): + def compile(self, code, extra_args=None, mode='link', want_output=False, cdata: coredata.CoreData = None): if extra_args is None: textra_args = None extra_args = [] else: textra_args = tuple(extra_args) - key = (code, textra_args, mode) + key = (tuple(self.exelist), self.version, code, textra_args, mode) if not want_output: - if key in self.compiler_check_cache: - p = self.compiler_check_cache[key] + if cdata is not None and key in cdata.compiler_check_cache: + p = cdata.compiler_check_cache[key] mlog.debug('Using cached compile:') mlog.debug('Cached command line: ', ' '.join(p.commands), '\n') mlog.debug('Code:\n', code) @@ -1206,8 +1204,15 @@ class Compiler: p.input_name = srcname if want_output: p.output_name = output - else: - self.compiler_check_cache[key] = p + elif cdata is not None: + # Remove all attributes except the following + # This way the object can be serialized + tokeep = ['args', 'commands', 'input_name', 'output_name', + 'pid', 'returncode', 'stdo', 'stde', 'text_mode'] + todel = [x for x in vars(p).keys() if x not in tokeep] + for i in todel: + delattr(p, i) + cdata.compiler_check_cache[key] = p yield p except (PermissionError, OSError): # On Windows antivirus programs and the like hold on to files so diff --git a/mesonbuild/compilers/d.py b/mesonbuild/compilers/d.py index 529919b..e8257d3 100644 --- a/mesonbuild/compilers/d.py +++ b/mesonbuild/compilers/d.py @@ -326,7 +326,7 @@ class DCompiler(Compiler): def compiles(self, code, env, *, extra_args=None, dependencies=None, mode='compile'): args = self._get_compiler_check_args(env, extra_args, dependencies, mode) - with self.compile(code, args, mode) as p: + with self.compile(code, args, mode, cdata=env.coredata) as p: return p.returncode == 0 def has_multi_arguments(self, args, env): diff --git a/mesonbuild/compilers/vala.py b/mesonbuild/compilers/vala.py index 98b8b42..789e00b 100644 --- a/mesonbuild/compilers/vala.py +++ b/mesonbuild/compilers/vala.py @@ -121,7 +121,7 @@ class ValaCompiler(Compiler): args = env.coredata.get_external_args(for_machine, self.language) vapi_args = ['--pkg', libname] args += vapi_args - with self.compile(code, args, 'compile') as p: + with self.compile(code, args, 'compile', cdata=env.coredata) as p: if p.returncode == 0: return vapi_args # Not found? Try to find the vapi file itself. diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py index 9281019..a2c5ff9 100644 --- a/mesonbuild/coredata.py +++ b/mesonbuild/coredata.py @@ -247,6 +247,7 @@ class CoreData: self.compilers = OrderedDict() self.cross_compilers = OrderedDict() self.deps = OrderedDict() + self.compiler_check_cache = OrderedDict() # Only to print a warning if it changes between Meson invocations. self.config_files = self.__load_config_files(options.native_file, 'native') self.libdir_cross_fixup() |