Hi Gert,

Not sure if my last mail with some more <solution> task updates came through.  I got an auto-response from the list saying my mail was a little big and awaiting moderator approval so not sure if it made it to the list...

Anyway,  since sending those updates I've done a bit more testing and found a couple of bugs with my changes or the latest mainline.  Attached is a revised set of updates that seem to work correctly for me.  The changes are in unified diff format and are upto date with the latest mainline.

Let me know if there are more updates you'd like me to make...

Regards,

Simon

 


diff -u -w -r 
c:\nant-0.85-nightly-2004-11-22\src\NAnt.VisualCpp\Tasks\ClTask.cs 
c:\nant-0.85-nightly-2004-11-22-changes\src\NAnt.VisualCpp\Tasks\ClTask.cs
--- c:\nant-0.85-nightly-2004-11-22\src\NAnt.VisualCpp\Tasks\ClTask.cs  Sun Aug 
01 20:42:24 2004
+++ c:\nant-0.85-nightly-2004-11-22-changes\src\NAnt.VisualCpp\Tasks\ClTask.cs  
Tue Oct 26 17:49:20 2004
@@ -89,7 +89,7 @@
         /// </summary>
         [TaskAttribute("pchfile")]
         public string PchFile {
-            get { return (_pchFile != null) ? Path.Combine(OutputDir.FullName, 
_pchFile) : null; }
+            get { return (_pchFile != null) ? 
Path.Combine(OutputDir.Parent.FullName, _pchFile) : null; }
             set { _pchFile = StringUtils.ConvertEmptyToNull(value); }
         }
 
@@ -332,11 +332,6 @@
                         Path.AltDirectorySeparatorChar);
                     writer.WriteLine("/Fo\"{0}{1}\"", OutputDir.FullName, 
                         Path.AltDirectorySeparatorChar);
