]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - Tools/Java/Source/GenBuild/org/tianocore/build/FileProcess.java
1. Update to just keep several line JAVA related msg; 2. Remove file PropertyManager...
[mirror_edk2.git] / Tools / Java / Source / GenBuild / org / tianocore / build / FileProcess.java
... / ...
CommitLineData
1/** @file\r
2 File is FileProcess class which is used to generate ANT script to build \r
3 source files. \r
4 \r
5Copyright (c) 2006, Intel Corporation\r
6All rights reserved. This program and the accompanying materials\r
7are licensed and made available under the terms and conditions of the BSD License\r
8which accompanies this distribution. The full text of the license may be found at\r
9http://opensource.org/licenses/bsd-license.php\r
10\r
11THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13**/\r
14package org.tianocore.build;\r
15\r
16import java.io.File;\r
17\r
18import org.apache.tools.ant.BuildException;\r
19import org.apache.tools.ant.Project;\r
20import org.w3c.dom.Document;\r
21import org.w3c.dom.Element;\r
22import org.w3c.dom.Node;\r
23\r
24/**\r
25 <p><code>FileProcess</code> is class to generate ANT script to build source\r
26 files.</p>\r
27 \r
28 <p>If file does not specify file type, <code>FileProcess</code> will judge \r
29 by its extension. Following is the current supported extensions. </p>\r
30 \r
31 <pre> \r
32 Source File Suffix File Type Description\r
33 .h CHeader C header file\r
34 .c CCode C source file\r
35 .inc ASMHeader Assembly header file\r
36 .asm ASM Assembly source file, usually for IA32 and X64 Arch and MSFT tool chain\r
37 .S ASM Assembly source file, usually for IPF Arch\r
38 .s ASM Assembly source file, usually for IA32 and X64 Arch and GCC tool chain\r
39 .uni UNI Unicode file\r
40 .vfr VFR Visual Forms Representation File\r
41 .fv FV Firmware Volume\r
42 .SEC FFS Firmware File System file\r
43 .PEI FFS Firmware File System file\r
44 .DXE FFS Firmware File System file\r
45 .APP FFS Firmware File System file\r
46 .FVI FFS Firmware File System file\r
47 .FFS FFS Firmware File System file\r
48 .bmp BMP Graphic File\r
49 .i PPCode IPF PreProcessor Code\r
50 </pre>\r
51 \r
52 @since GenBuild 1.0\r
53**/\r
54public class FileProcess {\r
55 ///\r
56 /// The mapping information about source suffix, result suffix, file type.\r
57 ///\r
58 public final String[][] fileTypes = { {".h", "", "CHeader" }, \r
59 {".c", "", "CCode" },\r
60 {".inc", "", "ASMHeader" },\r
61 {".asm", "", "ASM" }, \r
62 {".S", "", "ASM" },\r
63 {".s", "", "ASM" },\r
64 {".uni", "", "UNI" },\r
65 {".vfr", "", "VFR" },\r
66 {".Vfr", "", "VFR" },\r
67 {".dxs", "", "DPX"},\r
68 {".fv", "", "FV" },\r
69 {".efi", "", "EFI" },\r
70 {".SEC", "", "FFS" },\r
71 {".PEI", "", "FFS" },\r
72 {".DXE", "", "FFS" },\r
73 {".APP", "", "FFS" },\r
74 {".FYI", "", "FFS" },\r
75 {".FFS", "", "FFS" },\r
76 {".bmp", "", "BMP" },\r
77 {".i", "", "PPCode"}};\r
78 ///\r
79 /// Current ANT context. \r
80 ///\r
81 private Project project;\r
82\r
83 ///\r
84 /// Current module's include pathes\r
85 ///\r
86 private String[] includes;\r
87 \r
88 ///\r
89 /// Xml Document.\r
90 ///\r
91 private Document document;\r
92 \r
93 ///\r
94 /// The flag to ensure all unicode files build before others. \r
95 ///\r
96 private boolean unicodeFirst = true;\r
97 \r
98 ///\r
99 /// The flag present whether current module contains Unicode files or not.\r
100 ///\r
101 private boolean unicodeExist = false;\r
102\r
103 /**\r
104 Initialize the project, includes, sourceFiles, document members.\r
105 \r
106 @param project ANT project\r
107 @param includes Module include pathes\r
108 @param sourceFiles Modules source files\r
109 @param document XML document\r
110 **/\r
111 public void init(Project project, String[] includes, Document document) {\r
112 this.document = document;\r
113 this.includes = includes;\r
114 this.project = project;\r
115 }\r
116\r
117 /**\r
118 Parse file without file type. \r
119 \r
120 @param filename Source file name\r
121 @param root Root node\r
122 @param unicodeFirst whether build Unicode file firstly or not\r
123 **/\r
124 public synchronized void parseFile(String filename, Node root, boolean unicodeFirst) {\r
125 this.unicodeFirst = unicodeFirst;\r
126 parseFile(filename, root);\r
127 }\r
128 \r
129 /**\r
130 Get whether current module contains Unicode files or not.\r
131 \r
132 @return Whether current module contains Unicode files or not\r
133 **/\r
134 public boolean isUnicodeExist() {\r
135 return unicodeExist;\r
136 }\r
137\r
138 /**\r
139 Parse file.\r
140 \r
141 @param filename Source file name\r
142 @param filetype Source file type\r
143 @param root Root node\r
144 @param unicodeFirst whether build Unicode file firstly or not\r
145 **/\r
146 public synchronized void parseFile(String filename, String filetype, Node root, boolean unicodeFirst) {\r
147 this.unicodeFirst = unicodeFirst;\r
148 parseFile(filename, filetype, root);\r
149 }\r
150 \r
151 /**\r
152 Find out source file's type. \r
153 \r
154 @param filename Source file name\r
155 @param root Root node\r
156 **/\r
157 public synchronized void parseFile(String filename, Node root) throws BuildException {\r
158 for (int i = 0; i < fileTypes.length; i++) {\r
159 if (filename.endsWith(fileTypes[i][0])) {\r
160 parseFile(filename, fileTypes[i][2], root);\r
161 return ;\r
162 }\r
163 }\r
164 }\r
165\r
166 /**\r
167 Parse file. If flag <code>unicodeFirst</code> is true, then build all\r
168 unicode files firstly. \r
169 \r
170 <p>Note that AutoGen.c is processed specially. It's output path is always\r
171 <code>${DEST_DIR_OUTPUT}</code>, others are <code>${DEST_DIR_OUTPUT}</code>\r
172 and relative to module path. </p>\r
173 \r
174 @param filename Source file name\r
175 @param filetype Source file type\r
176 @param root Root node\r
177 **/\r
178 public synchronized void parseFile(String filename, String filetype, Node root) {\r
179 if (unicodeFirst) {\r
180 if ( ! filetype.equalsIgnoreCase("UNI")){\r
181 return ;\r
182 }\r
183 unicodeExist= true;\r
184 } else {\r
185 if (filetype.equalsIgnoreCase("UNI")){\r
186 return ;\r
187 }\r
188 }\r
189 \r
190 //\r
191 // If file is C or ASM header file, skip it\r
192 //\r
193 if (filetype.equalsIgnoreCase("CHeader") || filetype.equalsIgnoreCase("ASMHeader")) {\r
194 return;\r
195 }\r
196 \r
197 //\r
198 // If file is pre-processor file, skip it\r
199 // \r
200 if (filetype.equalsIgnoreCase("PPCode")) {\r
201 return;\r
202 }\r
203 \r
204 //\r
205 // If define CC_EXT in tools_def.txt file, the source file with \r
206 // different suffix is skipped\r
207 //\r
208 String toolsDefExtName = project.getProperty(filetype + "_EXT");\r
209 if (toolsDefExtName != null) {\r
210 String[] exts = toolsDefExtName.split(" ");\r
211 for (int i = 0; i < exts.length; i++) {\r
212 if ( ! filename.endsWith(exts[i])) {\r
213 return ;\r
214 }\r
215 }\r
216 }\r
217 \r
218 String module_path = project.getProperty("MODULE_DIR");\r
219 File moduleFile = new File(module_path);\r
220 File sourceFile = new File(filename);\r
221 \r
222 //\r
223 // If source file is AutoGen.c, then Filepath is .\r
224 //\r
225 String sourceFilepath = "";\r
226 String sourceFilename = "";\r
227 String sourceFileext = "";\r
228 if (sourceFile.getPath().endsWith("AutoGen.c")) {\r
229 sourceFilepath = ".";\r
230 sourceFilename = "AutoGen";\r
231 sourceFileext = ".c";\r
232 filetype = "AUTOGEN";\r
233 } else {\r
234 // sourceFile.\r
235 String str = sourceFile.getPath().substring(moduleFile.getPath().length() + 1);\r
236 int index = str.lastIndexOf(File.separatorChar);\r
237 sourceFilepath = ".";\r
238 if (index > 0) {\r
239 sourceFilepath = str.substring(0, index);\r
240 str = str.substring(index + 1);\r
241 }\r
242 sourceFilename = str;\r
243 index = str.lastIndexOf('.');\r
244 if (index > 0) {\r
245 sourceFilename = str.substring(0, index);\r
246 sourceFileext = str.substring(index);\r
247 }\r
248 }\r
249 // <Build_filetype FILEPATH="" FILENAME="" />\r
250 Element ele = document.createElement("Build_" + filetype);\r
251 ele.setAttribute("FILEPATH", sourceFilepath);\r
252 ele.setAttribute("FILENAME", sourceFilename);\r
253 ele.setAttribute("FILEEXT", sourceFileext.substring(1));\r
254 Element includesEle = document.createElement("EXTRA.INC");\r
255 for (int i = 0; i < includes.length; i++) {\r
256 Element includeEle = document.createElement("includepath");\r
257 includeEle.setAttribute("path", project.replaceProperties(includes[i]));\r
258 includesEle.appendChild(includeEle);\r
259 }\r
260 ele.appendChild(includesEle);\r
261 root.appendChild(ele);\r
262 }\r
263}