1 /* 2 * Copyright (c) 2005, 2011, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 import java.io.FileWriter; 26 import java.io.IOException; 27 import java.io.PrintWriter; 28 import java.util.Hashtable; 29 import java.util.Iterator; 30 import java.util.TreeSet; 31 import java.util.Vector; 32 33 public class WinGammaPlatformVC7 extends WinGammaPlatform { 34 35 String projectVersion() {return "7.10";}; 36 37 public void writeProjectFile(String projectFileName, String projectName, 38 Vector<BuildConfig> allConfigs) throws IOException { 39 System.out.println(); 40 System.out.println(" Writing .vcproj file: "+projectFileName); 41 // If we got this far without an error, we're safe to actually 42 // write the .vcproj file 43 printWriter = new PrintWriter(new FileWriter(projectFileName)); 44 45 printWriter.println("<?xml version=\"1.0\" encoding=\"windows-1251\"?>"); 46 startTag( 47 "VisualStudioProject", 48 new String[] { 49 "ProjectType", "Visual C++", 50 "Version", projectVersion(), 51 "Name", projectName, 52 "ProjectGUID", "{8822CB5C-1C41-41C2-8493-9F6E1994338B}", 53 "SccProjectName", "", 54 "SccLocalPath", "" 55 } 56 ); 57 startTag("Platforms"); 58 tag("Platform", new String[] {"Name", (String) BuildConfig.getField(null, "PlatformName")}); 59 endTag("Platforms"); 60 61 startTag("Configurations"); 62 63 for (Iterator i = allConfigs.iterator(); i.hasNext(); ) { 64 writeConfiguration((BuildConfig)i.next()); 65 } 66 67 endTag("Configurations"); 68 69 tag("References"); 70 71 writeFiles(allConfigs); 72 73 tag("Globals"); 74 75 endTag("VisualStudioProject"); 76 printWriter.close(); 77 78 System.out.println(" Done."); 79 } 80 81 82 abstract class NameFilter { 83 protected String fname; 84 85 abstract boolean match(FileInfo fi); 86 87 String filterString() { return ""; } 88 String name() { return this.fname;} 89 90 @Override 91 // eclipse auto-generated 92 public int hashCode() { 93 final int prime = 31; 94 int result = 1; 95 result = prime * result + getOuterType().hashCode(); 96 result = prime * result + ((fname == null) ? 0 : fname.hashCode()); 97 return result; 98 } 99 100 @Override 101 // eclipse auto-generated 102 public boolean equals(Object obj) { 103 if (this == obj) 104 return true; 105 if (obj == null) 106 return false; 107 if (getClass() != obj.getClass()) 108 return false; 109 NameFilter other = (NameFilter) obj; 110 if (!getOuterType().equals(other.getOuterType())) 111 return false; 112 if (fname == null) { 113 if (other.fname != null) 114 return false; 115 } else if (!fname.equals(other.fname)) 116 return false; 117 return true; 118 } 119 120 // eclipse auto-generated 121 private WinGammaPlatformVC7 getOuterType() { 122 return WinGammaPlatformVC7.this; 123 } 124 } 125 126 class DirectoryFilter extends NameFilter { 127 String dir; 128 int baseLen, dirLen; 129 130 DirectoryFilter(String dir, String sbase) { 131 this.dir = dir; 132 this.baseLen = sbase.length(); 133 this.dirLen = dir.length(); 134 this.fname = dir; 135 } 136 137 DirectoryFilter(String fname, String dir, String sbase) { 138 this.dir = dir; 139 this.baseLen = sbase.length(); 140 this.dirLen = dir.length(); 141 this.fname = fname; 142 } 143 144 145 boolean match(FileInfo fi) { 146 int lastSlashIndex = fi.full.lastIndexOf('/'); 147 String fullDir = fi.full.substring(0, lastSlashIndex); 148 return fullDir.endsWith(dir); 149 } 150 151 @Override 152 // eclipse auto-generated 153 public int hashCode() { 154 final int prime = 31; 155 int result = super.hashCode(); 156 result = prime * result + getOuterType().hashCode(); 157 result = prime * result + baseLen; 158 result = prime * result + ((dir == null) ? 0 : dir.hashCode()); 159 result = prime * result + dirLen; 160 return result; 161 } 162 163 @Override 164 // eclipse auto-generated 165 public boolean equals(Object obj) { 166 if (this == obj) 167 return true; 168 if (!super.equals(obj)) 169 return false; 170 if (getClass() != obj.getClass()) 171 return false; 172 DirectoryFilter other = (DirectoryFilter) obj; 173 if (!getOuterType().equals(other.getOuterType())) 174 return false; 175 if (baseLen != other.baseLen) 176 return false; 177 if (dir == null) { 178 if (other.dir != null) 179 return false; 180 } else if (!dir.equals(other.dir)) 181 return false; 182 if (dirLen != other.dirLen) 183 return false; 184 return true; 185 } 186 187 // eclipse auto-generated 188 private WinGammaPlatformVC7 getOuterType() { 189 return WinGammaPlatformVC7.this; 190 } 191 } 192 193 class TerminatorFilter extends NameFilter { 194 TerminatorFilter(String fname) { 195 this.fname = fname; 196 197 } 198 boolean match(FileInfo fi) { 199 return true; 200 } 201 202 } 203 204 class SpecificNameFilter extends NameFilter { 205 String pats[]; 206 207 SpecificNameFilter(String fname, String[] pats) { 208 this.fname = fname; 209 this.pats = pats; 210 } 211 212 boolean match(FileInfo fi) { 213 for (int i=0; i<pats.length; i++) { 214 if (fi.attr.shortName.matches(pats[i])) { 215 return true; 216 } 217 } 218 return false; 219 } 220 221 } 222 223 class SpecificPathFilter extends NameFilter { 224 String pats[]; 225 226 SpecificPathFilter(String fname, String[] pats) { 227 this.fname = fname; 228 this.pats = pats; 229 } 230 231 boolean match(FileInfo fi) { 232 for (int i=0; i<pats.length; i++) { 233 if (fi.full.matches(pats[i])) { 234 return true; 235 } 236 } 237 return false; 238 } 239 240 } 241 242 class ContainerFilter extends NameFilter { 243 Vector children; 244 245 ContainerFilter(String fname) { 246 this.fname = fname; 247 children = new Vector(); 248 249 } 250 boolean match(FileInfo fi) { 251 return false; 252 } 253 254 Iterator babies() { return children.iterator(); } 255 256 void add(NameFilter f) { 257 children.add(f); 258 } 259 } 260 261 262 void writeCustomToolConfig(Vector configs, String[] customToolAttrs) { 263 for (Iterator i = configs.iterator(); i.hasNext(); ) { 264 startTag("FileConfiguration", 265 new String[] { 266 "Name", (String)i.next() 267 } 268 ); 269 tag("Tool", customToolAttrs); 270 271 endTag("FileConfiguration"); 272 } 273 } 274 275 // here we define filters, which define layout of what can be seen in 'Solution View' of MSVC 276 // Basically there are two types of entities - container filters and real filters 277 // - container filter just provides a container to group together real filters 278 // - real filter can select elements from the set according to some rule, put it into XML 279 // and remove from the list 280 Vector<NameFilter> makeFilters(TreeSet<FileInfo> files) { 281 Vector<NameFilter> rv = new Vector<NameFilter>(); 282 String sbase = Util.normalize(BuildConfig.getFieldString(null, "SourceBase")+"/src/"); 283 284 String currentDir = ""; 285 DirectoryFilter container = null; 286 for(FileInfo fileInfo : files) { 287 288 if (!fileInfo.full.startsWith(sbase)) { 289 continue; 290 } 291 292 int lastSlash = fileInfo.full.lastIndexOf('/'); 293 String dir = fileInfo.full.substring(sbase.length(), lastSlash); 294 if(dir.equals("share/vm")) { 295 // skip files directly in share/vm - should only be precompiled.hpp which is handled below 296 continue; 297 } 298 if (!dir.equals(currentDir)) { 299 currentDir = dir; 300 if (container != null && !rv.contains(container)) { 301 rv.add(container); 302 } 303 304 // remove "share/vm/" from names 305 String name = dir; 306 if (dir.startsWith("share/vm/")) { 307 name = dir.substring("share/vm/".length(), dir.length()); 308 } 309 DirectoryFilter newfilter = new DirectoryFilter(name, dir, sbase); 310 int i = rv.indexOf(newfilter); 311 if(i == -1) { 312 container = newfilter; 313 } else { 314 // if the filter already exists, reuse it 315 container = (DirectoryFilter) rv.get(i); 316 } 317 } 318 } 319 if (container != null && !rv.contains(container)) { 320 rv.add(container); 321 } 322 323 ContainerFilter generated = new ContainerFilter("Generated"); 324 ContainerFilter c1Generated = new ContainerFilter("C1"); 325 c1Generated.add(new SpecificPathFilter("C++ Interpreter Generated", new String[] {".*compiler1/generated/jvmtifiles/bytecodeInterpreterWithChecks.+"})); 326 c1Generated.add(new SpecificPathFilter("jvmtifiles", new String[] {".*compiler1/generated/jvmtifiles/.*"})); 327 generated.add(c1Generated); 328 ContainerFilter c2Generated = new ContainerFilter("C2"); 329 c2Generated.add(new SpecificPathFilter("C++ Interpreter Generated", new String[] {".*compiler2/generated/jvmtifiles/bytecodeInterpreterWithChecks.+"})); 330 c2Generated.add(new SpecificPathFilter("adfiles", new String[] {".*compiler2/generated/adfiles/.*"})); 331 c2Generated.add(new SpecificPathFilter("jvmtifiles", new String[] {".*compiler2/generated/jvmtifiles/.*"})); 332 generated.add(c2Generated); 333 ContainerFilter coreGenerated = new ContainerFilter("Core"); 334 coreGenerated.add(new SpecificPathFilter("C++ Interpreter Generated", new String[] {".*core/generated/jvmtifiles/bytecodeInterpreterWithChecks.+"})); 335 coreGenerated.add(new SpecificPathFilter("jvmtifiles", new String[] {".*core/generated/jvmtifiles/.*"})); 336 generated.add(coreGenerated); 337 ContainerFilter tieredGenerated = new ContainerFilter("Tiered"); 338 tieredGenerated.add(new SpecificPathFilter("C++ Interpreter Generated", new String[] {".*tiered/generated/jvmtifiles/bytecodeInterpreterWithChecks.+"})); 339 tieredGenerated.add(new SpecificPathFilter("adfiles", new String[] {".*tiered/generated/adfiles/.*"})); 340 tieredGenerated.add(new SpecificPathFilter("jvmtifiles", new String[] {".*tiered/generated/jvmtifiles/.*"})); 341 generated.add(tieredGenerated); 342 ContainerFilter kernelGenerated = new ContainerFilter("Kernel"); 343 kernelGenerated.add(new SpecificPathFilter("C++ Interpreter Generated", new String[] {".*kernel/generated/jvmtifiles/bytecodeInterpreterWithChecks.+"})); 344 kernelGenerated.add(new SpecificPathFilter("jvmtifiles", new String[] {".*kernel/generated/jvmtifiles/.*"})); 345 generated.add(kernelGenerated); 346 rv.add(generated); 347 348 rv.add(new SpecificNameFilter("Precompiled Header", new String[] {"precompiled.hpp"})); 349 350 // this one is to catch files not caught by other filters 351 rv.add(new TerminatorFilter("Source Files")); 352 353 return rv; 354 } 355 356 void writeFiles(Vector<BuildConfig> allConfigs) { 357 358 Hashtable allFiles = computeAttributedFiles(allConfigs); 359 360 Vector allConfigNames = new Vector(); 361 for (Iterator i = allConfigs.iterator(); i.hasNext(); ) { 362 allConfigNames.add(((BuildConfig)i.next()).get("Name")); 363 } 364 365 TreeSet sortedFiles = sortFiles(allFiles); 366 367 startTag("Files"); 368 369 for (Iterator i = makeFilters(sortedFiles).iterator(); i.hasNext(); ) { 370 doWriteFiles(sortedFiles, allConfigNames, (NameFilter)i.next()); 371 } 372 373 374 startTag("Filter", 375 new String[] { 376 "Name", "Resource Files", 377 "Filter", "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe" 378 } 379 ); 380 endTag("Filter"); 381 382 endTag("Files"); 383 } 384 385 void doWriteFiles(TreeSet allFiles, Vector allConfigNames, NameFilter filter) { 386 startTag("Filter", 387 new String[] { 388 "Name", filter.name(), 389 "Filter", filter.filterString() 390 } 391 ); 392 393 if (filter instanceof ContainerFilter) { 394 395 Iterator i = ((ContainerFilter)filter).babies(); 396 while (i.hasNext()) { 397 doWriteFiles(allFiles, allConfigNames, (NameFilter)i.next()); 398 } 399 400 } else { 401 402 Iterator i = allFiles.iterator(); 403 while (i.hasNext()) { 404 FileInfo fi = (FileInfo)i.next(); 405 406 if (!filter.match(fi)) { 407 continue; 408 } 409 410 startTag("File", 411 new String[] { 412 "RelativePath", fi.full.replace('/', '\\') 413 } 414 ); 415 416 FileAttribute a = fi.attr; 417 if (a.pchRoot) { 418 writeCustomToolConfig(allConfigNames, 419 new String[] { 420 "Name", "VCCLCompilerTool", 421 "UsePrecompiledHeader", "1" 422 }); 423 } 424 425 if (a.noPch) { 426 writeCustomToolConfig(allConfigNames, 427 new String[] { 428 "Name", "VCCLCompilerTool", 429 "UsePrecompiledHeader", "0" 430 }); 431 } 432 433 if (a.configs != null) { 434 for (Iterator j=allConfigNames.iterator(); j.hasNext();) { 435 String cfg = (String)j.next(); 436 if (!a.configs.contains(cfg)) { 437 startTag("FileConfiguration", 438 new String[] { 439 "Name", cfg, 440 "ExcludedFromBuild", "TRUE" 441 }); 442 endTag("FileConfiguration"); 443 444 } 445 } 446 } 447 448 endTag("File"); 449 450 // we not gonna look at this file anymore 451 i.remove(); 452 } 453 } 454 455 endTag("Filter"); 456 } 457 458 459 void writeConfiguration(BuildConfig cfg) { 460 startTag("Configuration", 461 new String[] { 462 "Name", cfg.get("Name"), 463 "OutputDirectory", cfg.get("OutputDir"), 464 "IntermediateDirectory", cfg.get("OutputDir"), 465 "ConfigurationType", "2", 466 "UseOfMFC", "0", 467 "ATLMinimizesCRunTimeLibraryUsage", "FALSE" 468 } 469 ); 470 471 472 473 tagV("Tool", cfg.getV("CompilerFlags")); 474 475 tag("Tool", 476 new String[] { 477 "Name", "VCCustomBuildTool" 478 } 479 ); 480 481 tagV("Tool", cfg.getV("LinkerFlags")); 482 483 tag("Tool", 484 new String[] { 485 "Name", "VCPostBuildEventTool", 486 "Description", BuildConfig.getFieldString(null, "PostbuildDescription"), 487 //Caution: String.replace(String,String) is available from JDK5 onwards only 488 "CommandLine", cfg.expandFormat(BuildConfig.getFieldString(null, "PostbuildCommand").replace 489 ("\t", "
")) 490 } 491 ); 492 493 tag("Tool", 494 new String[] { 495 "Name", "VCPreBuildEventTool" 496 } 497 ); 498 499 tag("Tool", 500 new String[] { 501 "Name", "VCPreLinkEventTool", 502 "Description", BuildConfig.getFieldString(null, "PrelinkDescription"), 503 //Caution: String.replace(String,String) is available from JDK5 onwards only 504 "CommandLine", cfg.expandFormat(BuildConfig.getFieldString(null, "PrelinkCommand").replace 505 ("\t", "
")) 506 } 507 ); 508 509 tag("Tool", 510 new String[] { 511 "Name", "VCResourceCompilerTool", 512 // XXX??? 513 "PreprocessorDefinitions", "NDEBUG", 514 "Culture", "1033" 515 } 516 ); 517 518 tag("Tool", 519 new String[] { 520 "Name", "VCMIDLTool", 521 "PreprocessorDefinitions", "NDEBUG", 522 "MkTypLibCompatible", "TRUE", 523 "SuppressStartupBanner", "TRUE", 524 "TargetEnvironment", "1", 525 "TypeLibraryName", cfg.get("OutputDir") + Util.sep + "vm.tlb", 526 "HeaderFileName", "" 527 } 528 ); 529 530 endTag("Configuration"); 531 } 532 533 int indent; 534 535 private void startTagPrim(String name, 536 String[] attrs, 537 boolean close) { 538 startTagPrim(name, attrs, close, true); 539 } 540 541 private void startTagPrim(String name, 542 String[] attrs, 543 boolean close, 544 boolean newline) { 545 doIndent(); 546 printWriter.print("<"+name); 547 indent++; 548 549 if (attrs != null && attrs.length > 0) { 550 for (int i=0; i<attrs.length; i+=2) { 551 printWriter.print(" " + attrs[i]+"=\""+attrs[i+1]+"\""); 552 if (i < attrs.length - 2) { 553 } 554 } 555 } 556 557 if (close) { 558 indent--; 559 printWriter.print(" />"); 560 } else { 561 printWriter.print(">"); 562 } 563 if(newline) { 564 printWriter.println(); 565 } 566 } 567 568 void startTag(String name, String... attrs) { 569 startTagPrim(name, attrs, false); 570 } 571 572 void startTagV(String name, Vector attrs) { 573 String s[] = new String [attrs.size()]; 574 for (int i=0; i<attrs.size(); i++) { 575 s[i] = (String)attrs.elementAt(i); 576 } 577 startTagPrim(name, s, false); 578 } 579 580 void endTag(String name) { 581 indent--; 582 doIndent(); 583 printWriter.println("</"+name+">"); 584 } 585 586 void tag(String name, String... attrs) { 587 startTagPrim(name, attrs, true); 588 } 589 590 void tagData(String name, String data) { 591 doIndent(); 592 printWriter.print("<"+name+">"); 593 printWriter.print(data); 594 printWriter.println("</"+name+">"); 595 } 596 597 void tagData(String name, String data, String... attrs) { 598 startTagPrim(name, attrs, false, false); 599 printWriter.print(data); 600 printWriter.println("</"+name+">"); 601 indent--; 602 } 603 604 void tagV(String name, Vector attrs) { 605 String s[] = new String [attrs.size()]; 606 for (int i=0; i<attrs.size(); i++) { 607 s[i] = (String)attrs.elementAt(i); 608 } 609 startTagPrim(name, s, true); 610 } 611 612 613 void doIndent() { 614 for (int i=0; i<indent; i++) { 615 printWriter.print(" "); 616 } 617 } 618 619 protected String getProjectExt() { 620 return ".vcproj"; 621 } 622 } 623 624 class CompilerInterfaceVC7 extends CompilerInterface { 625 void getBaseCompilerFlags_common(Vector defines, Vector includes, String outDir,Vector rv) { 626 627 // advanced M$ IDE (2003) can only recognize name if it's first or 628 // second attribute in the tag - go guess 629 addAttr(rv, "Name", "VCCLCompilerTool"); 630 addAttr(rv, "AdditionalIncludeDirectories", Util.join(",", includes)); 631 addAttr(rv, "PreprocessorDefinitions", 632 Util.join(";", defines).replace("\"",""")); 633 addAttr(rv, "PrecompiledHeaderThrough", "precompiled.hpp"); 634 addAttr(rv, "PrecompiledHeaderFile", outDir+Util.sep+"vm.pch"); 635 addAttr(rv, "AssemblerListingLocation", outDir); 636 addAttr(rv, "ObjectFile", outDir+Util.sep); 637 addAttr(rv, "ProgramDataBaseFileName", outDir+Util.sep+"jvm.pdb"); 638 // Set /nologo optin 639 addAttr(rv, "SuppressStartupBanner", "TRUE"); 640 // Surpass the default /Tc or /Tp. 0 is compileAsDefault 641 addAttr(rv, "CompileAs", "0"); 642 // Set /W3 option. 3 is warningLevel_3 643 addAttr(rv, "WarningLevel", "3"); 644 // Set /WX option, 645 addAttr(rv, "WarnAsError", "TRUE"); 646 // Set /GS option 647 addAttr(rv, "BufferSecurityCheck", "FALSE"); 648 // Set /Zi option. 3 is debugEnabled 649 addAttr(rv, "DebugInformationFormat", "3"); 650 } 651 Vector getBaseCompilerFlags(Vector defines, Vector includes, String outDir) { 652 Vector rv = new Vector(); 653 654 getBaseCompilerFlags_common(defines,includes, outDir, rv); 655 // Set /Yu option. 3 is pchUseUsingSpecific 656 // Note: Starting VC8 pchUseUsingSpecific is 2 !!! 657 addAttr(rv, "UsePrecompiledHeader", "3"); 658 // Set /EHsc- option 659 addAttr(rv, "ExceptionHandling", "FALSE"); 660 661 return rv; 662 } 663 664 Vector getBaseLinkerFlags(String outDir, String outDll, String platformName) { 665 Vector rv = new Vector(); 666 667 addAttr(rv, "Name", "VCLinkerTool"); 668 addAttr(rv, "AdditionalOptions", 669 "/export:JNI_GetDefaultJavaVMInitArgs " + 670 "/export:JNI_CreateJavaVM " + 671 "/export:JVM_FindClassFromBootLoader "+ 672 "/export:JNI_GetCreatedJavaVMs "+ 673 "/export:jio_snprintf /export:jio_printf "+ 674 "/export:jio_fprintf /export:jio_vfprintf "+ 675 "/export:jio_vsnprintf "+ 676 "/export:JVM_GetVersionInfo "+ 677 "/export:JVM_GetThreadStateNames "+ 678 "/export:JVM_GetThreadStateValues "+ 679 "/export:JVM_InitAgentProperties "); 680 addAttr(rv, "AdditionalDependencies", "Wsock32.lib winmm.lib"); 681 addAttr(rv, "OutputFile", outDll); 682 // Set /INCREMENTAL option. 1 is linkIncrementalNo 683 addAttr(rv, "LinkIncremental", "1"); 684 addAttr(rv, "SuppressStartupBanner", "TRUE"); 685 addAttr(rv, "ModuleDefinitionFile", outDir+Util.sep+"vm.def"); 686 addAttr(rv, "ProgramDatabaseFile", outDir+Util.sep+"jvm.pdb"); 687 // Set /SUBSYSTEM option. 2 is subSystemWindows 688 addAttr(rv, "SubSystem", "2"); 689 addAttr(rv, "BaseAddress", "0x8000000"); 690 addAttr(rv, "ImportLibrary", outDir+Util.sep+"jvm.lib"); 691 if(platformName.equals("Win32")) { 692 // Set /MACHINE option. 1 is X86 693 addAttr(rv, "TargetMachine", "1"); 694 } else { 695 // Set /MACHINE option. 17 is X64 696 addAttr(rv, "TargetMachine", "17"); 697 } 698 699 return rv; 700 } 701 702 void getDebugCompilerFlags_common(String opt,Vector rv) { 703 704 // Set /On option 705 addAttr(rv, "Optimization", opt); 706 // Set /FR option. 1 is brAllInfo 707 addAttr(rv, "BrowseInformation", "1"); 708 addAttr(rv, "BrowseInformationFile", "$(IntDir)" + Util.sep); 709 // Set /MD option. 2 is rtMultiThreadedDLL 710 addAttr(rv, "RuntimeLibrary", "2"); 711 // Set /Oy- option 712 addAttr(rv, "OmitFramePointers", "FALSE"); 713 714 } 715 716 Vector getDebugCompilerFlags(String opt) { 717 Vector rv = new Vector(); 718 719 getDebugCompilerFlags_common(opt,rv); 720 721 return rv; 722 } 723 724 Vector getDebugLinkerFlags() { 725 Vector rv = new Vector(); 726 727 addAttr(rv, "GenerateDebugInformation", "TRUE"); // == /DEBUG option 728 729 return rv; 730 } 731 732 void getAdditionalNonKernelLinkerFlags(Vector rv) { 733 extAttr(rv, "AdditionalOptions", 734 "/export:AsyncGetCallTrace "); 735 } 736 737 void getProductCompilerFlags_common(Vector rv) { 738 // Set /O2 option. 2 is optimizeMaxSpeed 739 addAttr(rv, "Optimization", "2"); 740 // Set /Oy- option 741 addAttr(rv, "OmitFramePointers", "FALSE"); 742 // Set /Ob option. 1 is expandOnlyInline 743 addAttr(rv, "InlineFunctionExpansion", "1"); 744 // Set /GF option. 745 addAttr(rv, "StringPooling", "TRUE"); 746 // Set /MD option. 2 is rtMultiThreadedDLL 747 addAttr(rv, "RuntimeLibrary", "2"); 748 // Set /Gy option 749 addAttr(rv, "EnableFunctionLevelLinking", "TRUE"); 750 } 751 752 Vector getProductCompilerFlags() { 753 Vector rv = new Vector(); 754 755 getProductCompilerFlags_common(rv); 756 757 return rv; 758 } 759 760 Vector getProductLinkerFlags() { 761 Vector rv = new Vector(); 762 763 // Set /OPT:REF option. 2 is optReferences 764 addAttr(rv, "OptimizeReferences", "2"); 765 // Set /OPT:optFolding option. 2 is optFolding 766 addAttr(rv, "EnableCOMDATFolding", "2"); 767 768 return rv; 769 } 770 771 String getOptFlag() { 772 return "2"; 773 } 774 775 String getNoOptFlag() { 776 return "0"; 777 } 778 779 String makeCfgName(String flavourBuild, String platform) { 780 return flavourBuild + "|" + platform; 781 } 782 }