diff --git a/make/windows/create.bat b/make/windows/create.bat index 8d9c83aefab1c129f1a688677d94cf328af19a9c..ee4a1865e51098ef6db3673684877bdfffa9efe3 100644 --- a/make/windows/create.bat +++ b/make/windows/create.bat @@ -93,16 +93,15 @@ if "%MSC_VER%" == "1500" ( echo Will generate VC9 {Visual Studio 2008} ) else ( if "%MSC_VER%" == "1600" ( -echo Detected Visual Studio 2010, but -echo will generate VC9 {Visual Studio 2008} -echo Use conversion wizard in VS 2010. +echo Will generate VC10 {Visual Studio 2010} +set ProjectFile=%HotSpotBuildSpace%\jvm.vcxproj ) else ( echo Will generate VC7 project {Visual Studio 2003 .NET} ) ) ) ) -echo %ProjectFile% +echo %ProjectFile% echo ************************************************************** REM Test all variables to see whether the directories they diff --git a/make/windows/makefiles/projectcreator.make b/make/windows/makefiles/projectcreator.make index e7a9528c605d4111f0e3ba22ee6f6692541af362..c73c215851df8d9a08d8cfe637686c2792f8cf01 100644 --- a/make/windows/makefiles/projectcreator.make +++ b/make/windows/makefiles/projectcreator.make @@ -27,10 +27,6 @@ # This is used externally by both batch and IDE builds, so can't # reference any of the HOTSPOTWORKSPACE, HOTSPOTBUILDSPACE, # HOTSPOTRELEASEBINDEST, or HOTSPOTDEBUGBINDEST environment variables. -# -# NOTE: unfortunately the ProjectCreatorSources list must be kept -# synchronized between this and the Solaris version -# (make/solaris/makefiles/projectcreator.make). ProjectCreatorSources=\ $(WorkSpace)\src\share\tools\ProjectCreator\DirectoryTree.java \ @@ -42,6 +38,7 @@ ProjectCreatorSources=\ $(WorkSpace)\src\share\tools\ProjectCreator\WinGammaPlatformVC7.java \ $(WorkSpace)\src\share\tools\ProjectCreator\WinGammaPlatformVC8.java \ $(WorkSpace)\src\share\tools\ProjectCreator\WinGammaPlatformVC9.java \ + $(WorkSpace)\src\share\tools\ProjectCreator\WinGammaPlatformVC10.java \ $(WorkSpace)\src\share\tools\ProjectCreator\Util.java \ $(WorkSpace)\src\share\tools\ProjectCreator\BuildConfig.java \ $(WorkSpace)\src\share\tools\ProjectCreator\ArgsParser.java diff --git a/make/windows/makefiles/rules.make b/make/windows/makefiles/rules.make index 4d884c1b71d4dd409a710b542afa83e2507159ae..14bc0d5351a040e07e4f90730bd335ebe0dc674f 100644 --- a/make/windows/makefiles/rules.make +++ b/make/windows/makefiles/rules.make @@ -65,8 +65,8 @@ VcVersion=VC9 !elseif "$(MSC_VER)" == "1600" -# for compatibility - we don't yet have a ProjectCreator for VC10 -VcVersion=VC9 +VcVersion=VC10 +ProjectFile=jvm.vcxproj !else diff --git a/src/share/tools/ProjectCreator/Util.java b/src/share/tools/ProjectCreator/Util.java index 18b2f57b7b8636ca716c4cb9cd6e4c731db33dd7..466a099749ddab2bca5d49dc6c165453cb4f5c04 100644 --- a/src/share/tools/ProjectCreator/Util.java +++ b/src/share/tools/ProjectCreator/Util.java @@ -47,18 +47,6 @@ public class Util { return sb.toString(); } - static String join(String padder, String v[]) { - StringBuffer sb = new StringBuffer(); - - for (int i=0; i allConfigs) throws IOException { throw new RuntimeException("use compiler version specific version"); } } diff --git a/src/share/tools/ProjectCreator/WinGammaPlatformVC10.java b/src/share/tools/ProjectCreator/WinGammaPlatformVC10.java new file mode 100644 index 0000000000000000000000000000000000000000..4096beac88afb734d4ed7478e5344b9a7cfc4d4a --- /dev/null +++ b/src/share/tools/ProjectCreator/WinGammaPlatformVC10.java @@ -0,0 +1,545 @@ +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"; + } + + @Override + public void writeProjectFile(String projectFileName, String projectName, + Vector allConfigs) throws IOException { + System.out.println(); + System.out.print(" Writing .vcxproj file: " + projectFileName); + + String projDir = Util.normalize(new File(projectFileName).getParent()); + + printWriter = new PrintWriter(projectFileName, "UTF-8"); + printWriter.println(""); + startTag("Project", + "DefaultTargets", "Build", + "ToolsVersion", "4.0", + "xmlns", "http://schemas.microsoft.com/developer/msbuild/2003"); + startTag("ItemGroup", + "Label", "ProjectConfigurations"); + 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"); + tagData("_ProjectFileVersion", "10.0.30319.1"); + for (BuildConfig cfg : allConfigs) { + tagData(cfg, "OutDir", cfg.get("OutputDir") + Util.sep); + tagData(cfg, "IntDir", cfg.get("OutputDir") + Util.sep); + tagData(cfg, "LinkIncremental", "false"); + } + 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); + } + + + private void writeUserFile(String projectFileName, Vector allConfigs) throws FileNotFoundException, UnsupportedEncodingException { + String userFileName = projectFileName + ".user"; + if (new File(userFileName).exists()) { + return; + } + System.out.print(" Writing .vcxproj.user file: " + userFileName); + printWriter = new PrintWriter(userFileName, "UTF-8"); + + printWriter.println(""); + startTag("Project", + "ToolsVersion", "4.0", + "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 allConfigs, String base) throws FileNotFoundException, UnsupportedEncodingException { + String filterFileName = projectFileName + ".filters"; + System.out.print(" Writing .vcxproj.filters file: " + filterFileName); + printWriter = new PrintWriter(filterFileName, "UTF-8"); + + printWriter.println(""); + startTag("Project", + "ToolsVersion", "4.0", + "xmlns", "http://schemas.microsoft.com/developer/msbuild/2003"); + + Hashtable allFiles = computeAttributedFiles(allConfigs); + TreeSet sortedFiles = sortFiles(allFiles); + Vector 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 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 allConfigs, String projDir) { + Hashtable allFiles = computeAttributedFiles(allConfigs); + TreeSet 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 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 v) { + Iterator i = v.iterator(); + while(i.hasNext()) { + String name = i.next(); + String data = i.next(); + tagData(name, data); + } + } + + void tagData(BuildConfig cfg, String name, String data) { + tagData(name, data, "Condition", buildCond(cfg)); + } + + void tag(BuildConfig cfg, String name, String... attrs) { + String[] ss = new String[attrs.length + 2]; + ss[0] = "Condition"; + ss[1] = buildCond(cfg); + System.arraycopy(attrs, 0, ss, 2, attrs.length); + + tag(name, ss); + } + + void startTag(BuildConfig cfg, String name, String... attrs) { + String[] ss = new String[attrs.length + 2]; + ss[0] = "Condition"; + ss[1] = buildCond(cfg); + System.arraycopy(attrs, 0, ss, 2, attrs.length); + + startTag(name, ss); + } +} + +class CompilerInterfaceVC10 extends CompilerInterface { + + @Override + Vector getBaseCompilerFlags(Vector defines, Vector includes, String outDir) { + Vector rv = new Vector(); + + addAttr(rv, "AdditionalIncludeDirectories", Util.join(";", includes)); + addAttr(rv, "PreprocessorDefinitions", + Util.join(";", defines).replace("\\\"", "\"")); + addAttr(rv, "PrecompiledHeaderFile", "precompiled.hpp"); + addAttr(rv, "PrecompiledHeaderOutputFile", outDir+Util.sep+"vm.pch"); + addAttr(rv, "AssemblerListingLocation", outDir); + addAttr(rv, "ObjectFileName", outDir+Util.sep); + addAttr(rv, "ProgramDataBaseFileName", outDir+Util.sep+"jvm.pdb"); + // Set /nologo option + addAttr(rv, "SuppressStartupBanner", "true"); + // Surpass the default /Tc or /Tp. + addAttr(rv, "CompileAs", "Default"); + // Set /W3 option. + addAttr(rv, "WarningLevel", "Level3"); + // Set /WX option, + addAttr(rv, "TreatWarningAsError", "true"); + // Set /GS option + addAttr(rv, "BufferSecurityCheck", "false"); + // Set /Zi option. + addAttr(rv, "DebugInformationFormat", "ProgramDatabase"); + // Set /Yu option. + addAttr(rv, "PrecompiledHeader", "Use"); + // Set /EHsc- option + addAttr(rv, "ExceptionHandling", ""); + + addAttr(rv, "MultiProcessorCompilation", "true"); + + return rv; + } + + @Override + Vector getDebugCompilerFlags(String opt) { + Vector rv = new Vector(); + + // Set /On option + addAttr(rv, "Optimization", opt); + // Set /FR option. + addAttr(rv, "BrowseInformation", "true"); + addAttr(rv, "BrowseInformationFile", "$(IntDir)"); + // Set /MD option. + addAttr(rv, "RuntimeLibrary", "MultiThreadedDLL"); + // Set /Oy- option + addAttr(rv, "OmitFramePointers", "false"); + + return rv; + } + + @Override + Vector getProductCompilerFlags() { + Vector rv = new Vector(); + + // Set /O2 option. + addAttr(rv, "Optimization", "MaxSpeed"); + // Set /Oy- option + addAttr(rv, "OmitFramePointers", "false"); + // Set /Ob option. 1 is expandOnlyInline + addAttr(rv, "InlineFunctionExpansion", "OnlyExplicitInline"); + // Set /GF option. + addAttr(rv, "StringPooling", "true"); + // Set /MD option. 2 is rtMultiThreadedDLL + addAttr(rv, "RuntimeLibrary", "MultiThreadedDLL"); + // Set /Gy option + addAttr(rv, "FunctionLevelLinking", "true"); + + return rv; + } + + @Override + Vector getBaseLinkerFlags(String outDir, String outDll, String platformName) { + Vector rv = new Vector(); + + addAttr(rv, "AdditionalOptions", + "/export:JNI_GetDefaultJavaVMInitArgs " + + "/export:JNI_CreateJavaVM " + + "/export:JVM_FindClassFromBootLoader "+ + "/export:JNI_GetCreatedJavaVMs "+ + "/export:jio_snprintf /export:jio_printf "+ + "/export:jio_fprintf /export:jio_vfprintf "+ + "/export:jio_vsnprintf "+ + "/export:JVM_GetVersionInfo "+ + "/export:JVM_GetThreadStateNames "+ + "/export:JVM_GetThreadStateValues "+ + "/export:JVM_InitAgentProperties"); + addAttr(rv, "AdditionalDependencies", "kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;Wsock32.lib;winmm.lib"); + addAttr(rv, "OutputFile", outDll); + addAttr(rv, "SuppressStartupBanner", "true"); + addAttr(rv, "ModuleDefinitionFile", outDir+Util.sep+"vm.def"); + addAttr(rv, "ProgramDatabaseFile", outDir+Util.sep+"jvm.pdb"); + addAttr(rv, "SubSystem", "Windows"); + addAttr(rv, "BaseAddress", "0x8000000"); + addAttr(rv, "ImportLibrary", outDir+Util.sep+"jvm.lib"); + + if(platformName.equals("Win32")) { + addAttr(rv, "TargetMachine", "MachineX86"); + } else { + addAttr(rv, "TargetMachine", "MachineX64"); + } + + return rv; + } + + @Override + Vector getDebugLinkerFlags() { + Vector rv = new Vector(); + + // /DEBUG option + addAttr(rv, "GenerateDebugInformation", "true"); + + return rv; + } + + @Override + Vector getProductLinkerFlags() { + Vector rv = new Vector(); + + // Set /OPT:REF option. + addAttr(rv, "OptimizeReferences", "true"); + // Set /OPT:ICF option. + addAttr(rv, "EnableCOMDATFolding", "true"); + + return rv; + } + + @Override + void getAdditionalNonKernelLinkerFlags(Vector rv) { + extAttr(rv, "AdditionalOptions", " /export:AsyncGetCallTrace"); + } + + @Override + String getOptFlag() { + return "MaxSpeed"; + } + + @Override + String getNoOptFlag() { + return "Disabled"; + } + + @Override + String makeCfgName(String flavourBuild, String platform) { + return flavourBuild + "|" + platform; + } + +} diff --git a/src/share/tools/ProjectCreator/WinGammaPlatformVC7.java b/src/share/tools/ProjectCreator/WinGammaPlatformVC7.java index fd6fbfea83e4b334321104b9bf879bf232207032..d1d63c84734469b214e973ad1eea1efc50127d19 100644 --- a/src/share/tools/ProjectCreator/WinGammaPlatformVC7.java +++ b/src/share/tools/ProjectCreator/WinGammaPlatformVC7.java @@ -35,7 +35,7 @@ public class WinGammaPlatformVC7 extends WinGammaPlatform { String projectVersion() {return "7.10";}; public void writeProjectFile(String projectFileName, String projectName, - Vector allConfigs) throws IOException { + Vector allConfigs) throws IOException { System.out.println(); System.out.println(" Writing .vcproj file: "+projectFileName); // If we got this far without an error, we're safe to actually @@ -54,11 +54,11 @@ public class WinGammaPlatformVC7 extends WinGammaPlatform { "SccLocalPath", "" } ); - startTag("Platforms", null); + startTag("Platforms"); tag("Platform", new String[] {"Name", (String) BuildConfig.getField(null, "PlatformName")}); endTag("Platforms"); - startTag("Configurations", null); + startTag("Configurations"); for (Iterator i = allConfigs.iterator(); i.hasNext(); ) { writeConfiguration((BuildConfig)i.next()); @@ -66,11 +66,11 @@ public class WinGammaPlatformVC7 extends WinGammaPlatform { endTag("Configurations"); - tag("References", null); + tag("References"); writeFiles(allConfigs); - tag("Globals", null); + tag("Globals"); endTag("VisualStudioProject"); printWriter.close(); @@ -190,28 +190,6 @@ public class WinGammaPlatformVC7 extends WinGammaPlatform { } } - class TypeFilter extends NameFilter { - String[] exts; - - TypeFilter(String fname, String[] exts) { - this.fname = fname; - this.exts = exts; - } - - boolean match(FileInfo fi) { - for (int i=0; i files) { - Vector rv = new Vector(); + Vector makeFilters(TreeSet files) { + Vector rv = new Vector(); String sbase = Util.normalize(BuildConfig.getFieldString(null, "SourceBase")+"/src/"); String currentDir = ""; @@ -370,13 +348,12 @@ public class WinGammaPlatformVC7 extends WinGammaPlatform { rv.add(new SpecificNameFilter("Precompiled Header", new String[] {"precompiled.hpp"})); // this one is to catch files not caught by other filters - //rv.add(new TypeFilter("Header Files", new String[] {"h", "hpp", "hxx", "hm", "inl", "fi", "fd"})); rv.add(new TerminatorFilter("Source Files")); return rv; } - void writeFiles(Vector allConfigs) { + void writeFiles(Vector allConfigs) { Hashtable allFiles = computeAttributedFiles(allConfigs); @@ -387,7 +364,7 @@ public class WinGammaPlatformVC7 extends WinGammaPlatform { TreeSet sortedFiles = sortFiles(allFiles); - startTag("Files", null); + startTag("Files"); for (Iterator i = makeFilters(sortedFiles).iterator(); i.hasNext(); ) { doWriteFiles(sortedFiles, allConfigNames, (NameFilter)i.next()); @@ -555,35 +532,40 @@ public class WinGammaPlatformVC7 extends WinGammaPlatform { 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 close, + boolean newline) { doIndent(); printWriter.print("<"+name); indent++; - if (attrs != null) { - printWriter.println(); + if (attrs != null && attrs.length > 0) { for (int i=0; i"); + printWriter.print(" />"); } else { - //doIndent(); - printWriter.println(">"); + printWriter.print(">"); + } + if(newline) { + printWriter.println(); } } - void startTag(String name, String[] attrs) { + void startTag(String name, String... attrs) { startTagPrim(name, attrs, false); } @@ -601,11 +583,25 @@ public class WinGammaPlatformVC7 extends WinGammaPlatform { printWriter.println(""); } - void tag(String name, String[] attrs) { + void tag(String name, String... attrs) { startTagPrim(name, attrs, true); } - void tagV(String name, Vector attrs) { + void tagData(String name, String data) { + doIndent(); + printWriter.print("<"+name+">"); + printWriter.print(data); + printWriter.println(""); + } + + void tagData(String name, String data, String... attrs) { + startTagPrim(name, attrs, false, false); + printWriter.print(data); + printWriter.println(""); + indent--; + } + + void tagV(String name, Vector attrs) { String s[] = new String [attrs.size()]; for (int i=0; i