src/share/tools/ProjectCreator/WinGammaPlatform.java

Mon, 28 Mar 2011 12:48:08 +0200

author
sla
date
Mon, 28 Mar 2011 12:48:08 +0200
changeset 2675
74e790c48cd4
parent 2540
15d6977f04b0
child 4112
1a9b9cfcef41
permissions
-rw-r--r--

7031571: Generate native VS2010 project files
Reviewed-by: hosterda, stefank, brutisso

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

mercurial