singrdk/base/Windows/BuildTasks/Sgc.cs

420 lines
12 KiB
C#

// ----------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ----------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Diagnostics;
using Microsoft.Build.Framework;
namespace Microsoft.Singularity.BuildTasks
{
public class Sgc : ExecTaskBase
{
override protected bool Execute()
{
// Scan the parameters and build the argument list that we will pass to the command-line compiler.
List<String> args = new List<String>();
args.Add("/nologo");
if (String.IsNullOrEmpty(_outputAssembly)) {
LogError("The 'OutputAssembly' property is required, but no value was provided.");
return false;
}
args.Add("/out:" + _outputAssembly);
string targetType = _targetType;
if (String.IsNullOrEmpty(targetType)) {
LogError("The 'TargetType' property is required, but no value was provided.");
return false;
}
targetType = targetType.ToLower();
if (targetType != "exe" && targetType != "library" && targetType != "winexe") {
LogError(String.Format("The value '{0}' is valid for the 'TargetType' property.", targetType));
return false;
}
args.Add("/t:" + targetType);
if (_no_config)
args.Add("/noconfig");
if (_no_stdlib)
args.Add("/nostdlib");
if (_allowUnsafeBlocks)
args.Add("/unsafe+");
if (_checkOverflow)
args.Add("/checked+");
if (_assumeFieldsNonNull)
args.Add("/assumefieldsnonnull");
if (_emitDebugInformation) {
string debugType = _debugType;
if (String.IsNullOrEmpty(debugType))
debugType = "full";
debugType = debugType.ToLower();
if (debugType != "full" && debugType != "pdbonly") {
LogError(String.Format("The value '{0}' is not valid for the 'DebugType' parameter.", _debugType));
LogError("Valid values are 'full' and 'pdbonly'.");
}
args.Add("/debug+");
args.Add("/debug:" + debugType);
}
else {
// no debug info
}
if (_optimize)
args.Add("/optimize+");
if (_generateFullPaths)
args.Add("/fullpaths");
if (!String.IsNullOrEmpty(_stdlib)) {
args.Add("/stdlib:" + _stdlib);
}
string platform_version = _platformVersion;
if (platform_version != null) {
platform_version = platform_version.ToLower();
if (platform_version != "cli1" && platform_version != "cli11" && platform_version != "cli2") {
LogError("The value '{0}' is not valid for the 'PlatformVersion' parameter.");
LogError("Valid values are 'cli1', 'cli11', and 'cli2'.");
return false;
}
}
else {
platform_version = "cli1";
}
string runtime_path = _runtimePath;
if (String.IsNullOrEmpty(runtime_path)) {
runtime_path = "";
}
args.Add("/platform:" + platform_version + "," + runtime_path);
if (!String.IsNullOrEmpty(_shadowAssemblyPath))
args.Add("/shadow:" + _shadowAssemblyPath);
if (_references != null) {
foreach (ITaskItem reference in _references) {
args.Add("/r:" + reference.ItemSpec);
}
}
if (_sources == null || _sources.Length == 0) {
LogError("No source files were provided.");
return false;
}
if (!String.IsNullOrEmpty(_defineConstants)) {
string[] defines = _defineConstants.Split(_define_splits, StringSplitOptions.RemoveEmptyEntries);
foreach (string define in defines) {
if (String.IsNullOrEmpty(define))
continue;
args.Add("/d:" + define);
}
}
if (_disableNullParameterValidation) {
args.Add("/disable:nullparametervalidation");
}
if (!String.IsNullOrEmpty(_documentationFile)) {
args.Add("/doc:" + _documentationFile);
}
if (!String.IsNullOrEmpty(_disabledWarnings))
args.Add("/nowarn:" + _disabledWarnings);
if (_treatWarningsAsErrors)
args.Add("/warnaserror+");
if (!String.IsNullOrEmpty(_warningsAsErrors))
args.Add("/warnaserror:" + _warningsAsErrors);
foreach (ITaskItem source in _sources) {
args.Add(source.ItemSpec);
}
return ExecuteProgram(_sgcExe, args);
}
static readonly char[] _define_splits = { ';', ' ', '\t' };
ITaskItem[] _sources;
[Required]
public ITaskItem[] Sources
{
get { return _sources; }
set { _sources = value; }
}
string _targetType = "Exe";
[Required]
public string TargetType
{
get { return _targetType; }
set { _targetType = value; }
}
bool _treatWarningsAsErrors;
public bool TreatWarningsAsErrors
{
get { return _treatWarningsAsErrors; }
set { _treatWarningsAsErrors = value; }
}
int _warningLevel;
public int WarningLevel
{
get { return _warningLevel; }
set { _warningLevel = value; }
}
string _warningsNotAsErrors;
string _warningsAsErrors;
public string WarningsAsErrors
{
get { return _warningsAsErrors; }
set { _warningsAsErrors = value; }
}
public string WarningsNotAsErrors
{
get { return _warningsNotAsErrors; }
set { _warningsNotAsErrors = value; }
}
bool _no_stdlib;
public bool NoStandardLib
{
get { return _no_stdlib; }
set { _no_stdlib = value; }
}
string _stdlib;
public string StandardLib
{
get { return _stdlib; }
set { _stdlib = value; }
}
bool _optimize;
public bool Optimize
{
get { return _optimize; }
set { _optimize = value; }
}
[Required]
public string OutputAssembly
{
get { return _outputAssembly; }
set { _outputAssembly = value; }
}
string _outputAssembly;
string _platform = "anycpu";
public string Platform
{
get { return _platform; }
set { _platform = value; }
}
ITaskItem[] _references;
public ITaskItem[] References
{
get { return _references; }
set { _references = value; }
}
string _runtimePath;
public string CompilerRuntimePath
{
get { return _runtimePath; }
set { _runtimePath = value; }
}
string _platformVersion = "cli1";
public string PlatformVersion
{
get { return _platformVersion; }
set { _platformVersion = value; }
}
bool _disableNullParameterValidation;
public bool DisableNullParameterValidation
{
get { return _disableNullParameterValidation; }
set { _disableNullParameterValidation = value; }
}
bool _allowUnsafeBlocks;
public bool AllowUnsafeBlocks
{
get { return _allowUnsafeBlocks; }
set { _allowUnsafeBlocks = value; }
}
bool _checkOverflow;
public bool CheckForOverflowUnderflow
{
get { return _checkOverflow; }
set { _checkOverflow = value; }
}
string _debugType;
public string DebugType
{
get { return _debugType; }
set
{
if (value != null) {
value = value.ToLower();
switch (value) {
case "full":
case "pdbonly":
break;
default:
throw new ArgumentException("The value provided is not valid for the property DebugType.", "DebugType");
}
_debugType = value;
}
else {
_debugType = value;
}
}
}
string _defineConstants;
public string DefineConstants
{
get { return _defineConstants; }
set { _defineConstants = value; }
}
string _disabledWarnings;
public string DisabledWarnings
{
get { return _disabledWarnings; }
set { _disabledWarnings = value; }
}
string _documentationFile;
public string DocumentationFile
{
get { return _documentationFile; }
set { _documentationFile = value; }
}
bool _emitDebugInformation;
public bool EmitDebugInformation
{
get { return _emitDebugInformation; }
set { _emitDebugInformation = value; }
}
bool _generateFullPaths;
public bool GenerateFullPaths
{
get { return _generateFullPaths; }
set { _generateFullPaths = value; }
}
string _keyContainer;
public string KeyContainer
{
get { return _keyContainer; }
set { _keyContainer = value; }
}
string _keyFile;
public string KeyFile
{
get { return _keyFile; }
set { _keyFile = value; }
}
string _mainEntryPoint;
public string MainEntryPoint
{
get { return _mainEntryPoint; }
set { _mainEntryPoint = value; }
}
string _sgcExe = "sgc.exe";
public string ExecutablePath
{
get { return _sgcExe; }
set { _sgcExe = value; }
}
bool _assumeFieldsNonNull;
public bool AssumeFieldsNonNull
{
get { return _assumeFieldsNonNull; }
set { _assumeFieldsNonNull = value; }
}
string _shadowAssemblyPath;
public string ShadowAssemblyPath
{
get { return _shadowAssemblyPath; }
set { _shadowAssemblyPath = value; }
}
bool _no_config;
public bool NoConfig
{
get { return _no_config; }
set { _no_config = value; }
}
}
}