| // |
| // $Id$ |
| // |
| // defines different utility functions |
| // |
| ////////////////////////////////////////////////////////////////////// |
| // |
| // Licensed to the Apache Software Foundation (ASF) under one or more |
| // contributor license agreements. See the NOTICE file distributed |
| // with this work for additional information regarding copyright |
| // ownership. The ASF licenses this file to you under the Apache |
| // License, Version 2.0 (the "License"); you may not use this file |
| // except in compliance with the License. You may obtain a copy of |
| // the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
| // implied. See the License for the specific language governing |
| // permissions and limitations under the License. |
| // |
| ////////////////////////////////////////////////////////////////////// |
| |
| var VERSION = ""; |
| var DEVENV = ""; |
| var DEVENVFLAGS = ""; |
| var CPPFLAGS = ""; |
| var LDFLAGS = ""; |
| var LIBS = ""; |
| var CONVERT = false; |
| var CXX = ""; |
| var LD = ""; |
| var AR = ""; |
| var AS = ""; |
| var SLNVER=""; |
| var SLNCOMMENT=""; |
| var UNICODELOG = false; |
| var NOSTCRT = false; |
| var WINDIFF = ""; |
| var ICCCONVERT = ""; |
| var PLATFORM = ""; |
| var CLVARSBAT = ""; |
| var ICCVER=""; |
| |
| // timeout for exec utility in seconds |
| var EXEC_TIMEOUT = 300; |
| |
| // expand system macros |
| function expandSysMacro(str) |
| { |
| var env = null; |
| var pos = 0; |
| |
| while (true) |
| { |
| pos = str.indexOf("%", pos); |
| if (0 > pos) |
| break; |
| |
| ++pos; |
| var pos2 = str.indexOf("%", pos); |
| if (0 > pos2) |
| break; |
| |
| if (null == env) |
| env = WshShell.Environment("PROCESS"); |
| |
| var macro = str.substring(pos, pos2); |
| pos = pos2 + 1; |
| var value = env.Item(macro); |
| if ("undefined" != typeof(value) && "" != value) |
| str = str.replace("%" + macro + "%", value); |
| } |
| |
| return str; |
| } |
| |
| // read and parse compiler configuration file |
| // config - name of the compiler configuration |
| function parseConfig(config) |
| { |
| var scriptDir = getParentFolder(WScript.ScriptFullName); |
| var configFileName = scriptDir + "\\" + config + ".config"; |
| var ForReading = 1; |
| var configFile = null; |
| |
| try |
| { |
| configFile = fso.OpenTextFile(configFileName, ForReading); |
| } |
| catch (e) {} |
| |
| if (null == configFile) |
| { |
| WScript.StdErr.WriteLine("Cannot open configuration file: " + configFileName); |
| WScript.Quit(3); |
| } |
| |
| var rx = /^\s*([A-Z]+)\s*=\s*(\S.*)$/; |
| |
| while (!configFile.AtEndOfStream) |
| { |
| var line = configFile.ReadLine(); |
| |
| if (0 == line.length || 0 == line.indexOf("//")) |
| continue; |
| |
| var inc = "#include "; |
| var pos = line.indexOf(inc); |
| if (0 == pos) |
| parseConfig(line.substr(pos + inc.length)); |
| |
| var arr = rx.exec(line); |
| if (null == arr || 0 == arr[2].length) |
| continue; |
| |
| arr[2] = expandSysMacro(arr[2]); |
| |
| switch (arr[1]) |
| { |
| case "VERSION": |
| VERSION = arr[2]; |
| break; |
| case "DEVENV": |
| DEVENV = arr[2]; |
| break; |
| case "DEVENVFLAGS": |
| DEVENVFLAGS = arr[2]; |
| break; |
| case "CPPFLAGS": |
| CPPFLAGS = arr[2]; |
| break; |
| case "LDFLAGS": |
| LDFLAGS = arr[2]; |
| break; |
| case "LIBS": |
| LIBS = arr[2]; |
| break; |
| case "CONVERT": |
| CONVERT = parseInt(arr[2]) != 0; |
| break; |
| case "CXX": |
| CXX = arr[2]; |
| break; |
| case "LD": |
| LD = arr[2]; |
| break; |
| case "AR": |
| AR = arr[2]; |
| break; |
| case "AS": |
| AS = arr[2]; |
| break; |
| case "SLNVER": |
| SLNVER = arr[2]; |
| break; |
| case "SLNCOMMENT": |
| SLNCOMMENT = arr[2]; |
| break; |
| case "UNICODELOG": |
| UNICODELOG = parseInt(arr[2]) != 0; |
| break; |
| case "NOSTCRT": |
| NOSTCRT = parseInt(arr[2]) != 0; |
| break; |
| case "WINDIFF": |
| WINDIFF = arr[2]; |
| break; |
| case "ICCCONVERT": |
| ICCCONVERT = arr[2]; |
| break; |
| case "PLATFORM": |
| PLATFORM = arr[2]; |
| break; |
| case "CLVARSBAT": |
| CLVARSBAT = arr[2]; |
| break; |
| case "ICCVER": |
| ICCVER = arr[2]; |
| break; |
| } |
| } |
| } |
| |
| // init script variables for specified compiler configuration |
| function getCompilerOpts(config) |
| { |
| // set vars to initial state |
| VERSION = ""; |
| DEVENV = ""; |
| DEVENVFLAGS = ""; |
| CPPFLAGS = ""; |
| LDFLAGS = ""; |
| LIBS = ""; |
| CONVERT = false; |
| CXX = ""; |
| LD = ""; |
| AR = ""; |
| AS = ""; |
| SLNVER=""; |
| SLNCOMMENT=""; |
| UNICODELOG = false; |
| NOSTCRT = false; |
| WINDIFF = ""; |
| ICCCONVERT = ""; |
| PLATFORM = ""; |
| CLVARSBAT = ""; |
| ICCVER = ""; |
| |
| parseConfig(config); |
| |
| if (0 == WINDIFF.length) |
| { |
| if (VERSION.length) |
| { |
| var ver = ""; |
| if (0 <= VERSION.indexOf(".")) |
| ver = VERSION.replace(".", ""); |
| var path = WshShell.Environment.Item("VS" + ver + "COMNTOOLS"); |
| if (path.length) |
| { |
| WINDIFF = "\"" + |
| fso.BuildPath(path.replace(/\"/g, ""), "bin\\windiff") + |
| "\""; |
| } |
| } |
| |
| if (0 == WINDIFF.length) |
| WINDIFF = "windiff"; |
| } |
| } |
| |
| // out variables and their values to the stream |
| function PrintVars(stream) |
| { |
| stream.WriteLine("Variables:"); |
| stream.WriteLine(" VERSION=" + VERSION); |
| stream.WriteLine(" DEVENV=" + DEVENV); |
| stream.WriteLine(" DEVENVFLAGS=" + DEVENVFLAGS); |
| stream.WriteLine(" CPPFLAGS=" + CPPFLAGS); |
| stream.WriteLine(" LDFLAGS=" + LDFLAGS); |
| stream.WriteLine(" LIBS=" + LIBS); |
| stream.WriteLine(" CONVERT=" + CONVERT); |
| stream.WriteLine(" CXX=" + CXX); |
| stream.WriteLine(" LD=" + LD); |
| stream.WriteLine(" AR=" + AR); |
| stream.WriteLine(" AS=" + AS); |
| stream.WriteLine(" SLNVER=" + SLNVER); |
| stream.WriteLine(" SLNCOMMENT=" + SLNCOMMENT); |
| stream.WriteLine(" UNICODELOG=" + UNICODELOG); |
| stream.WriteLine(" NOSTCRT=" + NOSTCRT); |
| stream.WriteLine(" WINDIFF=" + WINDIFF); |
| stream.WriteLine(" ICCCONVERT=" + ICCCONVERT); |
| stream.WriteLine(" PLATFORM=" + PLATFORM); |
| stream.WriteLine(" CLVARSBAT=" + CLVARSBAT); |
| stream.WriteLine(" ICCVER=" + ICCVER); |
| stream.WriteLine(""); |
| } |
| |
| // returns parent folder for a path |
| function getParentFolder(path) |
| { |
| var idx = path.lastIndexOf('\\'); |
| return path.substr(0, idx); |
| } |
| |
| // returns filename from a path |
| function getFileName(path) |
| { |
| var idx = path.lastIndexOf('\\'); |
| return path.substr(idx + 1); |
| } |
| |
| // returns extension of the file name (with dot at first character) |
| function getExtension(filename) |
| { |
| var idx = filename.lastIndexOf('.'); |
| return 0 <= idx ? filename.substr(idx) : "."; |
| } |
| |
| ///////////////////////////////////////////////////////////////////////// |
| // get differences using WinDiff utility |
| |
| function getWinDiffDifferences(src1, src2, flags) |
| { |
| try |
| { |
| // first create two temporary files |
| var tfolder, TemporaryFolder = 2; |
| tfolder = fso.GetSpecialFolder(TemporaryFolder); |
| if (! tfolder) |
| return "unknown"; |
| |
| var tname1 = fso.GetTempName(); |
| var tfile1 = tfolder.CreateTextFile(tname1); |
| var tpath1 = tfolder.Path + "\\" + tname1; |
| tfile1.Write(src1); |
| tfile1.Close(); |
| |
| var tname2 = fso.GetTempName(); |
| var tfile2 = tfolder.CreateTextFile(tname2); |
| var tpath2 = tfolder.Path + "\\" + tname2; |
| tfile2.Write(src2); |
| tfile2.Close(); |
| |
| var tResName = fso.GetTempName(); |
| var tResPath = tfolder.Path + "\\" + tResName; |
| |
| // second run windiff |
| var cmd = WINDIFF + " -F" + flags + " " + tResPath; |
| cmd += " " + tpath1; |
| cmd += " " + tpath2; |
| |
| var result = WshShell.Run(cmd, 7, true); |
| if (result != 0) |
| { |
| WScript.StdErr.WriteLine( |
| "getWinDiffDifferences: Fatal error: windiff" |
| + " failed"); |
| return "unknown"; |
| } |
| |
| // third read the results |
| var tResFile = fso.OpenTextFile(tfolder.Path + "\\" + tResName); |
| var res = tResFile.ReadAll(); |
| tResFile.Close(); |
| |
| fso.DeleteFile(tpath1); |
| fso.DeleteFile(tpath2); |
| fso.DeleteFile(tResPath); |
| |
| return res; |
| } |
| catch(e) |
| { |
| return "Information about differences is not available"; |
| } |
| } |
| |
| // create temporary file and return path to this file |
| function makeTempFile() |
| { |
| var tfolder, TemporaryFolder = 2; |
| tfolder = fso.GetSpecialFolder(TemporaryFolder); |
| |
| var tname = fso.GetTempName(); |
| var tfile = tfolder.CreateTextFile(tname); |
| tfile.Close(); |
| |
| return tfolder.Path + "\\" + tname; |
| } |
| |
| // encode symbols within string with escaped analog |
| // srcString - source string |
| function encodeHTML(srcString) |
| { |
| var res = srcString; |
| var srcS = new Array ( "&", "<", ">", "\"" ); |
| var destS = new Array ( "&", "<", ">", """ ); |
| for (var t = 0; t < srcS.length; t++) |
| { |
| var reRep = new RegExp(srcS[t], "g"); |
| res = res.replace(reRep, destS[t]); |
| } |
| |
| return res; |
| } |
| |
| // decode escaped symbols within string with analog |
| // srcString - source string |
| function decodeHTML(srcString) |
| { |
| var res = srcString; |
| var srcS = new Array ( "&", "<", ">", """, " " ); |
| var destS = new Array ( "&", "<", ">", "\"", " " ); |
| for (var t = 0; t < srcS.length; t++) |
| { |
| var reRep = new RegExp(srcS[t], "g"); |
| res = res.replace(reRep, destS[t]); |
| } |
| |
| return res; |
| } |
| |
| // remove all tags within string |
| // srcString - source string |
| function stripTags(srcString) |
| { |
| return decodeHTML(srcString).replace(new RegExp("> <", "g"), "><") |
| .replace(new RegExp("><", "g"), ">\r\n<") |
| .replace(new RegExp("(^<[\\s\\S]+?>)", "gm"), "") |
| .replace(new RegExp("\r", "g"), "") |
| .replace(new RegExp("\n{2,}", "g"), "\n\n") |
| .replace(new RegExp("</pre>", "g"), "") |
| .replace(new RegExp("</h3>", "g"), "") |
| .replace(new RegExp("</font>", "g"), ""); |
| } |
| |
| // returns source string without first character if it equal to symbol |
| // dotName - source string |
| // symbol - symbol to remove |
| function removeLeadingSymbol(dotName, symbol) |
| { |
| var index = dotName.indexOf(symbol); |
| if (0 != index) |
| return dotName; |
| |
| var resName = dotName.substr(symbol.length); |
| return resName; |
| } |
| |
| // returns source string without first character is is a dot |
| function removeLeadingDot(dotName) |
| { |
| var index = dotName.indexOf("."); |
| if (0 != index) |
| return dotName; |
| |
| var resName = dotName.substr(1); |
| return resName; |
| } |
| |
| // returns the source filename with replaced extension to new one |
| // filename - source filename |
| // ext - new extension |
| function changeFileExt(filename, ext) |
| { |
| var arr = filename.split("."); |
| arr[arr.length - 1] = ext; |
| return arr.join("."); |
| } |
| |
| // returns new UUID |
| function createUUID() |
| { |
| return WScript.CreateObject("scriptlet.typelib").guid; |
| } |
| |
| // returns index of value in array or -1 |
| function arrayIndexOf(array, value) |
| { |
| for (var i = 0; i < array.length; ++i) |
| if (array[i] == value) |
| return i; |
| |
| return -1; |
| } |
| |
| // create MSVS solution file |
| // projects - array of the projects |
| // path - output folder |
| // name - name of the solutuion file |
| function generateSolution(projects, path, name) |
| { |
| path += "\\"; |
| var sln = fso.CreateTextFile(path + name, true, false); |
| // header |
| sln.WriteLine("Microsoft Visual Studio Solution File, Format Version " + SLNVER); |
| if (0 < SLNCOMMENT.length) |
| sln.WriteLine("# " + SLNCOMMENT); |
| for (var i = 0; i < projects.length; ++i) |
| { |
| // project section header |
| var Project = projects[i]; |
| var VCProject = Project.VSProject; |
| sln.Write("Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = "); |
| sln.Write("\"" + VCProject.Name + "\""); |
| var projectFile = VCProject.ProjectFile; |
| var pos = projectFile.indexOf(path); |
| if (0 == pos) |
| projectFile = projectFile.substr(path.length); |
| sln.Write(", \"" + projectFile + "\""); |
| sln.WriteLine(", \"" + VCProject.ProjectGUID + "\""); |
| |
| if (SLNVER != "7.00") |
| { |
| // project dependencies |
| sln.WriteLine( |
| "\tProjectSection(ProjectDependencies) = postProject"); |
| var deps = Project.PrjRefs.concat(Project.PrjDeps); |
| for (var j = 0; j < deps.length; ++j) |
| { |
| var depGUID = deps[j].VSProject.ProjectGUID; |
| sln.WriteLine("\t\t" + depGUID + " = " + depGUID); |
| } |
| sln.WriteLine("\tEndProjectSection"); |
| } |
| // project section end |
| sln.WriteLine("EndProject"); |
| } |
| |
| // Global section |
| sln.WriteLine("Global"); |
| // solution configurations |
| sln.WriteLine("\tGlobalSection(SolutionConfiguration) = preSolution"); |
| for (var i = 0; i < confNames.length; ++i) |
| { |
| var confName = confNames[i]; |
| var confKey = (SLNVER == "7.00" ? "ConfigName." + i : confName); |
| sln.WriteLine("\t\t" + confKey + " = " + confName); |
| } |
| sln.WriteLine("\tEndGlobalSection"); |
| |
| // project dependencies for MSVC 7.0 |
| if (SLNVER == "7.00") |
| { |
| sln.WriteLine("\tGlobalSection(ProjectDependencies) = postSolution"); |
| for (var i = 0; i < projects.length; ++i) |
| { |
| var Project = projects[i]; |
| var VCProject = Project.VSProject; |
| var prjGUID = VCProject.ProjectGUID; |
| var deps = Project.PrjRefs.concat(Project.PrjDeps); |
| for (var j = 0; j < deps.length; ++j) |
| { |
| var depGUID = deps[j].VSProject.ProjectGUID; |
| sln.WriteLine("\t\t" + prjGUID + "." + j + " = " + depGUID); |
| } |
| } |
| sln.WriteLine("\tEndGlobalSection"); |
| } |
| |
| // project configurations |
| sln.WriteLine("\tGlobalSection(ProjectConfiguration) = postSolution"); |
| for (var i = 0; i < projects.length; ++i) |
| { |
| var Project = projects[i]; |
| var VCProject = Project.VSProject; |
| var prjGUID = VCProject.ProjectGUID; |
| var cfgs = VCProject.Configurations; |
| for (var j = 1; j <= cfgs.Count; ++j) |
| { |
| var cfg = cfgs.Item(j); |
| sln.WriteLine("\t\t" + prjGUID + "." + cfg.ConfigurationName + |
| ".ActiveCfg = " + cfg.Name); |
| sln.WriteLine("\t\t" + prjGUID + "." + cfg.ConfigurationName + |
| ".Build.0 = " + cfg.Name); |
| } |
| } |
| 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(); |
| } |