+++ /dev/null
-/** @file\r
- File is FileProcess class which is used to generate ANT script to build \r
- source files. \r
- \r
-Copyright (c) 2006, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-**/\r
-package org.tianocore.build;\r
-\r
-import java.io.File;\r
-\r
-import org.apache.tools.ant.BuildException;\r
-import org.apache.tools.ant.Project;\r
-import org.w3c.dom.Document;\r
-import org.w3c.dom.Element;\r
-import org.w3c.dom.Node;\r
-\r
-/**\r
- <p><code>FileProcess</code> is class to generate ANT script to build source\r
- files.</p>\r
- \r
- <p>If file does not specify file type, <code>FileProcess</code> will judge \r
- by its extension. Following is the current supported extensions. </p>\r
- \r
- <pre> \r
- Source File Suffix File Type Description\r
- .h CHeader C header file\r
- .c CCode C source file\r
- .inc ASMHeader Assembly header file\r
- .asm ASM Assembly source file, usually for IA32 and X64 Arch and MSFT tool chain\r
- .S ASM Assembly source file, usually for IPF Arch\r
- .s ASM Assembly source file, usually for IA32 and X64 Arch and GCC tool chain\r
- .uni UNI Unicode file\r
- .vfr VFR Visual Forms Representation File\r
- .fv FV Firmware Volume\r
- .SEC FFS Firmware File System file\r
- .PEI FFS Firmware File System file\r
- .DXE FFS Firmware File System file\r
- .APP FFS Firmware File System file\r
- .FVI FFS Firmware File System file\r
- .FFS FFS Firmware File System file\r
- .bmp BMP Graphic File\r
- .i PPCode IPF PreProcessor Code\r
- </pre>\r
- \r
- @since GenBuild 1.0\r
-**/\r
-public class FileProcess {\r
- ///\r
- /// The mapping information about source suffix, result suffix, file type.\r
- ///\r
- public final String[][] fileTypes = { {".h", "", "CHeader" }, \r
- {".c", "", "CCode" },\r
- {".inc", "", "ASMHeader" },\r
- {".asm", "", "ASM" }, \r
- {".S", "", "ASM" },\r
- {".s", "", "ASM" },\r
- {".uni", "", "UNI" },\r
- {".vfr", "", "VFR" },\r
- {".Vfr", "", "VFR" },\r
- {".dxs", "", "DPX"},\r
- {".fv", "", "FV" },\r
- {".efi", "", "EFI" },\r
- {".SEC", "", "FFS" },\r
- {".PEI", "", "FFS" },\r
- {".DXE", "", "FFS" },\r
- {".APP", "", "FFS" },\r
- {".FYI", "", "FFS" },\r
- {".FFS", "", "FFS" },\r
- {".bmp", "", "BMP" },\r
- {".i", "", "PPCode"}};\r
- ///\r
- /// Current ANT context. \r
- ///\r
- private Project project;\r
-\r
- ///\r
- /// Current module's include pathes\r
- ///\r
- private String[] includes;\r
- \r
- ///\r
- /// Xml Document.\r
- ///\r
- private Document document;\r
- \r
- ///\r
- /// The flag to ensure all unicode files build before others. \r
- ///\r
- private boolean unicodeFirst = true;\r
- \r
- ///\r
- /// The flag present whether current module contains Unicode files or not.\r
- ///\r
- private boolean unicodeExist = false;\r
-\r
- /**\r
- Initialize the project, includes, sourceFiles, document members.\r
- \r
- @param project ANT project\r
- @param includes Module include pathes\r
- @param sourceFiles Modules source files\r
- @param document XML document\r
- **/\r
- public void init(Project project, String[] includes, Document document) {\r
- this.document = document;\r
- this.includes = includes;\r
- this.project = project;\r
- }\r
-\r
- /**\r
- Parse file without file type. \r
- \r
- @param filename Source file name\r
- @param root Root node\r
- @param unicodeFirst whether build Unicode file firstly or not\r
- **/\r
- public synchronized void parseFile(String filename, Node root, boolean unicodeFirst) {\r
- this.unicodeFirst = unicodeFirst;\r
- parseFile(filename, root);\r
- }\r
- \r
- /**\r
- Get whether current module contains Unicode files or not.\r
- \r
- @return Whether current module contains Unicode files or not\r
- **/\r
- public boolean isUnicodeExist() {\r
- return unicodeExist;\r
- }\r
-\r
- /**\r
- Parse file.\r
- \r
- @param filename Source file name\r
- @param filetype Source file type\r
- @param root Root node\r
- @param unicodeFirst whether build Unicode file firstly or not\r
- **/\r
- public synchronized void parseFile(String filename, String filetype, Node root, boolean unicodeFirst) {\r
- this.unicodeFirst = unicodeFirst;\r
- parseFile(filename, filetype, root);\r
- }\r
- \r
- /**\r
- Find out source file's type. \r
- \r
- @param filename Source file name\r
- @param root Root node\r
- **/\r
- public synchronized void parseFile(String filename, Node root) throws BuildException {\r
- for (int i = 0; i < fileTypes.length; i++) {\r
- if (filename.endsWith(fileTypes[i][0])) {\r
- parseFile(filename, fileTypes[i][2], root);\r
- return ;\r
- }\r
- }\r
- }\r
-\r
- /**\r
- Parse file. If flag <code>unicodeFirst</code> is true, then build all\r
- unicode files firstly. \r
- \r
- <p>Note that AutoGen.c is processed specially. It's output path is always\r
- <code>${DEST_DIR_OUTPUT}</code>, others are <code>${DEST_DIR_OUTPUT}</code>\r
- and relative to module path. </p>\r
- \r
- @param filename Source file name\r
- @param filetype Source file type\r
- @param root Root node\r
- **/\r
- public synchronized void parseFile(String filename, String filetype, Node root) {\r
- if (unicodeFirst) {\r
- if ( ! filetype.equalsIgnoreCase("UNI")){\r
- return ;\r
- }\r
- unicodeExist= true;\r
- } else {\r
- if (filetype.equalsIgnoreCase("UNI")){\r
- return ;\r
- }\r
- }\r
- \r
- //\r
- // If file is C or ASM header file, skip it\r
- //\r
- if (filetype.equalsIgnoreCase("CHeader") || filetype.equalsIgnoreCase("ASMHeader")) {\r
- return;\r
- }\r
- \r
- //\r
- // If file is pre-processor file, skip it\r
- // \r
- if (filetype.equalsIgnoreCase("PPCode")) {\r
- return;\r
- }\r
- \r
- //\r
- // If define CC_EXT in tools_def.txt file, the source file with \r
- // different suffix is skipped\r
- //\r
- String toolsDefExtName = project.getProperty(filetype + "_EXT");\r
- if (toolsDefExtName != null) {\r
- String[] exts = toolsDefExtName.split(" ");\r
- for (int i = 0; i < exts.length; i++) {\r
- if ( ! filename.endsWith(exts[i])) {\r
- return ;\r
- }\r
- }\r
- }\r
- \r
- String module_path = project.getProperty("MODULE_DIR");\r
- File moduleFile = new File(module_path);\r
- File sourceFile = new File(filename);\r
- \r
- //\r
- // If source file is AutoGen.c, then Filepath is .\r
- //\r
- String sourceFilepath = "";\r
- String sourceFilename = "";\r
- String sourceFileext = "";\r
- if (sourceFile.getPath().endsWith("AutoGen.c")) {\r
- sourceFilepath = ".";\r
- sourceFilename = "AutoGen";\r
- sourceFileext = ".c";\r
- filetype = "AUTOGEN";\r
- } else {\r
- // sourceFile.\r
- String str = sourceFile.getPath().substring(moduleFile.getPath().length() + 1);\r
- int index = str.lastIndexOf(File.separatorChar);\r
- sourceFilepath = ".";\r
- if (index > 0) {\r
- sourceFilepath = str.substring(0, index);\r
- str = str.substring(index + 1);\r
- }\r
- sourceFilename = str;\r
- index = str.lastIndexOf('.');\r
- if (index > 0) {\r
- sourceFilename = str.substring(0, index);\r
- sourceFileext = str.substring(index);\r
- }\r
- }\r
- // <Build_filetype FILEPATH="" FILENAME="" />\r
- Element ele = document.createElement("Build_" + filetype);\r
- ele.setAttribute("FILEPATH", sourceFilepath);\r
- ele.setAttribute("FILENAME", sourceFilename);\r
- ele.setAttribute("FILEEXT", sourceFileext.substring(1));\r
- Element includesEle = document.createElement("EXTRA.INC");\r
- for (int i = 0; i < includes.length; i++) {\r
- Element includeEle = document.createElement("includepath");\r
- includeEle.setAttribute("path", project.replaceProperties(includes[i]));\r
- includesEle.appendChild(includeEle);\r
- }\r
- ele.appendChild(includesEle);\r
- root.appendChild(ele);\r
- }\r
-}
\ No newline at end of file