-
-                    // specify pch file, if user specified one
-                    if (PchFile != null) {
-                        writer.WriteLine("/Fp\"{0}\"", PchFile);
-                    }
 
                     // write each of the filenames
                     foreach (string filename in Sources.FileNames) {
diff -u -w -r 
c:\nant-0.85-nightly-2004-11-22\src\NAnt.VisualCpp\Tasks\LibTask.cs 
c:\nant-0.85-nightly-2004-11-22-changes\src\NAnt.VisualCpp\Tasks\LibTask.cs
--- c:\nant-0.85-nightly-2004-11-22\src\NAnt.VisualCpp\Tasks\LibTask.cs Fri Jul 
16 03:52:02 2004
+++ c:\nant-0.85-nightly-2004-11-22-changes\src\NAnt.VisualCpp\Tasks\LibTask.cs 
Sat Nov 20 19:17:12 2004
@@ -158,7 +158,9 @@
 
                 // write each of the libdirs
                 foreach (string libdir in LibDirs.DirectoryNames) {
+                                       if (libdir.Length > 0) {
                     writer.WriteLine("/LIBPATH:\"{0}\"", libdir);
+                                       }
                 }
 
                 // suppresses display of the sign-on banner                    
diff -u -w -r 
c:\nant-0.85-nightly-2004-11-22\src\NAnt.VisualCpp\Tasks\LinkTask.cs 
c:\nant-0.85-nightly-2004-11-22-changes\src\NAnt.VisualCpp\Tasks\LinkTask.cs
--- c:\nant-0.85-nightly-2004-11-22\src\NAnt.VisualCpp\Tasks\LinkTask.cs        
Fri Jul 16 03:52:02 2004
+++ 
c:\nant-0.85-nightly-2004-11-22-changes\src\NAnt.VisualCpp\Tasks\LinkTask.cs    
    Sat Nov 20 19:17:54 2004
@@ -186,7 +186,9 @@
   
                    // write each of the libdirs
                    foreach (string libdir in LibDirs.DirectoryNames) {
+                                          if (libdir.Length > 0) {
                        writer.WriteLine("/LIBPATH:\"{0}\"", libdir);
+                                          }
                    }
 
                    // suppresses display of the sign-on banner                 
   
diff -u -w -r 
c:\nant-0.85-nightly-2004-11-22\src\NAnt.VSNet\ConfigurationBase.cs 
c:\nant-0.85-nightly-2004-11-22-changes\src\NAnt.VSNet\ConfigurationBase.cs
--- c:\nant-0.85-nightly-2004-11-22\src\NAnt.VSNet\ConfigurationBase.cs Sun Nov 
14 23:43:48 2004
+++ c:\nant-0.85-nightly-2004-11-22-changes\src\NAnt.VSNet\ConfigurationBase.cs 
Tue Nov 23 23:12:24 2004
@@ -175,6 +175,8 @@
         protected internal virtual string ExpandMacro(string macro) {
             // perform case-insensitive expansion of macros 
             switch (macro.ToLower(CultureInfo.InvariantCulture)) {
+                               case "noinherit":
+                                       return "";
                 case "outdir": // E.g. bin\Debug\
                     return RelativeOutputDir;
                 case "configurationname": // E.g. Debug
diff -u -w -r c:\nant-0.85-nightly-2004-11-22\src\NAnt.VSNet\ProjectBase.cs 
c:\nant-0.85-nightly-2004-11-22-changes\src\NAnt.VSNet\ProjectBase.cs
--- c:\nant-0.85-nightly-2004-11-22\src\NAnt.VSNet\ProjectBase.cs       Fri Nov 
19 04:28:22 2004
+++ c:\nant-0.85-nightly-2004-11-22-changes\src\NAnt.VSNet\ProjectBase.cs       
Tue Nov 23 23:13:38 2004
@@ -45,6 +45,7 @@
             _projectConfigurations = 
CollectionsUtil.CreateCaseInsensitiveHashtable();
             _buildConfigurations = 
CollectionsUtil.CreateCaseInsensitiveHashtable();
             _extraOutputFiles = 
CollectionsUtil.CreateCaseInsensitiveHashtable();
+                       _projectDependencies = new ArrayList();
             _solutionTask = solutionTask;
             _temporaryFiles = temporaryFiles;
             _outputDir = outputDir;
@@ -175,6 +176,11 @@
             get { return _extraOutputFiles; }
         }
 
+
+               public ArrayList ProjectDependencies {
+                       get { return _projectDependencies; }
+               }
+
         #endregion Public Instance Properties
 
         #region Protected Instance Properties
@@ -487,6 +493,7 @@
         private GacCache _gacCache;
         private ReferencesResolver _refResolver;
         private Hashtable _extraOutputFiles;
+               private ArrayList _projectDependencies;
 
         #endregion Private Instance Fields
     }
diff -u -w -r 
c:\nant-0.85-nightly-2004-11-22\src\NAnt.VSNet\ProjectReference.cs 
c:\nant-0.85-nightly-2004-11-22-changes\src\NAnt.VSNet\ProjectReference.cs
--- c:\nant-0.85-nightly-2004-11-22\src\NAnt.VSNet\ProjectReference.cs  Sun Nov 
14 23:43:48 2004
+++ c:\nant-0.85-nightly-2004-11-22-changes\src\NAnt.VSNet\ProjectReference.cs  
Fri Nov 26 15:21:46 2004
@@ -25,6 +25,7 @@
 using System.Globalization;
 using System.IO;
 using System.Xml;
+using System.CodeDom.Compiler;
 
 using NAnt.Core;
 using NAnt.Core.Util;
@@ -42,10 +43,6 @@
                 throw new ArgumentNullException("gacCache");
             }
 
-            if (projectSettings == null) {
-                throw new ArgumentNullException("projectSettings");
-            }
-
             if (solution == null) {
                 throw new BuildException("Project reference found, but no 
solution"
                     + " was specified.", Location.UnknownLocation);
@@ -57,14 +54,25 @@
                 _isPrivate = bool.Parse(privateAttribute.Value);
             }
 
