// NAnt - A .NET build tool
// Copyright (C) 2001-2003 Gerry Shaw
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// Matthew Mastracci (matt@aclaro.com)
using System;
using System.Globalization;
using System.IO;
using System.Collections;
using System.Xml;
using NAnt.Core;
using NAnt.Core.Util;
using NAnt.VSNet.Tasks;
namespace NAnt.VSNet {
public class ConfigurationSettings : ConfigurationBase {
#region Public Instance Constructors
public ConfigurationSettings(ManagedProjectBase project, XmlElement elemConfig, DirectoryInfo outputDir) : base(project) {
_settings = new ArrayList();
if (outputDir == null) {
_relativeOutputDir = elemConfig.Attributes["OutputPath"].Value;
if (!_relativeOutputDir.EndsWith(Path.DirectorySeparatorChar.ToString(CultureInfo.InvariantCulture))) {
_relativeOutputDir = _relativeOutputDir + Path.DirectorySeparatorChar;
}
_outputDir = new DirectoryInfo(FileUtils.CombinePaths(
project.ProjectDirectory.FullName,
_relativeOutputDir));
} else {
_relativeOutputDir = outputDir.FullName;
if (!_relativeOutputDir.EndsWith(Path.DirectorySeparatorChar.ToString(CultureInfo.InvariantCulture))) {
_relativeOutputDir = _relativeOutputDir + Path.DirectorySeparatorChar;
}
_outputDir = outputDir;
}
_name = elemConfig.GetAttribute("Name");
string documentationFile = elemConfig.GetAttribute("DocumentationFile");
if (!StringUtils.IsNullOrEmpty(documentationFile)) {
// to match VS.NET, the XML Documentation file will be output
// in the project directory, and only later copied to the output
// directory
string xmlDocBuildFile = FileUtils.CombinePaths(project.ProjectDirectory.FullName,
documentationFile);
// add compiler option to build XML Documentation file
_settings.Add(@"/doc:""" + xmlDocBuildFile + @"""");
// make sure the output directory for the doc file exists
if (!Directory.Exists(Path.GetDirectoryName(xmlDocBuildFile))) {
Directory.CreateDirectory(Path.GetDirectoryName(xmlDocBuildFile));
}
// add built documentation file as extra output file
ExtraOutputFiles[xmlDocBuildFile] = Path.GetFileName(xmlDocBuildFile);
}
// determine whether we need to register project output for use with
// COM components
_registerForComInterop = string.Compare(elemConfig.GetAttribute("RegisterForComInterop"),
"true", true, CultureInfo.InvariantCulture) == 0;
SolutionTask.Log(Level.Debug, "Project: {0} Relative Output Path: {1} Output Path: {2} Documentation Path: {3}",
Project.Name, _relativeOutputDir, _outputDir.FullName, documentationFile);
Hashtable htStringSettings = new Hashtable();
Hashtable htBooleanSettings = new Hashtable();
htStringSettings["BaseAddress"] = "/baseaddress:{0}";
// is only supported by csc (all versions) and vbc (2.0 or higher)
htStringSettings["FileAlignment"] = "/filealign:{0}";
htStringSettings["DefineConstants"] = "/define:{0}";
switch (project.Type) {
case ProjectType.CSharp:
htStringSettings["WarningLevel"] = "/warn:{0}";
htStringSettings["NoWarn"] = "/nowarn:{0}";
htBooleanSettings["IncrementalBuild"] = "/incremental";
htBooleanSettings["AllowUnsafeBlocks"] = "/unsafe";
htBooleanSettings["CheckForOverflowUnderflow"] = "/checked";
break;
case ProjectType.JSharp:
htStringSettings["WarningLevel"] = "/warn:{0}";
htStringSettings["NoWarn"] = "/nowarn:{0}";
htBooleanSettings["IncrementalBuild"] = "/incremental";
break;
case ProjectType.VB:
htStringSettings["DefineDebug"] = "/d:DEBUG={0}";
htStringSettings["DefineTrace"] = "/d:TRACE={0}";
htBooleanSettings["RemoveIntegerChecks"] = "/removeintchecks";
break;
}
htBooleanSettings["DebugSymbols"] = "/debug";
htBooleanSettings["TreatWarningsAsErrors"] = "/warnaserror";
htBooleanSettings["Optimize"] = "/optimize";
foreach (DictionaryEntry de in htStringSettings) {
string value = elemConfig.GetAttribute(de.Key.ToString());
if (!StringUtils.IsNullOrEmpty(value)) {
switch (de.Key.ToString()) {
case "BaseAddress":
// vbc and vjs expect the base address to be specified
// as a hexadecimal number, csc supports decimal,
// hexadecimal, or octal number
//
// so use hexadecimal as all compiler support this
uint intvalue = Convert.ToUInt32(value, CultureInfo.InvariantCulture);
value = "0x" + intvalue.ToString("x", CultureInfo.InvariantCulture);
break;
case "DefineConstants":
// vbc fails when the symbol contains spaces
value = value.Replace(" ", string.Empty);
break;
}
_settings.Add(string.Format(CultureInfo.InvariantCulture, de.Value.ToString(), value));
}
}
foreach (DictionaryEntry de in htBooleanSettings) {
string value = elemConfig.GetAttribute(de.Key.ToString());
if (string.Compare(value, "true", true, CultureInfo.InvariantCulture) == 0) {
_settings.Add(de.Value.ToString() + "+");
} else if (string.Compare(value, "false", true, CultureInfo.InvariantCulture) == 0) {
_settings.Add(de.Value.ToString() + "-");
}
}
_settings.Add(string.Format(CultureInfo.InvariantCulture, "/out:\"{0}\"", BuildPath));
}
#endregion Public Instance Constructors
#region Public Instance Properties
///
/// Gets the platform that the configuration targets.
///
///
/// The platform targeted by the configuration.
///
public override string PlatformName {
get { return ".NET"; }
}
public override string RelativeOutputDir {
get { return _relativeOutputDir; }
}
public override DirectoryInfo OutputDir {
get { return _outputDir; }
}
public override string OutputPath {
get {
return FileUtils.CombinePaths(OutputDir.FullName,
((ManagedProjectBase) Project).ProjectSettings.OutputFileName);
}
}
///
/// Gets the path in which the output file will be created before its
/// copied to the actual output path.
///
public override string BuildPath {
get {
return FileUtils.CombinePaths(ObjectDir.FullName,
Path.GetFileName(OutputPath));
}
}
public string[] Settings {
get { return (string[]) _settings.ToArray(typeof(string)); }
}
public override string Name {
get { return _name; }
}
///
/// Gets a value indicating whether to register the project output for
/// use with COM components.
///
///
/// if the project output should be registered
/// for use with COM components; otherwise, .
///
public bool RegisterForComInterop {
get { return _registerForComInterop; }
}
#endregion Public Instance Properties
#region Private Instance Fields
private readonly ArrayList _settings;
private readonly string _relativeOutputDir;
private readonly DirectoryInfo _outputDir;
private readonly string _name;
private readonly bool _registerForComInterop;
#endregion Private Instance Fields
}
}