aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/compilers
diff options
context:
space:
mode:
authorNirbheek Chauhan <nirbheek@centricular.com>2018-09-11 17:32:31 +0530
committerNirbheek Chauhan <nirbheek.chauhan@gmail.com>2018-09-11 10:19:42 -0700
commit1af704a509619d30b1fd9c6f96909c8195c0e3ca (patch)
treea6ff08a720ffdb106f54ee715b3a689b58fba119 /mesonbuild/compilers
parentd67ec95b500aabe0da5d95860fcefb894b7d363b (diff)
downloadmeson-1af704a509619d30b1fd9c6f96909c8195c0e3ca.zip
meson-1af704a509619d30b1fd9c6f96909c8195c0e3ca.tar.gz
meson-1af704a509619d30b1fd9c6f96909c8195c0e3ca.tar.bz2
Sprinkle functools.lru_cache() in a few more places
This improves the backend generation time for gst-build from 7.4s to 6.6s. This is probably all the low-hanging fruit we can get, further improvements will probably require refactoring, moving to pathlib.Path or reimplementing CompilerArgs: 222045 0.551 0.000 1.324 0.000 compilers.py:666(__iadd__) 3691 0.230 0.000 0.885 0.000 ninjabackend.py:99(write) 233560 0.441 0.000 0.701 0.000 posixpath.py:75(join) 882 0.141 0.000 0.636 0.001 backends.py:509(generate_basic_compiler_args) 256301 0.248 0.000 0.576 0.000 compilers.py:562(_can_dedup) 37369 0.035 0.000 0.466 0.000 compilers.py:652(extend_direct) 74650 0.067 0.000 0.431 0.000 compilers.py:641(append_direct) 158153 0.089 0.000 0.405 0.000 ninjabackend.py:129(<lambda>) 845 0.064 0.000 0.391 0.000 ninjabackend.py:279(get_target_generated_sources) 58161 0.070 0.000 0.317 0.000 backends.py:217(get_target_generated_dir) 216825 0.175 0.000 0.275 0.000 ninjabackend.py:48(ninja_quote) 845 0.058 0.000 0.255 0.000 ninjabackend.py:2289(guess_external_link_dependencies) 845 0.068 0.000 0.239 0.000 backends.py:793(get_custom_target_provided_libraries) 52101 0.030 0.000 0.237 0.000 compilers.py:716(append) 1319326 0.231 0.000 0.231 0.000 {built-in method builtins.isinstance} 1189117 0.229 0.000 0.229 0.000 {method 'startswith' of 'str' objects} 3235 0.102 0.000 0.228 0.000 compilers.py:614(to_native) Note: there are 845 build targets.
Diffstat (limited to 'mesonbuild/compilers')
-rw-r--r--mesonbuild/compilers/c.py19
-rw-r--r--mesonbuild/compilers/compilers.py10
2 files changed, 13 insertions, 16 deletions
diff --git a/mesonbuild/compilers/c.py b/mesonbuild/compilers/c.py
index bde9f63..1d531a6 100644
--- a/mesonbuild/compilers/c.py
+++ b/mesonbuild/compilers/c.py
@@ -119,6 +119,7 @@ class CCompiler(Compiler):
return None, fname
# The default behavior is this, override in MSVC
+ @functools.lru_cache(maxsize=None)
def build_rpath_args(self, build_dir, from_dir, rpath_paths, build_rpath, install_rpath):
if self.id == 'clang' and self.clang_type == compilers.CLANG_OSX:
return self.build_osx_rpath_args(build_dir, rpath_paths, build_rpath)
@@ -222,7 +223,7 @@ class CCompiler(Compiler):
p = Path(p)
if p.exists():
paths.append(p.resolve().as_posix())
- return paths
+ return tuple(paths)
def get_compiler_dirs(self, env, name):
'''
@@ -232,23 +233,19 @@ class CCompiler(Compiler):
for line in stdo.split('\n'):
if line.startswith(name + ':'):
return CCompiler._split_fetch_real_dirs(line.split('=', 1)[1])
- return []
+ return ()
+ @functools.lru_cache()
def get_library_dirs(self, env):
- key = (tuple(self.exelist), env)
- if key not in self.library_dirs_cache:
- self.library_dirs_cache[key] = self.get_compiler_dirs(env, 'libraries')
- return self.library_dirs_cache[key][:]
+ return self.get_compiler_dirs(env, 'libraries')
+ @functools.lru_cache()
def get_program_dirs(self, env):
'''
Programs used by the compiler. Also where toolchain DLLs such as
libstdc++-6.dll are found with MinGW.
'''
- key = (tuple(self.exelist), env)
- if key not in self.program_dirs_cache:
- self.program_dirs_cache[key] = self.get_compiler_dirs(env, 'programs')
- return self.program_dirs_cache[key][:]
+ return self.get_compiler_dirs(env, 'programs')
def get_pic_args(self):
return ['-fPIC']
@@ -907,7 +904,7 @@ class CCompiler(Compiler):
patterns += self._get_patterns(env, prefixes, stlibext, False)
else:
raise AssertionError('BUG: unknown libtype {!r}'.format(libtype))
- return patterns
+ return tuple(patterns)
@staticmethod
def _sort_shlibs_openbsd(libs):
diff --git a/mesonbuild/compilers/compilers.py b/mesonbuild/compilers/compilers.py
index 88e9bce..40d6880 100644
--- a/mesonbuild/compilers/compilers.py
+++ b/mesonbuild/compilers/compilers.py
@@ -923,7 +923,7 @@ class Compiler:
raise EnvironmentException('Language {} does not support library finding.'.format(self.get_display_language()))
def get_library_dirs(self, *args, **kwargs):
- return []
+ return ()
def has_multi_arguments(self, args, env):
raise EnvironmentException(
@@ -1381,12 +1381,12 @@ class ElbrusCompiler(GnuCompiler):
os_env = os.environ.copy()
os_env['LC_ALL'] = 'C'
stdo = Popen_safe(self.exelist + ['--print-search-dirs'], env=os_env)[1]
- paths = []
+ paths = ()
for line in stdo.split('\n'):
if line.startswith('libraries:'):
# lcc does not include '=' in --print-search-dirs output.
libstr = line.split(' ', 1)[1]
- paths = [os.path.realpath(p) for p in libstr.split(':')]
+ paths = (os.path.realpath(p) for p in libstr.split(':'))
break
return paths
@@ -1394,12 +1394,12 @@ class ElbrusCompiler(GnuCompiler):
os_env = os.environ.copy()
os_env['LC_ALL'] = 'C'
stdo = Popen_safe(self.exelist + ['--print-search-dirs'], env=os_env)[1]
- paths = []
+ paths = ()
for line in stdo.split('\n'):
if line.startswith('programs:'):
# lcc does not include '=' in --print-search-dirs output.
libstr = line.split(' ', 1)[1]
- paths = [os.path.realpath(p) for p in libstr.split(':')]
+ paths = (os.path.realpath(p) for p in libstr.split(':'))
break
return paths