]> git.proxmox.com Git - mirror_edk2.git/blob - Tools/Source/GenBuild/org/tianocore/build/FrameworkBuildTask.java
d236c5b5bb586df335950045a0554e798e9dfae6
[mirror_edk2.git] / Tools / Source / GenBuild / org / tianocore / build / FrameworkBuildTask.java
1 /** @file FrameworkBuildTask.java
2
3 The file is ANT task to find MSA or FPD file and build them.
4
5 Copyright (c) 2006, Intel Corporation
6 All rights reserved. This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
10
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 **/
14 package org.tianocore.build;
15
16 import java.io.BufferedReader;
17 import java.io.File;
18 import java.io.InputStreamReader;
19 import java.util.Iterator;
20 import java.util.LinkedHashSet;
21 import java.util.Map;
22 import java.util.Set;
23
24 import org.apache.tools.ant.BuildException;
25 import org.apache.tools.ant.Task;
26 import org.tianocore.build.fpd.FpdParserTask;
27 import org.tianocore.build.global.GlobalData;
28 import org.tianocore.build.toolchain.ConfigReader;
29 import org.tianocore.build.toolchain.ToolChainInfo;
30
31 public class FrameworkBuildTask extends Task{
32
33 private Set<File> buildFiles = new LinkedHashSet<File>();
34
35 private Set<File> fpdFiles = new LinkedHashSet<File>();
36
37 private Set<File> msaFiles = new LinkedHashSet<File>();
38
39 String toolsDefFilename = "Tools" + File.separatorChar + "Conf" + File.separatorChar + "tools_def.txt";
40
41 String targetFilename = "target.txt";
42
43 String activePlatform = null;
44
45 ///
46 /// there are three type: all (build), clean and cleanall
47 ///
48 private String type = "all";
49
50 public void execute() throws BuildException {
51 //
52 // Seach build.xml -> .FPD -> .MSA file
53 //
54 try {
55 //
56 // Gen Current Working Directory
57 //
58 File dummyFile = new File(".");
59 File cwd = dummyFile.getCanonicalFile();
60 File[] files = cwd.listFiles();
61 for (int i = 0; i < files.length; i++) {
62 if (files[i].isFile()) {
63 if (files[i].getName().equalsIgnoreCase("build.xml")) {
64 //
65 // First, search build.xml, if found, ANT call it
66 //
67 buildFiles.add(files[i]);
68
69 } else if (files[i].getName().endsWith(".fpd")) {
70 //
71 // Second, search FPD file, if found, build it
72 //
73 fpdFiles.add(files[i]);
74 } else if (files[i].getName().endsWith(".msa")) {
75 //
76 // Third, search MSA file, if found, build it
77 //
78 msaFiles.add(files[i]);
79 }
80 }
81 }
82 } catch (Exception e) {
83 throw new BuildException(e.getMessage());
84 }
85
86 //
87 // Deal with all environment variable (Add them to properties)
88 //
89 backupSystemProperties();
90
91 //
92 // Read target.txt file
93 //
94 readTargetFile();
95
96 //
97 // Global Data initialization
98 //
99 File workspacePath = new File(getProject().getProperty("WORKSPACE"));
100 getProject().setProperty("WORKSPACE_DIR", workspacePath.getPath().replaceAll("(\\\\)", "/"));
101 GlobalData.initInfo("Tools" + File.separatorChar + "Conf" + File.separatorChar + "FrameworkDatabase.db",
102 workspacePath.getPath(), toolsDefFilename);
103
104
105
106 //
107 // If find MSA file and ACTIVE_PLATFORM is set, build the module;
108 // else fail build.
109 // If without MSA file, and ACTIVE_PLATFORM is set, build the ACTIVE_PLATFORM.
110 // If ACTIVE_PLATFORM is not set, and only find one FPD file, build the platform;
111 // If find more than one FPD files, let user select one.
112 //
113 File buildFile = null;
114 if (msaFiles.size() > 1) {
115 throw new BuildException("Having more than one MSA file in a directory is not allowed!");
116 } else if (msaFiles.size() == 1 && activePlatform == null) {
117 throw new BuildException("If trying to build a single module, please set ACTIVE_PLATFORM in file [Tool/Conf/target.txt]. ");
118 } else if (msaFiles.size() == 1 && activePlatform != null) {
119 //
120 // Build the single module
121 //
122 buildFile = msaFiles.toArray(new File[1])[0];
123 } else if (activePlatform != null) {
124 buildFile = new File(GlobalData.getWorkspacePath() + File.separatorChar + activePlatform);
125 } else if (fpdFiles.size() == 1) {
126 buildFile = fpdFiles.toArray(new File[1])[0];
127 } else if (fpdFiles.size() > 1) {
128 buildFile = intercommuniteWithUser();
129 }
130 //
131 // If there is no build files or FPD files or MSA files, stop build
132 //
133 else {
134 throw new BuildException("Can't find any FPD or MSA files in the current directory. ");
135 }
136
137 //
138 // Build every FPD files (PLATFORM build)
139 //
140 if (buildFile.getName().endsWith(".fpd")) {
141 System.out.println("Processing the FPD file [" + buildFile.getPath() + "] ..>> ");
142 FpdParserTask fpdParserTask = new FpdParserTask();
143 fpdParserTask.setType(type);
144 fpdParserTask.setProject(getProject());
145 fpdParserTask.setFpdFile(buildFile);
146 fpdParserTask.execute();
147 }
148
149 //
150 // Build every MSA files (SINGLE MODULE BUILD)
151 //
152 else if (buildFile.getName().endsWith(".msa")) {
153 File tmpFile = new File(GlobalData.getWorkspacePath() + File.separatorChar + activePlatform);
154 System.out.println("Using the FPD file [" + tmpFile.getPath() + "] for the active platform. ");
155 System.out.println("Processing the MSA file [" + buildFile.getPath() + "] ..>> ");
156 GenBuildTask genBuildTask = new GenBuildTask();
157 genBuildTask.setSingleModuleBuild(true);
158 genBuildTask.setType(type);
159 getProject().setProperty("PLATFORM_FILE", activePlatform);
160 genBuildTask.setProject(getProject());
161 genBuildTask.setMsaFile(buildFile);
162 genBuildTask.execute();
163 }
164 }
165
166 /**
167 Transfer system environment variables to ANT properties. If system variable
168 already exiests in ANT properties, skip it.
169
170 **/
171 private void backupSystemProperties() {
172 Map<String, String> sysProperties = System.getenv();
173 Set<String> keys = sysProperties.keySet();
174 Iterator<String> iter = keys.iterator();
175 while (iter.hasNext()) {
176 String name = iter.next();
177
178 //
179 // If system environment variable is not in ANT properties, add it
180 //
181 if (getProject().getProperty(name) == null) {
182 getProject().setProperty(name, sysProperties.get(name));
183 }
184 }
185 }
186
187 private File intercommuniteWithUser(){
188 File file = null;
189 if (fpdFiles.size() > 1) {
190 File[] allFiles = new File[fpdFiles.size()];
191 int index = 0;
192 Iterator<File> iter = fpdFiles.iterator();
193 while (iter.hasNext()) {
194 allFiles[index] = iter.next();
195 index++;
196 }
197
198 System.out.println("Finding " + allFiles.length + " FPD files: ");
199 for (int i = 0; i < allFiles.length; i++) {
200 System.out.println("[" + (i + 1) + "]: " + allFiles[i].getName());
201 }
202
203 boolean flag = true;
204 System.out.print("Please select one of the following FPD files to build:[1] ");
205 do{
206 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
207 try {
208 String str = br.readLine();
209 if (str.trim().length() == 0) {
210 file = allFiles[0];
211 flag = false;
212 continue ;
213 }
214 int indexSelect = Integer.parseInt(str);
215 if (indexSelect <=0 || indexSelect > allFiles.length) {
216 System.out.print("Please enter a number between [1.." + allFiles.length + "]:[1] ");
217 continue ;
218 } else {
219 file = allFiles[indexSelect - 1];
220 flag = false;
221 continue ;
222 }
223 } catch (Exception e) {
224 System.out.print("Please enter a valid number:[1] ");
225 flag = true;
226 }
227 } while (flag);
228 } else if (fpdFiles.size() == 1) {
229 file = fpdFiles.toArray(new File[1])[0];
230 }
231 return file;
232 }
233
234
235 public void setType(String type) {
236 if (type.equalsIgnoreCase("clean") || type.equalsIgnoreCase("cleanall")) {
237 this.type = type.toLowerCase();
238 } else {
239 this.type = "all";
240 }
241 }
242
243 private void readTargetFile(){
244 try {
245 String[][] targetFileInfo = ConfigReader.parse(getProject().getProperty("WORKSPACE_DIR"), "Tools" + File.separatorChar + "Conf" + File.separatorChar + targetFilename);
246
247 //
248 // Get ToolChain Info from target.txt
249 //
250 ToolChainInfo envToolChainInfo = new ToolChainInfo();
251 String str = getValue("TARGET", targetFileInfo);
252 if (str == null || str.trim().equals("")) {
253 envToolChainInfo.addTargets("*");
254 } else {
255 envToolChainInfo.addTargets(str);
256 }
257 str = getValue("TOOL_CHAIN_TAG", targetFileInfo);
258 if (str == null || str.trim().equals("")) {
259 envToolChainInfo.addTagnames("*");
260 } else {
261 envToolChainInfo.addTagnames(str);
262 }
263 str = getValue("TARGET_ARCH", targetFileInfo);
264 if (str == null || str.trim().equals("")) {
265 envToolChainInfo.addArchs("*");
266 } else {
267 envToolChainInfo.addArchs(str);
268 }
269 GlobalData.setToolChainEnvInfo(envToolChainInfo);
270
271 str = getValue("TOOL_CHAIN_CONF", targetFileInfo);
272 if (str != null && str.trim().length() > 0) {
273 toolsDefFilename = str;
274 }
275
276 str = getValue("ACTIVE_PLATFORM", targetFileInfo);
277 if (str != null && ! str.trim().equals("")) {
278 if ( ! str.endsWith(".fpd")) {
279 throw new BuildException("FPD file's extension must be \".fpd\"!");
280 }
281 activePlatform = str;
282 }
283 }
284 catch (Exception ex) {
285 throw new BuildException(ex.getMessage());
286 }
287 }
288
289 private String getValue(String key, String[][] map) {
290 for (int i = 0; i < map[0].length; i++){
291 if (key.equalsIgnoreCase(map[0][i])) {
292 return map[1][i];
293 }
294 }
295 return null;
296 }
297 }