src/share/tools/ProjectCreator/WinGammaPlatformVC7.java
Print this page
rev 3265 : projectcreator
@@ -23,13 +23,11 @@
*/
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.nio.file.FileSystems;
import java.util.Vector;
public class WinGammaPlatformVC7 extends WinGammaPlatform {
String projectVersion() {return "7.10";};
@@ -40,583 +38,147 @@
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,
+ 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", ""
- }
- );
+ "SccProjectName", "", "SccLocalPath", "" });
startTag("Platforms");
- tag("Platform", new String[] {"Name", (String) BuildConfig.getField(null, "PlatformName")});
- endTag("Platforms");
+ tag("Platform",
+ new String[] { "Name",
+ (String) BuildConfig.getField(null, "PlatformName") });
+ endTag();
startTag("Configurations");
- for (Iterator i = allConfigs.iterator(); i.hasNext(); ) {
- writeConfiguration((BuildConfig)i.next());
+ for (BuildConfig cfg : allConfigs) {
+ writeConfiguration(cfg);
}
- endTag("Configurations");
+ endTag();
tag("References");
writeFiles(allConfigs);
tag("Globals");
- endTag("VisualStudioProject");
+ endTag();
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(); ) {
+ void writeCustomToolConfig(Vector<BuildConfig> configs, String[] customToolAttrs) {
+ for (BuildConfig cfg : configs) {
startTag("FileConfiguration",
- new String[] {
- "Name", (String)i.next()
- }
- );
+ new String[] { "Name", (String) cfg.get("Name") });
tag("Tool", customToolAttrs);
- endTag("FileConfiguration");
+ endTag();
}
}
- // 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);
-
+ // This code assummes there are no config specific includes.
startTag("Files");
+ String sourceBase = BuildConfig.getFieldString(null, "SourceBase");
- for (Iterator i = makeFilters(sortedFiles).iterator(); i.hasNext(); ) {
- doWriteFiles(sortedFiles, allConfigNames, (NameFilter)i.next());
- }
-
+ // Use first config for all global absolute includes.
+ BuildConfig baseConfig = allConfigs.firstElement();
+ Vector<String> rv = new Vector<String>();
- startTag("Filter",
- new String[] {
- "Name", "Resource Files",
- "Filter", "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"
+ // 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);
}
- );
- endTag("Filter");
- endTag("Files");
- }
+ baseConfig.collectRelevantVectors(rv, "AbsoluteSrcInclude");
- 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());
- }
+ handleIncludes(rv, allConfigs);
- } 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");
+ startTag("Filter", new String[] { "Name", "Resource Files", "Filter",
+ "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe" });
+ endTag();
- }
- }
+ endTag();
}
- endTag("File");
-
- // we not gonna look at this file anymore
- i.remove();
+ // 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();
}
}
-
- endTag("Filter");
}
-
void writeConfiguration(BuildConfig cfg) {
- startTag("Configuration",
- new String[] {
- "Name", cfg.get("Name"),
+ startTag("Configuration", new String[] { "Name", cfg.get("Name"),
"OutputDirectory", cfg.get("OutputDir"),
"IntermediateDirectory", cfg.get("OutputDir"),
- "ConfigurationType", "2",
- "UseOfMFC", "0",
- "ATLMinimizesCRunTimeLibraryUsage", "FALSE"
- }
- );
-
-
+ "ConfigurationType", "2", "UseOfMFC", "0",
+ "ATLMinimizesCRunTimeLibraryUsage", "FALSE" });
tagV("Tool", cfg.getV("CompilerFlags"));
- tag("Tool",
- new String[] {
- "Name", "VCCustomBuildTool"
- }
- );
+ 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", "
"))
- }
- );
-
- 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", "
"))
- }
- );
-
- tag("Tool",
- new String[] {
- "Name", "VCResourceCompilerTool",
- // XXX???
- "PreprocessorDefinitions", "NDEBUG",
- "Culture", "1033"
- }
- );
+ "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",
+ "
")) });
+
+ tag("Tool", new String[] { "Name", "VCPreBuildEventTool" });
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);
- }
+ "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", "
")) });
+
+ 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",
+ "" });
- 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);
+ endTag();
}
- 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";
}
}