src/share/tools/ProjectCreator/WinGammaPlatformVC7.java

Print this page
rev 3265 : 0000000: Updated projectcreator
Summary: Refactoring
Reviewed-by:
Contributed-by: nils.eliasson@oracle.com

*** 23,35 **** */ import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; ! import java.util.Hashtable; ! import java.util.Iterator; ! import java.util.TreeSet; import java.util.Vector; public class WinGammaPlatformVC7 extends WinGammaPlatform { String projectVersion() {return "7.10";}; --- 23,33 ---- */ import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; ! import java.nio.file.FileSystems; import java.util.Vector; public class WinGammaPlatformVC7 extends WinGammaPlatform { String projectVersion() {return "7.10";};
*** 40,622 **** System.out.println(" Writing .vcproj file: "+projectFileName); // If we got this far without an error, we're safe to actually // write the .vcproj file printWriter = new PrintWriter(new FileWriter(projectFileName)); ! printWriter.println("<?xml version=\"1.0\" encoding=\"windows-1251\"?>"); ! startTag( ! "VisualStudioProject", ! new String[] { ! "ProjectType", "Visual C++", ! "Version", projectVersion(), ! "Name", projectName, "ProjectGUID", "{8822CB5C-1C41-41C2-8493-9F6E1994338B}", ! "SccProjectName", "", ! "SccLocalPath", "" ! } ! ); startTag("Platforms"); ! tag("Platform", new String[] {"Name", (String) BuildConfig.getField(null, "PlatformName")}); ! endTag("Platforms"); startTag("Configurations"); ! for (Iterator i = allConfigs.iterator(); i.hasNext(); ) { ! writeConfiguration((BuildConfig)i.next()); } ! endTag("Configurations"); tag("References"); writeFiles(allConfigs); tag("Globals"); ! endTag("VisualStudioProject"); printWriter.close(); System.out.println(" Done."); } ! ! abstract class NameFilter { ! protected String fname; ! ! abstract boolean match(FileInfo fi); ! ! String filterString() { return ""; } ! String name() { return this.fname;} ! ! @Override ! // eclipse auto-generated ! public int hashCode() { ! final int prime = 31; ! int result = 1; ! result = prime * result + getOuterType().hashCode(); ! result = prime * result + ((fname == null) ? 0 : fname.hashCode()); ! return result; ! } ! ! @Override ! // eclipse auto-generated ! public boolean equals(Object obj) { ! if (this == obj) ! return true; ! if (obj == null) ! return false; ! if (getClass() != obj.getClass()) ! return false; ! NameFilter other = (NameFilter) obj; ! if (!getOuterType().equals(other.getOuterType())) ! return false; ! if (fname == null) { ! if (other.fname != null) ! return false; ! } else if (!fname.equals(other.fname)) ! return false; ! return true; ! } ! ! // eclipse auto-generated ! private WinGammaPlatformVC7 getOuterType() { ! return WinGammaPlatformVC7.this; ! } ! } ! ! class DirectoryFilter extends NameFilter { ! String dir; ! int baseLen, dirLen; ! ! DirectoryFilter(String dir, String sbase) { ! this.dir = dir; ! this.baseLen = sbase.length(); ! this.dirLen = dir.length(); ! this.fname = dir; ! } ! ! DirectoryFilter(String fname, String dir, String sbase) { ! this.dir = dir; ! this.baseLen = sbase.length(); ! this.dirLen = dir.length(); ! this.fname = fname; ! } ! ! ! boolean match(FileInfo fi) { ! int lastSlashIndex = fi.full.lastIndexOf('/'); ! String fullDir = fi.full.substring(0, lastSlashIndex); ! return fullDir.endsWith(dir); ! } ! ! @Override ! // eclipse auto-generated ! public int hashCode() { ! final int prime = 31; ! int result = super.hashCode(); ! result = prime * result + getOuterType().hashCode(); ! result = prime * result + baseLen; ! result = prime * result + ((dir == null) ? 0 : dir.hashCode()); ! result = prime * result + dirLen; ! return result; ! } ! ! @Override ! // eclipse auto-generated ! public boolean equals(Object obj) { ! if (this == obj) ! return true; ! if (!super.equals(obj)) ! return false; ! if (getClass() != obj.getClass()) ! return false; ! DirectoryFilter other = (DirectoryFilter) obj; ! if (!getOuterType().equals(other.getOuterType())) ! return false; ! if (baseLen != other.baseLen) ! return false; ! if (dir == null) { ! if (other.dir != null) ! return false; ! } else if (!dir.equals(other.dir)) ! return false; ! if (dirLen != other.dirLen) ! return false; ! return true; ! } ! ! // eclipse auto-generated ! private WinGammaPlatformVC7 getOuterType() { ! return WinGammaPlatformVC7.this; ! } ! } ! ! class TerminatorFilter extends NameFilter { ! TerminatorFilter(String fname) { ! this.fname = fname; ! ! } ! boolean match(FileInfo fi) { ! return true; ! } ! ! } ! ! class SpecificNameFilter extends NameFilter { ! String pats[]; ! ! SpecificNameFilter(String fname, String[] pats) { ! this.fname = fname; ! this.pats = pats; ! } ! ! boolean match(FileInfo fi) { ! for (int i=0; i<pats.length; i++) { ! if (fi.attr.shortName.matches(pats[i])) { ! return true; ! } ! } ! return false; ! } ! ! } ! ! class SpecificPathFilter extends NameFilter { ! String pats[]; ! ! SpecificPathFilter(String fname, String[] pats) { ! this.fname = fname; ! this.pats = pats; ! } ! ! boolean match(FileInfo fi) { ! for (int i=0; i<pats.length; i++) { ! if (fi.full.matches(pats[i])) { ! return true; ! } ! } ! return false; ! } ! ! } ! ! class ContainerFilter extends NameFilter { ! Vector children; ! ! ContainerFilter(String fname) { ! this.fname = fname; ! children = new Vector(); ! ! } ! boolean match(FileInfo fi) { ! return false; ! } ! ! Iterator babies() { return children.iterator(); } ! ! void add(NameFilter f) { ! children.add(f); ! } ! } ! ! ! void writeCustomToolConfig(Vector configs, String[] customToolAttrs) { ! for (Iterator i = configs.iterator(); i.hasNext(); ) { startTag("FileConfiguration", ! new String[] { ! "Name", (String)i.next() ! } ! ); tag("Tool", customToolAttrs); ! endTag("FileConfiguration"); } } - // here we define filters, which define layout of what can be seen in 'Solution View' of MSVC - // Basically there are two types of entities - container filters and real filters - // - container filter just provides a container to group together real filters - // - real filter can select elements from the set according to some rule, put it into XML - // and remove from the list - Vector<NameFilter> makeFilters(TreeSet<FileInfo> files) { - Vector<NameFilter> rv = new Vector<NameFilter>(); - String sbase = Util.normalize(BuildConfig.getFieldString(null, "SourceBase")+"/src/"); - - String currentDir = ""; - DirectoryFilter container = null; - for(FileInfo fileInfo : files) { - - if (!fileInfo.full.startsWith(sbase)) { - continue; - } - - int lastSlash = fileInfo.full.lastIndexOf('/'); - String dir = fileInfo.full.substring(sbase.length(), lastSlash); - if(dir.equals("share/vm")) { - // skip files directly in share/vm - should only be precompiled.hpp which is handled below - continue; - } - if (!dir.equals(currentDir)) { - currentDir = dir; - if (container != null && !rv.contains(container)) { - rv.add(container); - } - - // remove "share/vm/" from names - String name = dir; - if (dir.startsWith("share/vm/")) { - name = dir.substring("share/vm/".length(), dir.length()); - } - DirectoryFilter newfilter = new DirectoryFilter(name, dir, sbase); - int i = rv.indexOf(newfilter); - if(i == -1) { - container = newfilter; - } else { - // if the filter already exists, reuse it - container = (DirectoryFilter) rv.get(i); - } - } - } - if (container != null && !rv.contains(container)) { - rv.add(container); - } - - ContainerFilter generated = new ContainerFilter("Generated"); - ContainerFilter c1Generated = new ContainerFilter("C1"); - c1Generated.add(new SpecificPathFilter("C++ Interpreter Generated", new String[] {".*compiler1/generated/jvmtifiles/bytecodeInterpreterWithChecks.+"})); - c1Generated.add(new SpecificPathFilter("jvmtifiles", new String[] {".*compiler1/generated/jvmtifiles/.*"})); - generated.add(c1Generated); - ContainerFilter c2Generated = new ContainerFilter("C2"); - c2Generated.add(new SpecificPathFilter("C++ Interpreter Generated", new String[] {".*compiler2/generated/jvmtifiles/bytecodeInterpreterWithChecks.+"})); - c2Generated.add(new SpecificPathFilter("adfiles", new String[] {".*compiler2/generated/adfiles/.*"})); - c2Generated.add(new SpecificPathFilter("jvmtifiles", new String[] {".*compiler2/generated/jvmtifiles/.*"})); - generated.add(c2Generated); - ContainerFilter coreGenerated = new ContainerFilter("Core"); - coreGenerated.add(new SpecificPathFilter("C++ Interpreter Generated", new String[] {".*core/generated/jvmtifiles/bytecodeInterpreterWithChecks.+"})); - coreGenerated.add(new SpecificPathFilter("jvmtifiles", new String[] {".*core/generated/jvmtifiles/.*"})); - generated.add(coreGenerated); - ContainerFilter tieredGenerated = new ContainerFilter("Tiered"); - tieredGenerated.add(new SpecificPathFilter("C++ Interpreter Generated", new String[] {".*tiered/generated/jvmtifiles/bytecodeInterpreterWithChecks.+"})); - tieredGenerated.add(new SpecificPathFilter("adfiles", new String[] {".*tiered/generated/adfiles/.*"})); - tieredGenerated.add(new SpecificPathFilter("jvmtifiles", new String[] {".*tiered/generated/jvmtifiles/.*"})); - generated.add(tieredGenerated); - ContainerFilter kernelGenerated = new ContainerFilter("Kernel"); - kernelGenerated.add(new SpecificPathFilter("C++ Interpreter Generated", new String[] {".*kernel/generated/jvmtifiles/bytecodeInterpreterWithChecks.+"})); - kernelGenerated.add(new SpecificPathFilter("jvmtifiles", new String[] {".*kernel/generated/jvmtifiles/.*"})); - generated.add(kernelGenerated); - rv.add(generated); - - rv.add(new SpecificNameFilter("Precompiled Header", new String[] {"precompiled.hpp"})); - - // this one is to catch files not caught by other filters - rv.add(new TerminatorFilter("Source Files")); - - return rv; - } - void writeFiles(Vector<BuildConfig> allConfigs) { ! Hashtable allFiles = computeAttributedFiles(allConfigs); ! ! Vector allConfigNames = new Vector(); ! for (Iterator i = allConfigs.iterator(); i.hasNext(); ) { ! allConfigNames.add(((BuildConfig)i.next()).get("Name")); ! } ! ! TreeSet sortedFiles = sortFiles(allFiles); ! startTag("Files"); ! for (Iterator i = makeFilters(sortedFiles).iterator(); i.hasNext(); ) { ! doWriteFiles(sortedFiles, allConfigNames, (NameFilter)i.next()); ! } ! ! startTag("Filter", ! new String[] { ! "Name", "Resource Files", ! "Filter", "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe" } - ); - endTag("Filter"); ! endTag("Files"); ! } ! void doWriteFiles(TreeSet allFiles, Vector allConfigNames, NameFilter filter) { ! startTag("Filter", ! new String[] { ! "Name", filter.name(), ! "Filter", filter.filterString() ! } ! ); ! ! if (filter instanceof ContainerFilter) { ! ! Iterator i = ((ContainerFilter)filter).babies(); ! while (i.hasNext()) { ! doWriteFiles(allFiles, allConfigNames, (NameFilter)i.next()); ! } ! } else { ! ! Iterator i = allFiles.iterator(); ! while (i.hasNext()) { ! FileInfo fi = (FileInfo)i.next(); ! ! if (!filter.match(fi)) { ! continue; ! } ! ! startTag("File", ! new String[] { ! "RelativePath", fi.full.replace('/', '\\') ! } ! ); ! ! FileAttribute a = fi.attr; ! if (a.pchRoot) { ! writeCustomToolConfig(allConfigNames, ! new String[] { ! "Name", "VCCLCompilerTool", ! "UsePrecompiledHeader", "1" ! }); ! } ! ! if (a.noPch) { ! writeCustomToolConfig(allConfigNames, ! new String[] { ! "Name", "VCCLCompilerTool", ! "UsePrecompiledHeader", "0" ! }); ! } ! ! if (a.configs != null) { ! for (Iterator j=allConfigNames.iterator(); j.hasNext();) { ! String cfg = (String)j.next(); ! if (!a.configs.contains(cfg)) { ! startTag("FileConfiguration", ! new String[] { ! "Name", cfg, ! "ExcludedFromBuild", "TRUE" ! }); ! endTag("FileConfiguration"); ! } ! } } ! endTag("File"); ! ! // we not gonna look at this file anymore ! i.remove(); } } - - endTag("Filter"); } - void writeConfiguration(BuildConfig cfg) { ! startTag("Configuration", ! new String[] { ! "Name", cfg.get("Name"), "OutputDirectory", cfg.get("OutputDir"), "IntermediateDirectory", cfg.get("OutputDir"), ! "ConfigurationType", "2", ! "UseOfMFC", "0", ! "ATLMinimizesCRunTimeLibraryUsage", "FALSE" ! } ! ); ! ! tagV("Tool", cfg.getV("CompilerFlags")); ! tag("Tool", ! new String[] { ! "Name", "VCCustomBuildTool" ! } ! ); tagV("Tool", cfg.getV("LinkerFlags")); tag("Tool", new String[] { ! "Name", "VCPostBuildEventTool", ! "Description", BuildConfig.getFieldString(null, "PostbuildDescription"), ! //Caution: String.replace(String,String) is available from JDK5 onwards only ! "CommandLine", cfg.expandFormat(BuildConfig.getFieldString(null, "PostbuildCommand").replace ! ("\t", "&#x0D;&#x0A;")) ! } ! ); ! ! tag("Tool", ! new String[] { ! "Name", "VCPreBuildEventTool" ! } ! ); ! ! tag("Tool", ! new String[] { ! "Name", "VCPreLinkEventTool", ! "Description", BuildConfig.getFieldString(null, "PrelinkDescription"), ! //Caution: String.replace(String,String) is available from JDK5 onwards only ! "CommandLine", cfg.expandFormat(BuildConfig.getFieldString(null, "PrelinkCommand").replace ! ("\t", "&#x0D;&#x0A;")) ! } ! ); ! ! tag("Tool", ! new String[] { ! "Name", "VCResourceCompilerTool", ! // XXX??? ! "PreprocessorDefinitions", "NDEBUG", ! "Culture", "1033" ! } ! ); tag("Tool", new String[] { ! "Name", "VCMIDLTool", ! "PreprocessorDefinitions", "NDEBUG", ! "MkTypLibCompatible", "TRUE", ! "SuppressStartupBanner", "TRUE", ! "TargetEnvironment", "1", ! "TypeLibraryName", cfg.get("OutputDir") + Util.sep + "vm.tlb", ! "HeaderFileName", "" ! } ! ); ! ! endTag("Configuration"); ! } ! ! int indent; ! ! private void startTagPrim(String name, ! String[] attrs, ! boolean close) { ! startTagPrim(name, attrs, close, true); ! } ! ! private void startTagPrim(String name, ! String[] attrs, ! boolean close, ! boolean newline) { ! doIndent(); ! printWriter.print("<"+name); ! indent++; ! ! if (attrs != null && attrs.length > 0) { ! for (int i=0; i<attrs.length; i+=2) { ! printWriter.print(" " + attrs[i]+"=\""+attrs[i+1]+"\""); ! if (i < attrs.length - 2) { ! } ! } ! } ! ! if (close) { ! indent--; ! printWriter.print(" />"); ! } else { ! printWriter.print(">"); ! } ! if(newline) { ! printWriter.println(); ! } ! } ! ! void startTag(String name, String... attrs) { ! startTagPrim(name, attrs, false); ! } ! void startTagV(String name, Vector attrs) { ! String s[] = new String [attrs.size()]; ! for (int i=0; i<attrs.size(); i++) { ! s[i] = (String)attrs.elementAt(i); ! } ! startTagPrim(name, s, false); } - void endTag(String name) { - indent--; - doIndent(); - printWriter.println("</"+name+">"); - } - void tag(String name, String... attrs) { - startTagPrim(name, attrs, true); - } - - void tagData(String name, String data) { - doIndent(); - printWriter.print("<"+name+">"); - printWriter.print(data); - printWriter.println("</"+name+">"); - } - - void tagData(String name, String data, String... attrs) { - startTagPrim(name, attrs, false, false); - printWriter.print(data); - printWriter.println("</"+name+">"); - indent--; - } - - void tagV(String name, Vector attrs) { - String s[] = new String [attrs.size()]; - for (int i=0; i<attrs.size(); i++) { - s[i] = (String)attrs.elementAt(i); - } - startTagPrim(name, s, true); - } - - - void doIndent() { - for (int i=0; i<indent; i++) { - printWriter.print(" "); - } - } protected String getProjectExt() { return ".vcproj"; } } --- 38,184 ---- System.out.println(" Writing .vcproj file: "+projectFileName); // If we got this far without an error, we're safe to actually // write the .vcproj file printWriter = new PrintWriter(new FileWriter(projectFileName)); ! printWriter ! .println("<?xml version=\"1.0\" encoding=\"windows-1251\"?>"); ! startTag("VisualStudioProject", new String[] { "ProjectType", ! "Visual C++", "Version", projectVersion(), "Name", projectName, "ProjectGUID", "{8822CB5C-1C41-41C2-8493-9F6E1994338B}", ! "SccProjectName", "", "SccLocalPath", "" }); startTag("Platforms"); ! tag("Platform", ! new String[] { "Name", ! (String) BuildConfig.getField(null, "PlatformName") }); ! endTag(); startTag("Configurations"); ! for (BuildConfig cfg : allConfigs) { ! writeConfiguration(cfg); } ! endTag(); tag("References"); writeFiles(allConfigs); tag("Globals"); ! endTag(); printWriter.close(); System.out.println(" Done."); } ! void writeCustomToolConfig(Vector<BuildConfig> configs, String[] customToolAttrs) { ! for (BuildConfig cfg : configs) { startTag("FileConfiguration", ! new String[] { "Name", (String) cfg.get("Name") }); tag("Tool", customToolAttrs); ! endTag(); } } void writeFiles(Vector<BuildConfig> allConfigs) { ! // This code assummes there are no config specific includes. startTag("Files"); + String sourceBase = BuildConfig.getFieldString(null, "SourceBase"); ! // Use first config for all global absolute includes. ! BuildConfig baseConfig = allConfigs.firstElement(); ! Vector<String> rv = new Vector<String>(); ! // Then use first config for all relative includes ! Vector<String> ri = new Vector<String>(); ! baseConfig.collectRelevantVectors(ri, "RelativeSrcInclude"); ! for (String f : ri) { ! rv.add(sourceBase + Util.sep + f); } ! baseConfig.collectRelevantVectors(rv, "AbsoluteSrcInclude"); ! handleIncludes(rv, allConfigs); ! startTag("Filter", new String[] { "Name", "Resource Files", "Filter", ! "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe" }); ! endTag(); ! endTag(); } ! // Will visit file tree for each include ! private void handleIncludes(Vector<String> includes, Vector<BuildConfig> allConfigs) { ! for (String path : includes) { ! FileTreeCreatorVC7 ftc = new FileTreeCreatorVC7(FileSystems.getDefault().getPath(path) , allConfigs, this); ! try { ! ftc.writeFileTree(); ! } catch (IOException e) { ! e.printStackTrace(); } } } void writeConfiguration(BuildConfig cfg) { ! startTag("Configuration", new String[] { "Name", cfg.get("Name"), "OutputDirectory", cfg.get("OutputDir"), "IntermediateDirectory", cfg.get("OutputDir"), ! "ConfigurationType", "2", "UseOfMFC", "0", ! "ATLMinimizesCRunTimeLibraryUsage", "FALSE" }); tagV("Tool", cfg.getV("CompilerFlags")); ! tag("Tool", new String[] { "Name", "VCCustomBuildTool" }); tagV("Tool", cfg.getV("LinkerFlags")); tag("Tool", new String[] { ! "Name", ! "VCPostBuildEventTool", ! "Description", ! BuildConfig ! .getFieldString(null, "PostbuildDescription"), ! // Caution: String.replace(String,String) is available ! // from JDK5 onwards only ! "CommandLine", ! cfg.expandFormat(BuildConfig.getFieldString(null, ! "PostbuildCommand").replace("\t", ! "&#x0D;&#x0A;")) }); ! ! tag("Tool", new String[] { "Name", "VCPreBuildEventTool" }); tag("Tool", new String[] { ! "Name", ! "VCPreLinkEventTool", ! "Description", ! BuildConfig.getFieldString(null, "PrelinkDescription"), ! // Caution: String.replace(String,String) is available ! // from JDK5 onwards only ! "CommandLine", ! cfg.expandFormat(BuildConfig.getFieldString(null, ! "PrelinkCommand").replace("\t", "&#x0D;&#x0A;")) }); ! ! tag("Tool", new String[] { "Name", "VCResourceCompilerTool", ! "PreprocessorDefinitions", "NDEBUG", "Culture", "1033" }); ! ! tag("Tool", new String[] { "Name", "VCMIDLTool", ! "PreprocessorDefinitions", "NDEBUG", "MkTypLibCompatible", ! "TRUE", "SuppressStartupBanner", "TRUE", "TargetEnvironment", ! "1", "TypeLibraryName", ! cfg.get("OutputDir") + Util.sep + "vm.tlb", "HeaderFileName", ! "" }); ! endTag(); } protected String getProjectExt() { return ".vcproj"; } }