]> git.proxmox.com Git - mirror_edk2.git/blame - Tools/Source/GenBuild/org/tianocore/build/OutputDirSetup.java
Fully support active platform policy.
[mirror_edk2.git] / Tools / Source / GenBuild / org / tianocore / build / OutputDirSetup.java
CommitLineData
a29c47e0 1package org.tianocore.build;\r
2\r
3import java.io.File;\r
4import java.util.Map;\r
5\r
6import org.apache.tools.ant.BuildException;\r
7import org.apache.tools.ant.Task;\r
8import org.apache.xmlbeans.XmlObject;\r
9import org.tianocore.build.fpd.FpdParserTask;\r
10import org.tianocore.build.global.GlobalData;\r
a29c47e0 11import org.tianocore.build.global.SurfaceAreaQuery;\r
a29c47e0 12import org.tianocore.build.id.ModuleIdentification;\r
13import org.tianocore.build.id.PackageIdentification;\r
14import org.tianocore.build.id.PlatformIdentification;\r
15\r
16public class OutputDirSetup extends Task {\r
17 ///\r
18 /// Module surface area file.\r
19 ///\r
20 File msaFile;\r
21\r
22 ///\r
23 /// Module's Identification.\r
24 ///\r
25 private ModuleIdentification moduleId;\r
26 \r
27 ///\r
28 /// Module's component type, such as SEC, LIBRARY, BS_DRIVER and so on.\r
29 ///\r
30 private String componentType;\r
31 \r
de4bb9f6 32 private boolean isSingleModuleBuild = false;\r
a29c47e0 33// private ToolChainFactory toolChainFactory;\r
34 \r
35 /**\r
36 Public construct method. It is necessary for ANT task.\r
37 **/\r
38 public OutputDirSetup() {\r
39 }\r
40 \r
41 public void execute() throws BuildException {\r
42 //\r
43 // Global Data initialization\r
44 //\r
45// GlobalData.initInfo("Tools" + File.separatorChar + "Conf" + File.separatorChar + "FrameworkDatabase.db",\r
46// getProject().getProperty("WORKSPACE_DIR"));\r
47 \r
48 //\r
49 // Parse MSA and get the basic information\r
50 // Including BaseName, GUID, Version, ComponentType and SupportedArchs\r
51 //\r
52 Map<String, XmlObject> doc = GlobalData.getNativeMsa(msaFile);\r
53 \r
54 SurfaceAreaQuery.setDoc(doc);\r
55 \r
56 //\r
57 // String[]: {BaseName, ModuleType, ComponentType, Guid, Version}\r
58 //\r
59 moduleId = SurfaceAreaQuery.getMsaHeader();\r
60 // REMOVE!!! TBD\r
61 componentType = "APPLICATION";\r
62 \r
63 //\r
64 // Judge whether it is single module build or not\r
65 //\r
de4bb9f6 66 if (isSingleModuleBuild) {\r
a29c47e0 67 //\r
68 // Single Module build\r
69 //\r
70 prepareSingleModuleBuild();\r
71 }\r
72 else {\r
73 //\r
74 // Platform build\r
75 //\r
de4bb9f6 76 String filename = getProject().getProperty("PLATFORM_FILE");\r
77 PlatformIdentification platformId = GlobalData.getPlatform(filename);\r
a29c47e0 78 getProject().setProperty("PLATFORM_DIR", platformId.getFpdFile().getParent().replaceAll("(\\\\)", "/"));\r
79 getProject().setProperty("PLATFORM_RELATIVE_DIR", platformId.getPlatformRelativeDir().replaceAll("(\\\\)", "/"));\r
80 \r
81 String packageName = getProject().getProperty("PACKAGE");\r
82 String packageGuid = getProject().getProperty("PACKAGE_GUID");\r
83 String packageVersion = getProject().getProperty("PACKAGE_VERSION");\r
84 PackageIdentification packageId = new PackageIdentification(packageName, packageGuid, packageVersion);\r
85 moduleId.setPackage(packageId);\r
86 }\r
87 \r
88 //\r
89 // Tools Definition file parse\r
90 //\r
91 parseToolsDefinitionFile();\r
92 \r
93 //\r
94 // For Every TOOLCHAIN, TARGET, ARCH\r
95 //\r
96// String[] targetList = GlobalData.getTargets();\r
97// for (int i = 0; i < targetList.length; i ++){\r
98// //\r
99// // Prepare for target related common properties\r
100// // TARGET\r
101// //\r
102// getProject().setProperty("TARGET", targetList[i]);\r
103// String[] toolchainList = GlobalData.getToolChains();\r
104// for(int j = 0; j < toolchainList.length; j ++){\r
105// //\r
106// // Prepare for toolchain related common properties\r
107// // TOOLCHAIN\r
108// //\r
109// getProject().setProperty("TOOLCHAIN", toolchainList[j]);\r
110// //\r
111// // If single module : intersection MSA supported ARCHs and tools def!!\r
112// // else, get arch from pass down\r
113// //\r
114// String[] archList = GlobalData.getArchs();\r
115// for (int k = 0; k < archList.length; k++) {\r
116// \r
117// FpdModuleIdentification fpdModuleId = new FpdModuleIdentification(moduleId, archList[k]);\r
118// \r
119// SurfaceAreaQuery.setDoc(GlobalData.getDoc(fpdModuleId));\r
120// \r
121// //\r
122// // Prepare for all other common properties\r
123// // PACKAGE, PACKAGE_GUID, PACKAGE_VERSION, PACKAGE_DIR, PACKAGE_RELATIVE_DIR\r
124// // MODULE or BASE_NAME, GUID or FILE_GUID, VERSION, COMPONENT_TYPE\r
125// // MODULE_DIR, MODULE_RELATIVE_DIR\r
126// // SUBSYSTEM, ENTRYPOINT, EBC_TOOL_LIB_PATH\r
127// // LIBS, OBJECTS, SDB_FILES\r
128// //\r
129// getProject().setProperty("ARCH", archList[k]);\r
130// setModuleCommonProperties();\r
131// \r
132// //\r
133// // String[0] is build mode. String[1] is user-defined output dir. \r
134// //\r
135// String buildMode = SurfaceAreaQuery.getFpdIntermediateDirectories();\r
136// String userDefinedOutputDir = SurfaceAreaQuery.getFpdOutputDirectory();\r
137// \r
138// //\r
139// // OutputManage prepare for \r
140// // BIN_DIR, DEST_DIR_DEBUG, DEST_DIR_OUTPUT, BUILD_DIR, FV_DIR\r
141// //\r
142// OutputManager.getInstance().update(getProject(), userDefinedOutputDir, buildMode);\r
143// \r
144// }\r
145// }\r
146// }\r
147 \r
148 }\r
149 \r
150 private void prepareSingleModuleBuild(){\r
151 //\r
152 // Find out the package which the module belongs to\r
153 // TBD: Enhance it!!!!\r
154 //\r
155 PackageIdentification packageId = GlobalData.getPackageForModule(moduleId);\r
156 \r
157 moduleId.setPackage(packageId);\r
158 \r
159 //\r
160 // Read ACTIVE_PLATFORM's FPD file (Call FpdParserTask's method)\r
161 //\r
de4bb9f6 162 String filename = getProject().getProperty("PLATFORM_FILE");\r
163\r
164 PlatformIdentification platformId = GlobalData.getPlatform(filename);\r
a29c47e0 165 \r
166 //\r
167 // Read FPD file\r
168 //\r
169 FpdParserTask fpdParser = new FpdParserTask();\r
170 fpdParser.parseFpdFile(platformId.getFpdFile());\r
171 \r
172 //\r
173 // Prepare for Platform related common properties\r
174 // PLATFORM, PLATFORM_DIR, PLATFORM_RELATIVE_DIR\r
175 //\r
de4bb9f6 176 getProject().setProperty("PLATFORM", platformId.getName());\r
a29c47e0 177 getProject().setProperty("PLATFORM_DIR", platformId.getFpdFile().getParent().replaceAll("(\\\\)", "/"));\r
178 getProject().setProperty("PLATFORM_RELATIVE_DIR", platformId.getPlatformRelativeDir().replaceAll("(\\\\)", "/"));\r
179 }\r
180 \r
181\r
182\r
183 /**\r
184\r
185 **/\r
186 private void setModuleCommonProperties() {\r
187 //\r
188 // Prepare for all other common properties\r
189 // PACKAGE, PACKAGE_GUID, PACKAGE_VERSION, PACKAGE_DIR, PACKAGE_RELATIVE_DIR\r
190 //\r
191 PackageIdentification packageId = moduleId.getPackage();\r
192 getProject().setProperty("PACKAGE", packageId.getName());\r
193 getProject().setProperty("PACKAGE_GUID", packageId.getGuid());\r
194 getProject().setProperty("PACKAGE_VERSION", packageId.getVersion());\r
195 GlobalData.log.info("" + packageId);\r
196 getProject().setProperty("PACKAGE_DIR", packageId.getPackageDir().replaceAll("(\\\\)", "/"));\r
197 getProject().setProperty("PACKAGE_RELATIVE_DIR", packageId.getPackageRelativeDir().replaceAll("(\\\\)", "/"));\r
198 \r
199 //\r
200 // MODULE or BASE_NAME, GUID or FILE_GUID, VERSION, COMPONENT_TYPE\r
201 // MODULE_DIR, MODULE_RELATIVE_DIR\r
202 //\r
203 getProject().setProperty("MODULE", moduleId.getName());\r
204 getProject().setProperty("BASE_NAME", moduleId.getName());\r
205 getProject().setProperty("GUID", moduleId.getGuid());\r
206 getProject().setProperty("FILE_GUID", moduleId.getGuid());\r
207 getProject().setProperty("VERSION", moduleId.getVersion());\r
208 getProject().setProperty("COMPONENT_TYPE", componentType);\r
209 getProject().setProperty("MODULE_DIR", moduleId.getMsaFile().getParent().replaceAll("(\\\\)", "/"));\r
210 getProject().setProperty("MODULE_RELATIVE_DIR", moduleId.getModuleRelativePath().replaceAll("(\\\\)", "/"));\r
211 }\r
212 \r
213\r
214 /**\r
215 Method is for ANT use to initialize MSA file.\r
216 \r
217 @param msaFilename MSA file name\r
218 **/\r
219 public void setMsaFile(String msaFilename) {\r
220 String moduleDir = getProject().getProperty("MODULE_DIR");\r
221 if (moduleDir == null) {\r
222 moduleDir = getProject().getBaseDir().getPath();\r
223 }\r
224 msaFile = new File(moduleDir + File.separatorChar + msaFilename);\r
225 }\r
226\r
227 /**\r
228 Compile flags setup. \r
229 \r
230 <p> Take command <code>CC</code> and arch <code>IA32</code> for example, \r
231 Those flags are from <code>ToolChainFactory</code>: </p>\r
232 <ul>\r
233 <li> IA32_CC </li>\r
234 <li> IA32_CC_STD_FLAGS </li>\r
235 <li> IA32_CC_GLOBAL_FLAGS </li>\r
236 <li> IA32_CC_GLOBAL_ADD_FLAGS </li>\r
237 <li> IA32_CC_GLOBAL_SUB_FLAGS </li>\r
238 </ul>\r
239 Those flags can user-define: \r
240 <ul>\r
241 <li> IA32_CC_PROJ_FLAGS </li>\r
242 <li> IA32_CC_PROJ_ADD_FLAGS </li>\r
243 <li> IA32_CC_PROJ_SUB_FLAGS </li>\r
244 <li> CC_PROJ_FLAGS </li>\r
245 <li> CC_PROJ_ADD_FLAGS </li>\r
246 <li> CC_PROJ_SUB_FLAGS </li>\r
247 <li> CC_FLAGS </li>\r
248 <li> IA32_CC_FLAGS </li>\r
249 </ul>\r
250 \r
251 <p> The final flags is composed of STD, GLOBAL and PROJ. If CC_FLAGS or\r
252 IA32_CC_FLAGS is specified, STD, GLOBAL and PROJ will not affect. </p>\r
253 \r
254 Note that the <code>ToolChainFactory</code> executes only once \r
255 during whole build process. \r
256 **/\r
257 private void parseToolsDefinitionFile() {\r
258 //\r
259 // If ToolChain has been set up before, do nothing.\r
260 // CONF dir + tools definition file name\r
261 //\r
262 String confDir = GlobalData.getWorkspacePath() + File.separatorChar + "Tools" + File.separatorChar + "Conf";\r
263 String toolsDefFilename = "tools_def.txt";\r
264 if (getProject().getProperty("env.TOOLS_DEF") != null) {\r
265 toolsDefFilename = getProject().getProperty("env.TOOLS_DEF");\r
266 }\r
267// toolChainFactory = new ToolChainFactory(confDir, toolsDefFilename);\r
268// toolChainFactory.setupToolChain();\r
269 }\r
270}\r