duke@435: /* trims@1907: * Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved. duke@435: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. duke@435: * duke@435: * This code is free software; you can redistribute it and/or modify it duke@435: * under the terms of the GNU General Public License version 2 only, as duke@435: * published by the Free Software Foundation. duke@435: * duke@435: * This code is distributed in the hope that it will be useful, but WITHOUT duke@435: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or duke@435: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License duke@435: * version 2 for more details (a copy is included in the LICENSE file that duke@435: * accompanied this code). duke@435: * duke@435: * You should have received a copy of the GNU General Public License version duke@435: * 2 along with this work; if not, write to the Free Software Foundation, duke@435: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. duke@435: * trims@1907: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA trims@1907: * or visit www.oracle.com if you need additional information or have any trims@1907: * questions. duke@435: * duke@435: */ duke@435: duke@435: import java.io.*; duke@435: import java.util.*; duke@435: duke@435: abstract class HsArgHandler extends ArgHandler { duke@435: static final int STRING = 1; duke@435: static final int VECTOR = 2; duke@435: static final int HASH = 3; duke@435: duke@435: boolean nextNotKey(ArgIterator it) { duke@435: if (it.next()) { duke@435: String s = it.get(); duke@435: return (s.length() == 0) || (s.charAt(0) != '-'); duke@435: } else { duke@435: return false; duke@435: } duke@435: } duke@435: duke@435: void empty(String key, String message) { duke@435: if (key != null) { duke@435: System.err.println("** Error: empty " + key); duke@435: } duke@435: if (message != null) { duke@435: System.err.println(message); duke@435: } duke@435: WinGammaPlatform.usage(); duke@435: } duke@435: duke@435: static String getCfg(String val) { duke@435: int under = val.indexOf('_'); duke@435: int len = val.length(); duke@435: if (under != -1 && under < len - 1) { duke@435: return val.substring(under+1, len); duke@435: } else { duke@435: return null; duke@435: } duke@435: } duke@435: } duke@435: duke@435: class ArgRuleSpecific extends ArgRule { duke@435: ArgRuleSpecific(String arg, ArgHandler handler) { duke@435: super(arg, handler); duke@435: } duke@435: duke@435: boolean match(String rulePattern, String arg) { duke@435: return rulePattern.startsWith(arg); duke@435: } duke@435: } duke@435: duke@435: duke@435: class SpecificHsArgHandler extends HsArgHandler { duke@435: duke@435: String message, argKey, valKey; duke@435: int type; duke@435: duke@435: public void handle(ArgIterator it) { duke@435: String cfg = getCfg(it.get()); duke@435: if (nextNotKey(it)) { duke@435: String val = it.get(); duke@435: switch (type) { duke@435: case VECTOR: duke@435: BuildConfig.addFieldVector(cfg, valKey, val); duke@435: break; duke@435: case HASH: duke@435: BuildConfig.putFieldHash(cfg, valKey, val, "1"); duke@435: break; duke@435: case STRING: duke@435: BuildConfig.putField(cfg, valKey, val); duke@435: break; duke@435: default: duke@435: empty(valKey, "Unknown type: "+type); duke@435: } duke@435: it.next(); duke@435: duke@435: } else { duke@435: empty(argKey, message); duke@435: } duke@435: } duke@435: duke@435: SpecificHsArgHandler(String argKey, String valKey, String message, int type) { duke@435: this.argKey = argKey; duke@435: this.valKey = valKey; duke@435: this.message = message; duke@435: this.type = type; duke@435: } duke@435: } duke@435: duke@435: duke@435: class HsArgRule extends ArgRuleSpecific { duke@435: duke@435: HsArgRule(String argKey, String valKey, String message, int type) { duke@435: super(argKey, new SpecificHsArgHandler(argKey, valKey, message, type)); duke@435: } duke@435: duke@435: } duke@435: duke@435: public abstract class WinGammaPlatform extends Platform { duke@435: public void setupFileTemplates() { duke@435: inclFileTemplate = new FileName(this, duke@435: "incls\\", "_", "", ".incl", "", "" duke@435: ); duke@435: giFileTemplate = new FileName(this, duke@435: "incls\\", "", "_precompiled", ".incl", "", "" duke@435: ); duke@435: gdFileTemplate = new FileName(this, duke@435: "", "", "Dependencies", "", "", "" duke@435: ); duke@435: } duke@435: duke@435: private static String[] suffixes = { ".cpp", ".c" }; duke@435: duke@435: public String[] outerSuffixes() { duke@435: return suffixes; duke@435: } duke@435: duke@435: public String objFileSuffix() { duke@435: return ".obj"; duke@435: } duke@435: duke@435: public String asmFileSuffix() { duke@435: return ".i"; duke@435: } duke@435: duke@435: public String dependentPrefix() { duke@435: return "$(VM_PATH)"; duke@435: } duke@435: duke@435: public boolean includeGIInEachIncl() { duke@435: return false; duke@435: } duke@435: duke@435: public boolean fileNameStringEquality(String s1, String s2) { duke@435: return s1.equalsIgnoreCase(s2); duke@435: } duke@435: duke@435: static void usage() throws IllegalArgumentException { duke@435: System.err.println("WinGammaPlatform platform-specific options:"); duke@435: System.err.println(" -sourceBase "); duke@435: System.err.println(" -projectFileName "); duke@435: System.err.println(" If any of the above are specified, "+ duke@435: "they must all be."); duke@435: System.err.println(" Additional, optional arguments, which can be " + duke@435: "specified multiple times:"); duke@435: System.err.println(" -absoluteInclude "); duke@435: System.err.println(" -relativeInclude "); duke@435: System.err.println(" -define "); duke@435: System.err.println(" -startAt "); duke@435: System.err.println(" -additionalFile "); duke@435: System.err.println(" -additionalGeneratedFile " + duke@435: ""); duke@435: throw new IllegalArgumentException(); duke@435: } duke@435: duke@435: duke@435: public void addPerFileLine(Hashtable table, duke@435: String fileName, duke@435: String line) { duke@435: Vector v = (Vector) table.get(fileName); duke@435: if (v != null) { duke@435: v.add(line); duke@435: } else { duke@435: v = new Vector(); duke@435: v.add(line); duke@435: table.put(fileName, v); duke@435: } duke@435: } duke@435: duke@435: protected static class PerFileCondData { duke@435: public String releaseString; duke@435: public String debugString; duke@435: } duke@435: duke@435: protected void addConditionalPerFileLine(Hashtable table, duke@435: String fileName, duke@435: String releaseLine, duke@435: String debugLine) { duke@435: PerFileCondData data = new PerFileCondData(); duke@435: data.releaseString = releaseLine; duke@435: data.debugString = debugLine; duke@435: Vector v = (Vector) table.get(fileName); duke@435: if (v != null) { duke@435: v.add(data); duke@435: } else { duke@435: v = new Vector(); duke@435: v.add(data); duke@435: table.put(fileName, v); duke@435: } duke@435: } duke@435: duke@435: protected static class PrelinkCommandData { duke@435: String description; duke@435: String commands; duke@435: } duke@435: duke@435: protected void addPrelinkCommand(Hashtable table, duke@435: String build, duke@435: String description, duke@435: String commands) { duke@435: PrelinkCommandData data = new PrelinkCommandData(); duke@435: data.description = description; duke@435: data.commands = commands; duke@435: table.put(build, data); duke@435: } duke@435: duke@435: public boolean findString(Vector v, String s) { duke@435: for (Iterator iter = v.iterator(); iter.hasNext(); ) { duke@435: if (((String) iter.next()).equals(s)) { duke@435: return true; duke@435: } duke@435: } duke@435: duke@435: return false; duke@435: } duke@435: duke@435: /* This returns a String containing the full path to the passed duke@435: file name, or null if an error occurred. If the file was not duke@435: found or was a duplicate and couldn't be resolved using the duke@435: preferred paths, the file name is added to the appropriate duke@435: Vector of Strings. */ duke@435: private String findFileInDirectory(String fileName, duke@435: DirectoryTree directory, duke@435: Vector preferredPaths, duke@435: Vector filesNotFound, duke@435: Vector filesDuplicate) { duke@435: List locationsInTree = directory.findFile(fileName); duke@435: int rootNameLength = directory.getRootNodeName().length(); duke@435: String name = null; duke@435: if ((locationsInTree == null) || duke@435: (locationsInTree.size() == 0)) { duke@435: filesNotFound.add(fileName); duke@435: } else if (locationsInTree.size() > 1) { duke@435: // We shouldn't have duplicate file names in our workspace. duke@435: System.err.println(); duke@435: System.err.println("There are multiple files named as: " + fileName); duke@435: System.exit(-1); duke@435: // The following code could be safely removed if we don't need duplicate duke@435: // file names. duke@435: duke@435: // Iterate through them, trying to find one with a duke@435: // preferred path duke@435: search: duke@435: { duke@435: for (Iterator locIter = locationsInTree.iterator(); duke@435: locIter.hasNext(); ) { duke@435: DirectoryTreeNode node = duke@435: (DirectoryTreeNode) locIter.next(); duke@435: String tmpName = node.getName(); duke@435: for (Iterator prefIter = preferredPaths.iterator(); duke@435: prefIter.hasNext(); ) { duke@435: // We need to make sure the preferred path is duke@435: // found from the file path not including the root node name. duke@435: if (tmpName.indexOf((String)prefIter.next(), duke@435: rootNameLength) != -1) { duke@435: name = tmpName; duke@435: break search; duke@435: } duke@435: } duke@435: } duke@435: } duke@435: duke@435: if (name == null) { duke@435: filesDuplicate.add(fileName); duke@435: } duke@435: } else { duke@435: name = ((DirectoryTreeNode) locationsInTree.get(0)).getName(); duke@435: } duke@435: duke@435: return name; duke@435: } duke@435: duke@435: protected boolean databaseAllFilesEqual(Database previousDB, duke@435: Database currentDB) { duke@435: Iterator i1 = previousDB.getAllFiles().iterator(); duke@435: Iterator i2 = currentDB.getAllFiles().iterator(); duke@435: duke@435: while (i1.hasNext() && i2.hasNext()) { duke@435: FileList fl1 = (FileList) i1.next(); duke@435: FileList fl2 = (FileList) i2.next(); duke@435: if (!fl1.getName().equals(fl2.getName())) { duke@435: return false; duke@435: } duke@435: } duke@435: duke@435: if (i1.hasNext() != i2.hasNext()) { duke@435: // Different lengths duke@435: return false; duke@435: } duke@435: duke@435: return true; duke@435: } duke@435: duke@435: protected String envVarPrefixedFileName(String fileName, duke@435: int sourceBaseLen, duke@435: DirectoryTree tree, duke@435: Vector preferredPaths, duke@435: Vector filesNotFound, duke@435: Vector filesDuplicate) { duke@435: String fullName = findFileInDirectory(fileName, duke@435: tree, duke@435: preferredPaths, duke@435: filesNotFound, duke@435: filesDuplicate); duke@435: return fullName; duke@435: } duke@435: duke@435: String getProjectName(String fullPath, String extension) duke@435: throws IllegalArgumentException, IOException { duke@435: File file = new File(fullPath).getCanonicalFile(); duke@435: fullPath = file.getCanonicalPath(); duke@435: String parent = file.getParent(); duke@435: duke@435: if (!fullPath.endsWith(extension)) { duke@435: throw new IllegalArgumentException("project file name \"" + duke@435: fullPath + duke@435: "\" does not end in "+extension); duke@435: } duke@435: duke@435: if ((parent != null) && duke@435: (!fullPath.startsWith(parent))) { duke@435: throw new RuntimeException( duke@435: "Internal error: parent of file name \"" + parent + duke@435: "\" does not match file name \"" + fullPath + "\"" duke@435: ); duke@435: } duke@435: duke@435: int len = parent.length(); duke@435: if (!parent.endsWith(Util.sep)) { duke@435: len += Util.sep.length(); duke@435: } duke@435: duke@435: int end = fullPath.length() - extension.length(); duke@435: duke@435: if (len == end) { duke@435: throw new RuntimeException( duke@435: "Internal error: file name was empty" duke@435: ); duke@435: } duke@435: duke@435: return fullPath.substring(len, end); duke@435: } duke@435: duke@435: protected abstract String getProjectExt(); duke@435: duke@435: public void writePlatformSpecificFiles(Database previousDB, duke@435: Database currentDB, String[] args) duke@435: throws IllegalArgumentException, IOException { duke@435: duke@435: parseArguments(args); duke@435: duke@435: String projectFileName = BuildConfig.getFieldString(null, "ProjectFileName"); duke@435: String ext = getProjectExt(); duke@435: duke@435: // Compare contents of allFiles of previousDB and includeDB. duke@435: // If these haven't changed, then skip writing the .vcproj file. duke@435: if (false && databaseAllFilesEqual(previousDB, currentDB) && duke@435: new File(projectFileName).exists()) { duke@435: System.out.println( duke@435: " Databases unchanged; skipping overwrite of "+ext+" file." duke@435: ); duke@435: return; duke@435: } duke@435: duke@435: String projectName = getProjectName(projectFileName, ext); duke@435: duke@435: writeProjectFile(projectFileName, projectName, createAllConfigs()); duke@435: } duke@435: duke@435: protected void writePrologue(String[] args) { duke@435: System.err.println("WinGammaPlatform platform-specific arguments:"); duke@435: for (int i = 0; i < args.length; i++) { duke@435: System.err.print(args[i] + " "); duke@435: } duke@435: System.err.println(); duke@435: } duke@435: duke@435: duke@435: void setInclFileTemplate(FileName val) { duke@435: this.inclFileTemplate = val; duke@435: } duke@435: duke@435: void setGIFileTemplate(FileName val) { duke@435: this.giFileTemplate = val; duke@435: } duke@435: duke@435: duke@435: void parseArguments(String[] args) { duke@435: new ArgsParser(args, duke@435: new ArgRule[] duke@435: { duke@435: new HsArgRule("-sourceBase", duke@435: "SourceBase", duke@435: " (Did you set the HotSpotWorkSpace environment variable?)", duke@435: HsArgHandler.STRING duke@435: ), duke@435: duke@435: new HsArgRule("-buildBase", duke@435: "BuildBase", duke@435: " (Did you set the HotSpotBuildSpace environment variable?)", duke@435: HsArgHandler.STRING duke@435: ), duke@435: duke@435: new HsArgRule("-projectFileName", duke@435: "ProjectFileName", duke@435: null, duke@435: HsArgHandler.STRING duke@435: ), duke@435: duke@435: new HsArgRule("-jdkTargetRoot", duke@435: "JdkTargetRoot", duke@435: " (Did you set the HotSpotJDKDist environment variable?)", duke@435: HsArgHandler.STRING duke@435: ), duke@435: duke@435: new HsArgRule("-compiler", duke@435: "CompilerVersion", duke@435: " (Did you set the VcVersion correctly?)", duke@435: HsArgHandler.STRING duke@435: ), duke@435: duke@435: new HsArgRule("-platform", duke@435: "Platform", duke@435: null, duke@435: HsArgHandler.STRING duke@435: ), duke@435: duke@435: new HsArgRule("-absoluteInclude", duke@435: "AbsoluteInclude", duke@435: null, duke@435: HsArgHandler.VECTOR duke@435: ), duke@435: duke@435: new HsArgRule("-relativeInclude", duke@435: "RelativeInclude", duke@435: null, duke@435: HsArgHandler.VECTOR duke@435: ), duke@435: duke@435: new HsArgRule("-define", duke@435: "Define", duke@435: null, duke@435: HsArgHandler.VECTOR duke@435: ), duke@435: duke@435: new HsArgRule("-useToGeneratePch", duke@435: "UseToGeneratePch", duke@435: null, duke@435: HsArgHandler.STRING duke@435: ), duke@435: duke@435: new ArgRuleSpecific("-perFileLine", duke@435: new HsArgHandler() { duke@435: public void handle(ArgIterator it) { duke@435: String cfg = getCfg(it.get()); duke@435: if (nextNotKey(it)) { duke@435: String fileName = it.get(); duke@435: if (nextNotKey(it)) { duke@435: String line = it.get(); duke@435: BuildConfig.putFieldHash(cfg, "PerFileLine", fileName, line); duke@435: it.next(); duke@435: return; duke@435: } duke@435: } duke@435: empty(null, "** Error: wrong number of args to -perFileLine"); duke@435: } duke@435: } duke@435: ), duke@435: duke@435: new ArgRuleSpecific("-conditionalPerFileLine", duke@435: new HsArgHandler() { duke@435: public void handle(ArgIterator it) { duke@435: String cfg = getCfg(it.get()); duke@435: if (nextNotKey(it)) { duke@435: String fileName = it.get(); duke@435: if (nextNotKey(it)) { duke@435: String productLine = it.get(); duke@435: if (nextNotKey(it)) { duke@435: String debugLine = it.get(); duke@435: BuildConfig.putFieldHash(cfg+"_debug", "CondPerFileLine", duke@435: fileName, debugLine); duke@435: BuildConfig.putFieldHash(cfg+"_product", "CondPerFileLine", duke@435: fileName, productLine); duke@435: it.next(); duke@435: return; duke@435: } duke@435: } duke@435: } duke@435: duke@435: empty(null, "** Error: wrong number of args to -conditionalPerFileLine"); duke@435: } duke@435: } duke@435: ), duke@435: duke@435: new HsArgRule("-disablePch", duke@435: "DisablePch", duke@435: null, duke@435: HsArgHandler.HASH duke@435: ), duke@435: duke@435: new ArgRule("-startAt", duke@435: new HsArgHandler() { duke@435: public void handle(ArgIterator it) { duke@435: if (BuildConfig.getField(null, "StartAt") != null) { duke@435: empty(null, "** Error: multiple -startAt"); duke@435: } duke@435: if (nextNotKey(it)) { duke@435: BuildConfig.putField(null, "StartAt", it.get()); duke@435: it.next(); duke@435: } else { duke@435: empty("-startAt", null); duke@435: } duke@435: } duke@435: } duke@435: ), duke@435: duke@435: new HsArgRule("-ignoreFile", duke@435: "IgnoreFile", duke@435: null, duke@435: HsArgHandler.HASH duke@435: ), duke@435: duke@435: new HsArgRule("-additionalFile", duke@435: "AdditionalFile", duke@435: null, duke@435: HsArgHandler.VECTOR duke@435: ), duke@435: duke@435: new ArgRuleSpecific("-additionalGeneratedFile", duke@435: new HsArgHandler() { duke@435: public void handle(ArgIterator it) { duke@435: String cfg = getCfg(it.get()); duke@435: if (nextNotKey(it)) { duke@435: String dir = it.get(); duke@435: if (nextNotKey(it)) { duke@435: String fileName = it.get(); duke@435: // we ignore files that we know are generated, so we coudn't duke@435: // find them in sources duke@435: BuildConfig.putFieldHash(cfg, "IgnoreFile", fileName, "1"); duke@435: BuildConfig.putFieldHash(cfg, "AdditionalGeneratedFile", duke@435: Util.normalize(dir + Util.sep + fileName), duke@435: fileName); duke@435: it.next(); duke@435: return; duke@435: } duke@435: } duke@435: empty(null, "** Error: wrong number of args to -additionalGeneratedFile"); duke@435: } duke@435: } duke@435: ), duke@435: duke@435: new HsArgRule("-includeDB", duke@435: "IncludeDB", duke@435: null, duke@435: HsArgHandler.STRING duke@435: ), duke@435: duke@435: new ArgRule("-prelink", duke@435: new HsArgHandler() { duke@435: public void handle(ArgIterator it) { duke@435: if (nextNotKey(it)) { duke@435: String build = it.get(); duke@435: if (nextNotKey(it)) { duke@435: String description = it.get(); duke@435: if (nextNotKey(it)) { duke@435: String command = it.get(); duke@435: BuildConfig.putField(null, "PrelinkDescription", description); duke@435: BuildConfig.putField(null, "PrelinkCommand", command); duke@435: it.next(); duke@435: return; duke@435: } duke@435: } duke@435: } duke@435: duke@435: empty(null, "** Error: wrong number of args to -prelink"); duke@435: } duke@435: } duke@435: ) duke@435: }, duke@435: new ArgHandler() { duke@435: public void handle(ArgIterator it) { duke@435: duke@435: throw new RuntimeException("Arg Parser: unrecognized option "+it.get()); duke@435: } duke@435: } duke@435: ); duke@435: if (BuildConfig.getField(null, "SourceBase") == null || duke@435: BuildConfig.getField(null, "BuildBase") == null || duke@435: BuildConfig.getField(null, "ProjectFileName") == null || duke@435: BuildConfig.getField(null, "CompilerVersion") == null) { duke@435: usage(); duke@435: } duke@435: duke@435: if (BuildConfig.getField(null, "UseToGeneratePch") == null) { duke@435: throw new RuntimeException("ERROR: need to specify one file to compute PCH, with -useToGeneratePch flag"); duke@435: } duke@435: duke@435: BuildConfig.putField(null, "PlatformObject", this); duke@435: } duke@435: duke@435: Vector createAllConfigs() { duke@435: Vector allConfigs = new Vector(); duke@435: duke@435: allConfigs.add(new C1DebugConfig()); duke@435: duke@435: boolean b = true; duke@435: if (b) { duke@435: allConfigs.add(new C1FastDebugConfig()); duke@435: allConfigs.add(new C1ProductConfig()); duke@435: duke@435: allConfigs.add(new C2DebugConfig()); duke@435: allConfigs.add(new C2FastDebugConfig()); duke@435: allConfigs.add(new C2ProductConfig()); duke@435: duke@435: allConfigs.add(new TieredDebugConfig()); duke@435: allConfigs.add(new TieredFastDebugConfig()); duke@435: allConfigs.add(new TieredProductConfig()); duke@435: duke@435: allConfigs.add(new CoreDebugConfig()); duke@435: allConfigs.add(new CoreFastDebugConfig()); duke@435: allConfigs.add(new CoreProductConfig()); duke@435: duke@435: allConfigs.add(new KernelDebugConfig()); duke@435: allConfigs.add(new KernelFastDebugConfig()); duke@435: allConfigs.add(new KernelProductConfig()); duke@435: } duke@435: duke@435: return allConfigs; duke@435: } duke@435: duke@435: class FileAttribute { duke@435: int numConfigs; duke@435: Vector configs; duke@435: String shortName; duke@435: boolean noPch, pchRoot; duke@435: duke@435: FileAttribute(String shortName, BuildConfig cfg, int numConfigs) { duke@435: this.shortName = shortName; duke@435: this.noPch = (cfg.lookupHashFieldInContext("DisablePch", shortName) != null); duke@435: this.pchRoot = shortName.equals(BuildConfig.getFieldString(null, "UseToGeneratePch")); duke@435: this.numConfigs = numConfigs; duke@435: duke@435: configs = new Vector(); duke@435: add(cfg.get("Name")); duke@435: } duke@435: duke@435: void add(String confName) { duke@435: configs.add(confName); duke@435: duke@435: // if presented in all configs duke@435: if (configs.size() == numConfigs) { duke@435: configs = null; duke@435: } duke@435: } duke@435: } duke@435: duke@435: class FileInfo implements Comparable { duke@435: String full; duke@435: FileAttribute attr; duke@435: duke@435: FileInfo(String full, FileAttribute attr) { duke@435: this.full = full; duke@435: this.attr = attr; duke@435: } duke@435: duke@435: public int compareTo(Object o) { duke@435: FileInfo oo = (FileInfo)o; duke@435: // Don't squelch identical short file names where the full duke@435: // paths are different duke@435: if (!attr.shortName.equals(oo.attr.shortName)) duke@435: return attr.shortName.compareTo(oo.attr.shortName); duke@435: return full.compareTo(oo.full); duke@435: } duke@435: duke@435: boolean isHeader() { duke@435: return attr.shortName.endsWith(".h") || attr.shortName.endsWith(".hpp"); duke@435: } duke@435: } duke@435: duke@435: duke@435: TreeSet sortFiles(Hashtable allFiles) { duke@435: TreeSet rv = new TreeSet(); duke@435: Enumeration e = allFiles.keys(); duke@435: while (e.hasMoreElements()) { duke@435: String fullPath = (String)e.nextElement(); duke@435: rv.add(new FileInfo(fullPath, (FileAttribute)allFiles.get(fullPath))); duke@435: } duke@435: return rv; duke@435: } duke@435: duke@435: Hashtable computeAttributedFiles(Vector allConfigs) { duke@435: Hashtable ht = new Hashtable(); duke@435: int numConfigs = allConfigs.size(); duke@435: duke@435: for (Iterator i = allConfigs.iterator(); i.hasNext(); ) { duke@435: BuildConfig bc = (BuildConfig)i.next(); duke@435: Hashtable confFiles = (Hashtable)bc.getSpecificField("AllFilesHash"); duke@435: String confName = bc.get("Name"); duke@435: duke@435: for (Enumeration e=confFiles.keys(); e.hasMoreElements(); ) { duke@435: String filePath = (String)e.nextElement(); duke@435: FileAttribute fa = (FileAttribute)ht.get(filePath); duke@435: duke@435: if (fa == null) { duke@435: fa = new FileAttribute((String)confFiles.get(filePath), bc, numConfigs); duke@435: ht.put(filePath, fa); duke@435: } else { duke@435: fa.add(confName); duke@435: } duke@435: } duke@435: } duke@435: duke@435: return ht; duke@435: } duke@435: duke@435: Hashtable computeAttributedFiles(BuildConfig bc) { duke@435: Hashtable ht = new Hashtable(); duke@435: Hashtable confFiles = (Hashtable)bc.getSpecificField("AllFilesHash"); duke@435: duke@435: for (Enumeration e = confFiles.keys(); e.hasMoreElements(); ) { duke@435: String filePath = (String)e.nextElement(); duke@435: ht.put(filePath, new FileAttribute((String)confFiles.get(filePath), bc, 1)); duke@435: } duke@435: duke@435: return ht; duke@435: } duke@435: duke@435: PrintWriter printWriter; duke@435: duke@435: public void writeProjectFile(String projectFileName, String projectName, duke@435: Vector allConfigs) throws IOException { duke@435: throw new RuntimeException("use compiler version specific version"); duke@435: } duke@435: }