src/share/tools/MakeDeps/WinGammaPlatform.java

Sat, 01 Dec 2007 00:00:00 +0000

author
duke
date
Sat, 01 Dec 2007 00:00:00 +0000
changeset 435
a61af66fc99e
child 1907
c18cbe5936b8
permissions
-rw-r--r--

Initial load

     1 /*
     2  * Copyright 1999-2007 Sun Microsystems, Inc.  All Rights Reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
    20  * CA 95054 USA or visit www.sun.com if you need additional information or
    21  * have any questions.
    22  *
    23  */
    25 import java.io.*;
    26 import java.util.*;
    28 abstract class HsArgHandler extends ArgHandler {
    29     static final int STRING = 1;
    30     static final int VECTOR = 2;
    31     static final int HASH   = 3;
    33     boolean nextNotKey(ArgIterator it) {
    34         if (it.next()) {
    35             String s = it.get();
    36             return (s.length() == 0) || (s.charAt(0) != '-');
    37         } else {
    38             return false;
    39         }
    40     }
    42     void empty(String key, String message) {
    43         if (key != null) {
    44             System.err.println("** Error: empty " + key);
    45         }
    46         if (message != null) {
    47             System.err.println(message);
    48         }
    49         WinGammaPlatform.usage();
    50     }
    52     static String getCfg(String val) {
    53         int under = val.indexOf('_');
    54         int len = val.length();
    55         if (under != -1 && under < len - 1) {
    56             return val.substring(under+1, len);
    57         } else {
    58             return null;
    59         }
    60     }
    61 }
    63 class ArgRuleSpecific extends ArgRule {
    64     ArgRuleSpecific(String arg, ArgHandler handler) {
    65         super(arg, handler);
    66     }
    68     boolean match(String rulePattern, String arg) {
    69         return rulePattern.startsWith(arg);
    70     }
    71 }
    74 class SpecificHsArgHandler extends HsArgHandler {
    76     String message, argKey, valKey;
    77     int type;
    79     public void handle(ArgIterator it) {
    80         String cfg = getCfg(it.get());
    81         if (nextNotKey(it)) {
    82             String val = it.get();
    83             switch (type) {
    84             case VECTOR:
    85                 BuildConfig.addFieldVector(cfg, valKey, val);
    86                 break;
    87             case HASH:
    88                 BuildConfig.putFieldHash(cfg, valKey, val, "1");
    89                 break;
    90             case STRING:
    91                 BuildConfig.putField(cfg, valKey, val);
    92                 break;
    93             default:
    94                 empty(valKey, "Unknown type: "+type);
    95             }
    96             it.next();
    98         } else {
    99             empty(argKey, message);
   100         }
   101     }
   103     SpecificHsArgHandler(String argKey, String valKey, String message, int type) {
   104         this.argKey = argKey;
   105         this.valKey = valKey;
   106         this.message = message;
   107         this.type = type;
   108     }
   109 }
   112 class HsArgRule extends ArgRuleSpecific {
   114     HsArgRule(String argKey, String valKey, String message, int type) {
   115         super(argKey, new SpecificHsArgHandler(argKey, valKey, message, type));
   116     }
   118 }
   120 public abstract class WinGammaPlatform extends Platform {
   121     public void setupFileTemplates() {
   122         inclFileTemplate = new FileName(this,
   123             "incls\\", "_", "",                      ".incl", "", ""
   124         );
   125         giFileTemplate = new FileName(this,
   126             "incls\\", "",  "_precompiled", ".incl", "", ""
   127         );
   128         gdFileTemplate = new FileName(this,
   129             "", "",  "Dependencies",         "",      "", ""
   130         );
   131     }
   133     private static String[] suffixes = { ".cpp", ".c" };
   135     public String[] outerSuffixes() {
   136         return suffixes;
   137     }
   139     public String objFileSuffix() {
   140         return ".obj";
   141     }
   143     public String asmFileSuffix() {
   144         return ".i";
   145     }
   147     public String dependentPrefix() {
   148         return "$(VM_PATH)";
   149     }
   151     public boolean includeGIInEachIncl() {
   152         return false;
   153     }
   155     public boolean fileNameStringEquality(String s1, String s2) {
   156         return s1.equalsIgnoreCase(s2);
   157     }
   159     static void usage() throws IllegalArgumentException {
   160         System.err.println("WinGammaPlatform platform-specific options:");
   161         System.err.println("  -sourceBase <path to directory (workspace) " +
   162                            "containing source files; no trailing slash>");
   163         System.err.println("  -projectFileName <full pathname to which project file " +
   164                            "will be written; all parent directories must " +
   165                            "already exist>");
   166         System.err.println("  If any of the above are specified, "+
   167                            "they must all be.");
   168         System.err.println("  Additional, optional arguments, which can be " +
   169                            "specified multiple times:");
   170         System.err.println("    -absoluteInclude <string containing absolute " +
   171                            "path to include directory>");
   172         System.err.println("    -relativeInclude <string containing include " +
   173                            "directory relative to -sourceBase>");
   174         System.err.println("    -define <preprocessor flag to be #defined " +
   175                            "(note: doesn't yet support " +
   176                            "#define (flag) (value))>");
   177         System.err.println("    -startAt <subdir of sourceBase>");
   178         System.err.println("    -additionalFile <file not in database but " +
   179                            "which should show up in project file, like " +
   180                            "includeDB_core>");
   181         System.err.println("    -additionalGeneratedFile <absolute path to " +
   182                            "directory containing file; no trailing slash> " +
   183                            "<name of file generated later in the build process>");
   184         throw new IllegalArgumentException();
   185     }
   188     public void addPerFileLine(Hashtable table,
   189                                String fileName,
   190                                String line) {
   191         Vector v = (Vector) table.get(fileName);
   192         if (v != null) {
   193             v.add(line);
   194         } else {
   195             v = new Vector();
   196             v.add(line);
   197             table.put(fileName, v);
   198         }
   199     }
   201     protected static class PerFileCondData {
   202         public String releaseString;
   203         public String debugString;
   204     }
   206     protected void addConditionalPerFileLine(Hashtable table,
   207                                            String fileName,
   208                                            String releaseLine,
   209                                            String debugLine) {
   210         PerFileCondData data = new PerFileCondData();
   211         data.releaseString = releaseLine;
   212         data.debugString = debugLine;
   213         Vector v = (Vector) table.get(fileName);
   214         if (v != null) {
   215             v.add(data);
   216         } else {
   217             v = new Vector();
   218             v.add(data);
   219             table.put(fileName, v);
   220         }
   221     }
   223     protected static class PrelinkCommandData {
   224       String description;
   225       String commands;
   226     }
   228     protected void addPrelinkCommand(Hashtable table,
   229                                      String build,
   230                                      String description,
   231                                      String commands) {
   232       PrelinkCommandData data = new PrelinkCommandData();
   233       data.description = description;
   234       data.commands = commands;
   235       table.put(build, data);
   236     }
   238     public boolean findString(Vector v, String s) {
   239         for (Iterator iter = v.iterator(); iter.hasNext(); ) {
   240             if (((String) iter.next()).equals(s)) {
   241                 return true;
   242             }
   243         }
   245         return false;
   246     }
   248     /* This returns a String containing the full path to the passed
   249        file name, or null if an error occurred. If the file was not
   250        found or was a duplicate and couldn't be resolved using the
   251        preferred paths, the file name is added to the appropriate
   252        Vector of Strings. */
   253     private String findFileInDirectory(String fileName,
   254                                        DirectoryTree directory,
   255                                        Vector preferredPaths,
   256                                        Vector filesNotFound,
   257                                        Vector filesDuplicate) {
   258         List locationsInTree = directory.findFile(fileName);
   259         int  rootNameLength = directory.getRootNodeName().length();
   260         String name = null;
   261         if ((locationsInTree == null) ||
   262             (locationsInTree.size() == 0)) {
   263             filesNotFound.add(fileName);
   264         } else if (locationsInTree.size() > 1) {
   265             // We shouldn't have duplicate file names in our workspace.
   266             System.err.println();
   267             System.err.println("There are multiple files named as: " + fileName);
   268             System.exit(-1);
   269             // The following code could be safely removed if we don't need duplicate
   270             // file names.
   272             // Iterate through them, trying to find one with a
   273             // preferred path
   274         search:
   275             {
   276                 for (Iterator locIter = locationsInTree.iterator();
   277                      locIter.hasNext(); ) {
   278                     DirectoryTreeNode node =
   279                         (DirectoryTreeNode) locIter.next();
   280                     String tmpName = node.getName();
   281                     for (Iterator prefIter = preferredPaths.iterator();
   282                          prefIter.hasNext(); ) {
   283                         // We need to make sure the preferred path is
   284                         // found from the file path not including the root node name.
   285                         if (tmpName.indexOf((String)prefIter.next(),
   286                                             rootNameLength) != -1) {
   287                             name = tmpName;
   288                             break search;
   289                         }
   290                     }
   291                 }
   292             }
   294             if (name == null) {
   295                 filesDuplicate.add(fileName);
   296             }
   297         } else {
   298             name = ((DirectoryTreeNode) locationsInTree.get(0)).getName();
   299         }
   301         return name;
   302     }
   304     protected boolean databaseAllFilesEqual(Database previousDB,
   305                                             Database currentDB) {
   306         Iterator i1 = previousDB.getAllFiles().iterator();
   307         Iterator i2 = currentDB.getAllFiles().iterator();
   309         while (i1.hasNext() && i2.hasNext()) {
   310             FileList fl1 = (FileList) i1.next();
   311             FileList fl2 = (FileList) i2.next();
   312             if (!fl1.getName().equals(fl2.getName())) {
   313                 return false;
   314             }
   315         }
   317         if (i1.hasNext() != i2.hasNext()) {
   318             // Different lengths
   319             return false;
   320         }
   322         return true;
   323     }
   325     protected String envVarPrefixedFileName(String fileName,
   326                                             int sourceBaseLen,
   327                                             DirectoryTree tree,
   328                                             Vector preferredPaths,
   329                                             Vector filesNotFound,
   330                                             Vector filesDuplicate) {
   331         String fullName = findFileInDirectory(fileName,
   332                                               tree,
   333                                               preferredPaths,
   334                                               filesNotFound,
   335                                               filesDuplicate);
   336         return fullName;
   337     }
   339      String getProjectName(String fullPath, String extension)
   340         throws IllegalArgumentException, IOException {
   341         File file = new File(fullPath).getCanonicalFile();
   342         fullPath = file.getCanonicalPath();
   343         String parent = file.getParent();
   345         if (!fullPath.endsWith(extension)) {
   346             throw new IllegalArgumentException("project file name \"" +
   347                                                fullPath +
   348                                                "\" does not end in "+extension);
   349         }
   351         if ((parent != null) &&
   352             (!fullPath.startsWith(parent))) {
   353             throw new RuntimeException(
   354                 "Internal error: parent of file name \"" + parent +
   355                 "\" does not match file name \"" + fullPath + "\""
   356             );
   357         }
   359         int len = parent.length();
   360         if (!parent.endsWith(Util.sep)) {
   361             len += Util.sep.length();
   362         }
   364         int end = fullPath.length() - extension.length();
   366         if (len == end) {
   367             throw new RuntimeException(
   368                 "Internal error: file name was empty"
   369             );
   370         }
   372         return fullPath.substring(len, end);
   373     }
   375     protected abstract String getProjectExt();
   377     public void writePlatformSpecificFiles(Database previousDB,
   378                                            Database currentDB, String[] args)
   379         throws IllegalArgumentException, IOException {
   381         parseArguments(args);
   383         String projectFileName = BuildConfig.getFieldString(null, "ProjectFileName");
   384         String ext = getProjectExt();
   386         // Compare contents of allFiles of previousDB and includeDB.
   387         // If these haven't changed, then skip writing the .vcproj file.
   388         if (false && databaseAllFilesEqual(previousDB, currentDB) &&
   389             new File(projectFileName).exists()) {
   390             System.out.println(
   391                                "    Databases unchanged; skipping overwrite of "+ext+" file."
   392                                );
   393             return;
   394         }
   396         String projectName = getProjectName(projectFileName, ext);
   398         writeProjectFile(projectFileName, projectName, createAllConfigs());
   399     }
   401     protected void writePrologue(String[] args) {
   402         System.err.println("WinGammaPlatform platform-specific arguments:");
   403         for (int i = 0; i < args.length; i++) {
   404             System.err.print(args[i] + " ");
   405         }
   406         System.err.println();
   407     }
   410     void setInclFileTemplate(FileName val) {
   411         this.inclFileTemplate = val;
   412     }
   414     void setGIFileTemplate(FileName val) {
   415         this.giFileTemplate = val;
   416     }
   419     void parseArguments(String[] args) {
   420         new ArgsParser(args,
   421                        new ArgRule[]
   422             {
   423                 new HsArgRule("-sourceBase",
   424                               "SourceBase",
   425                               "   (Did you set the HotSpotWorkSpace environment variable?)",
   426                               HsArgHandler.STRING
   427                               ),
   429                 new HsArgRule("-buildBase",
   430                               "BuildBase",
   431                               "   (Did you set the HotSpotBuildSpace environment variable?)",
   432                               HsArgHandler.STRING
   433                               ),
   435                 new HsArgRule("-projectFileName",
   436                               "ProjectFileName",
   437                               null,
   438                               HsArgHandler.STRING
   439                               ),
   441                 new HsArgRule("-jdkTargetRoot",
   442                               "JdkTargetRoot",
   443                               "   (Did you set the HotSpotJDKDist environment variable?)",
   444                               HsArgHandler.STRING
   445                               ),
   447                 new HsArgRule("-compiler",
   448                               "CompilerVersion",
   449                               "   (Did you set the VcVersion correctly?)",
   450                               HsArgHandler.STRING
   451                               ),
   453                 new HsArgRule("-platform",
   454                               "Platform",
   455                               null,
   456                               HsArgHandler.STRING
   457                               ),
   459                 new HsArgRule("-absoluteInclude",
   460                               "AbsoluteInclude",
   461                               null,
   462                               HsArgHandler.VECTOR
   463                               ),
   465                 new HsArgRule("-relativeInclude",
   466                               "RelativeInclude",
   467                               null,
   468                               HsArgHandler.VECTOR
   469                               ),
   471                 new HsArgRule("-define",
   472                               "Define",
   473                               null,
   474                               HsArgHandler.VECTOR
   475                               ),
   477                 new HsArgRule("-useToGeneratePch",
   478                               "UseToGeneratePch",
   479                               null,
   480                               HsArgHandler.STRING
   481                               ),
   483                 new ArgRuleSpecific("-perFileLine",
   484                             new HsArgHandler() {
   485                                 public void handle(ArgIterator it) {
   486                                     String cfg = getCfg(it.get());
   487                                     if (nextNotKey(it)) {
   488                                         String fileName = it.get();
   489                                         if (nextNotKey(it)) {
   490                                             String line = it.get();
   491                                             BuildConfig.putFieldHash(cfg, "PerFileLine", fileName, line);
   492                                             it.next();
   493                                             return;
   494                                         }
   495                                     }
   496                                     empty(null, "** Error: wrong number of args to -perFileLine");
   497                                 }
   498                             }
   499                             ),
   501                 new ArgRuleSpecific("-conditionalPerFileLine",
   502                             new HsArgHandler() {
   503                                 public void handle(ArgIterator it) {
   504                                     String cfg = getCfg(it.get());
   505                                     if (nextNotKey(it)) {
   506                                         String fileName = it.get();
   507                                         if (nextNotKey(it)) {
   508                                             String productLine = it.get();
   509                                             if (nextNotKey(it)) {
   510                                                 String debugLine = it.get();
   511                                                 BuildConfig.putFieldHash(cfg+"_debug", "CondPerFileLine",
   512                                                                          fileName, debugLine);
   513                                                 BuildConfig.putFieldHash(cfg+"_product", "CondPerFileLine",
   514                                                                          fileName, productLine);
   515                                                 it.next();
   516                                                 return;
   517                                             }
   518                                         }
   519                                     }
   521                                     empty(null, "** Error: wrong number of args to -conditionalPerFileLine");
   522                                 }
   523                             }
   524                             ),
   526                 new HsArgRule("-disablePch",
   527                               "DisablePch",
   528                               null,
   529                               HsArgHandler.HASH
   530                               ),
   532                 new ArgRule("-startAt",
   533                             new HsArgHandler() {
   534                                 public void handle(ArgIterator it) {
   535                                     if (BuildConfig.getField(null, "StartAt") != null) {
   536                                         empty(null, "** Error: multiple -startAt");
   537                                     }
   538                                     if (nextNotKey(it)) {
   539                                         BuildConfig.putField(null, "StartAt", it.get());
   540                                         it.next();
   541                                     } else {
   542                                         empty("-startAt", null);
   543                                     }
   544                                 }
   545                             }
   546                             ),
   548                 new HsArgRule("-ignoreFile",
   549                                       "IgnoreFile",
   550                                       null,
   551                                       HsArgHandler.HASH
   552                                       ),
   554                 new HsArgRule("-additionalFile",
   555                               "AdditionalFile",
   556                               null,
   557                               HsArgHandler.VECTOR
   558                               ),
   560                 new ArgRuleSpecific("-additionalGeneratedFile",
   561                             new HsArgHandler() {
   562                                 public void handle(ArgIterator it) {
   563                                     String cfg = getCfg(it.get());
   564                                     if (nextNotKey(it)) {
   565                                         String dir = it.get();
   566                                         if (nextNotKey(it)) {
   567                                             String fileName = it.get();
   568                                             // we ignore files that we know are generated, so we coudn't
   569                                             // find them in sources
   570                                             BuildConfig.putFieldHash(cfg, "IgnoreFile",  fileName, "1");
   571                                             BuildConfig.putFieldHash(cfg, "AdditionalGeneratedFile",
   572                                                                      Util.normalize(dir + Util.sep + fileName),
   573                                                                      fileName);
   574                                             it.next();
   575                                             return;
   576                                         }
   577                                     }
   578                                     empty(null, "** Error: wrong number of args to -additionalGeneratedFile");
   579                                 }
   580                             }
   581                             ),
   583                 new HsArgRule("-includeDB",
   584                               "IncludeDB",
   585                               null,
   586                               HsArgHandler.STRING
   587                               ),
   589                 new ArgRule("-prelink",
   590                             new HsArgHandler() {
   591                                 public void handle(ArgIterator it) {
   592                                     if (nextNotKey(it)) {
   593                                         String build = it.get();
   594                                         if (nextNotKey(it)) {
   595                                             String description = it.get();
   596                                             if (nextNotKey(it)) {
   597                                                 String command = it.get();
   598                                                 BuildConfig.putField(null, "PrelinkDescription", description);
   599                                                 BuildConfig.putField(null, "PrelinkCommand", command);
   600                                                 it.next();
   601                                                 return;
   602                                             }
   603                                         }
   604                                     }
   606                                     empty(null,  "** Error: wrong number of args to -prelink");
   607                                 }
   608                             }
   609                             )
   610             },
   611                                        new ArgHandler() {
   612                                            public void handle(ArgIterator it) {
   614                                                throw new RuntimeException("Arg Parser: unrecognized option "+it.get());
   615                                            }
   616                                        }
   617                                        );
   618         if (BuildConfig.getField(null, "SourceBase") == null      ||
   619             BuildConfig.getField(null, "BuildBase") == null       ||
   620             BuildConfig.getField(null, "ProjectFileName") == null ||
   621             BuildConfig.getField(null, "CompilerVersion") == null) {
   622             usage();
   623         }
   625         if (BuildConfig.getField(null, "UseToGeneratePch") == null) {
   626             throw new RuntimeException("ERROR: need to specify one file to compute PCH, with -useToGeneratePch flag");
   627         }
   629         BuildConfig.putField(null, "PlatformObject", this);
   630     }
   632     Vector createAllConfigs() {
   633         Vector allConfigs = new Vector();
   635         allConfigs.add(new C1DebugConfig());
   637         boolean b = true;
   638         if (b) {
   639             allConfigs.add(new C1FastDebugConfig());
   640             allConfigs.add(new C1ProductConfig());
   642             allConfigs.add(new C2DebugConfig());
   643             allConfigs.add(new C2FastDebugConfig());
   644             allConfigs.add(new C2ProductConfig());
   646             allConfigs.add(new TieredDebugConfig());
   647             allConfigs.add(new TieredFastDebugConfig());
   648             allConfigs.add(new TieredProductConfig());
   650             allConfigs.add(new CoreDebugConfig());
   651             allConfigs.add(new CoreFastDebugConfig());
   652             allConfigs.add(new CoreProductConfig());
   654             allConfigs.add(new KernelDebugConfig());
   655             allConfigs.add(new KernelFastDebugConfig());
   656             allConfigs.add(new KernelProductConfig());
   657         }
   659         return allConfigs;
   660     }
   662     class FileAttribute {
   663         int     numConfigs;
   664         Vector  configs;
   665         String  shortName;
   666         boolean noPch, pchRoot;
   668         FileAttribute(String shortName, BuildConfig cfg, int numConfigs) {
   669             this.shortName = shortName;
   670             this.noPch =  (cfg.lookupHashFieldInContext("DisablePch", shortName) != null);
   671             this.pchRoot = shortName.equals(BuildConfig.getFieldString(null, "UseToGeneratePch"));
   672             this.numConfigs = numConfigs;
   674             configs = new Vector();
   675             add(cfg.get("Name"));
   676         }
   678         void add(String confName) {
   679             configs.add(confName);
   681             // if presented in all configs
   682             if (configs.size() == numConfigs) {
   683                 configs = null;
   684             }
   685         }
   686     }
   688     class FileInfo implements Comparable {
   689         String        full;
   690         FileAttribute attr;
   692         FileInfo(String full, FileAttribute  attr) {
   693             this.full = full;
   694             this.attr = attr;
   695         }
   697         public int compareTo(Object o) {
   698             FileInfo oo = (FileInfo)o;
   699             // Don't squelch identical short file names where the full
   700             // paths are different
   701             if (!attr.shortName.equals(oo.attr.shortName))
   702               return attr.shortName.compareTo(oo.attr.shortName);
   703             return full.compareTo(oo.full);
   704         }
   706         boolean isHeader() {
   707             return attr.shortName.endsWith(".h") || attr.shortName.endsWith(".hpp");
   708         }
   709     }
   712     TreeSet sortFiles(Hashtable allFiles) {
   713         TreeSet rv = new TreeSet();
   714         Enumeration e = allFiles.keys();
   715         while (e.hasMoreElements()) {
   716             String fullPath = (String)e.nextElement();
   717             rv.add(new FileInfo(fullPath, (FileAttribute)allFiles.get(fullPath)));
   718         }
   719         return rv;
   720     }
   722     Hashtable computeAttributedFiles(Vector allConfigs) {
   723         Hashtable ht = new Hashtable();
   724         int numConfigs = allConfigs.size();
   726         for (Iterator i = allConfigs.iterator(); i.hasNext(); ) {
   727             BuildConfig bc = (BuildConfig)i.next();
   728             Hashtable  confFiles = (Hashtable)bc.getSpecificField("AllFilesHash");
   729             String confName = bc.get("Name");
   731             for (Enumeration e=confFiles.keys(); e.hasMoreElements(); ) {
   732                 String filePath = (String)e.nextElement();
   733                 FileAttribute fa = (FileAttribute)ht.get(filePath);
   735                 if (fa == null) {
   736                     fa = new FileAttribute((String)confFiles.get(filePath), bc, numConfigs);
   737                     ht.put(filePath, fa);
   738                 } else {
   739                     fa.add(confName);
   740                 }
   741             }
   742         }
   744         return ht;
   745     }
   747      Hashtable computeAttributedFiles(BuildConfig bc) {
   748         Hashtable ht = new Hashtable();
   749         Hashtable confFiles = (Hashtable)bc.getSpecificField("AllFilesHash");
   751         for (Enumeration e = confFiles.keys(); e.hasMoreElements(); ) {
   752             String filePath = (String)e.nextElement();
   753             ht.put(filePath,  new FileAttribute((String)confFiles.get(filePath), bc, 1));
   754         }
   756         return ht;
   757     }
   759     PrintWriter printWriter;
   761     public void writeProjectFile(String projectFileName, String projectName,
   762                                  Vector allConfigs) throws IOException {
   763         throw new RuntimeException("use compiler version specific version");
   764     }
   765 }

mercurial