+                       string referencedProjectGuid = 
xmlDefinition.GetAttribute("Project");
+                       if (referencedProjectGuid == null || 
referencedProjectGuid.Length == 0) {
+                               referencedProjectGuid = 
xmlDefinition.GetAttribute("ReferencedProjectIdentifier");
+                       }
             // determine path of project file
             string projectFile = solution.GetProjectFileFromGuid(
-                xmlDefinition.GetAttribute("Project"));
+                referencedProjectGuid);
+
+                       TempFileCollection temporaryFiles;
+                       if (projectSettings != null) {
+                               temporaryFiles = projectSettings.TemporaryFiles;
+                       } else {
+                               temporaryFiles = parent.TemporaryFiles;
+                       }
 
             // load referenced project
             Log(Level.Verbose, "Loading referenced project '{0}'.", 
projectFile);
             _project = ProjectFactory.LoadProject(solution, 
-                SolutionTask, projectSettings.TemporaryFiles, gacCache, 
+                SolutionTask, temporaryFiles, gacCache, 
                 ReferencesResolver, outputDir, projectFile);
         }
 
diff -u -w -r c:\nant-0.85-nightly-2004-11-22\src\NAnt.VSNet\SolutionBase.cs 
c:\nant-0.85-nightly-2004-11-22-changes\src\NAnt.VSNet\SolutionBase.cs
--- c:\nant-0.85-nightly-2004-11-22\src\NAnt.VSNet\SolutionBase.cs      Sun Nov 
14 23:43:48 2004
+++ c:\nant-0.85-nightly-2004-11-22-changes\src\NAnt.VSNet\SolutionBase.cs      
Tue Nov 23 22:57:20 2004
@@ -494,6 +494,17 @@
                         }
                     }
                 }
+
+                               // Now go through all the project dependencies 
and store them in
+                               // the project so they are available for later 
use (such as link time).
+                               string[] dependencies = 
GetProjectDependencies(projectGuid);
+
+                               foreach (string dependency in dependencies) {
+                                       ProjectBase dependencyProject = 
GetProjectFromGuid(dependency);
+                                       if (dependencyProject != null) {
+                                               
project.ProjectDependencies.Add(dependencyProject);
+                                       }
+                               }
             }
         }
 
