1 package org
.tianocore
.build
;
3 import java
.io
.BufferedReader
;
5 import java
.io
.InputStreamReader
;
6 import java
.util
.Iterator
;
7 import java
.util
.LinkedHashSet
;
11 import org
.apache
.tools
.ant
.BuildException
;
12 import org
.apache
.tools
.ant
.Task
;
13 import org
.tianocore
.build
.fpd
.FpdParserTask
;
14 import org
.tianocore
.build
.global
.GlobalData
;
15 import org
.tianocore
.build
.toolchain
.ToolChainInfo
;
17 public class FrameworkBuildTask
extends Task
{
19 private Set
<File
> buildFiles
= new LinkedHashSet
<File
>();
21 private Set
<File
> fpdFiles
= new LinkedHashSet
<File
>();
23 private Set
<File
> msaFiles
= new LinkedHashSet
<File
>();
26 /// there are three type: all (build), clean and cleanall
28 private String type
= "all";
30 public void execute() throws BuildException
{
32 // Seach build.xml -> .FPD -> .MSA file
36 // Gen Current Working Directory
38 File dummyFile
= new File(".");
39 File cwd
= dummyFile
.getCanonicalFile();
40 File
[] files
= cwd
.listFiles();
41 for (int i
= 0; i
< files
.length
; i
++) {
42 if (files
[i
].isFile()) {
43 if (files
[i
].getName().equalsIgnoreCase("build.xml")) {
45 // First, search build.xml, if found, ANT call it
47 buildFiles
.add(files
[i
]);
49 } else if (files
[i
].getName().endsWith(".fpd")) {
51 // Second, search FPD file, if found, build it
53 fpdFiles
.add(files
[i
]);
54 } else if (files
[i
].getName().endsWith(".msa")) {
56 // Third, search MSA file, if found, build it
58 msaFiles
.add(files
[i
]);
62 } catch (Exception e
) {
64 throw new BuildException(e
.getMessage());
68 // If there is no build files or FPD files or MSA files, stop build
70 if (fpdFiles
.size() == 0 && msaFiles
.size() == 0) {
71 throw new BuildException("Can't find any build.xml file or FPD files or MSA files in current directory. ");
74 File buildFile
= intercommuniteWithUser();
75 System
.out
.println("Start to build file [" + buildFile
.getPath() + "] ..>> ");
78 // Deal with all environment variable (Add them to properties)
80 backupSystemProperties();
83 // Get ToolChain Info from environment
85 ToolChainInfo envToolChainInfo
= new ToolChainInfo();
86 envToolChainInfo
.addTargets(getProject().getProperty("TARGET"));
87 envToolChainInfo
.addTagnames(getProject().getProperty("TAGNAME"));
88 envToolChainInfo
.addArchs(getProject().getProperty("ARCH"));
89 GlobalData
.setToolChainEnvInfo(envToolChainInfo
);
92 // Global Data initialization
94 String toolsDefFilename
= "tools_def.txt";
95 if (getProject().getProperty("TOOLS_DEF") != null) {
96 toolsDefFilename
= getProject().getProperty("TOOLS_DEF");
99 GlobalData
.initInfo("Tools" + File
.separatorChar
+ "Conf" + File
.separatorChar
+ "FrameworkDatabase.db",
100 getProject().getProperty("WORKSPACE_DIR"), toolsDefFilename
);
103 // Build every FPD files (PLATFORM build)
105 if (buildFile
.getName().endsWith(".fpd")) {
106 FpdParserTask fpdParserTask
= new FpdParserTask();
107 fpdParserTask
.setType(type
);
108 fpdParserTask
.setProject(getProject());
109 fpdParserTask
.setFpdFile(buildFile
);
110 fpdParserTask
.execute();
114 // Build every MSA files (SINGLE MODULE BUILD)
116 else if (buildFile
.getName().endsWith(".msa")) {
117 GenBuildTask genBuildTask
= new GenBuildTask();
118 genBuildTask
.setType(type
);
119 genBuildTask
.setProject(getProject());
120 genBuildTask
.setMsaFile(buildFile
);
121 genBuildTask
.execute();
126 Transfer system environment variables to ANT properties. If system variable
127 already exiests in ANT properties, skip it.
130 private void backupSystemProperties() {
131 Map
<String
, String
> sysProperties
= System
.getenv();
132 Set
<String
> keys
= sysProperties
.keySet();
133 Iterator
<String
> iter
= keys
.iterator();
134 while (iter
.hasNext()) {
135 String name
= iter
.next();
138 // If system environment variable is not in ANT properties, add it
140 if (getProject().getProperty(name
) == null) {
141 getProject().setProperty(name
, sysProperties
.get(name
));
146 private File
intercommuniteWithUser(){
148 if (fpdFiles
.size() + msaFiles
.size() > 1) {
149 File
[] allFiles
= new File
[fpdFiles
.size() + msaFiles
.size()];
151 Iterator
<File
> iter
= fpdFiles
.iterator();
152 while (iter
.hasNext()) {
153 allFiles
[index
] = iter
.next();
156 iter
= msaFiles
.iterator();
157 while (iter
.hasNext()) {
158 allFiles
[index
] = iter
.next();
161 System
.out
.println("Find " + allFiles
.length
+ " FPD and MSA files: ");
162 for (int i
= 0; i
< allFiles
.length
; i
++) {
163 System
.out
.println("[" + (i
+ 1) + "]: " + allFiles
[i
].getName());
167 System
.out
.print("Please select one file to build:[1] ");
169 BufferedReader br
= new BufferedReader(new InputStreamReader(System
.in
));
171 String str
= br
.readLine();
172 if (str
.trim().length() == 0) {
177 int indexSelect
= Integer
.parseInt(str
);
178 if (indexSelect
<=0 || indexSelect
> allFiles
.length
) {
179 System
.out
.print("Please enter a number between [1.." + allFiles
.length
+ "]:[1] ");
182 file
= allFiles
[indexSelect
- 1];
186 } catch (Exception e
) {
187 System
.out
.print("Please enter a valid number:[1] ");
192 else if (fpdFiles
.size() == 1) {
193 file
= fpdFiles
.toArray(new File
[1])[0];
195 else if (msaFiles
.size() == 1) {
196 file
= msaFiles
.toArray(new File
[1])[0];
202 public void setType(String type
) {
203 if (type
.equalsIgnoreCase("clean") || type
.equalsIgnoreCase("cleanall")) {
204 this.type
= type
.toLowerCase();