146 lines
4.6 KiB
C#
146 lines
4.6 KiB
C#
|
// ----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//
|
||
|
// ----------------------------------------------------------------------------
|
||
|
|
||
|
using System;
|
||
|
using System.IO;
|
||
|
using System.Xml;
|
||
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Text;
|
||
|
using Microsoft.Build.Framework;
|
||
|
|
||
|
namespace Microsoft.Singularity.BuildTasks
|
||
|
{
|
||
|
public class Mkmani : ExecTaskBase
|
||
|
{
|
||
|
string _outputManifestPath;
|
||
|
string _applicationName;
|
||
|
string _cacheRootPath;
|
||
|
string _outputNativeExecutablePath;
|
||
|
string _codeGenParameters;
|
||
|
string _linkerParameters;
|
||
|
ITaskItem[] _assemblies;
|
||
|
|
||
|
protected override bool Execute()
|
||
|
{
|
||
|
ArrayList codegen = new ArrayList();
|
||
|
ArrayList linker = new ArrayList();
|
||
|
string outfile = _outputManifestPath;
|
||
|
string appname = _applicationName;
|
||
|
string x86file = _outputNativeExecutablePath;
|
||
|
string cacheDirectory = _cacheRootPath;
|
||
|
|
||
|
// check all input files
|
||
|
ArrayList infiles = new ArrayList();
|
||
|
foreach (ITaskItem assembly in _assemblies) {
|
||
|
if (!File.Exists(assembly.ItemSpec)) {
|
||
|
LogError(String.Format("Error: Assembly '{0}' not found.", assembly.ItemSpec));
|
||
|
return false;
|
||
|
}
|
||
|
infiles.Add(assembly.ItemSpec);
|
||
|
}
|
||
|
|
||
|
if (!Directory.Exists(cacheDirectory)) {
|
||
|
LogError(String.Format("Error: Cache directory '{0}' not found.", cacheDirectory));
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
// This is to work around a bug in ManifestBuilder that causes it to emit paths like
|
||
|
// cache="/Apps/..." into manifests, which are later interpreted as absolute paths
|
||
|
// by NIB.
|
||
|
if (!cacheDirectory.EndsWith("\\"))
|
||
|
cacheDirectory += "\\";
|
||
|
|
||
|
// initialize the empty app manifest.
|
||
|
ManifestBuilder mb = new ManifestBuilder(_cacheRootPath, infiles);
|
||
|
|
||
|
string nativeExecutableFullPath;
|
||
|
if (!String.IsNullOrEmpty(_outputNativeExecutablePath))
|
||
|
nativeExecutableFullPath = Path.GetFullPath(_outputNativeExecutablePath);
|
||
|
else
|
||
|
nativeExecutableFullPath = "";
|
||
|
|
||
|
// create the app manifest
|
||
|
if (!mb.CreateNewManifest(appname, nativeExecutableFullPath)) {
|
||
|
LogError("An error occurred while generating the manifest.");
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
// Add the codegen flags.
|
||
|
foreach (string param in codegen) {
|
||
|
mb.AddCodegenParameter(param);
|
||
|
}
|
||
|
|
||
|
// Add the linker flags.
|
||
|
foreach (string param in linker) {
|
||
|
mb.AddLinkerParameter(param);
|
||
|
}
|
||
|
|
||
|
// output the xml document:
|
||
|
try {
|
||
|
using (XmlTextWriter writer = new XmlTextWriter(outfile, System.Text.Encoding.UTF8)) {
|
||
|
writer.Formatting = Formatting.Indented;
|
||
|
mb.Save(writer);
|
||
|
}
|
||
|
}
|
||
|
catch (Exception ex) {
|
||
|
LogError("The manifest file could not be created: " + ex.Message);
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
|
||
|
[Required]
|
||
|
public string OutputManifestPath
|
||
|
{
|
||
|
get { return _outputManifestPath; }
|
||
|
set { _outputManifestPath = value; }
|
||
|
}
|
||
|
|
||
|
[Required]
|
||
|
public string ApplicationName
|
||
|
{
|
||
|
get { return _applicationName; }
|
||
|
set { _applicationName = value; }
|
||
|
}
|
||
|
|
||
|
[Required]
|
||
|
public string CacheRootPath
|
||
|
{
|
||
|
get { return _cacheRootPath; }
|
||
|
set { _cacheRootPath = value; }
|
||
|
}
|
||
|
|
||
|
[Required]
|
||
|
public string OutputNativeExecutablePath
|
||
|
{
|
||
|
get { return _outputNativeExecutablePath; }
|
||
|
set { _outputNativeExecutablePath = value; }
|
||
|
}
|
||
|
|
||
|
public ITaskItem[] Assemblies
|
||
|
{
|
||
|
get { return _assemblies; }
|
||
|
set { _assemblies = value; }
|
||
|
}
|
||
|
|
||
|
public string CodeGenParameters
|
||
|
{
|
||
|
get { return _codeGenParameters; }
|
||
|
set { _codeGenParameters = value; }
|
||
|
}
|
||
|
|
||
|
public string LinkerParameters
|
||
|
{
|
||
|
get { return _linkerParameters; }
|
||
|
set { _linkerParameters = value; }
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|