diff -u -w -r c:\nant-0.85-nightly-2004-11-22\src\NAnt.VSNet\VcArgumentMap.cs 
c:\nant-0.85-nightly-2004-11-22-changes\src\NAnt.VSNet\VcArgumentMap.cs
--- c:\nant-0.85-nightly-2004-11-22\src\NAnt.VSNet\VcArgumentMap.cs     Sun Oct 
24 23:03:26 2004
+++ c:\nant-0.85-nightly-2004-11-22-changes\src\NAnt.VSNet\VcArgumentMap.cs     
Tue Nov 23 22:24:04 2004
@@ -66,34 +66,34 @@
 
         public static VcArgumentMap CreateCLArgumentMap() {
             VcArgumentMap map = new VcArgumentMap();
-            map.AddEnum("AssemblerOutput", null, null, "FA", "FAcs", "FAc", 
"FAs");
-            map.AddBool("BufferSecurityCheck", "GS");
-            map.AddEnum("CompileAs", null, null, "TC", "TP");
-            map.AddEnum("DebugInformationFormat", null, null, "Z7", "Zd", 
"Zi", "ZI");
-            map.AddBool("EnableFunctionLevelLinking", "Gy");
-            map.AddBool("EnableIntrinsicFunctions", "Oi");
-            map.AddBool("ExceptionHandling", "EHsc");
-            map.AddBool("RuntimeTypeInfo", "GR");
-            map.AddEnum("FavorSizeOrSpeed", null, null, "Ot", "Os");
-            map.AddBool("GlobalOptimizations", "Og");
-            map.AddEnum("InlineFunctionExpansion", null, "Ob0", "Ob1", "Ob2");
-            map.AddBool("OmitFramePointers", "Oy");
-            map.AddEnum("Optimization", null, "Od", "O1", "O2", "Ox");
-            map.AddEnum("RuntimeLibrary", null, "MT", "MTd", "MD", "MDd", 
"ML", "MLd");
-            map.AddBool("StringPooling", "GF");
-            map.AddEnum("StructMemberAlignment", null, null, "Zp1", "Zp2", 
"Zp4", "Zp8", "Zp16");
-            map.AddEnum("UsePrecompiledHeader", null, null, "Yc", "YX", "Yu");
-            map.AddEnum("WarningLevel", null, "W0", "W1", "W2", "W3", "W4");
+            map.AddEnum("AssemblerOutput", null, null, "/FA", "/FAcs", "/FAc", 
"/FAs");
+            map.AddBool("BufferSecurityCheck", "/GS");
+            map.AddEnum("CompileAs", null, null, "/TC", "/TP");
+            map.AddEnum("DebugInformationFormat", null, null, "/Z7", "/Zd", 
"/Zi", "/ZI");
+            map.AddBool("EnableFunctionLevelLinking", "/Gy");
+            map.AddBool("EnableIntrinsicFunctions", "/Oi");
+            map.AddBool("ExceptionHandling", "/EHsc");
+            map.AddBool("RuntimeTypeInfo", "/GR");
+            map.AddEnum("FavorSizeOrSpeed", null, null, "/Ot", "/Os");
+            map.AddBool("GlobalOptimizations", "/Og");
+            map.AddEnum("InlineFunctionExpansion", null, "/Ob0", "/Ob1", 
"/Ob2");
+            map.AddBool("OmitFramePointers", "/Oy");
+            map.AddEnum("Optimization", null, "/Od", "/O1", "/O2", "/Ox");
+            map.AddEnum("RuntimeLibrary", null, "/MT", "/MTd", "/MD", "/MDd", 
"/ML", "/MLd");
+            map.AddBool("StringPooling", "/GF");
+            map.AddEnum("StructMemberAlignment", null, null, "/Zp1", "/Zp2", 
"/Zp4", "/Zp8", "/Zp16");
+            map.AddEnum("UsePrecompiledHeader", null, "", "/Yc", "/YX", "/Yu");
+            map.AddEnum("WarningLevel", null, "/W0", "/W1", "/W2", "/W3", 
"/W4");
             return map;
         }
 
         public static VcArgumentMap CreateLinkerArgumentMap() {
             VcArgumentMap map = new VcArgumentMap();
-            map.AddBool("GenerateDebugInformation", "DEBUG");
-            map.AddEnum("LinkIncremental", null, null, "INCREMENTAL:NO", 
"INCREMENTAL");
-            map.AddString("ModuleDefinitionFile", "DEF:");
-            map.AddEnum("OptimizeForWindows98", "OPT:", null, "NOWIN98", 
"WIN98");
-            map.AddEnum("SubSystem", "SUBSYSTEM:", null, "CONSOLE", "WINDOWS");
+            map.AddBool("GenerateDebugInformation", "/DEBUG");
+            map.AddEnum("LinkIncremental", null, null, "/INCREMENTAL:NO", 
"/INCREMENTAL");
+            map.AddString("ModuleDefinitionFile", "/DEF:");
+            map.AddEnum("OptimizeForWindows98", "/OPT:", null, "NOWIN98", 
"WIN98");
+            map.AddEnum("SubSystem", "/SUBSYSTEM:", null, "CONSOLE", 
"WINDOWS");
             return map;
         }
 
@@ -116,9 +116,9 @@
 
             protected string FormatOption(string value) {
                 if (_name == null) {
-                    return "/" + value;
+                    return value;
                 }
-                return "/" + _name + value;
+                return _name + value;
             }
         }
 
