## @file # manage multiple workspace file. # # This file is required to make Python interpreter treat the directory # as containing package. # # Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.
# This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License # which accompanies this distribution. The full text of the license may be found at # http://opensource.org/licenses/bsd-license.php # # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. # import Common.LongFilePathOs as os from Common.DataType import TAB_WORKSPACE ## MultipleWorkspace # # This class manage multiple workspace behavior # # @param class: # # @var WORKSPACE: defined the current WORKSPACE # @var PACKAGES_PATH: defined the other WORKSAPCE, if current WORKSPACE is invalid, search valid WORKSPACE from PACKAGES_PATH # class MultipleWorkspace(object): WORKSPACE = '' PACKAGES_PATH = None ## convertPackagePath() # # Convert path to match workspace. # # @param cls The class pointer # @param Ws The current WORKSPACE # @param Path Path to be converted to match workspace. # @classmethod def convertPackagePath(cls, Ws, Path): if str(os.path.normcase (Path)).startswith(Ws): return os.path.join(Ws, os.path.relpath(Path, Ws)) return Path ## setWs() # # set WORKSPACE and PACKAGES_PATH environment # # @param cls The class pointer # @param Ws initialize WORKSPACE variable # @param PackagesPath initialize PackagesPath variable # @classmethod def setWs(cls, Ws, PackagesPath=None): cls.WORKSPACE = Ws if PackagesPath: cls.PACKAGES_PATH = [cls.convertPackagePath (Ws, os.path.normpath(Path.strip())) for Path in PackagesPath.split(os.pathsep)] else: cls.PACKAGES_PATH = [] ## join() # # rewrite os.path.join function # # @param cls The class pointer # @param Ws the current WORKSPACE # @param *p path of the inf/dec/dsc/fdf/conf file # @retval Path the absolute path of specified file # @classmethod def join(cls, Ws, *p): Path = os.path.join(Ws, *p) if not os.path.exists(Path): for Pkg in cls.PACKAGES_PATH: Path = os.path.join(Pkg, *p) if os.path.exists(Path): return Path Path = os.path.join(Ws, *p) return Path ## relpath() # # rewrite os.path.relpath function # # @param cls The class pointer # @param Path path of the inf/dec/dsc/fdf/conf file # @param Ws the current WORKSPACE # @retval Path the relative path of specified file # @classmethod def relpath(cls, Path, Ws): for Pkg in cls.PACKAGES_PATH: if Path.lower().startswith(Pkg.lower()): Path = os.path.relpath(Path, Pkg) return Path if Path.lower().startswith(Ws.lower()): Path = os.path.relpath(Path, Ws) return Path ## getWs() # # get valid workspace for the path # # @param cls The class pointer # @param Ws the current WORKSPACE # @param Path path of the inf/dec/dsc/fdf/conf file # @retval Ws the valid workspace relative to the specified file path # @classmethod def getWs(cls, Ws, Path): absPath = os.path.join(Ws, Path) if not os.path.exists(absPath): for Pkg in cls.PACKAGES_PATH: absPath = os.path.join(Pkg, Path) if os.path.exists(absPath): return Pkg return Ws ## handleWsMacro() # # handle the $(WORKSPACE) tag, if current workspace is invalid path relative the tool, replace it. # # @param cls The class pointer # @retval PathStr Path string include the $(WORKSPACE) # @classmethod def handleWsMacro(cls, PathStr): if TAB_WORKSPACE in PathStr: PathList = PathStr.split() if PathList: for i, str in enumerate(PathList): MacroStartPos = str.find(TAB_WORKSPACE) if MacroStartPos != -1: Substr = str[MacroStartPos:] Path = Substr.replace(TAB_WORKSPACE, cls.WORKSPACE).strip() if not os.path.exists(Path): for Pkg in cls.PACKAGES_PATH: Path = Substr.replace(TAB_WORKSPACE, Pkg).strip() if os.path.exists(Path): break PathList[i] = str[0:MacroStartPos] + Path PathStr = ' '.join(PathList) return PathStr ## getPkgPath() # # get all package pathes. # # @param cls The class pointer # @classmethod def getPkgPath(cls): return cls.PACKAGES_PATH