Added: incubator/stdcxx/trunk/etc/config/windows/generate.js URL: http://svn.apache.org/viewcvs/incubator/stdcxx/trunk/etc/config/windows/generate.js?rev=349027&view=auto ============================================================================== --- incubator/stdcxx/trunk/etc/config/windows/generate.js (added) +++ incubator/stdcxx/trunk/etc/config/windows/generate.js Fri Nov 25 14:16:34 2005 @@ -0,0 +1,1360 @@ +// +// $Id$ +// +// shall be included after base_config_classes + +var projectStdLibName = ".stdlib"; +var stdlibProjectFolder = "src"; +var stdlibSrcFolder = "."; +var stdlibIncludeFolder = "..\\include"; +var stdlibAnsiIncludeFolder = "..\\include\\ansi"; +var winCfgFolder = ".\\etc\\config\\windows"; +var testSrcFolder = ".\\etc\\config\\src"; + +var cfgProjectSrcFolder = "etc\\config\\src"; +var cfgProjectIncludeFolder = "etc\\config\\src"; + +var samplesProjectsPrefix = "example_"; +var samplesProjectFolder = "examples"; + +var rwtestProjectFolder = "tests\\src"; +var rwtestSrcFolder = "."; +var rwtestIncludeFolder = "..\\include"; + +var testsProjectsPrefix = "test_"; +var testsProjectFolder = "tests"; + +var defineRWSHARED = "_RWSHARED"; +var defineRWBUILD = "_RWBUILD_std"; + +var samplesDir = "examples"; +var testsDir = "tests"; +var libOutputDir = "..\\lib"; + +var logFile = null; +var runExamplesLog = "runexamples.log"; +var runTestsLog = "runtests.log"; + +function fillProjectsFromFolders(result, solution, srcDir, + projectTemplateName, projectNamePrefix, projectFolder, + includeOffset, excludedFolders, excludedFiles, + oldProjects) +{ + var folder = fso.GetFolder(srcDir); + if (! folder) + return; + + var enumSubFolders = new Enumerator(folder.SubFolders); + for (; !enumSubFolders.atEnd(); enumSubFolders.moveNext()) + { + var folderName = enumSubFolders.item().Name; + if (excludedFolders.test(folderName)) + { + // skip excluded folder + continue; + } + + fillProjectsFromFolders(result, solution, + srcDir + "\\" + folderName, projectTemplateName, + projectNamePrefix, projectFolder + "\\" + folderName, + "..\\" + includeOffset, excludedFolders, excludedFiles, + oldProjects); + } + + var libPrj = result.projects[projectStdLibName]; + + var rx = new RegExp("^.+\\.(?:cpp)$", "i"); + var enumFiles = new Enumerator(folder.Files); + for (; !enumFiles.atEnd(); enumFiles.moveNext()) + { + var fileName = enumFiles.item().Name; + if (rx.test(fileName)) + { + if (excludedFiles.test(fileName)) // we should exclude this file + { + continue; + } + + var lastPoint = fileName.lastIndexOf("."); + var prjName = projectNamePrefix + fileName.substr(0, lastPoint); + var pureName = fileName.substr(0, lastPoint); + + var justUpdate = false; + if (oldProjects != null) + { + var prjOldTmp = oldProjects[pureName]; + if (prjOldTmp != null) + justUpdate = true; + } + + if (justUpdate) + { + logFile.WriteLine("Checking " + pureName); + WScript.Echo(" Checking " + pureName + "..."); + } + else + { + logFile.WriteLine("Creating " + pureName); + WScript.Echo(" Creating " + pureName + "..."); + } + + var project = + solution.projects[projectTemplateName].shallowClone(); + project.name = prjName; + project.folder = projectFolder; + + if (justUpdate) + project.id = oldProjects[pureName].id; + else + project.id = createUUID(); + + project.dependencies.add(projectStdLibName); + project.platforms = + solution.projects[projectTemplateName].platforms.clone(); + + if (justUpdate) + { + result.projects.add(pureName, project); + continue; + } + + project.sourceFiles.add(fileName, false); + + for (i in project.platforms) + { + var platform = project.platforms[i]; + if (! platform || ! platform.configurations) + { + continue; + } + + for (j in platform.configurations) + { + var config = platform.configurations[j]; + if (! config || ! config.tools) + { + continue; + } + + var oldCompiler = config.tools[compilerToolName]; + var newCompiler = oldCompiler.clone(); + for (k in oldCompiler.includeDirectories) + { + if (!oldCompiler.includeDirectories[k]) + { + newCompiler.includeDirectories.func_remove(k); + } + } + + for (m in oldCompiler.includeDirectories) + { + if (!oldCompiler.includeDirectories[m]) + { + var findex = m.indexOf(varSign); + if (findex == 0) + { + newCompiler.includeDirectories.add( + varSign + includeOffset + + m.substr(varSign.length)); + } + else + { + newCompiler.includeDirectories.add( + includeOffset + m); + } + } + } + + var postBuildTool = config.tools[postBuildToolName]; + if (postBuildTool) + { + var libPlatform = libPrj.platforms[platform.name]; + var libConfig = + libPlatform.configurations[config.name]; + var dllName = + libConfig.tools[linkerToolName].outputFile; + var cmdCopyDll = "copy /Y " + includeOffset + + "..\\lib" + "\\" + dllName + " $(OutDir)\\" + + dllName; + + postBuildTool.commands.func_remove(varCmdCopyDll); + postBuildTool.commands.add( + varCmdCopyDll, cmdCopyDll); + } + + config.tools.func_remove(compilerToolName); + config.tools.add(compilerToolName, newCompiler); + } + } + + result.projects.add(pureName, project); + logFile.WriteLine(pureName + " created"); + } + } +} + +// creates examples projects in a real solution +function fillSolutionWithSamples(result, solution, srcDir, oldProjects) +{ + var examplesDir = srcDir + "\\" + samplesDir; + var excludeFolders = + new RegExp("^(?:\\.svn|Release.*|Debug.*|in|out|CVS)$","i"); + var excludeFiles = + new RegExp("^(?:rwstdmessages.cpp)$","i"); + var includeOffset = ""; + + fillProjectsFromFolders(result, solution, examplesDir, + projectExamplesName, samplesProjectsPrefix, samplesDir, + includeOffset, excludeFolders, excludeFiles, + oldProjects); +} + + +// creates examples projects in a real solution +function fillSolutionWithTests(result, solution, srcDir, oldProjects) +{ + var tDir = srcDir + "\\" + testsDir; + var excludeFolders = + new RegExp("^(?:\\.svn|Release.*|Debug.*|in|out|CVS|src)$","i"); + var excludeFiles = + new RegExp("^(?:rwstdmessages.cpp)$","i"); + var includeOffset = ""; + + fillProjectsFromFolders(result, solution, tDir, + projectTestsName, testsProjectsPrefix, testsDir, + includeOffset, excludeFolders, excludeFiles, + oldProjects); +} + + +function updateSolutionProjectConfiguration(result, + projectTemplateName, projectNamePrefix) +{ + for (j in result.projects) + { + var somePrj = result.projects[j]; + if (! somePrj || ! somePrj.name) + { + continue; + } + + var firstPrefix = somePrj.name.indexOf(projectNamePrefix); + if (firstPrefix == -1) + { + continue; + } + + var pureName = + somePrj.name.substr(firstPrefix + projectNamePrefix.length); + + if (projectNamePrefix == samplesProjectsPrefix) + { + var prjExRunner = result.projects[projectRunExamplesName]; + if (prjExRunner) + prjExRunner.dependencies.add(pureName, somePrj); + } + + if (projectNamePrefix == testsProjectsPrefix) + { + var prjTestsRunner = result.projects[projectRunTestsName]; + if (prjTestsRunner) + prjTestsRunner.dependencies.add(pureName, somePrj); + } + + for (i in result.configurations) + { + var resultCfg = result.configurations[i]; + if (! resultCfg.projectConfigurations) + { + continue; + } + + var exmplCfg = + resultCfg.projectConfigurations[projectTemplateName]; + if (! exmplCfg || ! exmplCfg.platform) + { + continue; + } + + var prjCfg = exmplCfg.clone(); + prjCfg.projectName = pureName; + + var platformName = prjCfg.platform; + var configName = prjCfg.configuration; + + var cfg = + somePrj.platforms[platformName].configurations[configName]; + if (cfg) + { + var linker = cfg.tools[linkerToolName]; + if (linker) + linker.outputFile = pureName + ".exe"; + + cfg.intermDir = cfg.intermDir + "\\" + pureName; + } + + resultCfg.projectConfigurations.add(prjCfg.projectName, prjCfg); + } + + somePrj.name = pureName; + } +} + +function removeProjectTemplates(result, projectTemplateName) +{ + for (i in result.configurations) + { + var resultCfg = result.configurations[i]; + if (! resultCfg || ! resultCfg.projectConfigurations) + { + continue; + } + + resultCfg.projectConfigurations.func_remove(projectTemplateName); + } +} + +// creates real solution based on the template +function fillSolutionTemplate(solution, srcDir, outDir, logStream) +{ + logFile = logStream; + + // get configre project + // put it into a new solution + var configureProjectTemplate = + solution.projects.get(projectConfigureName); + if (!configureProjectTemplate) + { + WScript.StdErr.WriteLine( + "Generate: Fatal error: Configure project not found"); + WScript.Quit(3); + } + + // create dependencies for Configure project + var configureDependencies = makeDependencies(srcDir); + + var result = solution.shallowClone(); + result.generateSolution = solution.generateSolution; + // clone build configurations + result.configurations = solution.configurations.clone(); + + // append stdlib configurations as a copy of configure configurations + for (i in solution.configurations) + { + var solutionCfg = solution.configurations[i]; + if (!solutionCfg.projectConfigurations) + { + // not a project configuration + continue; + } + + // copy solution configuration for Configure project + // into stdlib project configuration + var resultCfg = result.configurations[i]; + var configureCfg = + solutionCfg.projectConfigurations[projectConfigureName]; + var newProjCfg = configureCfg.clone(); + newProjCfg.projectName = projectStdLibName; + resultCfg.projectConfigurations.add(newProjCfg.name, newProjCfg); + + // copy/fill projects that have associated solution configuration + for (j in resultCfg.projectConfigurations) + { + var projCfg = resultCfg.projectConfigurations[j]; + + // find/copy related project + var projName = projCfg.projectName; + if (!projName) + { + //not a project + continue; + } + + if (projName == projectExamplesName || + projName == projectTestsName) + { + continue; + } + + var project = result.projects[projName]; + // stdlib project will be copied from confgure + var templateProjName = projName == projectStdLibName ? + projectConfigureName : projName; + if (!project) // project was not copied yet. copy it + { + project = solution.projects[templateProjName].shallowClone(); + project.name = projName; + project.id = createUUID(); + // add files + switch (projName) + { + + case projectConfigureName: + var filter = createExcludedSourcesFilter(srcDir, + cfgProjectSrcFolder); + project.sourceFiles.add(filter.name, filter); + + filter = createIncludesFilter(srcDir, + cfgProjectIncludeFolder); + project.sourceFiles.add(filter.name, filter); + + break; + + case projectStdLibName: + project.folder = stdlibProjectFolder; + + var filter = createSourcesFilter(srcDir + "\\" + + stdlibProjectFolder, stdlibSrcFolder); + project.sourceFiles.add(filter.name, filter); + + filter = createIncludesFilter(srcDir + "\\" + + stdlibProjectFolder, stdlibIncludeFolder); + addIncludesToFilter(srcDir + "\\" + + stdlibProjectFolder, stdlibSrcFolder, filter); + + project.sourceFiles.add(filter.name, filter); + + project.dependencies.add(projectConfigureName); + break; + + case projectRwTestName: + + project.folder = rwtestProjectFolder; + var filter = createSourcesFilter(srcDir + "\\" + + rwtestProjectFolder, rwtestSrcFolder); + project.sourceFiles.add(filter.name, filter); + + filter = createIncludesFilter(srcDir + "\\" + + rwtestProjectFolder, rwtestIncludeFolder); + addIncludesToFilter(srcDir + "\\" + + rwtestProjectFolder, rwtestSrcFolder, filter); + + project.sourceFiles.add(filter.name, filter); + + break; + + case projectRunExamplesName: + project.folder = samplesProjectFolder; + break; + + case projectRunTestsName: + project.folder = testsProjectFolder; + break; + + default: + //do nothing. suppose that all files are explicitly specified + } + result.projects.add(project.name, project); + } + + // find/copy related platform + var platformName = projCfg.platform; + var platform = project.platforms.get(platformName); + if (!platform) // platform was not copied yet. copy it. + { + platform = + solution.projects[templateProjName] + .platforms[platformName].shallowClone(); + project.platforms.add(platform.name, platform); + } + + // find/copy-fill related configuration + var configName = projCfg.configuration; + var config = platform.configurations[configName]; + if (!config) // configuration was not copied yet. copy it + { + var oldCfg = solution.projects[templateProjName] + .platforms[platformName].configurations[configName]; + switch (projName) + { + case projectConfigureName: + var newCfg = oldCfg.shallowClone(); + newCfg.type = configTypeDll; + var tool = oldCfg.tools[customBuildToolName].clone(); + tool.output = ".\\include\\" + + newCfg.outputDir + "\\config.h"; + + tool.command = + "cscript .\\etc\\config\\windows\\configure.wsf"; + + tool.command += " /SolutionName:\"" + + solution.name + "\""; + tool.command += " /ConfigurationName:\"" + + resultCfg.name + "\""; + tool.command += " /SrcDir:\"" + srcDir + + "etc\\config\\src\\" + "\""; + tool.command += " /OutDir:\"" + outDir + "include\\" + + newCfg.outputDir + "\\" + "\""; + tool.command += " /IncludeDir:\"" + srcDir + + "include" + "\""; + tool.command += " /OutFile:\"" + outDir + "include\\" + + newCfg.outputDir + "\\" + "config.h" + "\""; + tool.command += " /LogFile:\"" + outDir + "include\\" + + newCfg.outputDir + "\\" + "config.log" + "\""; + + tool.dependencies = configureDependencies; + newCfg.tools.add(tool.name, tool); + // add a fake linker to suppress dependency on output + tool = new FakeLinkerVC(); + newCfg.tools.add(tool.name, tool); + + newCfg.outputDir = "include\\" + newCfg.outputDir; + newCfg.intermDir = "include\\" + newCfg.intermDir; + platform.configurations.add(newCfg.name, newCfg); + break; + case projectStdLibName: + var newCfg = oldCfg.shallowClone(); + var tool = oldCfg.tools[compilerToolName].clone(); + tool.includeDirectories.add(stdlibIncludeFolder); + tool.includeDirectories.add(stdlibAnsiIncludeFolder); + tool.includeDirectories.add(varSign + + stdlibIncludeFolder + "\\" + newCfg.outputDir); + + var cfgSuffix = newCfg.outputDir; + newCfg.outputDir = libOutputDir; + + newCfg.tools.add(tool.name, tool); + // for lib project add librarian + // for dll project add linker + // project is a dll project if librarian is absent + if (!oldCfg.tools[librarianToolName]) + { + tool = oldCfg.tools[linkerToolName].clone(); + tool.outputFile = + removeLeadingDot(projectStdLibName) + + cfgSuffix + ".dll"; + + tool.pdbFile = removeLeadingDot(projectStdLibName) + + cfgSuffix + ".pdb"; + + var toolCmp = newCfg.tools[compilerToolName]; + toolCmp.defines.add("_RWSHARED"); + toolCmp.defines.add("_RWBUILD_std"); + } + else + { + tool = oldCfg.tools[librarianToolName].clone(); + tool.outputFile = + removeLeadingDot(projectStdLibName) + + cfgSuffix + ".lib"; + } + newCfg.tools.add(tool.name, tool); + platform.configurations.add(newCfg.name, newCfg); + break; + + case projectRwTestName: + var newCfg = oldCfg.clone(); + var tool = newCfg.tools[librarianToolName]; + if (tool) + tool.outputFile = + removeLeadingDot(projectRwTestName) + + ".lib"; + + platform.configurations.add(newCfg.name, newCfg); + break; + + case projectRunExamplesName: + var newCfg = oldCfg.shallowClone(); + newCfg.type = configTypeDll; + var tool = oldCfg.tools[customBuildToolName].clone(); + tool.output = newCfg.outputDir + "\\" + runExamplesLog; + + tool.command = + "cscript /nologo " + + "..\\etc\\config\\windows\\runexamples.wsf"; + + tool.command += + " /INOUTDIR:\"" + srcDir + "examples" + "\""; + tool.command += + " /EXEDIR:\"" + outDir + "examples" + "\""; + tool.command += + " /BUILDTYPE:\"" + newCfg.outputDir + "\""; + tool.command += + " /LOGFILE:\"" + newCfg.outputDir + "\\" + + runExamplesLog; + + newCfg.tools.add(tool.name, tool); + // add a fake linker to suppress dependency on output + tool = new FakeLinkerVC(); + newCfg.tools.add(tool.name, tool); + + platform.configurations.add(newCfg.name, newCfg); + break; + + case projectRunTestsName: + var newCfg = oldCfg.shallowClone(); + newCfg.type = configTypeDll; + var tool = oldCfg.tools[customBuildToolName].clone(); + tool.output = newCfg.outputDir + "\\" + runTestsLog; + + tool.command = + "cscript /nologo " + + "..\\etc\\config\\windows\\runexamples.wsf"; + + tool.command += + " /INOUTDIR:\"" + srcDir + "tests" + "\""; + tool.command += + " /EXEDIR:\"" + outDir + "tests" + "\""; + tool.command += + " /BUILDTYPE:\"" + newCfg.outputDir + "\""; + tool.command += + " /LOGFILE:\"" + newCfg.outputDir + "\\" + + runTestsLog; + + newCfg.tools.add(tool.name, tool); + // add a fake linker to suppress dependency on output + tool = new FakeLinkerVC(); + newCfg.tools.add(tool.name, tool); + + platform.configurations.add(newCfg.name, newCfg); + break; + + default: + var newCfg = oldCfg.clone(); + platform.configurations.add(newCfg.name, newCfg); + } + } + //else configuration already present. do nothing + } + } + + WScript.Echo("Library amd configure projects are created"); + logFile.WriteLine("Library amd configure projects are created"); + + logFile.WriteLine("Creating examples"); + WScript.Echo("Creating examples..."); + fillSolutionWithSamples(result, solution, srcDir, null); + + WScript.Echo("Configuring examples..."); + logFile.WriteLine("Configuring examples"); + updateSolutionProjectConfiguration(result, + projectExamplesName, samplesProjectsPrefix); + + logFile.WriteLine("Creating tests"); + WScript.Echo("Creating tests..."); + fillSolutionWithTests(result, solution, srcDir, null); + + WScript.Echo("Configuring tests..."); + logFile.WriteLine("Configuring tests"); + updateSolutionProjectConfiguration(result, + projectTestsName, testsProjectsPrefix); + + logFile.WriteLine("Clearing temporary data"); + WScript.Echo("Clearing temporary data..."); + removeProjectTemplates(result, projectExamplesName); + removeProjectTemplates(result, projectTestsName); + + return result; +} + +function createSourcesFilter(projectDir, offsetDir) +{ + var filter = createFilter(projectDir, offsetDir, + "Source Files", "cpp;c;cxx;s;cc", /^.+\.cc|.+\.c$/i); + filter.id = "{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"; + return filter; +} + +function createIncludesFilter(projectDir, offsetDir) +{ + var filter = createFilter(projectDir, offsetDir, + "Header Files", "h;hpp;hxx;c;cc", /^.+\.cc?/i); + filter.id = "{93995380-89BD-4b04-88EB-625FBE52EBFB}"; + return filter; +} + +function addIncludesToFilter(projectDir, offsetDir, filter) +{ + addToFilter(projectDir, offsetDir, filter, /^.+\.cc?/i); +} + +function createExcludedSourcesFilter(projectDir, offsetDir) +{ + var filter = createFilter(projectDir, offsetDir, + "Source Files", "cpp;c;cxx;s;cc", /^.+\.cc|.+\.c|.+\.cpp|.+\.cxx$/i); + filter.id = "{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"; + return filter; +} + +var rxExcludedFolders = + new RegExp("^(?:\\.svn|Release.*|Debug.*|in|out|CVS)$","i"); + +function addToFilter(projectDir, offsetDir, filter, excludeRx) +{ + if (! filter) + return; + + var filterExt = filter.filter; + var extArray = filter.filter.split(";"); + var rxText = "^"; + if (extArray.length != 0) + { + rxText += ".+\\.(?:" + extArray[0]; + for (i = 1; i < extArray.length; ++i) + { + rxText += "|" + extArray[i]; + } + rxText += ")"; + } + rxText += "$"; + var rx = new RegExp(rxText, "i"); + var dir = projectDir + "\\" + offsetDir; + try + { + var folder = fso.GetFolder(dir); + } + catch (e) + { + WScript.StdErr.WriteLine("Generate: Fatal error: Failed to" + + " open folder " + dir); + WScript.Quit(3); + } + // add subfolders as own filters + var enumSubFolders = new Enumerator(folder.SubFolders); + for (; !enumSubFolders.atEnd(); enumSubFolders.moveNext()) + { + var folderName = enumSubFolders.item().Name; + if (rxExcludedFolders.test(folderName)) + { + // skip excluded folder + continue; + } + + var subfilter = createFilter(projectDir + , offsetDir + "\\" + folderName + , folderName, filterExt, excludeRx); + + if (subfilter != null) + filter.sourceFiles.add(subfilter.name, subfilter); + } + + // add files + var enumFiles = new Enumerator(folder.Files); + for (; !enumFiles.atEnd(); enumFiles.moveNext()) + { + var fileName = enumFiles.item().Name; + if (rx.test(fileName)) + { + var exclude = excludeRx.test(fileName); + filter.sourceFiles.add(offsetDir + "\\" + fileName, exclude); + } + } +} + +function createFilter(projectDir, offsetDir, filterName, + filterExtensions, excludeRx) +{ + var filter = new Filter(filterName); + filter.filter = filterExtensions; + // create regexp from extensions + var extArray = filterExtensions.split(";"); + var rxText = "^"; + if (extArray.length != 0) + { + rxText += ".+\\.(?:" + extArray[0]; + for (i = 1; i < extArray.length; ++i) + { + rxText += "|" + extArray[i]; + } + rxText += ")"; + } + rxText += "$"; + var rx = new RegExp(rxText, "i"); + var dir = projectDir + "\\" + offsetDir; + try + { + var folder = fso.GetFolder(dir); + } + catch (e) + { + WScript.StdErr.WriteLine("Generate: Fatal error: Failed to" + + " open folder " + dir); + WScript.Quit(3); + } + // add subfolders as own filters + var enumSubFolders = new Enumerator(folder.SubFolders); + for (; !enumSubFolders.atEnd(); enumSubFolders.moveNext()) + { + var folderName = enumSubFolders.item().Name; + if (rxExcludedFolders.test(folderName)) + { + // skip excluded folder + continue; + } + + var subfilter = createFilter(projectDir + , offsetDir + "\\" + folderName + , folderName, filterExtensions, excludeRx); + + if (subfilter != null) + filter.sourceFiles.add(subfilter.name, subfilter); + } + // add files + var n = 0; + var enumFiles = new Enumerator(folder.Files); + for (; !enumFiles.atEnd(); enumFiles.moveNext()) + { + var fileName = enumFiles.item().Name; + if (rx.test(fileName)) + { + n++; + var exclude = excludeRx.test(fileName); + filter.sourceFiles.add(offsetDir + "\\" + fileName, exclude); + } + } + if (n == 0) + return null; + + return filter; +} + +function makeDependencies(srcDir) +{ + var deps = new Collection(); + var folder = fso.GetFolder(srcDir + "\\" + winCfgFolder); + var rxCfgFiles = /^.+\.(?:js|cpp|wsf)$/i; + var filesEnum = new Enumerator(folder.Files); + for (; !filesEnum.atEnd(); filesEnum.moveNext()) + { + var fileName = filesEnum.item().Name; + if (rxCfgFiles.test(fileName)) + { + deps.add(winCfgFolder + "\\" + fileName); + } + } + folder = fso.GetFolder(srcDir + "\\" + testSrcFolder); + filesEnum = new Enumerator(folder.Files); + for (; !filesEnum.atEnd(); filesEnum.moveNext()) + { + deps.add(testSrcFolder + "\\" + filesEnum.item().Name); + } + return deps; +} + + +// creates real solution based on the template +function fillSolutionTemplateLight(solution, oldProjects, srcDir, outDir, logStream) +{ + logFile = logStream; + + // get configre project + // put it into a new solution + var configureProjectTemplate = + solution.projects.get(projectConfigureName); + if (!configureProjectTemplate) + { + WScript.StdErr.WriteLine( + "Update: Fatal error: Configure project not found"); + WScript.Quit(3); + } + + // create dependencies for Configure project + var configureDependencies = makeDependencies(srcDir); + + var result = solution.shallowClone(); + result.generateSolution = solution.generateSolution; + // clone build configurations + result.configurations = solution.configurations.clone(); + + // append stdlib configurations as a copy of configure configurations + for (i in solution.configurations) + { + var solutionCfg = solution.configurations[i]; + if (!solutionCfg.projectConfigurations) + { + // not a project configuration + continue; + } + + // copy solution configuration for Configure project + // into stdlib project configuration + var resultCfg = result.configurations[i]; + var configureCfg = + solutionCfg.projectConfigurations[projectConfigureName]; + var newProjCfg = configureCfg.clone(); + newProjCfg.projectName = projectStdLibName; + resultCfg.projectConfigurations.add(newProjCfg.name, newProjCfg); + + // copy/fill projects that have associated solution configuration + for (j in resultCfg.projectConfigurations) + { + var projCfg = resultCfg.projectConfigurations[j]; + + // find/copy related project + var projName = projCfg.projectName; + if (!projName) + { + //not a project + continue; + } + + if (projName == projectExamplesName || + projName == projectTestsName) + { + continue; + } + + var project = result.projects[projName]; + // stdlib project will be copied from confgure + var templateProjName = projName == projectStdLibName ? + projectConfigureName : projName; + if (!project) // project was not copied yet. copy it + { + project = solution.projects[templateProjName].shallowClone(); + project.name = projName; + + var oldProject = oldProjects[projName]; + if (! oldProject) + project.id = createUUID(); + else + project.id = oldProject.id; + + // add files + switch (projName) + { + + case projectConfigureName: + break; + + case projectStdLibName: + project.folder = stdlibProjectFolder; + project.dependencies.add(projectConfigureName); + break; + + case projectRwTestName: + project.folder = rwtestProjectFolder; + break; + + case projectRunExamplesName: + project.folder = samplesProjectFolder; + break; + + case projectRunTestsName: + project.folder = testsProjectFolder; + break; + + default: + //do nothing. suppose that all files are explicitly specified + } + result.projects.add(project.name, project); + } + + // find/copy related platform + var platformName = projCfg.platform; + var platform = project.platforms.get(platformName); + if (!platform) // platform was not copied yet. copy it. + { + platform = + solution.projects[templateProjName] + .platforms[platformName].shallowClone(); + project.platforms.add(platform.name, platform); + } + + // find/copy-fill related configuration + var configName = projCfg.configuration; + var config = platform.configurations[configName]; + if (!config) // configuration was not copied yet. copy it + { + var oldCfg = solution.projects[templateProjName] + .platforms[platformName].configurations[configName]; + + var newCfg = oldCfg.clone(); + if (projName == projectStdLibName) + { + if (!newCfg.tools[librarianToolName]) + { + var tool = newCfg.tools[linkerToolName]; + tool.outputFile = + removeLeadingDot(projectStdLibName) + + newCfg.outputDir + ".dll"; + } + } + + platform.configurations.add(newCfg.name, newCfg); + } + //else configuration already present. do nothing + } + } + + WScript.Echo("Library amd configure projects are checked"); + logFile.WriteLine("Library amd configure projects are checked"); + + logFile.WriteLine("Checking examples"); + WScript.Echo("Checking examples..."); + fillSolutionWithSamples(result, solution, srcDir, oldProjects); + + WScript.Echo("Configuring examples..."); + logFile.WriteLine("Configuring examples"); + updateSolutionProjectConfiguration(result, + projectExamplesName, samplesProjectsPrefix); + + logFile.WriteLine("Checking tests"); + WScript.Echo("Checking tests..."); + fillSolutionWithTests(result, solution, srcDir, oldProjects); + + WScript.Echo("Configuring tests..."); + logFile.WriteLine("Configuring tests"); + updateSolutionProjectConfiguration(result, + projectTestsName, testsProjectsPrefix); + + logFile.WriteLine("Clearing temporary data"); + WScript.Echo("Clearing temporary data..."); + removeProjectTemplates(result, projectExamplesName); + removeProjectTemplates(result, projectTestsName); + + return result; +} + +// generates solution for the VC +function generateVCPROJ(project, srcDir, outDir) +{ + var projectPath = project.folder.length > 0 ? + outDir + project.folder + "\\" : outDir + ""; + var projectSrcPath = project.folder.length > 0 ? + srcDir + project.folder + "\\" : srcDir + ""; + var projectFile = projectPath + + removeLeadingDot(project.name) + ".vcproj"; + + if (! fso.FolderExists(projectPath)) + { + fso.CreateFolder(projectPath); + } + + // write project file + var vcproj = fso.CreateTextFile(projectFile, true, false); + vcproj.WriteLine( + ""); + vcproj.WriteLine(""); + + // platforms + vcproj.WriteLine("\t"); + for (j in project.platforms) + { + var platform = project.platforms[j]; + if (platform.name) + { + vcproj.WriteLine("\t\t"); + } + } + vcproj.WriteLine("\t"); + + // configurations + vcproj.WriteLine("\t"); + for (j in project.platforms) + { + var platform = project.platforms[j]; + if (platform.configurations) + { + for (k in platform.configurations) + { + var configuration = platform.configurations[k]; + if (configuration.name) + { + vcproj.WriteLine("\t\t"); + + // tools + for (l in configuration.tools) + { + var tool = configuration.tools[l]; + if (tool.name) + { + tool.outputDirectory = "$(OutDir)"; + tool.intermDirectory = "$(IntDir)"; + tool.writeSolutionSettings( + vcproj, projectSrcPath); + } + } + vcproj.WriteLine("\t\t"); + } + } + } + } + vcproj.WriteLine("\t"); + + // references (not needed for us) + // vcproj.WriteLine("\t"); + // vcproj.WriteLine("\t"); + + // files + vcproj.WriteLine("\t"); + writeSourcesVC(project.sourceFiles, vcproj, "\t\t", + project, projectSrcPath); + vcproj.WriteLine("\t"); + + // some unknows stuff + // vcproj.WriteLine("\t"); + // vcproj.WriteLine("\t"); + + vcproj.WriteLine(""); + vcproj.Close(); +} + +function generateSolutionVC(srcDir, outDir, logStream, genVCPROJs) +{ + var slnFileName = outDir + "\\" + this.name + ".sln"; + var sln = fso.CreateTextFile(slnFileName, true, false); + // header + sln.WriteLine( + "Microsoft Visual Studio Solution File, Format Version 8.00"); + for (i in this.projects) + { + var project = this.projects[i]; + if (project.name) //really a project + { + if (true == genVCPROJs) + { + logStream.WriteLine("Saving project " + project.name); + WScript.Echo(" Saving " + project.name + "..."); + } + + // project section header + sln.Write( + "Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = "); + sln.Write("\"" + project.name + "\""); + var projectPath = project.folder.length > 0 ? + outDir + project.folder + "\\" : outDir + ""; + var projectSrcPath = project.folder.length > 0 ? + srcDir + project.folder + "\\" : srcDir + ""; + var projectFile = projectPath + + removeLeadingDot(project.name) + ".vcproj"; + sln.Write(", \"" + projectFile + "\""); + sln.WriteLine(", \"" + project.id + "\""); + + // project dependencies + sln.WriteLine( + "\tProjectSection(ProjectDependencies) = postProject"); + for (j in project.dependencies) + { + var depProject = this.projects[j]; + if (depProject.name) + { + sln.WriteLine("\t\t" + depProject.id + + " = " + depProject.id); + } + } + sln.WriteLine("\tEndProjectSection"); + // project section end + sln.WriteLine("EndProject"); + + if (true == genVCPROJs) + { + generateVCPROJ(project, srcDir, outDir); + logStream.WriteLine(project.name + " saved"); + } + } + } + // Global section + sln.WriteLine("Global"); + // solution configurations + sln.WriteLine("\tGlobalSection(SolutionConfiguration) = preSolution"); + for (j in this.configurations) + { + var slnCfg = this.configurations[j]; + if (slnCfg.name) + { + sln.WriteLine("\t\t" + slnCfg.name + " = " + slnCfg.name); + } + } + sln.WriteLine("\tEndGlobalSection"); + // project configurations + sln.WriteLine("\tGlobalSection(ProjectConfiguration) = postSolution"); + for (j in this.configurations) + { + var slnCfg = this.configurations[j]; + if (slnCfg.name) + { + for (k in slnCfg.projectConfigurations) + { + var projectCfg = slnCfg.projectConfigurations[k]; + if (projectCfg.projectName) + { + var project = this.projects[projectCfg.projectName]; + if (!project) + { + WScript.StdErr.WriteLine( + "Generate: Fatal error: Project " + + projectCfg.projectName + + " mentioned in the configuration " + + slnCfg.name + + " is missing."); + WScript.Quit(3); + } + sln.WriteLine("\t\t" + project.id + "." + slnCfg.name + + ".ActiveCfg = " + + projectCfg.configuration + "|" + + projectCfg.platform); + sln.WriteLine("\t\t" + project.id + "." + slnCfg.name + + ".Build.0 = " + + projectCfg.configuration + "|" + + projectCfg.platform); + } + } + } + } + sln.WriteLine("\tEndGlobalSection"); + + // some unknown stuff + sln.WriteLine("\tGlobalSection(ExtensibilityGlobals) = postSolution"); + sln.WriteLine("\tEndGlobalSection"); + sln.WriteLine("\tGlobalSection(ExtensibilityAddIns) = postSolution"); + sln.WriteLine("\tEndGlobalSection"); + + sln.WriteLine("EndGlobal"); + sln.Close(); +} + +function writeSourcesVC(sourceFiles, vcproj, prefix, project, outDir) +{ + var excludeString = ""; + for (i in project.platforms) + { + var platform = project.platforms[i]; + if (platform.configurations) + { + for (j in platform.configurations) + { + var cfg = platform.configurations[j]; + if (cfg.name) + { + excludeString += prefix + "\t\r\n" + + prefix + + "\t\t\r\n" + + prefix + "\t\r\n"; + } + } + } + } + + for (i in sourceFiles) + { + var obj = sourceFiles[i]; + if (typeof(obj) == "boolean") + { + // file + vcproj.WriteLine(prefix + ""); + if (obj) //excluded from build + { + vcproj.Write(excludeString); + } + vcproj.WriteLine(prefix + ""); + } + else if (obj.filter) + { + //filter + vcproj.WriteLine(prefix + " 0) + { + vcproj.WriteLine(""); + vcproj.Write(prefix + "\tFilter=\"" + + obj.filter + "\""); + } + if (obj.id.length > 0) + { + vcproj.WriteLine(""); + vcproj.Write(prefix + "\tUniqueIdentifier=\"" + + obj.id + "\""); + } + vcproj.WriteLine(">"); + writeSourcesVC(obj.sourceFiles, vcproj, + prefix + "\t", project, outDir); + vcproj.WriteLine(prefix + ""); + } + } +} + +function readSolutionGUIDs(solFileName) +{ + if (! fso.FileExists(solFileName)) + return null; + + var solFile = fso.OpenTextFile(solFileName); + var solLine = solFile.ReadLine(); + if (solLine != + "Microsoft Visual Studio Solution File, Format Version 8.00") + { + solFile.Close(); + return null; + } + + var slnProjects = new Collection(); + while (! solFile.AtEndOfStream) + { + solLine = solFile.ReadLine(); + var idx = solLine.indexOf("Project"); + if (idx == 0) + { + var tempPrj = readProjectSolLine(solLine); + slnProjects.add(tempPrj.name, tempPrj); + } + } + + solFile.Close(); + + return slnProjects; +} + +function readProjectSolLine(solLine) +{ + var eqSignIndex = solLine.indexOf("="); + var prjInfoStr = solLine.substr(eqSignIndex + 2); + var rgPrjInfo = prjInfoStr.split(", "); + + var prjName = rgPrjInfo[0].substr(1, rgPrjInfo[0].length - 2); + var tempProject = new Project(prjName); + tempProject.folder = rgPrjInfo[1].substr(1, rgPrjInfo[1].length - 2); + tempProject.id = rgPrjInfo[2].substr(1, rgPrjInfo[2].length - 2); + + return tempProject; +} + + +var solutionVC71 = getSolution("VC71"); +solutionVC71.generateSolution = generateSolutionVC; Propchange: incubator/stdcxx/trunk/etc/config/windows/generate.js ------------------------------------------------------------------------------ svn:keywords = Id Added: incubator/stdcxx/trunk/etc/config/windows/generate.wsf URL: http://svn.apache.org/viewcvs/incubator/stdcxx/trunk/etc/config/windows/generate.wsf?rev=349027&view=auto ============================================================================== --- incubator/stdcxx/trunk/etc/config/windows/generate.wsf (added) +++ incubator/stdcxx/trunk/etc/config/windows/generate.wsf Fri Nov 25 14:16:34 2005 @@ -0,0 +1,363 @@ + + + + PrimalCode wizard generated file. + + + + + +Generates solution file for a specified environment + + + + + cscript generate.wsf /TOPDIR:"C:\stdcxx" + /BUILDDIR:"C:\stdcxx\build" /CONFIG:VC71 + + +Usage: cscript generate.wsf /CONFIG:@CONFIG +/BUILDDIR:@BUILDDIR [/TOPDIR:@TOPDIR] +[/BUILDTYPE:@BUILDTYPE] [/BUILDONLY:@BUILDONLY] +where +@CONFIG is VC71, +@TOPDIR - stdcxx main directory, +@BUILDDIR - output directory for a build. + + + + + + + + Propchange: incubator/stdcxx/trunk/etc/config/windows/generate.wsf ------------------------------------------------------------------------------ svn:keywords = Id Added: incubator/stdcxx/trunk/etc/config/windows/makelog.wsf URL: http://svn.apache.org/viewcvs/incubator/stdcxx/trunk/etc/config/windows/makelog.wsf?rev=349027&view=auto ============================================================================== --- incubator/stdcxx/trunk/etc/config/windows/makelog.wsf (added) +++ incubator/stdcxx/trunk/etc/config/windows/makelog.wsf Fri Nov 25 14:16:34 2005 @@ -0,0 +1,241 @@ + + + + PrimalCode wizard generated file. + + + + + +Gathers logs and makes the build summary log. + + + + + cscript makebuildlog.wsf /BUILDDIR"C:\stdcxx\build" /BUILDTYPE:11d + + +Usage: cscript makebuildlog.wsf /BUILDDIR:@BUILDDIR /BUILDTYPE:@BUILDTYPE +where +@BUILDDIR is the build directory, +@BUILDTYPE is the build type (11d, 11s, etc). + + + + + + + Propchange: incubator/stdcxx/trunk/etc/config/windows/makelog.wsf ------------------------------------------------------------------------------ svn:keywords = Id