// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
namespace WixToolset.BuildTasks
{
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Text;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
///
/// An MSBuild task to run the WiX lib tool.
///
public sealed class Lit : WixToolTask
{
private const string LitToolName = "lit.exe";
private string[] baseInputPaths;
private ITaskItem[] bindInputPaths;
private bool bindFiles;
private ITaskItem[] extensions;
private ITaskItem[] localizationFiles;
private ITaskItem[] objectFiles;
private ITaskItem outputFile;
private bool pedantic;
private bool suppressIntermediateFileVersionMatching;
private bool suppressSchemaValidation;
private string extensionDirectory;
private string[] referencePaths;
// TODO: remove this property entirely in v4.0
[Obsolete("Use BindInputPaths instead of BaseInputPaths.")]
public string[] BaseInputPaths
{
get { return this.baseInputPaths; }
set { this.baseInputPaths = value; }
}
public ITaskItem[] BindInputPaths
{
get { return this.bindInputPaths; }
set { this.bindInputPaths = value; }
}
public bool BindFiles
{
get { return this.bindFiles; }
set { this.bindFiles = value; }
}
public ITaskItem[] Extensions
{
get { return this.extensions; }
set { this.extensions = value; }
}
public ITaskItem[] LocalizationFiles
{
get { return this.localizationFiles; }
set { this.localizationFiles = value; }
}
[Required]
public ITaskItem[] ObjectFiles
{
get { return this.objectFiles; }
set { this.objectFiles = value; }
}
[Required]
[Output]
public ITaskItem OutputFile
{
get { return this.outputFile; }
set { this.outputFile = value; }
}
public bool Pedantic
{
get { return this.pedantic; }
set { this.pedantic = value; }
}
public bool SuppressIntermediateFileVersionMatching
{
get { return this.suppressIntermediateFileVersionMatching; }
set { this.suppressIntermediateFileVersionMatching = value; }
}
public bool SuppressSchemaValidation
{
get { return this.suppressSchemaValidation; }
set { this.suppressSchemaValidation = value; }
}
public string ExtensionDirectory
{
get { return this.extensionDirectory; }
set { this.extensionDirectory = value; }
}
public string[] ReferencePaths
{
get { return this.referencePaths; }
set { this.referencePaths = value; }
}
///
/// Get the name of the executable.
///
/// The ToolName is used with the ToolPath to get the location of lit.exe
/// The name of the executable.
protected override string ToolName
{
get { return LitToolName; }
}
///
/// Get the path to the executable.
///
/// GetFullPathToTool is only called when the ToolPath property is not set (see the ToolName remarks above).
/// The full path to the executable or simply lit.exe if it's expected to be in the system path.
protected override string GenerateFullPathToTool()
{
// If there's not a ToolPath specified, it has to be in the system path.
if (String.IsNullOrEmpty(this.ToolPath))
{
return LitToolName;
}
return Path.Combine(Path.GetFullPath(this.ToolPath), LitToolName);
}
///
/// Builds a command line from options in this task.
///
protected override void BuildCommandLine(WixCommandLineBuilder commandLineBuilder)
{
base.BuildCommandLine(commandLineBuilder);
commandLineBuilder.AppendSwitchIfNotNull("-out ", this.OutputFile);
commandLineBuilder.AppendArrayIfNotNull("-b ", this.baseInputPaths);
if (null != this.BindInputPaths)
{
Queue formattedBindInputPaths = new Queue();
foreach (ITaskItem item in this.BindInputPaths)
{
String formattedPath = string.Empty;
String bindName = item.GetMetadata("BindName");
if (!String.IsNullOrEmpty(item.GetMetadata("BindName")))
{
formattedPath = String.Concat(bindName, "=", item.GetMetadata("FullPath"));
}
else
{
formattedPath = item.GetMetadata("FullPath");
}
formattedBindInputPaths.Enqueue(formattedPath);
}
commandLineBuilder.AppendArrayIfNotNull("-b ", formattedBindInputPaths.ToArray());
}
commandLineBuilder.AppendIfTrue("-bf", this.BindFiles);
commandLineBuilder.AppendExtensions(this.extensions, this.ExtensionDirectory, this.referencePaths);
commandLineBuilder.AppendArrayIfNotNull("-loc ", this.LocalizationFiles);
commandLineBuilder.AppendIfTrue("-pedantic", this.Pedantic);
commandLineBuilder.AppendIfTrue("-ss", this.SuppressSchemaValidation);
commandLineBuilder.AppendIfTrue("-sv", this.SuppressIntermediateFileVersionMatching);
commandLineBuilder.AppendTextIfNotNull(this.AdditionalOptions);
List objectFilePaths = AdjustFilePaths(this.objectFiles, this.ReferencePaths);
commandLineBuilder.AppendFileNamesIfNotNull(objectFilePaths.ToArray(), " ");
}
}
}