src/share/tools/ProjectCreator/WinGammaPlatformVC10.java

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

*** 1,18 **** import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; ! import java.util.Hashtable; import java.util.Iterator; ! import java.util.TreeSet; import java.util.UUID; import java.util.Vector; public class WinGammaPlatformVC10 extends WinGammaPlatformVC7 { @Override protected String getProjectExt() { return ".vcxproj"; } --- 1,22 ---- import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; ! import java.nio.file.FileSystems; import java.util.Iterator; ! import java.util.LinkedList; import java.util.UUID; import java.util.Vector; public class WinGammaPlatformVC10 extends WinGammaPlatformVC7 { + + LinkedList <String>filters = new LinkedList<String>(); + LinkedList <String[]>filterDeps = new LinkedList<String[]>(); + @Override protected String getProjectExt() { return ".vcxproj"; }
*** 35,73 **** for (BuildConfig cfg : allConfigs) { startTag("ProjectConfiguration", "Include", cfg.get("Name")); tagData("Configuration", cfg.get("Id")); tagData("Platform", cfg.get("PlatformName")); ! endTag("ProjectConfiguration"); } ! endTag("ItemGroup"); startTag("PropertyGroup", "Label", "Globals"); tagData("ProjectGuid", "{8822CB5C-1C41-41C2-8493-9F6E1994338B}"); tag("SccProjectName"); tag("SccLocalPath"); ! endTag("PropertyGroup"); tag("Import", "Project", "$(VCTargetsPath)\\Microsoft.Cpp.Default.props"); for (BuildConfig cfg : allConfigs) { startTag(cfg, "PropertyGroup", "Label", "Configuration"); tagData("ConfigurationType", "DynamicLibrary"); tagData("UseOfMfc", "false"); ! endTag("PropertyGroup"); } tag("Import", "Project", "$(VCTargetsPath)\\Microsoft.Cpp.props"); startTag("ImportGroup", "Label", "ExtensionSettings"); ! endTag("ImportGroup"); for (BuildConfig cfg : allConfigs) { startTag(cfg, "ImportGroup", "Label", "PropertySheets"); tag("Import", "Project", "$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props", "Condition", "exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')", "Label", "LocalAppDataPlatform"); ! endTag("ImportGroup"); } tag("PropertyGroup", "Label", "UserMacros"); startTag("PropertyGroup"); --- 39,77 ---- for (BuildConfig cfg : allConfigs) { startTag("ProjectConfiguration", "Include", cfg.get("Name")); tagData("Configuration", cfg.get("Id")); tagData("Platform", cfg.get("PlatformName")); ! endTag(); } ! endTag(); startTag("PropertyGroup", "Label", "Globals"); tagData("ProjectGuid", "{8822CB5C-1C41-41C2-8493-9F6E1994338B}"); tag("SccProjectName"); tag("SccLocalPath"); ! endTag(); tag("Import", "Project", "$(VCTargetsPath)\\Microsoft.Cpp.Default.props"); for (BuildConfig cfg : allConfigs) { startTag(cfg, "PropertyGroup", "Label", "Configuration"); tagData("ConfigurationType", "DynamicLibrary"); tagData("UseOfMfc", "false"); ! endTag(); } tag("Import", "Project", "$(VCTargetsPath)\\Microsoft.Cpp.props"); startTag("ImportGroup", "Label", "ExtensionSettings"); ! endTag(); for (BuildConfig cfg : allConfigs) { startTag(cfg, "ImportGroup", "Label", "PropertySheets"); tag("Import", "Project", "$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props", "Condition", "exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')", "Label", "LocalAppDataPlatform"); ! endTag(); } tag("PropertyGroup", "Label", "UserMacros"); startTag("PropertyGroup");
*** 80,121 **** for (BuildConfig cfg : allConfigs) { tagData(cfg, "CodeAnalysisRuleSet", "AllRules.ruleset"); tag(cfg, "CodeAnalysisRules"); tag(cfg, "CodeAnalysisRuleAssemblies"); } ! endTag("PropertyGroup"); for (BuildConfig cfg : allConfigs) { startTag(cfg, "ItemDefinitionGroup"); startTag("ClCompile"); tagV(cfg.getV("CompilerFlags")); ! endTag("ClCompile"); startTag("Link"); tagV(cfg.getV("LinkerFlags")); ! endTag("Link"); startTag("PostBuildEvent"); tagData("Message", BuildConfig.getFieldString(null, "PostbuildDescription")); tagData("Command", cfg.expandFormat(BuildConfig.getFieldString(null, "PostbuildCommand").replace("\t", "\r\n"))); ! endTag("PostBuildEvent"); startTag("PreLinkEvent"); tagData("Message", BuildConfig.getFieldString(null, "PrelinkDescription")); tagData("Command", cfg.expandFormat(BuildConfig.getFieldString(null, "PrelinkCommand").replace("\t", "\r\n"))); ! endTag("PreLinkEvent"); ! endTag("ItemDefinitionGroup"); } writeFiles(allConfigs, projDir); tag("Import", "Project", "$(VCTargetsPath)\\Microsoft.Cpp.targets"); startTag("ImportGroup", "Label", "ExtensionTargets"); ! endTag("ImportGroup"); ! endTag("Project"); printWriter.close(); System.out.println(" Done."); writeFilterFile(projectFileName, projectName, allConfigs, projDir); writeUserFile(projectFileName, allConfigs); --- 84,125 ---- for (BuildConfig cfg : allConfigs) { tagData(cfg, "CodeAnalysisRuleSet", "AllRules.ruleset"); tag(cfg, "CodeAnalysisRules"); tag(cfg, "CodeAnalysisRuleAssemblies"); } ! endTag(); for (BuildConfig cfg : allConfigs) { startTag(cfg, "ItemDefinitionGroup"); startTag("ClCompile"); tagV(cfg.getV("CompilerFlags")); ! endTag(); startTag("Link"); tagV(cfg.getV("LinkerFlags")); ! endTag(); startTag("PostBuildEvent"); tagData("Message", BuildConfig.getFieldString(null, "PostbuildDescription")); tagData("Command", cfg.expandFormat(BuildConfig.getFieldString(null, "PostbuildCommand").replace("\t", "\r\n"))); ! endTag(); startTag("PreLinkEvent"); tagData("Message", BuildConfig.getFieldString(null, "PrelinkDescription")); tagData("Command", cfg.expandFormat(BuildConfig.getFieldString(null, "PrelinkCommand").replace("\t", "\r\n"))); ! endTag(); ! endTag(); } writeFiles(allConfigs, projDir); tag("Import", "Project", "$(VCTargetsPath)\\Microsoft.Cpp.targets"); startTag("ImportGroup", "Label", "ExtensionTargets"); ! endTag(); ! endTag(); printWriter.close(); System.out.println(" Done."); writeFilterFile(projectFileName, projectName, allConfigs, projDir); writeUserFile(projectFileName, allConfigs);
*** 136,153 **** "xmlns", "http://schemas.microsoft.com/developer/msbuild/2003"); for (BuildConfig cfg : allConfigs) { startTag(cfg, "PropertyGroup"); tagData("LocalDebuggerCommand", "$(TargetDir)/hotspot.exe"); ! endTag("PropertyGroup"); } ! endTag("Project"); printWriter.close(); System.out.println(" Done."); } private void writeFilterFile(String projectFileName, String projectName, Vector<BuildConfig> allConfigs, String base) throws FileNotFoundException, UnsupportedEncodingException { String filterFileName = projectFileName + ".filters"; System.out.print(" Writing .vcxproj.filters file: " + filterFileName); printWriter = new PrintWriter(filterFileName, "UTF-8"); --- 140,165 ---- "xmlns", "http://schemas.microsoft.com/developer/msbuild/2003"); for (BuildConfig cfg : allConfigs) { startTag(cfg, "PropertyGroup"); tagData("LocalDebuggerCommand", "$(TargetDir)/hotspot.exe"); ! endTag(); } ! endTag(); printWriter.close(); System.out.println(" Done."); } + public void addFilter(String rPath) { + filters.add(rPath); + } + + public void addFilterDependency(String fileLoc, String filter) { + filterDeps.add(new String[] {fileLoc, filter}); + } + private void writeFilterFile(String projectFileName, String projectName, Vector<BuildConfig> allConfigs, String base) throws FileNotFoundException, UnsupportedEncodingException { String filterFileName = projectFileName + ".filters"; System.out.print(" Writing .vcxproj.filters file: " + filterFileName); printWriter = new PrintWriter(filterFileName, "UTF-8");
*** 155,368 **** printWriter.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); startTag("Project", "ToolsVersion", "4.0", "xmlns", "http://schemas.microsoft.com/developer/msbuild/2003"); - Hashtable<String, FileAttribute> allFiles = computeAttributedFiles(allConfigs); - TreeSet<FileInfo> sortedFiles = sortFiles(allFiles); - Vector<NameFilter> filters = makeFilters(sortedFiles); - - // first all filters startTag("ItemGroup"); ! for (NameFilter filter : filters) { ! doWriteFilter(filter, ""); } startTag("Filter", "Include", "Resource Files"); UUID uuid = UUID.randomUUID(); tagData("UniqueIdentifier", "{" + uuid.toString() + "}"); tagData("Extensions", "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"); ! endTag("Filter"); ! endTag("ItemGroup"); ! // then all cpp files ! startTag("ItemGroup"); ! for (NameFilter filter : filters) { ! doWriteFiles(sortedFiles, filter, "", "ClCompile", new Evaluator() { ! public boolean pick(FileInfo fi) { ! return fi.isCpp(); ! } ! }, base); ! } ! endTag("ItemGroup"); ! // then all header files startTag("ItemGroup"); ! for (NameFilter filter : filters) { ! doWriteFiles(sortedFiles, filter, "", "ClInclude", new Evaluator() { ! public boolean pick(FileInfo fi) { ! return fi.isHeader(); ! } ! }, base); ! } ! endTag("ItemGroup"); ! // then all other files ! startTag("ItemGroup"); ! for (NameFilter filter : filters) { ! doWriteFiles(sortedFiles, filter, "", "None", new Evaluator() { ! public boolean pick(FileInfo fi) { ! return true; ! } ! }, base); } ! endTag("ItemGroup"); ! endTag("Project"); printWriter.close(); System.out.println(" Done."); } ! ! private void doWriteFilter(NameFilter filter, String start) { ! startTag("Filter", "Include", start + filter.fname); ! UUID uuid = UUID.randomUUID(); ! tagData("UniqueIdentifier", "{" + uuid.toString() + "}"); ! endTag("Filter"); ! if (filter instanceof ContainerFilter) { ! Iterator i = ((ContainerFilter)filter).babies(); ! while (i.hasNext()) { ! doWriteFilter((NameFilter)i.next(), start + filter.fname + "\\"); ! } ! } ! } ! ! interface Evaluator { ! boolean pick(FileInfo fi); ! } ! ! private void doWriteFiles(TreeSet<FileInfo> allFiles, NameFilter filter, String start, String tool, Evaluator eval, String base) { ! if (filter instanceof ContainerFilter) { ! Iterator i = ((ContainerFilter)filter).babies(); ! while (i.hasNext()) { ! doWriteFiles(allFiles, (NameFilter)i.next(), start + filter.fname + "\\", tool, eval, base); ! } ! } ! else { ! Iterator i = allFiles.iterator(); ! while (i.hasNext()) { ! FileInfo fi = (FileInfo)i.next(); ! ! if (!filter.match(fi)) { ! continue; ! } ! if (eval.pick(fi)) { ! startTag(tool, "Include", rel(fi.full, base)); ! tagData("Filter", start + filter.fname); ! endTag(tool); ! ! // we not gonna look at this file anymore (sic!) ! i.remove(); ! } ! } } } - void writeFiles(Vector<BuildConfig> allConfigs, String projDir) { ! Hashtable<String, FileAttribute> allFiles = computeAttributedFiles(allConfigs); ! TreeSet<FileInfo> sortedFiles = sortFiles(allFiles); ! ! // first cpp-files startTag("ItemGroup"); - for (FileInfo fi : sortedFiles) { - if (!fi.isCpp()) { - continue; - } - writeFile("ClCompile", allConfigs, fi, projDir); - } - endTag("ItemGroup"); ! // then header-files ! startTag("ItemGroup"); ! for (FileInfo fi : sortedFiles) { ! if (!fi.isHeader()) { ! continue; ! } ! writeFile("ClInclude", allConfigs, fi, projDir); ! } ! endTag("ItemGroup"); ! // then others ! startTag("ItemGroup"); ! for (FileInfo fi : sortedFiles) { ! if (fi.isHeader() || fi.isCpp()) { ! continue; ! } ! writeFile("None", allConfigs, fi, projDir); ! } ! endTag("ItemGroup"); ! } ! /** ! * Make "path" into a relative path using "base" as the base. ! * ! * path and base are assumed to be normalized with / as the file separator. ! * returned path uses "\\" as file separator ! */ ! private String rel(String path, String base) ! { ! if(!base.endsWith("/")) { ! base += "/"; } - String[] pathTok = path.split("/"); - String[] baseTok = base.split("/"); - int pi = 0; - int bi = 0; - StringBuilder newPath = new StringBuilder(); ! // first step past all path components that are the same ! while (pi < pathTok.length && ! bi < baseTok.length && ! pathTok[pi].equals(baseTok[bi])) { ! pi++; ! bi++; ! } ! // for each path component left in base, add "../" ! while (bi < baseTok.length) { ! bi++; ! newPath.append("..\\"); ! } ! // now add everything left in path ! while (pi < pathTok.length) { ! newPath.append(pathTok[pi]); ! pi++; ! if (pi != pathTok.length) { ! newPath.append("\\"); ! } ! } ! return newPath.toString(); } ! private void writeFile(String tool, Vector<BuildConfig> allConfigs, FileInfo fi, String base) { ! if (fi.attr.configs == null && fi.attr.pchRoot == false && fi.attr.noPch == false) { ! tag(tool, "Include", rel(fi.full, base)); ! } ! else { ! startTag(tool, "Include", rel(fi.full, base)); ! for (BuildConfig cfg : allConfigs) { ! if (fi.attr.configs != null && !fi.attr.configs.contains(cfg.get("Name"))) { ! tagData(cfg, "ExcludedFromBuild", "true"); ! } ! if (fi.attr.pchRoot) { ! tagData(cfg, "PrecompiledHeader", "Create"); ! } ! if (fi.attr.noPch) { ! startTag(cfg, "PrecompiledHeader"); ! endTag("PrecompiledHeader"); ! } } - endTag(tool); } } String buildCond(BuildConfig cfg) { return "'$(Configuration)|$(Platform)'=='"+cfg.get("Name")+"'"; } - void tagV(Vector<String> v) { Iterator<String> i = v.iterator(); while(i.hasNext()) { String name = i.next(); String data = i.next(); --- 167,262 ---- printWriter.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); startTag("Project", "ToolsVersion", "4.0", "xmlns", "http://schemas.microsoft.com/developer/msbuild/2003"); startTag("ItemGroup"); ! for (String filter : filters) { ! startTag("Filter", "Include",filter); ! UUID uuid = UUID.randomUUID(); ! tagData("UniqueIdentifier", "{" + uuid.toString() + "}"); ! endTag(); } startTag("Filter", "Include", "Resource Files"); UUID uuid = UUID.randomUUID(); tagData("UniqueIdentifier", "{" + uuid.toString() + "}"); tagData("Extensions", "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"); ! endTag(); ! endTag(); ! //TODO - do I need to split cpp and hpp files? ! // then all files startTag("ItemGroup"); ! for (String[] dep : filterDeps) { ! String tagName = getFileTagFromSuffix(dep[0]); ! startTag(tagName, "Include", dep[0]); ! tagData("Filter", dep[1]); ! endTag(); } ! endTag(); ! endTag(); printWriter.close(); System.out.println(" Done."); } ! public String getFileTagFromSuffix(String fileName) { ! if (fileName.endsWith(".cpp")) { ! return"ClCompile"; ! } else if (fileName.endsWith(".c")) { ! return "ClCompile"; ! } else if (fileName.endsWith(".hpp")) { ! return"ClInclude"; ! } else if (fileName.endsWith(".h")) { ! return "ClInclude"; ! } else { ! return"None"; } } void writeFiles(Vector<BuildConfig> allConfigs, String projDir) { ! // This code assummes there are no config specific includes. startTag("ItemGroup"); ! 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); ! endTag(); } ! // Will visit file tree for each include ! private void handleIncludes(Vector<String> includes, Vector<BuildConfig> allConfigs) { ! for (String path : includes) { ! FileTreeCreatorVC10 ftc = new FileTreeCreatorVC10(FileSystems.getDefault().getPath(path) , allConfigs, this); ! try { ! ftc.writeFileTree(); ! } catch (IOException e) { ! e.printStackTrace(); } } } String buildCond(BuildConfig cfg) { return "'$(Configuration)|$(Platform)'=='"+cfg.get("Name")+"'"; } void tagV(Vector<String> v) { Iterator<String> i = v.iterator(); while(i.hasNext()) { String name = i.next(); String data = i.next();
*** 389,398 **** --- 283,293 ---- ss[1] = buildCond(cfg); System.arraycopy(attrs, 0, ss, 2, attrs.length); startTag(name, ss); } + } class CompilerInterfaceVC10 extends CompilerInterface { @Override
*** 541,547 **** @Override String makeCfgName(String flavourBuild, String platform) { return flavourBuild + "|" + platform; } - } --- 436,441 ----