<?xml version="1.0" ?>
<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="makelog" prompt="no">
        <?job error="false" debug="false" ?>
        <runtime>
            <description>
Gathers logs and makes the build summary log.
            </description>
            <named helpstring="The build directory" name="BUILDDIR" 
                required="true" type="string"/>         
            <named helpstring="The build type" name="BUILDTYPE" 
                required="true" type="string"/>
            <named helpstring="The configuration" name="CONFIG" 
                required="true" type="string"/>
            <example>
cscript makelog.wsf /BUILDDIR"C:\stdcxx\build" /BUILDTYPE:11d /CONFIG:msvc-7.1
            </example>
            <usage>
Usage: cscript makebuildlog.wsf /BUILDDIR:@BUILDDIR 
/BUILDTYPE:@BUILDTYPE /CONFIG:@CONFIG
where
@BUILDDIR is the build directory,
@BUILDTYPE is the build type (11d, 11s, etc).
@CONFIG is the compiler configuration (msvc-7.1, icc-9.0, etc).
            </usage>
        </runtime>
        <object id="fso" progid="Scripting.FileSystemObject"/>
        <object id="WshShell" progid="WScript.Shell"/>
        <script language="JScript" src="config.js"/>
        <script language="JScript" src="utilities.js"/>
        <script language="JScript" src="summary.js"/>
        <script id="makelog" language="JScript">
