diff options
Diffstat (limited to 'configs')
-rw-r--r-- | configs/common/SysPaths.py | 66 |
1 files changed, 26 insertions, 40 deletions
diff --git a/configs/common/SysPaths.py b/configs/common/SysPaths.py index 316fd0399..c012846ce 100644 --- a/configs/common/SysPaths.py +++ b/configs/common/SysPaths.py @@ -27,55 +27,41 @@ # Authors: Ali Saidi import os, sys -from os.path import join as joinpath -from os import environ as env config_path = os.path.dirname(os.path.abspath(__file__)) config_root = os.path.dirname(config_path) -def searchpath(path, filename): - for p in path: - f = joinpath(p, filename) - if os.path.exists(f): - return f - raise IOError, "Can't find file '%s' on path." % filename +class PathSearchFunc(object): + _sys_paths = None -def disk(filename): - system() - return searchpath(disk.path, filename) + def __init__(self, *subdirs): + self._subdir = os.path.join(*subdirs) -def binary(filename): - system() - return searchpath(binary.path, filename) + def __call__(self, filename): + if self._sys_paths is None: + try: + paths = os.environ['M5_PATH'].split(':') + except KeyError: + paths = [ '/dist/m5/system', '/n/poolfs/z/dist/m5/system' ] -def script(filename): - system() - return searchpath(script.path, filename) + # expand '~' and '~user' in paths + paths = map(os.path.expanduser, paths) -def system(): - if not system.path: - try: - path = env['M5_PATH'].split(':') - except KeyError: - path = [ '/dist/m5/system', '/n/poolfs/z/dist/m5/system' ] - - # expand '~' and '~user' in paths - path = map(os.path.expanduser, path) + # filter out non-existent directories + paths = filter(os.path.isdir, paths) - # filter out non-existent directories - system.path = filter(os.path.isdir, path) + if not paths: + raise IOError, "Can't find a path to system files." - if not system.path: - raise IOError, "Can't find a path to system files." + self._sys_paths = paths - if not binary.path: - binary.path = [joinpath(p, 'binaries') for p in system.path] - if not disk.path: - disk.path = [joinpath(p, 'disks') for p in system.path] - if not script.path: - script.path = [joinpath(config_root, 'boot')] + filepath = os.path.join(self._subdir, filename) + paths = (os.path.join(p, filepath) for p in self._sys_paths) + try: + return next(p for p in paths if os.path.exists(p)) + except StopIteration: + raise IOError, "Can't find file '%s' on path." % filename -system.path = None -binary.path = None -disk.path = None -script.path = None +disk = PathSearchFunc('disks') +binary = PathSearchFunc('binaries') +script = PathSearchFunc('boot') |