Added -x to pass SKU ID from command line
[people/mcb30/basetools.git] / Source / Python / Workspace / WorkspaceBuild.py
1 ## @file\r
2 # This file is used to create a database used by ECC tool\r
3 #\r
4 # Copyright (c) 2007 ~ 2008, Intel Corporation\r
5 # All rights reserved. This program and the accompanying materials\r
6 # are licensed and made available under the terms and conditions of the BSD License\r
7 # which accompanies this distribution.  The full text of the license may be found at\r
8 # http://opensource.org/licenses/bsd-license.php\r
9 #\r
10 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12 #\r
13 \r
14 ##\r
15 # Import Modules\r
16 #\r
17 ##\r
18 # Import Modules\r
19 #\r
20 import os\r
21 \r
22 from CommonDataClass.DataClass import *\r
23 from WorkspaceDatabase import *\r
24 from Common import EdkLogger as EdkLogger\r
25 from Common import DataType\r
26 from Common.String import *\r
27 from Common.BuildToolError import *\r
28 from Common.Misc import sdict\r
29 from Common import GlobalData\r
30 \r
31 DATABASE_PATH = "Conf/.cache/build.db"\r
32 \r
33 ## ItemBuild\r
34 #\r
35 # This Class defines Module/Platform/Package databases for build system\r
36 #\r
37 # @param object:          Inherited from object class\r
38 # @param Arch:            Build arch\r
39 # @param Platform:        Build Platform\r
40 # @param Package:         Build Package\r
41 # @param Module:          Build Module\r
42 #\r
43 # @var Arch:              To store value for Build Arch\r
44 # @var PlatformDatabase:  To store value for PlatformDatabase, it is a set structure as\r
45 #                         { [DscFileName] : PlatformBuildClassObject, ...}\r
46 # @var PackageDatabase:   To store value for PackageDatabase, it is a set structure as\r
47 #                         { [DecFileName] : PacakgeBuildClassObject, ...}\r
48 # @var ModuleDatabase:    To store value for ModuleDatabase, it is a list structure as\r
49 #                         { [InfFileName] : ModuleBuildClassObject, ...}\r
50 #\r
51 class ItemBuild(object):\r
52     def __init__(self, Arch, Platform = None, Package = None, Module = None):\r
53         self.Arch                    = Arch\r
54         self.PlatformDatabase        = {}\r
55         self.PackageDatabase         = {}\r
56         self.ModuleDatabase          = {}\r
57 \r
58 class WorkspaceBuild(object):\r
59     def __init__(self, ActivePlatform, WorkspaceDir, Reparse=False, SkuId=''):\r
60         self.WorkspaceDir            = NormPath(WorkspaceDir)\r
61         self.SupArchList             = []\r
62         self.BuildTarget             = []\r
63         self.SkuId                   = SkuId\r
64         self.Fdf                     = ''\r
65         self.FdTargetList            = []\r
66         self.FvTargetList            = []\r
67         self.TargetTxt               = None\r
68         self.ToolDef                 = None\r
69 \r
70         self.InfDatabase             = {}\r
71         self.DecDatabase             = {}\r
72         self.DscDatabase             = {}\r
73         \r
74         self.UnFoundPcdInDsc         = {}\r
75 \r
76         os.chdir(self.WorkspaceDir)\r
77         #\r
78         # Init build for all arches\r
79         #\r
80         self.Build                   = {}\r
81         for Arch in DataType.ARCH_LIST:\r
82             self.Build[Arch] = ItemBuild(Arch)\r
83 \r
84         #\r
85         # Init build database\r
86         #\r
87         self.Db = WorkspaceDatabase(DATABASE_PATH, GlobalData.gGlobalDefines, Reparse)\r
88         self.Db.InitDatabase()\r
89         \r
90         #\r
91         # Get active platform\r
92         #\r
93         self.DscFileName = NormPath(ActivePlatform)\r
94         File = os.path.join(self.WorkspaceDir, self.DscFileName)\r
95         if not (os.path.exists(File) and os.path.isfile(File)):\r
96             EdkLogger.error("AutoGen", FILE_NOT_FOUND, ExtraData = File)\r
97 \r
98         #\r
99         # Parse platform to get module\r
100         #\r
101         Platform = self.Db.BuildObject[self.DscFileName, MODEL_FILE_DSC, 'COMMON']\r
102         self.SupArchList = Platform.SupArchList\r
103         self.BuildTarget = Platform.BuildTargets\r
104         self.Fdf = Platform.FlashDefinition\r
105         if self.SkuId == '':\r
106             self.SkuId = Platform.SkuName\r
107         for Arch in self.SupArchList:\r
108             Platform = self.Db.BuildObject[self.DscFileName, MODEL_FILE_DSC, Arch]\r
109             Platform.SkuName = self.SkuId\r
110             self.Build[Arch].PlatformDatabase[self.DscFileName] = Platform\r
111     \r
112     ## GenBuildDatabase\r
113     #\r
114     # Generate build database for all arches\r
115     #\r
116     # @param PcdsSet: Pcd list for override from Fdf parse result\r
117     # @param InfList: Inf list for override from Fdf parse result\r
118     #\r
119     def GenBuildDatabase(self, PcdsSet = {}, InfList = []):\r
120         for Arch in self.SupArchList:\r
121             Platform = self.Build[Arch].PlatformDatabase[self.DscFileName]\r
122 \r
123             for Name,Guid in PcdsSet:\r
124                 Platform.AddPcd(Name, Guid, PcdsSet[Name, Guid])\r
125 \r
126             for Inf in InfList:\r
127                 Platform.AddModule(Inf)\r
128 \r
129             #\r
130             # Get all inf files\r
131             #\r
132             for Module in Platform.Modules:\r
133                 ModulePath = str(Module)\r
134                 if ModulePath in self.Build[Arch].ModuleDatabase:\r
135                     continue \r
136                 self.Build[Arch].ModuleDatabase[ModulePath] = Module\r
137 \r
138                 for Key in Module.LibraryClasses:\r
139                     ModulePath = Module.LibraryClasses[Key]\r
140                     if ModulePath == None or ModulePath == '':\r
141                         continue\r
142                     self.Build[Arch].ModuleDatabase[ModulePath] = self.Db.BuildObject[ModulePath, MODEL_FILE_INF, Arch]\r
143 \r
144                 for Package in Module.Packages:\r
145                     PackagePath = str(Package)\r
146                     if PackagePath in self.Build[Arch].PackageDatabase:\r
147                         continue\r
148                     self.Build[Arch].PackageDatabase[PackagePath] = Package\r
149 \r
150     def WorkspaceFile(self, Filename):\r
151         return os.path.join(self.WorkspaceDir, Filename)\r
152 \r