blob: 6f70ddd551f9ea49b6d3edf594be91dbf03b76dd [file] [log] [blame]
<?xml version="1.0" ?><!-- -*- SGML -*- -->
<package>
<comment>
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.
</comment>
<job id="build" prompt="no">
<?job error="false" debug="false" ?>
<runtime>
<description>
Builds specified solution configuration
</description>
<named helpstring="Name of the compiler configuration"
name="CONFIG" required="true" type="string"/>
<named helpstring="Output directory for modules"
name="BUILDDIR" required="true" type="string"/>
<named helpstring="Top directory of stdcxx sources tree"
name="TOPDIR" required="false" type="string"/>
<named helpstring="Name of the solution configuration"
name="BUILDTYPE" required="true" type="string"/>
<named helpstring="Build projects only, do not execute tests"
name="BUILDONLY" required="false" type="string"/>
<example>cscript build.wsf /CONFIG:msvc-7.1 /BUILDTYPE:11d
</example>
<usage>
Usage: cscript build.wsf /CONFIG:@CONFIG /BUILDDIR:@BUILDDIR
/TOPDIR:@TOPDIR /BUILDTYPE:@BUILDTYPE [/BUILDONLY:@BUILDONLY]
where
@CONFIG is the compiler configuration (msvc-7.1, icc-9.0, etc).
@BUILDDIR is the root of the build directory.
@TOPDIR is the root of the stdcxx source tree.
@BUILDTYPE is the build type (11d, 11s, etc).
@BUILDONLY is one of { yes, no } - execute or not the tests.
</usage>
</runtime>
<object id="fso" progid="Scripting.FileSystemObject"/>
<object id="WshShell" progid="WScript.Shell"/>
<script language="JScript" src="config.js"/>
<script language="JScript" src="data.js"/>
<script language="JScript" src="utilities.js"/>
<script language="JScript" src="devenv_consts.js"/>
<script language="JScript" src="filterdef.js"/>
<script language="JScript" src="projectdef.js"/>
<script language="JScript" src="projects.js"/>
<script id="build" language="JScript">
<![CDATA[
//
// Solution generation script for Stdcxx library
//
// constants
var currentCfg = "";
var slnDir = "";
var srcDir = "";
var buildType = "";
var longConfName = "";
var buildOnly = false;
var outputPane = null;
var winconfigDir = "\\etc\\config\\windows";
var postBuildInvoked;
var rxBuildDir = null;
var rxTopDir = null;
var description = new build; // run
function event_ProjectBuildStarted(Cfg)
{
// clear output window
outputPane.Clear();
if (null != Cfg)
{
// delete old BuildLog.htm
var path = Cfg.Evaluate(Cfg.IntermediateDirectory) + "\\BuildLog.htm";
if (fso.FileExists(path))
fso.DeleteFile(path);
}
}
function getBuildLog(path)
{
var log = "";
try
{
var ForReading = 1;
var format = UNICODELOG ? -1 : 0;
var logStrm = fso.OpenTextFile(path, ForReading, false, format);
log = logStrm.ReadAll();
logStrm.Close();
log = stripTags(log);
var line = "-------";
log = log.replace("Build Log", "").replace("Command Lines", line);
log = log.replace("Output Window", line).replace("Results", line);
}
catch (e)
{
log = "";
}
return log;
}
function removeLogClutter(log)
{
if ("" != slnDir)
{
if (null == rxBuildDir)
{
var buildDir = slnDir.replace(/\\/g, "\\\\");
rxBuildDir = new RegExp("(" + buildDir + ")", "ig");
}
log = log.replace(rxBuildDir, "$(BUILDDIR)");
}
if ("" != srcDir)
{
if (null == rxTopDir)
{
var topDir = srcDir.replace(/\\/g, "\\\\");
rxTopDir = new RegExp("(" + topDir + ")", "ig");
}
log = log.replace(rxTopDir, "$(TOPDIR)");
}
log = log.replace(/^Build log was saved at.*$/gm, "");
return log;
}
function event_ProjectBuildFinished(Cfg, Warnings, Errors, Canceled)
{
postBuildInvoked = true;
var log = "";
var htm = "BuildLog.htm";
if (null != Cfg)
{
try
{
// try get log from BuildLog.htm file
var path = Cfg.Evaluate(Cfg.IntermediateDirectory) + "\\" + htm;
log = getBuildLog(path);
}
catch (e)
{
log = "";
}
}
if (0 == log.length)
{
// try get log from output window
var sel = outputPane.TextDocument.Selection;
sel.SelectAll();
log = sel.Text;
var log2 = "";
var begin = 0;
while (true)
{
// find BuildLog.htm path
var proto = "file://";
begin = log.indexOf(proto, begin);
if (0 > begin)
break;
begin += proto.length;
var end = log.indexOf(htm, begin);
if (0 > end)
break;
var path = log.substring(begin, end + htm.length);
log2 += getBuildLog(path);
}
if (0 < log2.length)
log = log2;
}
WScript.Echo(removeLogClutter(log));
}
function BuildProject(solutionBuild, projectName)
{
var projectFile = "";
var projects = dte.Solution.Projects;
for (var i = 1; i <= projects.Count && 0 == projectFile.length; ++i)
{
var project = projects.Item(i);
if (project.Name == projectName)
projectFile = project.UniqueName;
}
if (0 < projectFile.length)
{
event_ProjectBuildStarted(null);
postBuildInvoked = false;
solutionBuild.BuildProject(longConfName, projectFile, true);
if (!postBuildInvoked)
event_ProjectBuildFinished(null, 0, 0, 0);
return solutionBuild.LastBuildInfo;
}
WScript.Echo("Error: project " + projectName + " not found\n");
return 1;
}
function DiffTime(start, end)
{
var msec = end - start;
var min = Math.floor(msec / 60000);
var sec = Math.floor(msec % 60000 / 1000);
msec %= 1000;
return min + "m" + sec + "." + msec + "s";
}
function TimeEcho(msg, time)
{
WScript.Echo("### real time (" + msg + "):");
WScript.Echo(DiffTime(time, new Date()) + "\n");
}
// the main function of the script
function build()
{
WScript.Echo("Solution build script");
WScript.Echo("Checking arguments...");
readAndCheckArguments();
// get solution object
InitVSObjects(currentCfg, false);
dte.SuppressUI = true;
var solutionName = slnDir + "\\" + currentCfg + ".sln";
WScript.Echo("Loading solution...");
var solution = dte.Solution;
var retCode = 0;
var prop = null;
var propVal;
var oldLogging = null;
var iSettings = null;
var oldIccIdx = null;
var oldPlatIdx = null;
var projectEngine = null;
var events = null;
do
{
try
{
solution.Open(solutionName);
}
catch (e)
{
WScript.StdErr.WriteLine("Build: Failed to open solution file: " + solutionName);
retCode = 2;
break;
}
var solutionBuild = solution.SolutionBuild;
// fix 'Call was Rejected By Callee' error
// http://msdn2.microsoft.com/en-us/library/ms228772(vs.80).aspx
var ntimes = 60;
for (var i = 0; i < ntimes; ++i)
{
try
{
projectEngine = solution.Projects.Item(1).Object.VCProjectEngine;
break;
}
catch (e)
{
if (0 > e.description.indexOf("Call was rejected by callee")
|| i == ntimes - 1)
{
WScript.StdErr.WriteLine("Build: " + e.description);
retCode = 7;
break;
}
else
WScript.Sleep(1000);
}
}
if (retCode)
break;
events = projectEngine.Events;
try
{
WScript.ConnectObject(events, "event_");
}
catch (e)
{
events = null;
}
var runTests = false;
vsWindowKindOutput = "{34E76E81-EE4A-11D0-AE2E-00A0C90FFFC3}";
var outWindow = dte.Windows.Item(vsWindowKindOutput).Object;
outputPane = outWindow.OutputWindowPanes.Item("Build");
// save ConcurrentBuilds property value
try
{
prop = dte.Properties("Environment", "ProjectsAndSolution").Item("ConcurrentBuilds");
propVal = prop.Value;
prop.Value = 1;
}
catch (e)
{
// current version of devenv not support that property
prop = null;
}
if ("" != ICCVER)
{
// select proper Intel C++ compiler
try
{
iSettings = dte.GetObject("IntelOptions");
}
catch (e)
{
WScript.StdErr.WriteLine(
"Build: Intel C++ not installed or installed incorrectly.");
retCode = 1;
break;
}
oldIccIdx = iSettings.CurrentCompilerIndex;
oldPlatIdx = iSettings.CurrentPlatformIndex;
WScript.Echo("Current compiler: " +
iSettings.Compiler(oldIccIdx).Name);
var ICPlatform = "IA32";
if ("x64" == PLATFORM)
ICPlatform = "EM64T";
for (var i = 0; i < iSettings.PlatformsCount; ++i)
{
iSettings.CurrentPlatformIndex = i;
if (ICPlatform == iSettings.CurrentPlatformName)
break;
}
if (i >= iSettings.PlatformsCount)
{
WScript.StdErr.WriteLine(
"Build: Installed ICC does not support " + PLATFORM + " platform.");
retCode = 1;
break;
}
var rx = new RegExp("(^.*C\\+\\+ " + ICCVER + ".*)");
for (var i = 1; i <= iSettings.CompilersCount; ++i)
{
var compname = iSettings.Compiler(i).Name;
if (null != rx.exec(compname))
break;
}
if (i <= iSettings.CompilersCount)
{
iSettings.CurrentCompilerIndex = i;
WScript.Echo("Selected compiler: " +
iSettings.Compiler(i).Name);
}
else
{
WScript.StdErr.WriteLine(
"Build: ICC " + ICCVER + " not found.");
retCode = 1;
break;
}
}
// save BuildLogging property value
oldLogging = projectEngine.BuildLogging;
projectEngine.BuildLogging = true;
WScript.Echo("Performing configure step...\n");
var start = new Date();
var res = BuildProject(solutionBuild, ".configure");
TimeEcho ("config", start);
if (0 < res)
{
retCode = 3;
break;
}
WScript.Echo("Compiling stdcxx library...\n");
start = new Date();
res = BuildProject(solutionBuild, ".stdcxx");
TimeEcho ("lib", start);
if (0 < res)
{
retCode = 4;
break;
}
WScript.Echo("Compiling examples...\n");
start = new Date();
BuildProject(solutionBuild, ".stdcxx_examples");
TimeEcho ("examples", start);
WScript.Echo("Compiling rwtest library...\n");
start = new Date();
res = BuildProject(solutionBuild, ".rwtest");
TimeEcho ("rwtest", start);
if (0 == res)
{
runTests = true;
WScript.Echo("Compiling tests...\n");
start = new Date();
BuildProject(solutionBuild, ".stdcxx_tests");
TimeEcho ("tests", start);
}
WScript.Echo("Compiling utils...\n");
// compile exec utility
start = new Date();
var resExec = BuildProject(solutionBuild, "util_exec");
// compile rest utils
start = new Date();
var resUtils = BuildProject(solutionBuild, ".stdcxx_utils");
TimeEcho ("bin", start);
if (0 < resExec)
{
retCode = 5;
break;
}
if (buildOnly)
break;
start = new Date();
if (0 >= resUtils)
{
WScript.Echo("Running locales tests...");
BuildProject(solutionBuild, ".stdcxx_testlocales");
}
if (runTests)
{
WScript.Echo("Running tests...\n");
start = new Date();
BuildProject(solutionBuild, ".stdcxx_runtests");
}
WScript.Echo("Running examples...\n");
start = new Date();
BuildProject(solutionBuild, ".stdcxx_runexamples");
TimeEcho ("runall", start);
}
while (false);
if (null != iSettings)
{
if (null != oldIccIdx)
iSettings.CurrentCompilerIndex = oldIccIdx;
if (null != oldPlatIdx)
iSettings.CurrentPlatformIndex = oldPlatIdx;
iSettings = null;
}
if (null != oldLogging)
projectEngine.BuildLogging = oldLogging;
projectEngine = null;
if (null != events)
{
WScript.DisconnectObject(events);
events = null;
}
outputPane = null;
// restore ConcurrentBuilds property value
if (null != prop)
prop.Value = propVal;
WScript.Echo("Closing the VisualStudio...");
solution = null;
dte.Quit();
dte = null;
WScript.Echo("Exiting...");
WScript.Quit(retCode);
}
// performs checking of the script parameters
function readAndCheckArguments()
{
if (!WScript.Arguments.Named.Exists("CONFIG"))
{
WScript.StdErr.WriteLine(
"Build: Missing required argument.");
WScript.Arguments.ShowUsage();
WScript.Quit(2);
}
if (!WScript.Arguments.Named.Exists("BUILDDIR"))
{
WScript.StdErr.WriteLine(
"Build: Missing required argument BUILDDIR.");
WScript.Arguments.ShowUsage();
WScript.Quit(2);
}
if (!WScript.Arguments.Named.Exists("BUILDTYPE"))
{
WScript.StdErr.WriteLine(
"Build: Missing required argument BUILDTYPE.");
WScript.Arguments.ShowUsage();
WScript.Quit(2);
}
currentCfg = WScript.Arguments.Named("CONFIG");
slnDir = WScript.Arguments.Named("BUILDDIR");
slnDir = fso.GetAbsolutePathName (slnDir) + "\\" + currentCfg;
if (WScript.Arguments.Named.Exists("TOPDIR"))
{
srcDir = WScript.Arguments.Named("TOPDIR");
}
else
{
// try to deduce it
var myDir = WScript.ScriptFullName;
var dirIndex = myDir.indexOf(winconfigDir);
if (0 <= dirIndex)
srcDir = myDir.substr(0, dirIndex);
else
srcDir = "";
}
buildType = WScript.Arguments.Named("BUILDTYPE");
for (var i = 0; i < confNames.length; ++i)
{
var lcfg = confNames[i];
var scfg = configs.get(lcfg).out;
if (buildType == scfg)
{
longConfName = lcfg;
break;
}
}
if (0 == longConfName.length)
{
WScript.StdErr.WriteLine(
"Build: Invalid argument BUILDTYPE.");
WScript.Arguments.ShowUsage();
WScript.Quit(2);
}
if (WScript.Arguments.Named.Exists("BUILDONLY"))
{
var copyOption = WScript.Arguments.Named("BUILDONLY");
copyOption = copyOption.toLowerCase();
if (copyOption == "yes" || copyOption == "y")
buildOnly = true;
}
}
]]>
</script>
</job>
</package>