diff -u -w -r c:\nant-0.85-nightly-2004-11-22\src\NAnt.VSNet\VcConfiguration.cs 
c:\nant-0.85-nightly-2004-11-22-changes\src\NAnt.VSNet\VcConfiguration.cs
--- c:\nant-0.85-nightly-2004-11-22\src\NAnt.VSNet\VcConfiguration.cs   Mon Nov 
15 00:11:40 2004
+++ c:\nant-0.85-nightly-2004-11-22-changes\src\NAnt.VSNet\VcConfiguration.cs   
Tue Nov 23 22:26:44 2004
@@ -152,12 +152,12 @@
             get { 
                 string linkOutput = GetToolSetting("VCLinkerTool", 
"OutputFile");
                 if (linkOutput != null) {
-                    return Path.Combine(OutputDir.FullName, linkOutput);
+                    return Path.Combine(ProjectDir.FullName, linkOutput);
                 }
 
                 string librarianOutput = GetToolSetting("VCLibrarianTool", 
"OutputFile");
                 if (librarianOutput != null) {
-                    return Path.Combine(OutputDir.FullName, librarianOutput);
+                    return Path.Combine(ProjectDir.FullName, librarianOutput);
                 }
 
                 return OutputDir.Name;
diff -u -w -r c:\nant-0.85-nightly-2004-11-22\src\NAnt.VSNet\VcProject.cs 
c:\nant-0.85-nightly-2004-11-22-changes\src\NAnt.VSNet\VcProject.cs
--- c:\nant-0.85-nightly-2004-11-22\src\NAnt.VSNet\VcProject.cs Mon Nov 15 
00:11:40 2004
+++ c:\nant-0.85-nightly-2004-11-22-changes\src\NAnt.VSNet\VcProject.cs Wed Nov 
24 23:17:56 2004
@@ -42,7 +42,6 @@
         #region Public Instance Constructors
         
         public VcProject(SolutionBase solution, string projectPath, XmlElement 
xmlDefinition, SolutionTask solutionTask, TempFileCollection tfc, GacCache 
gacCache, ReferencesResolver refResolver, DirectoryInfo outputDir) : 
base(solutionTask, tfc, gacCache, refResolver, outputDir) {
-            // ensure the specified project is actually supported by this class
             if (!IsSupported(xmlDefinition)) {
                 throw new 
BuildException(string.Format(CultureInfo.InvariantCulture,
                     "Project '{0}' is not a valid Visual C++ project.", 
ProjectPath),
@@ -56,7 +55,6 @@
             if (xmlDefinition == null) {
                 throw new ArgumentNullException("xmlDefinition");
             }
-
             _htPlatformConfigurations = 
CollectionsUtil.CreateCaseInsensitiveHashtable();
             _htFiles = CollectionsUtil.CreateCaseInsensitiveHashtable();
             _references = new ArrayList();
@@ -218,9 +216,31 @@
                 return true;
             }
 
-            foreach (VcConfiguration buildConfig in buildConfigs.Keys) {
-                BuildCPPFiles((ArrayList) buildConfigs[buildConfig], 
baseConfig, 
-                    buildConfig);
+
+                       VcConfiguration stdafxConfig = null;
+
+                       // If VC project uses precompiled headers then the 
precompiled header
+                       // output (.pch file) must be generated before 
compiling any other
+                       // source files.
+                       foreach (VcConfiguration vcConfig in buildConfigs.Keys) 
{
+                               const string compilerTool = "VCCLCompilerTool";
+                               Hashtable compilerArgs = 
vcConfig.GetToolArguments(compilerTool, _clArgMap);   
+
+                               object o = compilerArgs["UsePrecompiledHeader"];
+
+                               if (o != null) {
+                                       string arg = o as string;
+                                       if (arg.Equals("/Yc")) {
+                                               BuildCPPFiles((ArrayList) 
buildConfigs[vcConfig], baseConfig, vcConfig);
+                                               stdafxConfig = vcConfig;
+                                       }
+                               }
+                       }
+
+            foreach (VcConfiguration vcConfig in buildConfigs.Keys) {
+                               if (vcConfig != stdafxConfig) {
+                                       BuildCPPFiles((ArrayList) 
buildConfigs[vcConfig], baseConfig, vcConfig);
+                               }
             }
 
             string libOutput = baseConfig.GetToolSetting("VCLibrarianTool", 
"OutputFile");
@@ -363,7 +383,7 @@
                 }
             }
 
-            string metadataDirs = fileConfig.GetToolSetting(compilerTool, 
"AdditionalUsingDirectories");
+            string metadataDirs = MergeCompilerToolSetting(baseConfig, 
fileConfig, "AdditionalUsingDirectories");
             if (!StringUtils.IsNullOrEmpty(metadataDirs)) {
                 foreach (string metadataDir in metadataDirs.Split(';')) {
                     clTask.MetaDataIncludeDirs.DirectoryNames.Add(
@@ -401,7 +421,7 @@
                     Path.GetFileNameWithoutExtension(fileName) + ".obj"));
             }
 
-            string preprocessorDefs = MergePreprocessorDefinitions(baseConfig, 
fileConfig);
+            string preprocessorDefs = MergeCompilerToolSetting(baseConfig, 
fileConfig, "PreprocessorDefinitions");
             if (!StringUtils.IsNullOrEmpty(preprocessorDefs)) {
                 foreach (string def in preprocessorDefs.Split(';', ',')) {
                     if (def.Length != 0) {
@@ -411,6 +431,34 @@
                 }
             }
 
+                       string undefinePreprocessorDefs = 
fileConfig.GetToolSetting(compilerTool, "UndefinePreprocessorDefinitions");
+                       if 
(!StringUtils.IsNullOrEmpty(undefinePreprocessorDefs)) { 
+                               foreach (string def in 
undefinePreprocessorDefs.Split(';', ',')) { 
+                                       clTask.Arguments.Add(new 
Argument("/U"));
+                                       clTask.Arguments.Add(new Argument(def));
+                               }
+                       }
+
+
+                       string addOptions = 
baseConfig.GetToolSetting(compilerTool, "AdditionalOptions");
+                       if (addOptions != null) {
+                               StringReader reader = new 
StringReader(addOptions);
+                               string addOptionsLine = reader.ReadLine();
+                               while (addOptionsLine != null) {
+                                       foreach(string addOption in 
addOptionsLine.Split(' '))  {
+                                               clTask.Arguments.Add(new 
Argument(addOption));
+                                       }
+
+                                       addOptionsLine = reader.ReadLine();
+                               }
+                       }
+
+                       string exceptionHandling = 
baseConfig.GetToolSetting(compilerTool, "ExceptionHandling");
+                       if (exceptionHandling == null || 
exceptionHandling.ToUpper().Equals("TRUE")) {
+                               clTask.Arguments.Add(new Argument("/EHsc"));
+                       }
+
+
             if (IsOutputDll(fileConfig)) {
                 clTask.Arguments.Add(new Argument("/D"));
                 clTask.Arguments.Add(new Argument("_WINDLL"));
@@ -429,6 +477,11 @@
                         // with the "UsePrecompiledHeader" argument
                         break;
                     case "UsePrecompiledHeader":
+                                               string arg = 
compilerArgs["UsePrecompiledHeader"] as string;
+
+                                               // if arg.length == 0 then this 
configuration explicitly turns
+                                               // OFF use of precompiled 
headers - even if parent config uses it.
+                                               if (arg == null || arg.Length > 
0) {
                         string headerThrough = 
compilerArgs["PrecompiledHeaderThrough"] as string;
                         if (headerThrough == null) {
                             headerThrough = "StdAfx.h";
@@ -441,6 +494,7 @@
                         }
 
                         clTask.Arguments.Add(new Argument("/Fp\"" + headerFile 
+ "\""));
+                                               }
                         break;
                     default:
                         clTask.Arguments.Add(new Argument((string) 
compilerArgs[key]));
@@ -559,6 +613,19 @@
                 linkTask.Sources.FileNames.Add(objFile);
             }
 
+                       foreach (ProjectBase dependency in ProjectDependencies) 
{
+                               if (dependency is VcProject) {
+                                       VcConfiguration vcConfig = 
dependency.ProjectConfigurations[baseConfig.Name] as VcConfiguration;
+
+                                       string libraryName = 
vcConfig.GetToolSetting("VCLibrarianTool", "OutputFile");
+                                       if (libraryName != null) {
+                                               string libOutFile = new 
FileInfo(Path.Combine(
+                                                       
dependency.ProjectDirectory.FullName, libraryName)).FullName;
+                                               
linkTask.Sources.FileNames.Add(libOutFile);
+                                       }
+                               }
+                       }
+
             string addDeps = 
baseConfig.ExpandMacros(baseConfig.GetToolSetting(linkerTool, 
"AdditionalDependencies"));
             if (addDeps != null) {
                 foreach (string addDep in addDeps.Split(' ')) {
@@ -584,9 +651,15 @@
 
             string addOptions = baseConfig.GetToolSetting(linkerTool, 
"AdditionalOptions");
             if (addOptions != null) {
-                foreach(string addOption in addOptions.Split(' ')) {
+                               StringReader reader = new 
StringReader(addOptions);
+                               string addOptionsLine = reader.ReadLine();
+                               while (addOptionsLine != null) {
+                                       foreach(string addOption in 
addOptionsLine.Split(' '))  {
                     linkTask.Arguments.Add(new Argument(addOption));
                 }
+
+                                       addOptionsLine = reader.ReadLine();
+                               }
             }
 
             if (baseConfig.WholeProgramOptimization) {
@@ -625,25 +698,28 @@
         }
 
         /// <summary>
-        /// Merges the preprocessor definitions of <paramref name="baseConfig" 
/> 
+               /// Merges the specified tool setting of <paramref 
name="baseConfig" /> 
         /// with <paramref name="fileConfig" />.
         /// </summary>
         /// <remarks>
-        /// The merge is uppresses when the flag $(noinherit) is defined in
+               /// The merge is suppressed when the flag $(noinherit) is 
defined in
         /// <paramref name="fileConfig" />.
         /// </remarks>
-        private string MergePreprocessorDefinitions(VcConfiguration 
baseConfig, VcConfiguration fileConfig) {
+               private string MergeCompilerToolSetting(VcConfiguration 
baseConfig, VcConfiguration fileConfig, string setting) {
             const string compilerTool = "VCCLCompilerTool";
             const string noinherit = "$(noinherit)";
-            string preprocessorDefs = fileConfig.GetToolSetting(compilerTool, 
-                "PreprocessorDefinitions");
-            if 
(preprocessorDefs.ToLower(CultureInfo.InvariantCulture).IndexOf(noinherit) == 
-1) {
-                preprocessorDefs += ";" + 
baseConfig.GetToolSetting(compilerTool, 
-                    "PreprocessorDefinitions");
+                       string settingValue = 
fileConfig.GetToolSetting(compilerTool, setting);
+
+                       if (settingValue == null) {
+                               return baseConfig.GetToolSetting(compilerTool, 
setting);
+                       }
+
+                       if 
(settingValue.ToLower(CultureInfo.InvariantCulture).IndexOf(noinherit) == -1) {
+                               settingValue += ";" + 
baseConfig.GetToolSetting(compilerTool, setting);
             } else {
-                preprocessorDefs = 
preprocessorDefs.Remove(preprocessorDefs.ToLower(CultureInfo.InvariantCulture).IndexOf(noinherit),
 noinherit.Length);
+                               settingValue = 
settingValue.Remove(settingValue.ToLower(CultureInfo.InvariantCulture).IndexOf(noinherit),
 noinherit.Length);
             }
-            return preprocessorDefs;
+                       return settingValue;
         }
 
         #endregion Private Instance Methods

Reply via email to