1 /** @file FrameworkBuildTask.java
3 The file is ANT task to find MSA or FPD file and build them.
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
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.
14 package org
.tianocore
.build
;
16 import java
.io
.BufferedReader
;
18 import java
.io
.InputStreamReader
;
19 import java
.util
.Iterator
;
20 import java
.util
.LinkedHashSet
;
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
;
31 public class FrameworkBuildTask
extends Task
{
33 private Set
<File
> buildFiles
= new LinkedHashSet
<File
>();
35 private Set
<File
> fpdFiles
= new LinkedHashSet
<File
>();
37 private Set
<File
> msaFiles
= new LinkedHashSet
<File
>();
39 String toolsDefFilename
= "Tools" + File
.separatorChar
+ "Conf" + File
.separatorChar
+ "tools_def.txt";
41 String targetFilename
= "target.txt";
43 String activePlatform
= null;
46 /// there are three type: all (build), clean and cleanall
48 private String type
= "all";
50 public void execute() throws BuildException
{
52 // Seach build.xml -> .FPD -> .MSA file
56 // Gen Current Working Directory
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")) {
65 // First, search build.xml, if found, ANT call it
67 buildFiles
.add(files
[i
]);
69 } else if (files
[i
].getName().endsWith(".fpd")) {
71 // Second, search FPD file, if found, build it
73 fpdFiles
.add(files
[i
]);
74 } else if (files
[i
].getName().endsWith(".msa")) {
76 // Third, search MSA file, if found, build it
78 msaFiles
.add(files
[i
]);
82 } catch (Exception e
) {
83 throw new BuildException(e
.getMessage());
87 // Deal with all environment variable (Add them to properties)
89 backupSystemProperties();
92 // Read target.txt file
97 // Global Data initialization
99 GlobalData
.initInfo("Tools" + File
.separatorChar
+ "Conf" + File
.separatorChar
+ "FrameworkDatabase.db",
100 getProject().getProperty("WORKSPACE_DIR"), toolsDefFilename
);
105 // If find MSA file and ACTIVE_PLATFORM is set, build the module;
107 // If without MSA file, and ACTIVE_PLATFORM is set, build the ACTIVE_PLATFORM.
108 // If ACTIVE_PLATFORM is not set, and only find one FPD file, build the platform;
109 // If find more than one FPD files, let user select one.
111 File buildFile
= null;
112 if (msaFiles
.size() > 1) {
113 throw new BuildException("More than one MSA file under current directory. It is not allowd. ");
115 else if (msaFiles
.size() == 1 && activePlatform
== null) {
116 throw new BuildException("If try to build a single module, please set ACTIVE_PLATFORM in file [Tool/Conf/target.txt]. ");
118 else if (msaFiles
.size() == 1 && activePlatform
!= null) {
120 // Build the single module
122 buildFile
= msaFiles
.toArray(new File
[1])[0];
124 else if (activePlatform
!= null) {
125 buildFile
= new File(GlobalData
.getWorkspacePath() + File
.separatorChar
+ activePlatform
);
127 else if (fpdFiles
.size() == 1) {
128 buildFile
= fpdFiles
.toArray(new File
[1])[0];
130 else if (fpdFiles
.size() > 1) {
131 buildFile
= intercommuniteWithUser();
134 // If there is no build files or FPD files or MSA files, stop build
137 throw new BuildException("Can't find any FPD files or MSA files in current directory. ");
141 // Build every FPD files (PLATFORM build)
143 if (buildFile
.getName().endsWith(".fpd")) {
144 System
.out
.println("Start to build FPD file [" + buildFile
.getPath() + "] ..>> ");
145 FpdParserTask fpdParserTask
= new FpdParserTask();
146 fpdParserTask
.setType(type
);
147 fpdParserTask
.setProject(getProject());
148 fpdParserTask
.setFpdFile(buildFile
);
149 fpdParserTask
.execute();
153 // Build every MSA files (SINGLE MODULE BUILD)
155 else if (buildFile
.getName().endsWith(".msa")) {
156 File tmpFile
= new File(GlobalData
.getWorkspacePath() + File
.separatorChar
+ activePlatform
);
157 System
.out
.println("Using FPD file [" + tmpFile
.getPath() + "] as active platform. ");
158 System
.out
.println("Start to build MSA file [" + buildFile
.getPath() + "] ..>> ");
159 GenBuildTask genBuildTask
= new GenBuildTask();
160 genBuildTask
.setSingleModuleBuild(true);
161 genBuildTask
.setType(type
);
162 getProject().setProperty("PLATFORM_FILE", activePlatform
);
163 genBuildTask
.setProject(getProject());
164 genBuildTask
.setMsaFile(buildFile
);
165 genBuildTask
.execute();
170 Transfer system environment variables to ANT properties. If system variable
171 already exiests in ANT properties, skip it.
174 private void backupSystemProperties() {
175 Map
<String
, String
> sysProperties
= System
.getenv();
176 Set
<String
> keys
= sysProperties
.keySet();
177 Iterator
<String
> iter
= keys
.iterator();
178 while (iter
.hasNext()) {
179 String name
= iter
.next();
182 // If system environment variable is not in ANT properties, add it
184 if (getProject().getProperty(name
) == null) {
185 getProject().setProperty(name
, sysProperties
.get(name
));
190 private File
intercommuniteWithUser(){
192 if (fpdFiles
.size() + msaFiles
.size() > 1) {
193 File
[] allFiles
= new File
[fpdFiles
.size() + msaFiles
.size()];
195 Iterator
<File
> iter
= fpdFiles
.iterator();
196 while (iter
.hasNext()) {
197 allFiles
[index
] = iter
.next();
200 iter
= msaFiles
.iterator();
201 while (iter
.hasNext()) {
202 allFiles
[index
] = iter
.next();
205 System
.out
.println("Find " + allFiles
.length
+ " FPD and MSA files: ");
206 for (int i
= 0; i
< allFiles
.length
; i
++) {
207 System
.out
.println("[" + (i
+ 1) + "]: " + allFiles
[i
].getName());
211 System
.out
.print("Please select one file to build:[1] ");
213 BufferedReader br
= new BufferedReader(new InputStreamReader(System
.in
));
215 String str
= br
.readLine();
216 if (str
.trim().length() == 0) {
221 int indexSelect
= Integer
.parseInt(str
);
222 if (indexSelect
<=0 || indexSelect
> allFiles
.length
) {
223 System
.out
.print("Please enter a number between [1.." + allFiles
.length
+ "]:[1] ");
226 file
= allFiles
[indexSelect
- 1];
230 } catch (Exception e
) {
231 System
.out
.print("Please enter a valid number:[1] ");
236 else if (fpdFiles
.size() == 1) {
237 file
= fpdFiles
.toArray(new File
[1])[0];
239 else if (msaFiles
.size() == 1) {
240 file
= msaFiles
.toArray(new File
[1])[0];
246 public void setType(String type
) {
247 if (type
.equalsIgnoreCase("clean") || type
.equalsIgnoreCase("cleanall")) {
248 this.type
= type
.toLowerCase();
255 private void readTargetFile(){
257 String
[][] targetFileInfo
= ConfigReader
.parse(getProject().getProperty("WORKSPACE_DIR"), "Tools" + File
.separatorChar
+ "Conf" + File
.separatorChar
+ targetFilename
);
260 // Get ToolChain Info from target.txt
262 ToolChainInfo envToolChainInfo
= new ToolChainInfo();
263 String str
= getValue("TARGET", targetFileInfo
);
264 if (str
== null || str
.trim().equals("")) {
265 envToolChainInfo
.addTargets("*");
268 envToolChainInfo
.addTargets(str
);
270 str
= getValue("TOOL_CHAIN_TAG", targetFileInfo
);
271 if (str
== null || str
.trim().equals("")) {
272 envToolChainInfo
.addTagnames("*");
275 envToolChainInfo
.addTagnames(str
);
277 str
= getValue("TARGET_ARCH", targetFileInfo
);
278 if (str
== null || str
.trim().equals("")) {
279 envToolChainInfo
.addArchs("*");
282 envToolChainInfo
.addArchs(str
);
284 GlobalData
.setToolChainEnvInfo(envToolChainInfo
);
286 str
= getValue("TOOL_CHAIN_CONF", targetFileInfo
);
287 if (str
!= null && str
.trim().length() > 0) {
288 toolsDefFilename
= str
;
291 str
= getValue("ACTIVE_PLATFORM", targetFileInfo
);
292 if (str
!= null && ! str
.trim().equals("")) {
293 if ( ! str
.endsWith(".fpd")) {
294 throw new BuildException("FPD file's file extension must be \".fpd\"");
296 activePlatform
= str
;
299 catch (Exception ex
) {
300 throw new BuildException(ex
.getMessage());
304 private String
getValue(String key
, String
[][] map
) {
305 for (int i
= 0; i
< map
[0].length
; i
++){
306 if (key
.equalsIgnoreCase(map
[0][i
])) {