<![CDATA[
//
// Summary build log maker script
//

var buildDir = "";      // path to the root directory containing executables
var buildDirBase = "";  // path to the root directory containing executables
var buildType = "";     // the buid type (11d, 11s, etc)
var buildCfg = "";      // the build configuration (MSVC-7.1, ICC-9.0, etc)

var buildlogFile = "BuildLog.htm";
var summaryFileName = "Summary.htm";
var htmFolderName = "temphtm";
var buildSummaryPrefix = "msvc-7.1-";

var buildLogUnicode = 0;

var libBuildDir = "src";
var examplesBuildDir = "examples";
var testsBuildDir = "tests";
var rwtestBuildDir = "tests\\src";
    
var description = new makelog; // run

// the main function of the script
function makelog()
{
    readAndCheckArguments();

    getCompilerOpts(buildCfg);
    
    var useUnicode = UNICODELOG;

    if (useUnicode)
        buildLogUnicode = -1;

    // check for build failures
    var sumTempFileNameEx = buildDir + "\\" + buildType + "\\" +
        examplesBuildDir + "\\" + summaryFileName;
    checkForFailures(buildDir + "\\" + buildType + "\\" + examplesBuildDir, buildType,
        buildlogFile, sumTempFileNameEx, htmFolderName, true, useUnicode);
    
    var sumTempFileNameTst = buildDir + "\\" + buildType + "\\" +
        testsBuildDir + "\\" + summaryFileName;
    checkForFailures(buildDir + "\\" + buildType + "\\" + testsBuildDir, buildType,
        buildlogFile, sumTempFileNameTst, htmFolderName, true, useUnicode);
        
    // make build summary log file
    var fSum = makeSummaryLog(buildDirBase, buildSummaryPrefix, buildType);
    var logPath = getSummaryLogPath(buildDirBase, 
        buildSummaryPrefix, buildType);
    
    // read information about library
    var libInfo = new ItemBuildInfo(".stdcxx");
    getLibraryBuildInfo(buildDir + "\\" + buildType +
        "\\" + libBuildDir, libInfo);
    
    // and test driver
    var rwtestInfo = new ItemBuildInfo(".rwtest");
    getTestDriverBuildInfo(buildDir + "\\" + buildType +
        "\\" + rwtestBuildDir, rwtestInfo);
        
    // save headers for library and test driver
    saveSummaryHeaderLib(fSum, libInfo, hdrLibrary);
    saveSummaryHeaderTestDriver(fSum, rwtestInfo, hdrTestDriver);
    
    // save headers for examples and tests
    saveSummaryHeaderMulti(fSum, buildDir + "\\" + buildType + "\\" + examplesBuildDir, 
        buildType, hdrExamples);
    saveSummaryHeaderMulti(fSum, buildDir + "\\" + buildType + "\\" + testsBuildDir, 
        buildType, hdrTests);

    // save build summary for library and test driver       
    saveBuildSummarySingle(fSum, libInfo, hdrLibrary);
    saveBuildSummarySingle(fSum, rwtestInfo, hdrTestDriver);
    
    // save build summary for examples and tests
    saveBuildSummariesFromFolder(fSum,
        buildDir + "\\" + buildType + "\\" + examplesBuildDir,
        htmFolderName);
    saveBuildSummariesFromFolder(fSum,
        buildDir + "\\" + buildType + "\\" + testsBuildDir,
        htmFolderName);
        
    closeSummaryLog(fSum);

    deleteTemporaryFiles();
    
    var resLogPath = logPath.replace(/\\/mg, "/");  
    WScript.Echo("Summary log was generated in file://" + resLogPath);
    
    WScript.Quit(0);
}

// performs checking of the script parameters
function readAndCheckArguments()
{
    if (!WScript.Arguments.Named.Exists("BUILDDIR"))
    {
        WScript.StdErr.WriteLine(
            "Generate: Missing required argument BUILDDIR.");
        WScript.Arguments.ShowUsage();
        WScript.Quit(2);
    }
    
    buildDir =  WScript.Arguments.Named("BUILDDIR");
    buildDirBase = buildDir;
    
    if (!WScript.Arguments.Named.Exists("CONFIG"))
    {
        WScript.StdErr.WriteLine(
            "Generate: Missing required argument CONFIG.");
        WScript.Arguments.ShowUsage();
        WScript.Quit(2);
    }
    
    buildCfg =  WScript.Arguments.Named("CONFIG");
    buildSummaryPrefix = buildCfg + "-";
    buildDir = buildDir + "\\" + buildCfg;
    
    if (WScript.Arguments.Named.Exists("BUILDTYPE"))
        buildType = WScript.Arguments.Named("BUILDTYPE");
    else
        buildType = "11d";
    
    if (! fso.FolderExists(buildDir))
    {
        WScript.StdErr.WriteLine(
            "Generate: Could not find directory " + buildDir);
            
        WScript.Quit(3);
    }
}

// collects information about build process of the stdcxx library
// libDir - output directory for the stdcxx library
// libInfo - ItemBuildInfo object to hold the collected information
function getLibraryBuildInfo(libDir, libInfo)
{   
    if (! fso.FolderExists(libDir))
        return;
        
    var blogFilePath = libDir + "\\" + buildlogFile;
    if (! fso.FileExists(blogFilePath))
        return;
        
    var blogFile = fso.OpenTextFile(blogFilePath, 1, false, buildLogUnicode);
    var blogData = blogFile.ReadAll();
    
    var posTmp = getCommandLinesInfo(libInfo, blogData, 0);
    posTmp = getCompilationInfo(libInfo, blogData, posTmp);
    posTmp = getBuildSummaryInfo(libInfo, blogData, posTmp);
}

// collects information about build process of the rwtest library
// rwtestDir - output directory for the rwtest library
// rwtestInfo - ItemBuildInfo object to hold the collected information
function getTestDriverBuildInfo(rwTestDir, rwtestInfo)
{
    if (! fso.FolderExists(rwTestDir))
        return;
        
    var blogFilePath = rwTestDir + "\\" + buildlogFile;
    if (! fso.FileExists(blogFilePath))
        return;
        
    var blogFile = fso.OpenTextFile(blogFilePath, 1, false, buildLogUnicode);
    var blogData = blogFile.ReadAll();
    
    var posTmp = getCommandLinesInfo(rwtestInfo, blogData, 0);
    posTmp = getCompilationInfo(rwtestInfo, blogData, posTmp);
    posTmp = getBuildSummaryInfo(rwtestInfo, blogData, posTmp);
}

// removes the temporary files created by this script and by run_all.wsf script
function deleteTemporaryFiles()
{
    // delete temphtm folders
    deleteTempFolders(buildDir + "\\" + buildType + "\\" + examplesBuildDir, htmFolderName);
        
    deleteTempFolders(buildDir + "\\" + buildType + "\\" + testsBuildDir, htmFolderName);
    
    // delete Summary.htm files
    var sumTempFileNameEx = buildDir + "\\" + buildType + "\\" + examplesBuildDir + "\\" + summaryFileName;
        
    if (fso.FileExists(sumTempFileNameEx))
        fso.DeleteFile(sumTempFileNameEx);
        
    var sumTempFileNameTst = buildDir + "\\" + buildType + "\\" + testsBuildDir + "\\" + summaryFileName;
        
    if (fso.FileExists(sumTempFileNameTst))
        fso.DeleteFile(sumTempFileNameTst);
}

// removes the subfolders with the specified name in specified folder
// startDir - starting folder
// tempName - name of the folder with temporary files
function deleteTempFolders(startDir, tempName)
{
    if (!fso.FolderExists(startDir))
        return;

    var startFolder = fso.GetFolder(startDir);
        
    var enumHtmSubFolders = new Enumerator(startFolder.SubFolders);
    for (; !enumHtmSubFolders.atEnd(); enumHtmSubFolders.moveNext())
    {
        var htmFName = enumHtmSubFolders.item().Name;
        var htmParent = enumHtmSubFolders.item().ParentFolder.Name;
        
        if (htmFName == tempName)
        {
            try
            {
                fso.DeleteFolder(enumHtmSubFolders.item().Path);
            }
            catch(e)
            {
                WScript.StdErr.Write("Could not delete temporary folder " + 
                    enumHtmSubFolders.item().Path);
            }
        }
        else
        {
            deleteTempFolders(startDir + "\\" + htmFName, tempName);
        }
    }
}

]]>
        </script>
    </job>
</package>
