summaryrefslogtreecommitdiff
path: root/configs
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2017-10-30 18:31:07 -0700
committerGabe Black <gabeblack@google.com>2017-10-31 22:18:26 +0000
commit97c68e8fc56baa39ce7901ac1f73d2ff79b550f2 (patch)
tree8b60d9815d1b460c9c4a4439d1e38d83f5b95e20 /configs
parentfd16487b71e7b4e0c2df71d77bd2da947fdee2e9 (diff)
downloadgem5-97c68e8fc56baa39ce7901ac1f73d2ff79b550f2.tar.xz
config: Rework the SysPaths functions into functors.
These functions were already being treated as psuedo objects and had properties assigned to them setting what their paths were. That's a bit unusual and made it less obvious what the code was doing, but also forced the "system" function to know what all the possible path searching functions were so that they'd have their "path" property initialized properly in a central location. This change introduces a PathSearcFunc class which encapsulates the mechanisms of the old code and makes it implicitly extensible so that other path searching functions which might look in other directories can be added in other places. Change-Id: I7be28e51481a06ec83997677af99927709b18003 Reviewed-on: https://gem5-review.googlesource.com/5341 Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com> Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
Diffstat (limited to 'configs')
-rw-r--r--configs/common/SysPaths.py66
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')