blob: 0ef6b09d907b99eee837204019f5d2e7831e3690 [file] [log] [blame]
//
// $Id$
//
// filterdef.js - FilterDef 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 sourceFilterName = "Source Files";
var sourceFilterUuid = "{4FC737F1-C7A5-4376-A066-2A32D752A2FF}";
var sourceFilterExts = ".cpp;.cxx;.s;.asm";
var headerFilterName = "Header Files";
var headerFilterUuid = "{93995380-89BD-4b04-88EB-625FBE52EBFB}";
var headerFilterExts = ".h;.hpp;.hxx;.c;.cc";
//------------------------------------------------
// Macro class
//------------------------------------------------
// Macro .ctor
function Macro(name, value)
{
this.name = name;
this.value = value;
}
// Replace all macros in str
// str - string to modify
// arrMacro - array of Macro objects
function ReplaceMacros(str, arrMacro)
{
for (var i = 0; i < arrMacro.length; ++i)
{
var macro = arrMacro[i];
str = str.replace(new RegExp("(" + macro.name + ")", "g"), macro.value)
}
return str;
}
// common macros
var cmnMacros = new Array();
// init custom build rule for .asm files
function InitAsmTool(VCFile)
{
var cfgs = VCFile.FileConfigurations;
for (var i = 1; i <= cfgs.Count; ++i)
{
var cfg = cfgs.Item(i);
if ((typeof(cfg.Tool.ToolKind) != "undefined" &&
cfg.Tool.ToolKind != "VCCustomBuildTool") ||
cfg.Tool.ToolName != "Custom Build Tool")
{
cfg.Tool = cfg.ProjectConfiguration.FileTools.Item("VCCustomBuildTool");
}
var tool = cfg.Tool;
tool.Description = "Compiling .asm file...";
tool.Outputs = "$(IntDir)\\$(InputName).obj";
tool.CommandLine = AS + " /c /nologo /D" + PLATFORM + " /Fo" + tool.Outputs +
" /W3 /Zi /Ta" + VCFile.RelativePath;
}
}
//------------------------------------------------
// FilterDef class
//------------------------------------------------
// FilterDef .ctor
function FilterDef(name, id, filter, type, exclude)
{
this.Name = name;
this.Id = id;
this.Filter = filter;
this.Type = type;
this.Exclude = exclude;
this.Folder = null;
this.Files = new Array();
this.exclFolders = null;
this.exclFiles = null;
this.FilterDefs = new Array();
}
FilterDef.prototype.addFilter = filterAddFilter;
FilterDef.prototype.addFiles = filterAddFiles;
FilterDef.prototype.addFilesByMask = filterAddFilesByMask;
FilterDef.prototype.createVCFilter = filterCreateVCFilter;
// add subfilter to object
function filterAddFilter(filter)
{
this.FilterDefs.push(filter);
return this;
}
// add files to object
// folder - parent folder
// files - filename of array if filenames
function filterAddFiles(folder, files)
{
this.Folder = folder;
if (files instanceof Array)
this.Files = this.Files.concat(files);
else
this.Files.push(files);
return this;
}
// add to object files from filder and all subfolders
// excluding exclFolders and exclFiles
// folder - start folder
// exclFolder - regular expression which defines the folders to exclude
// exclFiles - regular expression which defines the files to exclude
function filterAddFilesByMask(folder, exclFolders, exclFiles)
{
this.Folder = folder;
this.exclFolders = exclFolders;
this.exclFiles = exclFiles;
return this;
}
// add file to VCFilter object
// filter - VCFilter object
// filename - filename to add
// filetype - type of file (one of eFileTypexxx)
// exclude - if true then file will be excluded from build
function AddFilterFile(filter, filename, filetype, exclude)
{
var VCFile = filter.AddFile(filename);
if (null != filetype && typeof(VCFile.FileType) != "undefined")
VCFile.FileType = filetype;
var customFileDef = null;
if (exclude)
{
var cfgs = VCFile.FileConfigurations;
for (var i = 1; i <= cfgs.Count; ++i)
{
var cfg = cfgs.Item(i);
if (typeof(cfg.Tool.ToolKind) != "undefined")
{
if (cfg.Tool.ToolKind != "VCCLCompilerTool")
exclude = false;
}
else if (cfg.Tool.ToolName != "C/C++ Compiler Tool")
exclude = false;
cfg.ExcludedFromBuild = exclude;
}
}
else if (".asm" == VCFile.Extension)
InitAsmTool(VCFile);
}
// create VCFilter object from the FilterDef definition
// and add to parent
function filterCreateVCFilter(parent)
{
var VCFilter;
if (null == this.Name)
VCFilter = parent;
else
{
VCFilter = parent.AddFilter(this.Name);
if (null != this.Id)
VCFilter.UniqueIdentifier = this.Id;
if (null != this.Filter)
VCFilter.Filter = this.Filter;
}
if (null != this.Folder)
this.Folder = ReplaceMacros(this.Folder, cmnMacros);
if (0 < this.Files.length)
{
// add specified files
for (var i = 0; i < this.Files.length; ++i)
{
var filename = this.Files[i];
if (null != this.Folder && this.Folder.length > 0)
filename = this.Folder + "\\" + filename;
try
{
fso.GetFile(filename);
}
catch (e)
{
WScript.Echo("File " + filename + " does not exist");
WScript.Quit(3);
}
AddFilterFile(VCFilter, filename, this.Type, this.Exclude);
}
}
else
{
// add files from folder
// create regexp from extensions
var extArray = this.Filter.replace(/\./g, "\\.").split(";");
var rxText = "^";
if (extArray.length != 0)
{
rxText += "(?:" + extArray[0];
for (i = 1; i < extArray.length; ++i)
rxText += "|" + extArray[i];
rxText += ")";
}
rxText += "$";
var rxExts = new RegExp(rxText, "i");
var folder;
try
{
folder = fso.GetFolder(this.Folder);
}
catch (e)
{
WScript.Echo("Folder " + this.Folder + " does not exist");
WScript.Quit(3);
}
// add subfolders as own filters
var enumSubFolders = new Enumerator(folder.SubFolders);
for (; !enumSubFolders.atEnd(); enumSubFolders.moveNext())
{
var subFolder = enumSubFolders.item();
if (null == this.exclFolders || !this.exclFolders.test(subFolder.Name))
{
var filterDef = new FilterDef(subFolder.Name, this.Id,
this.Filter, this.Type, this.Exclude);
filterDef.Folder = subFolder.Path;
filterDef.exclFolders = this.exclFolders;
filterDef.exclFiles = this.exclFiles;
filterDef.createVCFilter(VCFilter);
}
}
// add files
var nfiles = 0;
var enumFiles = new Enumerator(folder.Files);
for (; !enumFiles.atEnd(); enumFiles.moveNext())
{
var file = enumFiles.item();
var fileext = getExtension(file.Name);
if (rxExts.test(fileext) && (null == this.exclFiles || !this.exclFiles.test(file.Name)))
{
++nfiles;
AddFilterFile(VCFilter, file.Path, this.Type, this.Exclude);
}
}
// remove filter if it is empty
if (0 == nfiles)
parent.RemoveFilter(VCFilter);
}
for (var i = 0; i < this.FilterDefs.length; ++i)
this.FilterDefs[i].createVCFilter(VCFilter);
}