]>
Commit | Line | Data |
---|---|---|
a29c47e0 | 1 | package org.tianocore.build;\r |
2 | \r | |
3 | import java.io.File;\r | |
4 | import java.util.Map;\r | |
5 | \r | |
6 | import org.apache.tools.ant.BuildException;\r | |
7 | import org.apache.tools.ant.Task;\r | |
8 | import org.apache.xmlbeans.XmlObject;\r | |
9 | import org.tianocore.build.fpd.FpdParserTask;\r | |
10 | import org.tianocore.build.global.GlobalData;\r | |
a29c47e0 | 11 | import org.tianocore.build.global.SurfaceAreaQuery;\r |
a29c47e0 | 12 | import org.tianocore.build.id.ModuleIdentification;\r |
13 | import org.tianocore.build.id.PackageIdentification;\r | |
14 | import org.tianocore.build.id.PlatformIdentification;\r | |
15 | \r | |
16 | public 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 |