X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=Tools%2FSource%2FGenBuild%2Forg%2Ftianocore%2Fbuild%2FGenBuildTask.java;h=62304774452967fc01cfedebf814e11b3e80d19e;hp=c8cc4ad74890729a245d705ac896467b4ca0d5be;hb=1e8e8a82ddbc10ad79097ef393866d188f968ee1;hpb=2d16dcec6f602d218ae95a823fca6ae542e03a8f diff --git a/Tools/Source/GenBuild/org/tianocore/build/GenBuildTask.java b/Tools/Source/GenBuild/org/tianocore/build/GenBuildTask.java index c8cc4ad748..6230477445 100644 --- a/Tools/Source/GenBuild/org/tianocore/build/GenBuildTask.java +++ b/Tools/Source/GenBuild/org/tianocore/build/GenBuildTask.java @@ -16,13 +16,11 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. package org.tianocore.build; import java.io.File; -import java.util.Hashtable; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.Stack; import java.util.Vector; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -40,6 +38,7 @@ import org.tianocore.build.fpd.FpdParserTask; import org.tianocore.build.global.GenBuildLogger; import org.tianocore.build.global.GlobalData; import org.tianocore.build.global.OutputManager; +import org.tianocore.build.global.PropertyManager; import org.tianocore.build.global.SurfaceAreaQuery; import org.tianocore.build.id.FpdModuleIdentification; import org.tianocore.build.id.ModuleIdentification; @@ -55,6 +54,7 @@ import org.tianocore.build.tools.ModuleItem;

The main function of this task is to parse module's surface area (MSA), then generate the corresponding BaseName_build.xml (the real ANT build script) and call this to build the module. The whole process including: +

   1. generate AutoGen.c and AutoGen.h; 
   2. build all dependent library instances;
@@ -69,24 +69,26 @@ import org.tianocore.build.tools.ModuleItem;
   

-   <GenBuild
-             msaFilename="HelloWorld.msa"/>
-             processTo="ALL"/>
+    <GenBuild 
+       msaFile="${PACKAGE_DIR}/Application/HelloWorld/HelloWorld.msa"
+       type="cleanall" />
   
-

processTo provides a way to customize the whole build process. - processTo can be one value of ALL, AUTOGEN, FILES, LIBRARYINSTANCES, SECTIONS, NONE. - Default is ALL, means whole -

-

This task calls AutoGen to generate AutoGen.c and - AutoGen.h. The task also parses the development environment - configuration files, such as collecting package information, setting compiler - flags and so on. + AutoGen.h.

- +

+ This task will also set properties for current module, such as PACKAGE, + PACKAGE_GUID, PACKAGE_VERSION, PACKAGE_DIR, PACKAGE_RELATIVE_DIR + (relative to Workspace), MODULE or BASE_NAME, GUID, VERSION, MODULE_DIR, + MODULE_RELATIVE_DIR (relative to Package), CONFIG_DIR, BIN_DIR, + DEST_DIR_DEBUG, DEST_DIR_OUTPUT, TARGET, ARCH, TOOLCHAIN, TOOLCHAIN_FAMILY, + SUBSYSTEM, ENTRYPOINT, EBC_TOOL_LIB_PATH, all compiler command related + properties (CC, CC_FLAGS, CC_DPATH, CC_SPATH, CC_FAMILY, CC_EXT). +

