blob: ec7f88ab803a97ef06a86f6d0905342a76441800 [file] [log] [blame]
//
// $Id$
//
// projectdef.js - ProjectDef class definition
//
//////////////////////////////////////////////////////////////////////
//
// 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 TristateUseDefault = -2;
var TristateTrue = -1;
var TristateFalse = 0;
var dte = null;
var VCProjectEngine = null;
var ICConvertTool = "ICProjConvert90.exe";
// test availability of utility file
// returns true if utility is available
// otherwise returns false
function TestUtil(cmd)
{
try
{
return (0 == WshShell.Run(cmd + " /?", 0, true));
}
catch (e) {}
return false;
}
// init VisualStudio objects using specified configuration
// config - name of configuration (e.g. msvc-7.0)
// freedte - if undefined or true then free dte inside function
function InitVSObjects(config, freedte)
{
getCompilerOpts(config);
try
{
dte = WScript.CreateObject("VisualStudio.DTE." + VERSION);
if (DEVENV == "")
{
// use devenv.com executable, if it present
var comName = dte.FullName.replace(/\.exe$/i, ".com");
DEVENV = fso.FileExists(comName) ? comName : dte.FullName;
}
}
catch (e) {}
if (CONVERT)
{
if (ICCCONVERT == "")
ICCCONVERT = "ICProjConvert90.exe";
var ICConvertTool = ICCCONVERT;
var arrPath = new Array(ICConvertTool);
if (0 > ICConvertTool.indexOf("\\"))
{
// no file path specified
// try to detect the path
if (null != dte)
{
try
{
var isettings = dte.GetObject("IntelOptions");
for (var i = 1; i <= isettings.CompilersCount; ++i)
{
var paths = isettings.Compiler(i).ExecutablePath.split(";");
for (var j = 0; j < paths.length; ++j)
arrPath.push("\"" + isettings.Evaluate(paths[j]) + "\\" + ICConvertTool + "\"");
}
isettings = null;
}
catch (e) {}
}
}
var success = false;
for (var i = 0; i < arrPath.length; ++i)
if (TestUtil(arrPath[i]))
{
success = true;
ICCCONVERT = arrPath[i];
break;
}
if (!success)
{
WScript.StdErr.WriteLine(ICCCONVERT + " conversion utility not found");
WScript.StdErr.WriteLine("You should check ICCCONVERT configuration variable");
WScript.Quit(3);
}
}
if (("undefined" == typeof(freedte) || true == freedte) && (null != dte))
{
dte.Quit();
dte = null;
}
try
{
VCProjectEngine = WScript.CreateObject("VisualStudio.VCProjectEngine." + VERSION);
}
catch (e)
{
WScript.StdErr.WriteLine("Unable to create VCProjectEngine object: " + e.message);
return false;
}
return true;
}
//------------------------------------------------
// ProjectDef class
//------------------------------------------------
// ProjectDef .ctor
function ProjectDef(name, type)
{
this.Name = name;
this.Type = type;
this.SubSystem = typeGeneric == type ? null :
(typeApplication == type ? subSystemConsole : subSystemWindows);
this.RTTI = true;
this.VCProjDir = "%BUILDDIR%";
this.FilterDefs = new Array();
this.Defines = null;
this.Includes = null;
this.PrepOpts = null
this.CppOpts = null;
this.LnkOpts = null;
this.LibOpts = null;
this.OutDir = null;
this.IntDir = null;
this.Libs = null;
this.OutFile = null;
this.CustomBuildFile = null;
this.CustomBuildDesc = null;
this.CustomBuildCmd = null;
this.CustomBuildOut = null;
this.CustomBuildDeps = null;
this.PreLinkDesc = null;
this.PreLinkCmd = null;
this.PreBuildDesc = null;
this.PreBuildCmd = null;
this.PostBuildDesc = null;
this.PostBuildCmd = null;
this.VSProject = null;
this.PrjRefs = new Array();
this.PrjDeps = new Array();
}
ProjectDef.prototype.clone = projectCloneDef;
ProjectDef.prototype.createVCProject = projectCreateVCProject;
ProjectDef.prototype.createProjectDefsFromFolder = projectCreateProjectDefsFromFolder;
ProjectDef.prototype.createLocaleDefs = projectCreateLocaleDefs;
ProjectDef.prototype.createTestLocaleDefs = projectCreateTestLocaleDefs;
ProjectDef.prototype.createTestLocalesDef = projectCreateTestLocalesDef;
// returns copy of ProjectDef object
function projectCloneDef()
{
var clone = new ProjectDef(this.Name, this.Type);
clone.SubSystem = this.SubSystem;
clone.RTTI = this.RTTI;
clone.VCProjDir = this.VCProjDir;
clone.FilterDefs = this.FilterDefs.concat(new Array());
clone.Defines = this.Defines;
clone.Includes = this.Includes;
clone.PrepOpts = this.PrepOpts;
clone.CppOpts = this.CppOpts;
clone.LnkOpts = this.LnkOpts;
clone.LibOpts = this.LibOpts;
clone.OutDir = this.OutDir;
clone.IntDir = this.IntDir;
clone.Libs = this.Libs;
clone.OutFile = this.OutFile;
clone.CustomBuildFile = this.CustomBuildFile;
clone.CustomBuildDesc = this.CustomBuildDesc;
clone.CustomBuildCmd = this.CustomBuildCmd;
clone.CustomBuildOut = this.CustomBuildOut;
clone.CustomBuildDeps = this.CustomBuildDeps;
clone.PreLinkDesc = this.PreLinkDesc;
clone.PreLinkCmd = this.PreLinkCmd;
clone.PreBuildDesc = this.PreBuildDesc;
clone.PreBuildCmd = this.PreBuildCmd;
clone.PostBuildDesc = this.PostBuildDesc;
clone.PostBuildCmd = this.PostBuildCmd;
clone.VSProject = this.VSProject;
clone.PrjRefs = this.PrjRefs.concat(new Array());
clone.PrjDeps = this.PrjDeps.concat(new Array());
return clone;
}
// preprocess defines using info about selected configuration
// defines - string with compiler defines, separated by ';'
// the define syntax can contain ?: construction
// supported conditions: debug, dll, mt
// i.e. "debug?_RWSTD_DEBUG:_RWSTD_RELEASE"
// will be replaced to "_RWSTD_DEBUG" in debug configurations
// and to "_RWSTD_RELEASE" in non-debug configurations
// confInfo - configuration info object
function processDefines(defines, confInfo)
{
var arr = defines.split(";");
var res = new Array();
for (var i = 0; i < arr.length; ++i)
{
var str = arr[i];
var pos1 = str.indexOf("?");
if (pos1 > 0)
{
var pos2 = str.indexOf(":", pos1 + 1);
if (pos2 < 0)
pos2 = str.length;
var s1 = str.substring(0, pos1);
var s2 = str.substring(pos1 + 1, pos2);
var s3 = pos2 < str.length ? str.substr(pos2 + 1) : "";
switch (s1)
{
case "debug":
str = confInfo.debug ? s2 : s3;
break;
case "dll":
str = confInfo.dll ? s2 : s3;
break;
case "mt":
str = confInfo.mt ? s2 : s3;
break;
}
}
if (str.length > 0)
res.push(str);
}
return res.join(";");
}
// returns string with list of files in VCFiles of VCFilters collection
// files - source VCFiles or VCFilters collection
// delim - delimiter
function combFiles(files, delim)
{
var ret = "";
for (var i = 1; i <= files.Count; ++i)
{
if (ret != "")
ret += delim;
ret += files.Item(i).RelativePath;
}
return ret;
}
// returns string with list of files in VCFilter object
// filter - source VCFilter object
// delim - delimiter
function combFilter(filter, delim)
{
var ret = combFiles(filter.Files, delim);
if (ret != "")
ret += delim;
ret += combFilters(filter.Filters, delim);
return ret;
}
// returns string with list of files in VCFilters collection
// filters - VCFilters collection
// delim - delimiter
function combFilters(filters, delim)
{
var ret = "";
for (var i = 1; i <= filters.Count; ++i)
{
if (ret != "")
ret += delim;
ret += combFilter(filters.Item(i), delim);
}
return ret;
}
// assign value to a property if it's exists
function setProperty(property, value)
{
if ("undefined" != typeof(property))
{
property = value;
return true;
}
return false;
}
// create VCProject object from ProjectDef
// engine - VCProjectEngine object
// report - callback function to report progress
function projectCreateVCProject(engine, report)
{
if (typeof(report) != "undefined" && null != report)
report(" Creating " + this.Name + "...");
var PrjName = removeLeadingDot(this.Name);
var prjMacros = cmnMacros.concat();
prjMacros.push(new Macro("%PRJNAME%", PrjName));
var VCProject = engine.CreateProject(this.Name);
VCProject.Name = this.Name;
var PrjDir = ReplaceMacros(this.VCProjDir, prjMacros);
var PrjFile = PrjDir + "\\" + PrjName + ".vcproj";
VCProject.ProjectFile = PrjFile;
VCProject.ProjectGUID = createUUID();
VCProject.AddPlatform(PLATFORM);
var FixedPrjName = PrjName;
var dotObj = ".obj";
var VC7xWknd = 0 <= PrjName.indexOf(dotObj)
&& ("7" == VERSION || "7.1" == VERSION);
var PostBuildCmd = this.PostBuildCmd;
if (VC7xWknd)
{
FixedPrjName = FixedPrjName.replace(new RegExp(dotObj, "ig"), "_obj");
if (null != PostBuildCmd)
PostBuildCmd += "\r\n";
else
PostBuildCmd = "";
var srcDir = "$(OutDir)\\" + FixedPrjName;
var dstDir = "$(OutDir)\\" + PrjName;
PostBuildCmd += "md \"" + dstDir + "\"\r\n" +
"copy \"" + srcDir + "\\" + FixedPrjName + dotObj + "\" \"" + dstDir + "\\" + PrjName + dotObj + "\"\r\n" +
"copy \"" + srcDir + "\\buildlog.htm\" \"" + dstDir + "\"";
}
for (var i = 0; i < confNames.length; ++i)
VCProject.AddConfiguration(confNames[i]);
var OutDir = this.OutDir != null ?
ReplaceMacros(this.OutDir, prjMacros) : "%CONFIG%";
var IntDir = this.IntDir != null ?
ReplaceMacros(this.IntDir, prjMacros) : OutDir + "\\" + FixedPrjName;
// add files
for (var i = 0; i < this.FilterDefs.length; ++i)
this.FilterDefs[i].createVCFilter(VCProject);
prjMacros.push(new Macro("%FILES%", combFiles(VCProject.Files, ";")));
var VCCustomFile = null;
if (null != this.CustomBuildFile)
VCCustomFile = VCProject.Files(this.CustomBuildFile);
// set common configuration settings
for (var i = 1; i <= VCProject.Configurations.Count; ++i)
{
var conf = VCProject.Configurations.Item(i);
var confInfo = configs.get(conf.ConfigurationName);
var cfgMacros = new Array(
new Macro("%CONFIG%", confInfo.out),
new Macro("%CFGNAME%", conf.ConfigurationName));
conf.CharacterSet = charSetMBCS;
conf.IntermediateDirectory = ReplaceMacros(IntDir, cfgMacros);
conf.OutputDirectory = ReplaceMacros(OutDir, cfgMacros);
conf.ConfigurationType = (typeLibrary != this.Type) ?
this.Type :
(confInfo.dll ? typeDynamicLibrary : typeStaticLibrary);
var ext = "";
switch (conf.ConfigurationType)
{
case typeApplication:
ext = ".exe";
break;
case typeDynamicLibrary:
ext = ".dll";
break;
case typeStaticLibrary:
ext = ".lib";
break;
}
cfgMacros.push(new Macro("%EXT%", ext));
var allMacros = prjMacros.concat(cfgMacros);
var OutFile = this.OutFile != null ?
ReplaceMacros(this.OutFile, allMacros) :
"$(OutDir)\\" + PrjName + ext;
var IngoreLibs = "";
if (confInfo.dll)
{
IngoreLibs = confInfo.debug ? "msvcprtd.lib" : "msvcprt.lib";
}
else
{
if (confInfo.mt || NOSTCRT)
IngoreLibs = confInfo.debug ? "libcpmtd.lib" : "libcpmt.lib";
else
IngoreLibs = confInfo.debug ? "libcpd.lib" : "libcp.lib";
}
var compiler = conf.Tools.Item("VCCLCompilerTool");
if (null != compiler)
{
if (null != this.Includes)
compiler.AdditionalIncludeDirectories =
ReplaceMacros(this.Includes, allMacros);
compiler.AdditionalOptions = CPPFLAGS + " " +
(null != this.CppOpts ? this.CppOpts : "");
if (null != this.PrepOpts)
compiler.GeneratePreprocessedFile = this.PrepOpts;
compiler.DebugInformationFormat = debugEnabled;
if (typeStaticLibrary == conf.ConfigurationType)
{
// generate the source pdb in the OutDir
compiler.ProgramDataBaseFileName = changeFileExt(OutFile, "pdb");
}
compiler.SuppressStartupBanner = true;
compiler.WarningLevel = warningLevel_3;
setProperty(compiler.Detect64BitPortabilityProblems, false);
if (null != this.Defines)
compiler.PreprocessorDefinitions = processDefines(this.Defines, confInfo);
if (confInfo.debug)
{
compiler.Optimization = optimizeDisabled;
compiler.MinimalRebuild = true;
//setProperty(compiler.SmallerTypeCheck, true);
setProperty(compiler.BasicRuntimeChecks, runtimeBasicCheckAll);
compiler.BufferSecurityCheck = true;
}
else
{
if (typeApplication == conf.ConfigurationType)
{
if (!setProperty(compiler.OptimizeForWindowsApplication, true))
compiler.AdditionalOptions += " /GA";
}
compiler.Optimization = optimizeMaxSpeed;
compiler.MinimalRebuild = false;
setProperty(compiler.SmallerTypeCheck, false);
setProperty(compiler.BasicRuntimeChecks, runtimeBasicCheckNone);
compiler.BufferSecurityCheck = false;
}
compiler.ExceptionHandling = cppExceptionHandlingYes;
compiler.RuntimeTypeInfo = this.RTTI;
if (confInfo.dll)
{
// the singlethreaded dll runtimes are not present
// always use the multithreaded dll runtime
compiler.RuntimeLibrary = confInfo.debug ?
rtMultiThreadedDebugDLL : rtMultiThreadedDLL;
}
else
{
if (confInfo.mt || NOSTCRT)
// use multithreaded runtimes
compiler.RuntimeLibrary = confInfo.debug ?
rtMultiThreadedDebug : rtMultiThreaded;
else
// use singlethreaded runtimes
compiler.RuntimeLibrary = confInfo.debug ?
rtSingleThreadedDebug : rtSingleThreaded;
}
compiler.UsePrecompiledHeader = pchNone;
if (VC7xWknd)
compiler.ObjectFile = "$(IntDir)/" + FixedPrjName + dotObj;
}
var linker = conf.Tools.Item("VCLinkerTool");
if (null != linker)
{
linker.AdditionalOptions = LDFLAGS + " " +
(null != this.LnkOpts ? this.LnkOpts : "");
if (null != this.Libs)
linker.AdditionalDependencies = this.Libs;
linker.LinkIncremental = linkIncrementalNo;
linker.SuppressStartupBanner = true;
linker.GenerateDebugInformation = true;
linker.ProgramDatabaseFile = changeFileExt(OutFile, "pdb");
linker.IgnoreDefaultLibraryNames = IngoreLibs;
linker.SubSystem = this.SubSystem;
if (confInfo.debug)
{
linker.OptimizeReferences = optReferencesDefault;
linker.EnableCOMDATFolding = optFoldingDefault;
}
else
{
linker.OptimizeReferences = optReferences;
linker.EnableCOMDATFolding = optFolding;
}
linker.OutputFile = OutFile;
if (this.Type != typeApplication)
linker.ImportLibrary = changeFileExt(linker.OutputFile, "lib");
}
var librarian = conf.Tools.Item("VCLibrarianTool");
if (null != librarian)
{
if (null != this.LibOpts)
linker.AdditionalOptions = this.LibOpts;
librarian.SuppressStartupBanner = true;
librarian.IgnoreDefaultLibraryNames = IngoreLibs;
librarian.OutputFile = OutFile;
}
if (null != this.PreLinkCmd)
{
var tool = conf.Tools.Item("VCPreLinkEventTool");
tool.CommandLine = ReplaceMacros(this.PreLinkCmd, allMacros);
if (null != this.PreLinkDesc)
tool.Description = ReplaceMacros(this.PreLinkDesc, allMacros);
}
if (null != this.PreBuildCmd)
{
var tool = conf.Tools.Item("VCPreBuildEventTool");
tool.CommandLine = ReplaceMacros(this.PreBuildCmd, allMacros);
if (null != this.PreBuildDesc)
tool.Description = ReplaceMacros(this.PreBuildDesc, allMacros);
}
if (null != PostBuildCmd)
{
var tool = conf.Tools.Item("VCPostBuildEventTool");
tool.CommandLine = ReplaceMacros(PostBuildCmd, allMacros);
if (null != this.PostBuildDesc)
tool.Description = ReplaceMacros(this.PostBuildDesc, allMacros);
}
if (null != this.CustomBuildCmd)
{
var tool = (null == VCCustomFile) ? conf.Tools.Item("VCCustomBuildTool") :
VCCustomFile.FileConfigurations.Item(conf.ConfigurationName).Tool;
var cmd = ReplaceMacros(this.CustomBuildCmd, allMacros);
if (null != VCCustomFile)
cmd = cmd.replace(/(%CUSTOMFILE%)/g, VCCustomFile.FullPath);
tool.CommandLine = cmd;
tool.Outputs = null != this.CustomBuildOut ?
ReplaceMacros(this.CustomBuildOut, allMacros) : "";
if (null != this.PostBuildDesc)
tool.Description = ReplaceMacros(this.CustomBuildDesc, allMacros);
if (null != this.CustomBuildDeps)
tool.AdditionalDependencies = ReplaceMacros(this.CustomBuildDeps, allMacros);
}
}
if (!fso.FolderExists(PrjDir))
fso.CreateFolder(PrjDir);
VCProject.Save();
this.VSProject = VCProject;
}
// create array of ProjectDef objects (one object for each file)
// startDir - start folder
// inclFiles - regular expression to define include files
// exclDirs - regular expression to define exclude folder
// exclFiles - regular expression to define exclude files
// shiftOutDir - if true then add subfolder name to the OutDir path
function projectCreateProjectDefsFromFolder(startDir,
inclFiles, exclDirs, exclFiles, shiftOutDir)
{
var projectDefs = new Array();
var folder = fso.GetFolder(ReplaceMacros(startDir, cmnMacros));
var enumSubFolders = new Enumerator(folder.SubFolders);
for (; !enumSubFolders.atEnd(); enumSubFolders.moveNext())
{
var subFolder = enumSubFolders.item();
if (exclDirs.test(subFolder.Name))
{
// skip excluded folder
continue;
}
var newDefs = this.createProjectDefsFromFolder(subFolder.Path,
inclFiles, exclDirs, exclFiles, shiftOutDir);
if (shiftOutDir)
{
for (var i = 0; i < newDefs.length; ++i)
newDefs[i].OutDir += "\\" + subFolder.Name;
}
projectDefs = projectDefs.concat(newDefs);
}
var enumFiles = new Enumerator(folder.Files);
for (; !enumFiles.atEnd(); enumFiles.moveNext())
{
var file = enumFiles.item();
if (inclFiles.test(file.Name))
{
if (exclFiles.test(file.Name)) // we should exclude this file
continue;
var lastPoint = file.Name.lastIndexOf(".");
var prjName = file.Name.substr(0, lastPoint);
var projectDef = this.clone();
projectDef.Name = prjName;
projectDef.FilterDefs.push(
new FilterDef(sourceFilterName, sourceFilterUuid,
"cpp;c;cxx;s;cc", eFileTypeCppCode, false).
addFiles(null, new Array(file.Path)));
projectDefs.push(projectDef);
}
}
return projectDefs;
}
//------------------------------------------------
// Locale class
//------------------------------------------------
// Locale .ctor
function Locale(name, cmname, srcname)
{
this.Name = name;
this.cmName = cmname;
this.srcName = srcname;
}
// returns array of Locale objects parsing the gen_list file
// nlsDir - folder containing file "gen_list"
function initLocalesList(nlsDir)
{
var listFileName = nlsDir + "\\gen_list";
if (!fso.FileExists(listFileName))
{
WScript.StdErr.WriteLine("Generate: Fatal error: "
+ "File "+ listFileName + " does not exist");
WScript.Quit(3);
}
var ForReading = 1;
var stream = fso.OpenTextFile(listFileName, ForReading);
if (!stream)
{
WScript.StdErr.WriteLine("Generate: Fatal error: "
+ "Cannot open file "+ listFileName);
WScript.Quit(3);
}
var arrLocales = new Array();
while (!stream.AtEndOfStream)
{
var line = stream.ReadLine();
var name = line.replace(new RegExp("^\([^ ]*\) *\([^ ]*\)"),
"$1\.$2")
.replace(new RegExp("\([^.]*\)\(.euro\)\([^ ]*\)"),
"$1$3@euro")
.replace(new RegExp("\([^.]*\)\(.cyrillic\)\([^ ]*\)"),
"$1$3@cyrillic");
var pos = name.indexOf(" ");
if (0 <= pos)
name = name.substr(0, pos);
var srcname = name.replace(new RegExp("\([^.]*\)\.\([^@]*\)\(.*\)"),
"$1$3")
.replace("@", ".");
var cmname = name.replace(new RegExp("\([^.]*\)\.\([^@]*\)\(.*\)"),
"$2");
arrLocales.push(new Locale(name, cmname, srcname));
}
return arrLocales;
}
// create array of ProjectDef objects for build locales
// (one object for each locale)
// nlsDir - folder containing locale source files
function projectCreateLocaleDefs(nlsDir)
{
nlsDir = ReplaceMacros(nlsDir, cmnMacros);
if (typeof(this.arrLocales) == "undefined")
ProjectDef.prototype.arrLocales = initLocalesList(nlsDir);
var projectDefs = new Array();
for (var i = 0; i < this.arrLocales.length; ++i)
{
var locale = this.arrLocales[i];
srcFileName = nlsDir + "\\src\\" + locale.srcName;
cmFileName = nlsDir + "\\charmaps\\" + locale.cmName;
var cmFile;
var srcFile;
try
{
cmFile = fso.GetFile(cmFileName);
}
catch (e)
{
WScript.StdErr.WriteLine("Generate: Fatal error: File " +
cmFileName + " not found");
WScript.Quit(3);
}
try
{
srcFile = fso.GetFile(srcFileName);
}
catch (e)
{
WScript.StdErr.WriteLine("Generate: Fatal error: File " +
srcFileName + " not found");
WScript.Quit(3);
}
var projectDef = this.clone();
projectDef.Name = locale.Name;
projectDef.FilterDefs.push(
new FilterDef("Charmap", null, "cm", eFileTypeText, false).
addFiles(null, new Array(cmFile.Path)));
projectDef.FilterDefs.push(
new FilterDef("Src", null, "", eFileTypeText, false).
addFiles(null, new Array(srcFile.Path)));
projectDef.CustomBuildCmd =
"set PATH=$(SolutionDir)%CONFIG%\\lib;%PATH%\r\n" +
"\"$(SolutionDir)%CONFIG%\\bin\\localedef.exe\" -w -c" +
" -f \"" + cmFileName + "\"" + " -i \"" + srcFileName + "\"" +
" \"$(OutDir)\\" + locale.Name + "\"";
projectDef.CustomBuildOut = "$(OutDir)\\" + locale.Name;
projectDefs.push(projectDef);
}
return projectDefs;
}
// create array of ProjectDef objects for test locales
// (one object for each locale)
// nlsDir - folder containing locale source files
function projectCreateTestLocaleDefs(nlsDir)
{
nlsDir = ReplaceMacros(nlsDir, cmnMacros);
if (typeof(this.arrLocales) == "undefined")
ProjectDef.prototype.arrLocales = initLocalesList(nlsDir);
var projectDefs = new Array();
var srcdir = "%SRCDIR%\\etc\\config\\windows";
var bindir = "$(SolutionDir)%CONFIG%\\bin";
var exec = bindir + "\\exec.exe";
var test = bindir + "\\sanity_test";
var setPath = "set PATH=$(SolutionDir)%CONFIG%\\lib;%PATH%";
// create test_locale_sanity project
var sanityDef = this.clone();
sanityDef.Name = "test_locale_sanity";
if (null == sanityDef.PreBuildCmd)
sanityDef.PreBuildCmd = "";
else
sanityDef.PreBuildCmd += "\r\n";
sanityDef.PreBuildCmd +=
"echo cscript /nologo \"" + srcdir + "\\run_locale_utils.wsf\"" +
" /s /b:\"" + bindir + "\" > \"" + test + ".bat\"";
sanityDef.CustomBuildCmd = setPath + "\r\n\"" + exec + "\" -t " + EXEC_TIMEOUT + " \"" + test + ".bat\"";
sanityDef.CustomBuildOut = test + ".out";
projectDefs.push(sanityDef);
for (var i = 0; i < this.arrLocales.length; ++i)
{
var locale = this.arrLocales[i];
srcFileName = nlsDir + "\\src\\" + locale.srcName;
cmFileName = nlsDir + "\\charmaps\\" + locale.cmName;
var cmFile;
var srcFile;
try
{
cmFile = fso.GetFile(cmFileName);
}
catch (e)
{
WScript.StdErr.WriteLine("Generate: Fatal error: File " +
cmFileName + " not found");
WScript.Quit(3);
}
try
{
srcFile = fso.GetFile(srcFileName);
}
catch (e)
{
WScript.StdErr.WriteLine("Generate: Fatal error: File " +
srcFileName + " not found");
WScript.Quit(3);
}
test = bindir + "\\" + locale.Name;
var projectDef = this.clone();
projectDef.Name = "test_" + locale.Name;
projectDef.FilterDefs.push(
new FilterDef("Charmap", null, "cm", eFileTypeText, false).
addFiles(null, new Array(cmFile.Path)));
projectDef.FilterDefs.push(
new FilterDef("Src", null, "", eFileTypeText, false).
addFiles(null, new Array(srcFile.Path)));
if (null == projectDef.PreBuildCmd)
projectDef.PreBuildCmd = "";
else
projectDef.PreBuildCmd += "\r\n";
projectDef.PreBuildCmd +=
"echo cscript /nologo \"" + srcdir + "\\run_locale_utils.wsf\"" +
" /f /b:\"" + bindir + "\" /i:\"" + nlsDir + "\"" +
" /l:" + locale.Name + " > \"" + test + ".bat\"";
projectDef.CustomBuildCmd = setPath + "\r\n\"" + exec + "\" -t " + EXEC_TIMEOUT + " \"" + test + ".bat\"";
projectDef.CustomBuildOut = test + ".out";
projectDef.PrjDeps.push(sanityDef);
projectDefs.push(projectDef);
}
return projectDefs;
}
// create ProjectDef object for test all locales
// nlsDir - folder containing locale source files
function projectCreateTestLocalesDef(nlsDir)
{
nlsDir = ReplaceMacros(nlsDir, cmnMacros);
if (typeof(this.arrLocales) == "undefined")
ProjectDef.prototype.arrLocales = initLocalesList(nlsDir);
var bindir = "$(SolutionDir)%CONFIG%\\bin";
var test = "sanity_test";
// create test_locale_sanity project
var projectDef = this.clone();
if (null == projectDef.PreBuildCmd)
{
projectDef.PreBuildCmd =
"set soldir=%BUILDDIR%\r\n" +
"set bindir=%soldir%\\%CONFIG%\\bin";
}
projectDef.PreBuildCmd += "\r\n" +
"set etcdir=%SRCDIR%\\etc\r\n" +
"set util=\"%etcdir%\\config\\windows\\run_locale_utils.wsf\"\r\n";
projectDef.PreBuildCmd +=
"echo cscript /nologo %util% /s /b:\"%bindir%\" > \"%bindir%\\" + test + ".bat\"";
var arrLocs = new Array();
var locales = "";
for (var i = 0; i < this.arrLocales.length; ++i)
{
var locale = this.arrLocales[i];
srcFileName = nlsDir + "\\src\\" + locale.srcName;
cmFileName = nlsDir + "\\charmaps\\" + locale.cmName;
var cmFile;
var srcFile;
try
{
cmFile = fso.GetFile(cmFileName);
}
catch (e)
{
WScript.StdErr.WriteLine("Generate: Fatal error: File " +
cmFileName + " not found");
WScript.Quit(3);
}
try
{
srcFile = fso.GetFile(srcFileName);
}
catch (e)
{
WScript.StdErr.WriteLine("Generate: Fatal error: File " +
srcFileName + " not found");
WScript.Quit(3);
}
if (locales.length + locale.Name.length > 1012)
{
arrLocs.push(locales);
locales = "";
}
else
{
if (0 < locales.length)
locales += " ";
locales += locale.Name;
}
}
if (0 < locales.length)
arrLocs.push(locales);
for (var i = 0; i < arrLocs.length; ++i)
{
projectDef.PreBuildCmd += "\r\nset locales=" + arrLocs[i] + "\r\n" +
"for %%l in (%locales%) do " +
"echo cscript /nologo %util% /f /b:\"%bindir%\" " +
"/i:\"%etcdir%\\nls\" /l:%%l > \"%bindir%\\%%l.bat\"";
}
return projectDef;
}