+ @since GenBuild 1.0 **/ public class GenBuildTask extends Ant { @@ -95,7 +97,9 @@ public class GenBuildTask extends Ant { /// Module surface area file. /// File msaFile; - + + public ModuleIdentification parentId; + private String type = "all"; /// @@ -105,9 +109,9 @@ public class GenBuildTask extends Ant { private Vector properties = new Vector(); - private static Stack backupPropertiesStack = new Stack(); - private boolean isSingleModuleBuild = false; + + private SurfaceAreaQuery saq = null; /** Public construct method. It is necessary for ANT task. @@ -128,14 +132,15 @@ public class GenBuildTask extends Ant { EdkLog.setLogLevel(getProject().getProperty("env.LOGLEVEL")); EdkLog.setLogger(logger); - pushProperties(); + PropertyManager.setProject(getProject()); + PropertyManager.save(); // // Enable all specified properties // Iterator iter = properties.iterator(); while (iter.hasNext()) { Property item = iter.next(); - getProject().setProperty(item.getName(), item.getValue()); + PropertyManager.setProperty(item.getName(), item.getValue()); } // @@ -153,14 +158,14 @@ public class GenBuildTask extends Ant { moduleId = new ModuleIdentification(moduleGuid, moduleVersion); moduleId.setPackage(packageId); Map doc = GlobalData.getNativeMsa(moduleId); - SurfaceAreaQuery.setDoc(doc); - moduleId = SurfaceAreaQuery.getMsaHeader(); + saq = new SurfaceAreaQuery(doc); + moduleId = saq.getMsaHeader(); } else { Map doc = GlobalData.getNativeMsa(msaFile); - SurfaceAreaQuery.setDoc(doc); - moduleId = SurfaceAreaQuery.getMsaHeader(); + saq = new SurfaceAreaQuery(doc); + moduleId = saq.getMsaHeader(); } - String[] producedLibraryClasses = SurfaceAreaQuery.getLibraryClasses("ALWAYS_PRODUCED",null); + String[] producedLibraryClasses = saq.getLibraryClasses("ALWAYS_PRODUCED",null); if (producedLibraryClasses.length == 0) { moduleId.setLibrary(false); } else { @@ -181,8 +186,8 @@ public class GenBuildTask extends Ant { // String filename = getProject().getProperty("PLATFORM_FILE"); PlatformIdentification platformId = GlobalData.getPlatform(filename); - getProject().setProperty("PLATFORM_DIR", platformId.getFpdFile().getParent().replaceAll("(\\\\)", "/")); - getProject().setProperty("PLATFORM_RELATIVE_DIR", platformId.getPlatformRelativeDir().replaceAll("(\\\\)", "/")); + PropertyManager.setProperty("PLATFORM_DIR", platformId.getFpdFile().getParent().replaceAll("(\\\\)", "/")); + PropertyManager.setProperty("PLATFORM_RELATIVE_DIR", platformId.getPlatformRelativeDir().replaceAll("(\\\\)", "/")); String packageGuid = getProject().getProperty("PACKAGE_GUID"); String packageVersion = getProject().getProperty("PACKAGE_VERSION"); @@ -220,7 +225,7 @@ public class GenBuildTask extends Ant { // // Judge if arch is all supported by current module. If not, throw Exception. // - List moduleSupportedArchs = SurfaceAreaQuery.getModuleSupportedArchs(); + List moduleSupportedArchs = saq.getModuleSupportedArchs(); if (moduleSupportedArchs != null) { for (int k = 0; k < archList.length; k++) { if ( ! moduleSupportedArchs.contains(archList[k])) { @@ -231,7 +236,7 @@ public class GenBuildTask extends Ant { for (int k = 0; k < archList.length; k++) { - getProject().setProperty("ARCH", archList[k]); + PropertyManager.setProperty("ARCH", archList[k]); FpdModuleIdentification fpdModuleId = new FpdModuleIdentification(moduleId, archList[k]); @@ -242,7 +247,7 @@ public class GenBuildTask extends Ant { System.out.println("\nWARNING: " + moduleId + " for " + archList[k] + " was not found in current platform FPD file!\n"); continue; } else if (GlobalData.isModuleBuilt(fpdModuleId)) { - return; + break; } else { GlobalData.registerBuiltModule(fpdModuleId); } @@ -256,7 +261,7 @@ public class GenBuildTask extends Ant { // Prepare for target related common properties // TARGET // - getProject().setProperty("TARGET", targetList[i]); + PropertyManager.setProperty("TARGET", targetList[i]); String[] toolchainList = GlobalData.getToolChainInfo().getTagnames(); for(int j = 0; j < toolchainList.length; j ++){ // @@ -272,11 +277,11 @@ public class GenBuildTask extends Ant { // Prepare for toolchain related common properties // TOOLCHAIN // - getProject().setProperty("TOOLCHAIN", toolchainList[j]); + PropertyManager.setProperty("TOOLCHAIN", toolchainList[j]); System.out.println("Build " + moduleId + " start >>>"); System.out.println("Target: " + targetList[i] + " Tagname: " + toolchainList[j] + " Arch: " + archList[k]); - SurfaceAreaQuery.setDoc(GlobalData.getDoc(fpdModuleId)); + saq.push(GlobalData.getDoc(fpdModuleId)); // // Prepare for all other common properties @@ -304,7 +309,7 @@ public class GenBuildTask extends Ant { } } - popProperties(); + PropertyManager.restore(); } /** @@ -342,14 +347,15 @@ public class GenBuildTask extends Ant { FpdParserTask fpdParser = new FpdParserTask(); fpdParser.setProject(getProject()); fpdParser.parseFpdFile(platformId.getFpdFile()); + PropertyManager.setProperty("ARCH", fpdParser.getAllArchForModule(moduleId)); // // Prepare for Platform related common properties // PLATFORM, PLATFORM_DIR, PLATFORM_RELATIVE_DIR // - getProject().setProperty("PLATFORM", platformId.getName()); - getProject().setProperty("PLATFORM_DIR", platformId.getFpdFile().getParent().replaceAll("(\\\\)", "/")); - getProject().setProperty("PLATFORM_RELATIVE_DIR", platformId.getPlatformRelativeDir().replaceAll("(\\\\)", "/")); + PropertyManager.setProperty("PLATFORM", platformId.getName()); + PropertyManager.setProperty("PLATFORM_DIR", platformId.getFpdFile().getParent().replaceAll("(\\\\)", "/")); + PropertyManager.setProperty("PLATFORM_RELATIVE_DIR", platformId.getPlatformRelativeDir().replaceAll("(\\\\)", "/")); } @@ -364,29 +370,29 @@ public class GenBuildTask extends Ant { // PACKAGE, PACKAGE_GUID, PACKAGE_VERSION, PACKAGE_DIR, PACKAGE_RELATIVE_DIR // PackageIdentification packageId = moduleId.getPackage(); - getProject().setProperty("PACKAGE", packageId.getName()); - getProject().setProperty("PACKAGE_GUID", packageId.getGuid()); - getProject().setProperty("PACKAGE_VERSION", packageId.getVersion()); - getProject().setProperty("PACKAGE_DIR", packageId.getPackageDir().replaceAll("(\\\\)", "/")); - getProject().setProperty("PACKAGE_RELATIVE_DIR", packageId.getPackageRelativeDir().replaceAll("(\\\\)", "/")); + PropertyManager.setProperty("PACKAGE", packageId.getName()); + PropertyManager.setProperty("PACKAGE_GUID", packageId.getGuid()); + PropertyManager.setProperty("PACKAGE_VERSION", packageId.getVersion()); + PropertyManager.setProperty("PACKAGE_DIR", packageId.getPackageDir().replaceAll("(\\\\)", "/")); + PropertyManager.setProperty("PACKAGE_RELATIVE_DIR", packageId.getPackageRelativeDir().replaceAll("(\\\\)", "/")); // // MODULE or BASE_NAME, GUID or FILE_GUID, VERSION, MODULE_TYPE // MODULE_DIR, MODULE_RELATIVE_DIR // - getProject().setProperty("MODULE", moduleId.getName()); - String baseName = SurfaceAreaQuery.getModuleOutputFileBasename(); + PropertyManager.setProperty("MODULE", moduleId.getName()); + String baseName = saq.getModuleOutputFileBasename(); if (baseName == null) { - getProject().setProperty("BASE_NAME", moduleId.getName()); + PropertyManager.setProperty("BASE_NAME", moduleId.getName()); } else { - getProject().setProperty("BASE_NAME", baseName); + PropertyManager.setProperty("BASE_NAME", baseName); } - getProject().setProperty("GUID", moduleId.getGuid()); - getProject().setProperty("FILE_GUID", moduleId.getGuid()); - getProject().setProperty("VERSION", moduleId.getVersion()); - getProject().setProperty("MODULE_TYPE", moduleId.getModuleType()); - getProject().setProperty("MODULE_DIR", moduleId.getMsaFile().getParent().replaceAll("(\\\\)", "/")); - getProject().setProperty("MODULE_RELATIVE_DIR", moduleId.getModuleRelativePath().replaceAll("(\\\\)", "/")); + PropertyManager.setProperty("GUID", moduleId.getGuid()); + PropertyManager.setProperty("FILE_GUID", moduleId.getGuid()); + PropertyManager.setProperty("VERSION", moduleId.getVersion()); + PropertyManager.setProperty("MODULE_TYPE", moduleId.getModuleType()); + PropertyManager.setProperty("MODULE_DIR", moduleId.getMsaFile().getParent().replaceAll("(\\\\)", "/")); + PropertyManager.setProperty("MODULE_RELATIVE_DIR", moduleId.getModuleRelativePath().replaceAll("(\\\\)", "/")); // // SUBSYSTEM @@ -412,18 +418,18 @@ public class GenBuildTask extends Ant { break ; } } - getProject().setProperty("SUBSYSTEM", subsystem); + PropertyManager.setProperty("SUBSYSTEM", subsystem); // // ENTRYPOINT // if (arch.equalsIgnoreCase("EBC")) { - getProject().setProperty("ENTRYPOINT", "EfiStart"); + PropertyManager.setProperty("ENTRYPOINT", "EfiStart"); } else { - getProject().setProperty("ENTRYPOINT", "_ModuleEntryPoint"); + PropertyManager.setProperty("ENTRYPOINT", "_ModuleEntryPoint"); } - getProject().setProperty("OBJECTS", ""); + PropertyManager.setProperty("OBJECTS", ""); } private void getCompilerFlags(String target, String toolchain, FpdModuleIdentification fpdModuleId) throws EdkException { @@ -438,7 +444,7 @@ public class GenBuildTask extends Ant { key[4] = ToolDefinitions.TOOLS_DEF_ATTRIBUTE_NAME; String cmdName = GlobalData.getCommandSetting(key, fpdModuleId); File cmdFile = new File(cmdPath + File.separatorChar + cmdName); - getProject().setProperty(cmd[m], cmdFile.getPath().replaceAll("(\\\\)", "/")); + PropertyManager.setProperty(cmd[m], cmdFile.getPath().replaceAll("(\\\\)", "/")); // // set CC_FLAGS @@ -448,7 +454,7 @@ public class GenBuildTask extends Ant { Set addset = new LinkedHashSet(); Set subset = new LinkedHashSet(); putFlagsToSet(addset, cmdFlags); - getProject().setProperty(cmd[m] + "_FLAGS", getProject().replaceProperties(getFlags(addset, subset))); + PropertyManager.setProperty(cmd[m] + "_FLAGS", getProject().replaceProperties(getFlags(addset, subset))); // // Set CC_EXT @@ -456,9 +462,9 @@ public class GenBuildTask extends Ant { key[4] = ToolDefinitions.TOOLS_DEF_ATTRIBUTE_EXT; String extName = GlobalData.getCommandSetting(key, fpdModuleId); if ( extName != null && ! extName.equalsIgnoreCase("")) { - getProject().setProperty(cmd[m] + "_EXT", extName); + PropertyManager.setProperty(cmd[m] + "_EXT", extName); } else { - getProject().setProperty(cmd[m] + "_EXT", ""); + PropertyManager.setProperty(cmd[m] + "_EXT", ""); } // @@ -467,7 +473,7 @@ public class GenBuildTask extends Ant { key[4] = ToolDefinitions.TOOLS_DEF_ATTRIBUTE_FAMILY; String toolChainFamily = GlobalData.getCommandSetting(key, fpdModuleId); if (toolChainFamily != null) { - getProject().setProperty(cmd[m] + "_FAMILY", toolChainFamily); + PropertyManager.setProperty(cmd[m] + "_FAMILY", toolChainFamily); } // @@ -476,9 +482,9 @@ public class GenBuildTask extends Ant { key[4] = ToolDefinitions.TOOLS_DEF_ATTRIBUTE_SPATH; String spath = GlobalData.getCommandSetting(key, fpdModuleId); if (spath != null) { - getProject().setProperty(cmd[m] + "_SPATH", spath.replaceAll("(\\\\)", "/")); + PropertyManager.setProperty(cmd[m] + "_SPATH", spath.replaceAll("(\\\\)", "/")); } else { - getProject().setProperty(cmd[m] + "_SPATH", ""); + PropertyManager.setProperty(cmd[m] + "_SPATH", ""); } // @@ -487,9 +493,9 @@ public class GenBuildTask extends Ant { key[4] = ToolDefinitions.TOOLS_DEF_ATTRIBUTE_DPATH; String dpath = GlobalData.getCommandSetting(key, fpdModuleId); if (dpath != null) { - getProject().setProperty(cmd[m] + "_DPATH", dpath.replaceAll("(\\\\)", "/")); + PropertyManager.setProperty(cmd[m] + "_DPATH", dpath.replaceAll("(\\\\)", "/")); } else { - getProject().setProperty(cmd[m] + "_DPATH", ""); + PropertyManager.setProperty(cmd[m] + "_DPATH", ""); } } } @@ -537,13 +543,11 @@ public class GenBuildTask extends Ant { private void applyBuild(String buildTarget, String buildTagname, FpdModuleIdentification fpdModuleId) throws BuildException{ // - // AutoGen + // Call AutoGen to generate AutoGen.c and AutoGen.h // - - AutoGen autogen = new AutoGen(getProject().getProperty("FV_DIR"), getProject().getProperty("DEST_DIR_DEBUG"), fpdModuleId.getModule(),fpdModuleId.getArch()); + AutoGen autogen = new AutoGen(getProject().getProperty("FV_DIR"), getProject().getProperty("DEST_DIR_DEBUG"), fpdModuleId.getModule(),fpdModuleId.getArch(), saq); autogen.genAutogen(); - // // Get compiler flags // @@ -557,19 +561,24 @@ public class GenBuildTask extends Ant { // // Prepare LIBS // - ModuleIdentification[] libinstances = SurfaceAreaQuery.getLibraryInstance(fpdModuleId.getArch()); + ModuleIdentification[] libinstances = saq.getLibraryInstance(fpdModuleId.getArch()); String propertyLibs = ""; for (int i = 0; i < libinstances.length; i++) { propertyLibs += " " + getProject().getProperty("BIN_DIR") + File.separatorChar + libinstances[i].getName() + ".lib"; } - getProject().setProperty("LIBS", propertyLibs.replaceAll("(\\\\)", "/")); + PropertyManager.setProperty("LIBS", propertyLibs.replaceAll("(\\\\)", "/")); + // + // Get all includepath and set to INCLUDE_PATHS + // + String[] includes = prepareIncludePaths(fpdModuleId); + // // if it is CUSTOM_BUILD // then call the exist BaseName_build.xml directly. // if (moduleId.getModuleType().equalsIgnoreCase("USER_DEFINED")) { - GlobalData.log.info("Call user-defined " + moduleId.getName() + "_build.xml"); + System.out.println("Call user-defined " + moduleId.getName() + "_build.xml"); String antFilename = getProject().getProperty("MODULE_DIR") + File.separatorChar + moduleId.getName() + "_build.xml"; antCall(antFilename, null); @@ -581,8 +590,8 @@ public class GenBuildTask extends Ant { // Generate ${BASE_NAME}_build.xml // TBD // - String ffsKeyword = SurfaceAreaQuery.getModuleFfsKeyword(); - ModuleBuildFileGenerator fileGenerator = new ModuleBuildFileGenerator(getProject(), ffsKeyword, fpdModuleId); + String ffsKeyword = saq.getModuleFfsKeyword(); + ModuleBuildFileGenerator fileGenerator = new ModuleBuildFileGenerator(getProject(), ffsKeyword, fpdModuleId, includes, saq); String buildFilename = getProject().getProperty("DEST_DIR_OUTPUT") + File.separatorChar + moduleId.getName() + "_build.xml"; fileGenerator.genBuildFile(buildFilename); @@ -599,7 +608,7 @@ public class GenBuildTask extends Ant { // then call the exist BaseName_build.xml directly. // if (moduleId.getModuleType().equalsIgnoreCase("USER_DEFINED")) { - GlobalData.log.info("Calling user-defined " + moduleId.getName() + "_build.xml"); + System.out.println("Calling user-defined " + moduleId.getName() + "_build.xml"); String antFilename = getProject().getProperty("MODULE_DIR") + File.separatorChar + moduleId.getName() + "_build.xml"; antCall(antFilename, "clean"); @@ -617,7 +626,7 @@ public class GenBuildTask extends Ant { // then call the exist BaseName_build.xml directly. // if (moduleId.getModuleType().equalsIgnoreCase("USER_DEFINED")) { - GlobalData.log.info("Calling user-defined " + moduleId.getName() + "_build.xml"); + System.out.println("Calling user-defined " + moduleId.getName() + "_build.xml"); String antFilename = getProject().getProperty("MODULE_DIR") + File.separatorChar + moduleId.getName() + "_build.xml"; antCall(antFilename, "cleanall"); @@ -689,21 +698,97 @@ public class GenBuildTask extends Ant { return result; } - private void pushProperties() { - backupPropertiesStack.push(getProject().getProperties()); + public void setSingleModuleBuild(boolean isSingleModuleBuild) { + this.isSingleModuleBuild = isSingleModuleBuild; } + + private String[] prepareIncludePaths(FpdModuleIdentification fpdModuleId) { + // + // Prepare the includes: PackageDependencies and Output debug direactory + // + Set includes = new LinkedHashSet(); + String arch = fpdModuleId.getArch(); + + // + // WORKSPACE + // + includes.add("${WORKSPACE_DIR}" + File.separatorChar); + + // + // Module iteself + // + includes.add("${MODULE_DIR}"); + includes.add("${MODULE_DIR}" + File.separatorChar + archDir(arch)); + + // + // Packages in PackageDenpendencies + // + PackageIdentification[] packageDependencies = saq.getDependencePkg(fpdModuleId.getArch()); + for (int i = 0; i < packageDependencies.length; i++) { + GlobalData.refreshPackageIdentification(packageDependencies[i]); + File packageFile = packageDependencies[i].getSpdFile(); + includes.add(packageFile.getParent() + File.separatorChar + "Include"); + includes.add(packageFile.getParent() + File.separatorChar + "Include" + File.separatorChar + archDir(arch)); + } - private void popProperties() { - Hashtable backupProperties = backupPropertiesStack.pop(); - Set keys = backupProperties.keySet(); - Iterator iter = keys.iterator(); - while (iter.hasNext()) { - String item = (String)iter.next(); - getProject().setProperty(item, (String)backupProperties.get(item)); + // + // All Dependency Library Instance's PackageDependencies + // + ModuleIdentification[] libinstances = saq.getLibraryInstance(fpdModuleId.getArch()); + for (int i = 0; i < libinstances.length; i++) { + saq.push(GlobalData.getDoc(libinstances[i], fpdModuleId.getArch())); + PackageIdentification[] libraryPackageDependencies = saq.getDependencePkg(fpdModuleId.getArch()); + for (int j = 0; j < libraryPackageDependencies.length; j++) { + GlobalData.refreshPackageIdentification(libraryPackageDependencies[j]); + File packageFile = libraryPackageDependencies[j].getSpdFile(); + includes.add(packageFile.getParent() + File.separatorChar + "Include"); + includes.add(packageFile.getParent() + File.separatorChar + "Include" + File.separatorChar + archDir(arch)); + } + saq.pop(); } - } + + + // + // The package which the module belongs to + // TBD + includes.add(fpdModuleId.getModule().getPackage().getPackageDir() + File.separatorChar + "Include"); + includes.add(fpdModuleId.getModule().getPackage().getPackageDir() + File.separatorChar + "Include" + File.separatorChar + archDir(arch)); - public void setSingleModuleBuild(boolean isSingleModuleBuild) { - this.isSingleModuleBuild = isSingleModuleBuild; + // + // Debug files output directory + // + includes.add("${DEST_DIR_DEBUG}"); + + // + // set to INCLUDE_PATHS property + // + Iterator iter = includes.iterator(); + StringBuffer includePaths = new StringBuffer(); + while (iter.hasNext()) { + includePaths.append(iter.next()); + includePaths.append("; "); + } + PropertyManager.setProperty("INCLUDE_PATHS", getProject().replaceProperties(includePaths.toString()).replaceAll("(\\\\)", "/")); + + return includes.toArray(new String[includes.size()]); } + + /** + Return the name of the directory that corresponds to the architecture. + This is a translation from the XML Schema tag to a directory that + corresponds to our directory name coding convention. + + **/ + private String archDir(String arch) { + return arch.replaceFirst("X64", "x64") + .replaceFirst("IPF", "Ipf") + .replaceFirst("IA32", "Ia32") + .replaceFirst("ARM", "Arm") + .replaceFirst("EBC", "Ebc"); + } + + + public void setExternalProperties(Vector v) { + this.properties = v; + } }