SF.net SVN: ant-contrib: [154] cpptasks/trunk/src/main/java/net/sf/ antcontrib/cpptasks/devstudio

[email protected] Tue, 19 Feb 2008 19:58:46 -0800
Newsgroups gmane.comp.java.ant-contrib.devel
Message-ID <[email protected]>
Revision: 154
          http://ant-contrib.svn.sourceforge.net/ant-contrib/?rev=154&view=rev
Author:   carnold
Date:     2008-02-19 19:58:45 -0800 (Tue, 19 Feb 2008)

Log Message:
-----------
Bug 980130: Generate projects with Debug and Release configurations

Modified Paths:
--------------
    cpptasks/trunk/src/main/java/net/sf/antcontrib/cpptasks/devstudio/DevStudioProjectWriter.java
    cpptasks/trunk/src/main/java/net/sf/antcontrib/cpptasks/devstudio/VisualStudioNETProjectWriter.java

Modified: cpptasks/trunk/src/main/java/net/sf/antcontrib/cpptasks/devstudio/DevStudioProjectWriter.java
===================================================================
--- cpptasks/trunk/src/main/java/net/sf/antcontrib/cpptasks/devstudio/DevStudioProjectWriter.java	2008-02-13 17:23:14 UTC (rev 153)
+++ cpptasks/trunk/src/main/java/net/sf/antcontrib/cpptasks/devstudio/DevStudioProjectWriter.java	2008-02-20 03:58:45 UTC (rev 154)
@@ -33,12 +33,8 @@
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.Writer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
+import java.util.*;
+import java.text.MessageFormat;
 
 /**
  * Writes a Microsoft Visual Studio 97 or Visual Studio 6 project file.
@@ -144,13 +140,6 @@
 
     String outputType = task.getOuttype();
     String subsystem = task.getSubsystem();
-    String configName = projectName;
-    final boolean isDebug = task.getDebug();
-    if (isDebug) {
-      configName += " - Win32 Debug";
-    } else {
-      configName += " - Win32 Release";
-    }
     String targtype = "Win32 (x86) Dynamic-Link Library";
     String targid = "0x0102";
     if ("executable".equals(outputType)) {
@@ -170,10 +159,11 @@
     writer.write("\" ");
     writer.write(targid);
     writer.write("\r\n\r\nCFG=");
-    writer.write(configName);
+
+    writer.write(projectName + " - Win32 Debug");
     writer.write("\r\n");
 
-    writeMessage(writer, projectName, configName, targtype);
+    writeMessage(writer, projectName, targtype);
 
     writer.write("# Begin Project\r\n");
     if (version.equals("6.00")) {
@@ -184,60 +174,23 @@
     writer.write("CPP=cl.exe\r\n");
     writer.write("MTL=midl.exe\r\n");
     writer.write("RSC=rc.exe\r\n");
-    writer.write("# PROP BASE Use_MFC 0\r\n");
 
-    writer.write("# PROP BASE Use_Debug_Libraries ");
-    if (isDebug) {
-      writer.write("1\r\n");
-    } else {
-      writer.write("0\r\n");
-    }
+    writer.write("\r\n!IF  \"$(CFG)\" == \"" + projectName + " - Win32 Release\"\r\n");
 
-    File objDir = task.getObjdir();
-    String objDirPath = CUtil.getRelativePath(basePath, objDir);
+    writeConfig(writer, false, projectDef.getDependencies(), basePath, compilerConfig, linkTarget, targets);
 
-    File outFile = task.getOutfile();
-    File buildDir = outFile.getParentFile();
-    String buildDirPath = CUtil.getRelativePath(basePath, buildDir);
+    writer.write("\r\n!ELSEIF  \"$(CFG)\" == \"" + projectName + " - Win32 Debug\"\r\n");
 
-    writer.write("# PROP BASE Output_Dir \"");
-    writer.write(CUtil.toWindowsPath(buildDirPath));
-    writer.write("\"\r\n");
-    writer.write("# PROP BASE Intermediate_Dir \"");
-    writer.write(CUtil.toWindowsPath(objDirPath));
-    writer.write("\"\r\n");
-    writer.write("# PROP BASE Target_Dir \"\"\r\n");
-    writer.write("# PROP Use_MFC 0\r\n");
-    writer.write("# PROP Use_Debug_Libraries ");
-    if (isDebug) {
-      writer.write("1\r\n");
-    } else {
-      writer.write("0\r\n");
-    }
-    writer.write("# PROP Output_Dir \"");
-    writer.write(CUtil.toWindowsPath(buildDirPath));
-    writer.write("\"\r\n");
-    writer.write("# PROP Intermediate_Dir \"");
-    writer.write(CUtil.toWindowsPath(objDirPath));
-    writer.write("\"\r\n");
-    writer.write("# PROP Target_Dir \"\"\r\n");
-    writeCompileOptions(writer, basePath, compilerConfig);
-    writer.write(
-        "# ADD BASE MTL /nologo /D \"_DEBUG\" /mktyplib203 /o NUL /win32\r\n");
-    writer.write(
-        "# ADD MTL /nologo /D \"_DEBUG\" /mktyplib203 /o NUL /win32\r\n");
-    writer.write("# ADD BASE RSC /l 0x409 /d \"_DEBUG\"\r\n");
-    writer.write("# ADD RSC /l 0x409 /d \"_DEBUG\"\r\n");
-    writer.write("BSC32=bscmake.exe\r\n");
-    writer.write("# ADD BASE BSC32 /nologo\r\n");
-    writer.write("# ADD BSC32 /nologo\r\n");
-    writer.write("LINK32=link.exe\r\n");
-    writeLinkOptions(writer, basePath, linkTarget, targets);
+    writeConfig(writer, true, projectDef.getDependencies(), basePath, compilerConfig, linkTarget, targets);
+
+    writer.write("\r\n!ENDIF\r\n");
+
     writer.write("# Begin Target\r\n\r\n");
-    writer.write("# Name \"");
-    writer.write(configName);
-    writer.write("\"\r\n");
+    writer.write("# Name \"" + projectName + " - Win32 Release\"\r\n");
+    writer.write("# Name \"" + projectName + " - Win32 Debug\"\r\n");
+      
 
+
     File[] sortedSources = getSources(files);
 
     if (version.equals("6.00")) {
@@ -296,28 +249,80 @@
 
   }
 
+  private void writeConfig(final Writer writer,
+                           boolean isDebug,
+                           final List dependencies,
+                           final String basePath,
+                           CommandLineCompilerConfiguration compilerConfig,
+                           TargetInfo linkTarget,
+                           Hashtable targets) throws IOException {
+      writer.write("# PROP BASE Use_MFC 0\r\n");
+
+      String configType = "Release";
+      String configInt = "0";
+      String configMacro = "NDEBUG";
+      if (isDebug) {
+        configType = "Debug";
+        configInt = "1";
+        configMacro = "_DEBUG";
+      }
+
+      writer.write("# PROP BASE Use_Debug_Libraries ");
+      writer.write(configInt);
+      writer.write("\r\n# PROP BASE Output_Dir \"");
+      writer.write(configType);
+      writer.write("\"\r\n");
+      writer.write("# PROP BASE Intermediate_Dir \"");
+      writer.write(configType);
+      writer.write("\"\r\n");
+      writer.write("# PROP BASE Target_Dir \"\"\r\n");
+      writer.write("# PROP Use_MFC 0\r\n");
+      writer.write("# PROP Use_Debug_Libraries ");
+      writer.write(configInt);
+      writer.write("\r\n# PROP Output_Dir \"");
+      writer.write(configType);
+      writer.write("\"\r\n");
+      writer.write("# PROP Intermediate_Dir \"");
+      writer.write(configType);
+      writer.write("\"\r\n");
+      writer.write("# PROP Target_Dir \"\"\r\n");
+      writeCompileOptions(writer, isDebug, basePath, compilerConfig);
+      writer.write(
+          "# ADD BASE MTL /nologo /D \"" + configMacro + "\" /mktyplib203 /o NUL /win32\r\n");
+      writer.write(
+          "# ADD MTL /nologo /D \"" + configMacro + "\" /mktyplib203 /o NUL /win32\r\n");
+      writer.write("# ADD BASE RSC /l 0x409 /d \"" + configMacro + "\"\r\n");
+      writer.write("# ADD RSC /l 0x409 /d \"" + configMacro + "\"\r\n");
+      writer.write("BSC32=bscmake.exe\r\n");
+      writer.write("# ADD BASE BSC32 /nologo\r\n");
+      writer.write("# ADD BSC32 /nologo\r\n");
+      writer.write("LINK32=link.exe\r\n");
+      writeLinkOptions(writer, isDebug, dependencies, basePath, linkTarget, targets);
+  }
   private static void writeWorkspaceProject(final Writer writer,
                                      final String projectName,
                                      final String projectFile,
                                      final List dependsOn) throws IOException {
       writer.write("############################################");
       writer.write("###################################\r\n\r\n");
-      writer.write("Project: \"" + projectName + "\"="
-                   + projectFile
-                   + " - Package Owner=<4>\r\n\r\n");
+      String file = projectFile;
+      if(!file.startsWith(".") && !file.startsWith("\\") && !file.startsWith("/")) {
+          file = ".\\" + file;
+      }
+      writer.write("Project: \"" + projectName + "\"=\""
+                   + file
+                   + "\" - Package Owner=<4>\r\n\r\n");
 
       writer.write("Package=<5>\r\n{{{\r\n}}}\r\n\r\n");
       writer.write("Package=<4>\r\n{{{\r\n");
       if (dependsOn != null) {
         for(Iterator iter = dependsOn.iterator(); iter.hasNext();) {
             writer.write("    Begin Project Dependency\r\n");
-            writer.write("    Project_Dep_name " + toProjectName(String.valueOf(iter.next())) + "\r\n");
+            writer.write("    Project_Dep_Name " + toProjectName(String.valueOf(iter.next())) + "\r\n");
             writer.write("    End Project Dependency\r\n");
         }
       }
       writer.write("}}}\r\n\r\n");
-      writer.write("######################################");
-      writer.write("#########################################\r\n\r\n");
 
   }
 
@@ -350,9 +355,11 @@
           }
       }
 
+      writeWorkspaceProject(writer, projectName, dspFile.getName(), projectDeps);
 
+      writer.write("############################################");
+      writer.write("###################################\r\n\r\n");
 
-      writeWorkspaceProject(writer, projectName, ".\\" + dspFile.getName(), projectDeps);
 
       writer.write("Global:\r\n\r\nPackage=<5>\r\n{{{\r\n}}}");
       writer.write("\r\n\r\nPackage=<3>\r\n{{{\r\n}}}\r\n\r\n");
@@ -426,14 +433,12 @@
    * Writes "This is not a makefile" warning.
    * @param writer Writer writer
    * @param projectName String project name
-   * @param configName String configuration name
    * @param targtype String target type
    * @throws IOException if error writing project
    */
 
   private void writeMessage(final Writer writer,
                             final String projectName,
-                            final String configName,
                             final String targtype) throws IOException {
     writer.write(
         "!MESSAGE This is not a valid makefile. ");
@@ -453,16 +458,14 @@
     writer.write("!MESSAGE NMAKE /f \"");
     writer.write(projectName);
     writer.write(".mak\" CFG=\"");
-    writer.write(configName);
-    writer.write("\"\r\n");
+    writer.write(projectName);
+    writer.write(" - Win32 Debug\"\r\n");
     writer.write("!MESSAGE \r\n");
     writer.write("!MESSAGE Possible choices for configuration are:\r\n");
     writer.write("!MESSAGE \r\n");
-    writer.write("!MESSAGE \"");
-    writer.write(configName);
-    writer.write("\" (based on \"");
-    writer.write(targtype);
-    writer.write("\")\r\n");
+    String pattern = "!MESSAGE \"{0} - Win32 {1}\" (based on \"{2}\")\r\n";
+    writer.write(MessageFormat.format(pattern, new Object[] { projectName, "Release", targtype }));
+    writer.write(MessageFormat.format(pattern, new Object[] { projectName, "Debug", targtype }));
     writer.write("!MESSAGE \r\n");
     writer.write("\r\n");
 
@@ -479,7 +482,7 @@
     //
     //   find first target with an DevStudio C compilation
     //
-    CommandLineCompilerConfiguration compilerConfig = null;
+    CommandLineCompilerConfiguration compilerConfig;
     //
     //   get the first target and assume that it is representative
     //
@@ -487,7 +490,6 @@
     while (targetIter.hasNext()) {
       TargetInfo targetInfo = (TargetInfo) targetIter.next();
       ProcessorConfiguration config = targetInfo.getConfiguration();
-      String identifier = config.getIdentifier();
       //
       //   for the first cl compiler
       //
@@ -504,11 +506,13 @@
   /**
    * Writes compiler options.
    * @param writer Writer writer
+   * @param isDebug true if debug.
    * @param baseDir String base directory
    * @param compilerConfig compiler configuration
    * @throws IOException if error on writing project
    */
   private void writeCompileOptions(final Writer writer,
+                                   final boolean isDebug,
                                    final String baseDir,
                                    final CommandLineCompilerConfiguration
                                    compilerConfig) throws IOException {
@@ -523,7 +527,32 @@
       options.append(CUtil.toWindowsPath(relPath));
       options.append('"');
     }
+    Hashtable optionMap = new Hashtable();
 
+    if (isDebug) {
+        //
+        //   release options that should be mapped to debug counterparts
+        //
+        optionMap.put("/MT", "/MTd");
+        optionMap.put("/ML", "/MLd");
+        optionMap.put("/MD", "/MDd");
+        optionMap.put("/O2", "/Od");
+        optionMap.put("/O3", "/Od");
+    } else {
+        //
+        //   debug options that should be mapped to release counterparts
+        //
+        optionMap.put("/MTD", "/MT");
+        optionMap.put("/MLD", "/ML");
+        optionMap.put("/MDD", "/MD");
+        optionMap.put("/GM", "");
+        optionMap.put("/ZI", "");
+        optionMap.put("/OD", "/O2");
+        optionMap.put("/GZ", "");
+    }
+
+
+
     String[] preArgs = compilerConfig.getPreArguments();
     for (int i = 0; i < preArgs.length; i++) {
       if (preArgs[i].startsWith("/D")) {
@@ -534,15 +563,30 @@
           options.append(body);
           baseOptions.append(body);
         } else {
-          options.append('"');
-          options.append(body);
-          options.append('"');
+          StringBuffer buf = new StringBuffer("\"");
+          if ("NDEBUG".equals(body) || "_DEBUG".equals(body)) {
+            if (isDebug) {
+                buf.append("_DEBUG");
+            } else {
+                buf.append("NDEBUG");
+            }
+          } else {
+            buf.append(body);
+          }
+          buf.append("\"");
+          options.append(buf);
+          baseOptions.append(buf);
         }
       } else if (!preArgs[i].startsWith("/I")) {
+        String option = preArgs[i];
+        String key = option.toUpperCase(Locale.US);
+        if (optionMap.containsKey(key)) {
+            option = optionMap.get(key).toString();
+        }
         options.append(" ");
-        options.append(preArgs[i]);
+        options.append(option);
         baseOptions.append(" ");
-        baseOptions.append(preArgs[i]);
+        baseOptions.append(option);
       }
     }
     baseOptions.append("\r\n");
@@ -560,11 +604,14 @@
    * Writes link options.
    * @param writer Writer writer
    * @param basePath String base path
+   * @param dependencies project dependencies, used to suppress explicit linking.
    * @param linkTarget TargetInfo link target
    * @param targets Hashtable all targets
    * @throws IOException if unable to write to project file
    */
   private void writeLinkOptions(final Writer writer,
+                                final boolean isDebug,
+                                final List dependencies,
                                 final String basePath,
                                 final TargetInfo linkTarget,
                                 final Hashtable targets) throws IOException {
@@ -591,28 +638,45 @@
           //      otherwise construct a relative path.
           //
           String relPath = linkSources[i].getName();
-          if (!CUtil.isSystemPath(linkSources[i])) {
-              relPath = CUtil.getRelativePath(basePath, linkSources[i]);
-          }
           //
-          //   if path has an embedded space then
-          //      must quote
-          if (relPath.indexOf(' ') > 0) {
-            options.append(" \"");
-            options.append(CUtil.toWindowsPath(relPath));
-            options.append("\"");
-          } else {
-            options.append(' ');
-            options.append(CUtil.toWindowsPath(relPath));
+          //   check if file comes from a project dependency
+          //       if it does it should not be explicitly linked
+          boolean fromDependency = false;
+          if (relPath.indexOf(".") > 0) {
+              String baseName = relPath.substring(0, relPath.indexOf("."));
+              for(Iterator iter = dependencies.iterator(); iter.hasNext(); ) {
+                DependencyDef depend = (DependencyDef) iter.next();
+                if (baseName.compareToIgnoreCase(depend.getName()) == 0) {
+                    fromDependency = true;
+                }
+            }
           }
+          if (!fromDependency) {
+            if (!CUtil.isSystemPath(linkSources[i])) {
+              relPath = CUtil.getRelativePath(basePath, linkSources[i]);
+            }
+            //
+            //   if path has an embedded space then
+            //      must quote
+            if (relPath.indexOf(' ') > 0) {
+                options.append(" \"");
+                options.append(CUtil.toWindowsPath(relPath));
+                options.append("\"");
+            } else {
+                options.append(' ');
+                options.append(CUtil.toWindowsPath(relPath));
+            }
+           }
         }
       }
       String[] preArgs = linkConfig.getPreArguments();
       for (int i = 0; i < preArgs.length; i++) {
-        options.append(' ');
-        options.append(preArgs[i]);
-        baseOptions.append(' ');
-        baseOptions.append(preArgs[i]);
+        if (isDebug || !preArgs[i].equals("/DEBUG")) {
+            options.append(' ');
+            options.append(preArgs[i]);
+            baseOptions.append(' ');
+            baseOptions.append(preArgs[i]);
+        }
       }
       String[] endArgs = linkConfig.getEndArguments();
       for (int i = 0; i < endArgs.length; i++) {

Modified: cpptasks/trunk/src/main/java/net/sf/antcontrib/cpptasks/devstudio/VisualStudioNETProjectWriter.java
===================================================================
--- cpptasks/trunk/src/main/java/net/sf/antcontrib/cpptasks/devstudio/VisualStudioNETProjectWriter.java	2008-02-13 17:23:14 UTC (rev 153)
+++ cpptasks/trunk/src/main/java/net/sf/antcontrib/cpptasks/devstudio/VisualStudioNETProjectWriter.java	2008-02-20 03:58:45 UTC (rev 154)
@@ -25,8 +25,8 @@
 import net.sf.antcontrib.cpptasks.ide.ProjectDef;
 import net.sf.antcontrib.cpptasks.ide.CommentDef;
 import net.sf.antcontrib.cpptasks.ide.ProjectWriter;
+import net.sf.antcontrib.cpptasks.ide.DependencyDef;
 import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.util.StringUtils;
 import org.apache.xml.serialize.OutputFormat;
 import org.apache.xml.serialize.XMLSerializer;
 import org.xml.sax.ContentHandler;
@@ -91,17 +91,6 @@
     }
     
 
-    /**
-     * Get configuration name.
-     * @param task cc task, may not be null.
-     * @return configuration name.
-     */
-    private String getConfigurationName(final CCTask task) {
-        if (task.getDebug()) {
-            return "Debug|Win32";
-        }
-        return "Release|Win32";
-    }
 
     /**
      * Gets the configuration type.
@@ -121,33 +110,8 @@
     }
 
 
-    /**
-     * Get output directory.
-     * @param basePath path to parent of project file.
-     * @param task cc task, may not be null.
-     * @return  output directory relative path.
-     */
-    private String getOutputDirectory(final String basePath,
-                                      final CCTask task) {
-        File outFile = task.getOutfile();
-        File buildDir = outFile.getParentFile();
-        return CUtil.toWindowsPath(CUtil.getRelativePath(basePath, buildDir));
-    }
 
     /**
-     * Get object file directory.
-     * @param basePath path to parent of project file.
-     * @param task cc task, may not be null.
-     * @return  object file directory relative path.
-     */
-    private String getIntermediateDirectory(final String basePath,
-                                            final CCTask task) {
-        File objDir = task.getObjdir();
-        return CUtil.toWindowsPath(CUtil.getRelativePath(basePath, objDir));
-    }
-
-
-    /**
      * Get character set for Windows API.
      * @param compilerConfig compiler configuration, may not be null.
      * @return "1" is TCHAR is unicode, "0" if TCHAR is multi-byte.
@@ -170,23 +134,27 @@
     /**
      * Write the start tag of the Configuration element.
      * @param content serialization content handler.
-     * @param basePath path of directory containing project file.
+     * @param isDebug if true, write a debug configuration.
      * @param task cc task.
      * @param compilerConfig compiler configuration.
      * @throws SAXException thrown if serialization error.
      */
     private void writeConfigurationStartTag(final ContentHandler content,
-                                            final String basePath,
+                                            final boolean isDebug,
                                             final CCTask task,
                   final CommandLineCompilerConfiguration compilerConfig)
             throws SAXException {
         AttributesImpl attributes = new AttributesImpl();
-        addAttribute(attributes, "Name",
-                getConfigurationName(task));
-        addAttribute(attributes, "OutputDirectory",
-                getOutputDirectory(basePath, task));
-        addAttribute(attributes, "IntermediateDirectory",
-                getIntermediateDirectory(basePath, task));
+        if (isDebug) {
+            addAttribute(attributes, "Name", "Debug|Win32");
+            addAttribute(attributes, "OutputDirectory", "Debug");
+            addAttribute(attributes, "IntermediateDirectory", "Debug");
+        } else {
+            addAttribute(attributes, "Name", "Release|Win32");
+            addAttribute(attributes, "OutputDirectory", "Release");
+            addAttribute(attributes, "IntermediateDirectory", "Release");
+
+        }
         addAttribute(attributes, "ConfigurationType",
                 getConfigurationType(task));
         addAttribute(attributes, "CharacterSet",
@@ -224,6 +192,7 @@
     /**
      * Get value of AdditionalIncludeDirectories property.
      * @param compilerConfig compiler configuration.
+     * @param baseDir base for relative paths.
      * @return value of AdditionalIncludeDirectories property.
      */
     private String getAdditionalIncludeDirectories(
@@ -247,15 +216,27 @@
     /**
      * Get value of PreprocessorDefinitions property.
      * @param compilerConfig compiler configuration.
+     * @param isDebug true if generating debug configuration.
      * @return value of PreprocessorDefinitions property.
      */
     private String getPreprocessorDefinitions(
-            final CommandLineCompilerConfiguration compilerConfig) {
+            final CommandLineCompilerConfiguration compilerConfig,
+            final boolean isDebug) {
         StringBuffer defines = new StringBuffer();
         String[] args = compilerConfig.getPreArguments();
         for (int i = 0; i < args.length; i++) {
             if (args[i].startsWith("/D")) {
-                defines.append(args[i].substring(2));
+                String macro = args[i].substring(2);
+                if (isDebug) {
+                    if (macro.equals("NDEBUG")) {
+                        macro = "_DEBUG";
+                    }
+                } else {
+                    if (macro.equals("_DEBUG")) {
+                        macro = "NDEBUG";
+                    }
+                }
+                defines.append(macro);
                 defines.append(";");
             }
         }
@@ -269,25 +250,28 @@
     /**
      * Get value of RuntimeLibrary property.
      * @param compilerConfig compiler configuration.
+     * @param isDebug true if generating debug configuration.
      * @return value of RuntimeLibrary property.
      */
     private String getRuntimeLibrary(
-            final CommandLineCompilerConfiguration compilerConfig) {
+            final CommandLineCompilerConfiguration compilerConfig,
+            final boolean isDebug) {
         String rtl = null;
         String[] args = compilerConfig.getPreArguments();
         for (int i = 0; i < args.length; i++) {
-            if ("/MT".equals(args[i])) {
-                rtl = "0";
+            if (args[i].startsWith("/MT")) {
+                if (isDebug) {
+                    rtl = "1";
+                } else {
+                    rtl = "0";
+                }
+            } else if (args[i].startsWith("/MD")) {
+                if (isDebug) {
+                    rtl = "3";
+                } else {
+                    rtl = "2";
+                }
             }
-            if ("/MTd".equals(args[i])) {
-                rtl = "1";
-            }
-            if ("/MD".equals(args[i])) {
-                rtl = "2";
-            }
-            if ("/MDd".equals(args[i])) {
-                rtl = "3";
-            }
         }
         return rtl;
     }
@@ -330,15 +314,6 @@
     }
 
 
-    /**
-     * Get value of MinimalRebuild property.
-     * @param compilerConfig compiler configuration.
-     * @return value of MinimalRebuild property.
-     */
-    private String getMinimalRebuild(
-            final CommandLineCompilerConfiguration compilerConfig) {
-        return trueLiteral;
-    }
 
     /**
      * Get value of BasicRuntimeChecks property.
@@ -419,6 +394,9 @@
             if ("/Z7".equals(args[i])) {
                 format = "1";
             }
+            if ("/Zd".equals(args[i])) {
+                format = "2";
+            }
             if ("/Zi".equals(args[i])) {
                 format = "3";
             }
@@ -432,27 +410,41 @@
     /**
      * write the Compiler element.
      * @param content serialization content handler.
+     * @param isDebug true if generating debug configuration.
+     * @param basePath base for relative file paths.
      * @param compilerConfig compiler configuration.
      * @throws SAXException thrown if error during serialization.
      */
     private void writeCompilerElement(final ContentHandler content,
+            final boolean isDebug,
             final String basePath,
             final CommandLineCompilerConfiguration compilerConfig)
             throws SAXException {
         AttributesImpl attributes = new AttributesImpl();
         addAttribute(attributes, "Name", "VCCLCompilerTool");
-        addAttribute(attributes, "Optimization",
-                getOptimization(compilerConfig));
+        String optimization = getOptimization(compilerConfig);
+        String debugFormat = getDebugInformationFormat(compilerConfig);
+        if(isDebug) {
+            optimization = "0";
+            if ("0".equals(debugFormat)) {
+                debugFormat = "4";
+            }
+        } else {
+            if ("0".equals(optimization)) {
+                optimization = "2";
+            }
+            debugFormat = "0";
+        }
+        addAttribute(attributes, "Optimization", optimization);
         addAttribute(attributes, "AdditionalIncludeDirectories",
                 getAdditionalIncludeDirectories(basePath, compilerConfig));
         addAttribute(attributes, "PreprocessorDefinitions",
-                getPreprocessorDefinitions(compilerConfig));
-        addAttribute(attributes, "MinimalRebuild",
-                getMinimalRebuild(compilerConfig));
+                getPreprocessorDefinitions(compilerConfig, isDebug));
+        addAttribute(attributes, "MinimalRebuild", trueLiteral);
         addAttribute(attributes, "BasicRuntimeChecks",
                 getBasicRuntimeChecks(compilerConfig));
         addAttribute(attributes, "RuntimeLibrary",
-                getRuntimeLibrary(compilerConfig));
+                getRuntimeLibrary(compilerConfig, isDebug));
         addAttribute(attributes, "UsePrecompiledHeader",
                 getUsePrecompiledHeader(compilerConfig));
         addAttribute(attributes, "PrecompiledHeaderFile",
@@ -462,7 +454,7 @@
         addAttribute(attributes, "Detect64BitPortabilityProblems",
                 getDetect64BitPortabilityProblems(compilerConfig));
         addAttribute(attributes, "DebugInformationFormat",
-                getDebugInformationFormat(compilerConfig));
+                debugFormat);
         content.startElement(null, "Tool", "Tool", attributes);
         content.endElement(null, "Tool", "Tool");
 
@@ -489,22 +481,6 @@
         return incremental;
     }
 
-    /**
-     * Get value of GenerateDebugInformation property.
-     * @param linkerConfig linker configuration.
-     * @return value of GenerateDebugInformation property
-     */
-    private String getGenerateDebugInformation(
-            final CommandLineLinkerConfiguration linkerConfig) {
-        String debug = falseLiteral;
-        String[] args = linkerConfig.getPreArguments();
-        for (int i = 0; i < args.length; i++) {
-            if ("/DEBUG".equals(args[i])) {
-                debug = trueLiteral;
-            }
-        }
-        return debug;
-    }
 
     /**
      * Get value of Subsystem property.
@@ -549,11 +525,13 @@
     /**
      * Get value of AdditionalDependencies property.
      * @param linkTarget link target.
+     * @param projectDependencies dependencies declared in project.
      * @param targets all targets.
      * @param basePath path to directory containing project file.
      * @return value of AdditionalDependencies property.
      */
     private String getAdditionalDependencies(final TargetInfo linkTarget,
+                                             final List projectDependencies,
                                              final Map targets,
                                              final String basePath) {
       String dependencies = null;
@@ -570,21 +548,37 @@
             //      otherwise construct a relative path.
             //
             String relPath = linkSources[i].getName();
-            if (!CUtil.isSystemPath(linkSources[i])) {
-                relPath = CUtil.getRelativePath(basePath, linkSources[i]);
+              //
+              //   check if file comes from a project dependency
+              //       if it does it should not be explicitly linked
+            boolean fromDependency = false;
+            if (relPath.indexOf(".") > 0) {
+                  String baseName = relPath.substring(0, relPath.indexOf("."));
+                  for(Iterator iter = projectDependencies.iterator(); iter.hasNext(); ) {
+                    DependencyDef depend = (DependencyDef) iter.next();
+                    if (baseName.compareToIgnoreCase(depend.getName()) == 0) {
+                        fromDependency = true;
+                    }
+                }
             }
-            //
-            //   if path has an embedded space then
-            //      must quote
-            if (relPath.indexOf(' ') > 0) {
-              buf.append('\"');
-              buf.append(CUtil.toWindowsPath(relPath));
-              buf.append('\"');
-            } else {
-               buf.append(relPath);
+
+            if (!fromDependency) {
+                if (!CUtil.isSystemPath(linkSources[i])) {
+                    relPath = CUtil.getRelativePath(basePath, linkSources[i]);
+                }
+                //
+                //   if path has an embedded space then
+                //      must quote
+                if (relPath.indexOf(' ') > 0) {
+                    buf.append('\"');
+                    buf.append(CUtil.toWindowsPath(relPath));
+                    buf.append('\"');
+                } else {
+                    buf.append(relPath);
+                }
+                buf.append(' ');
             }
-            buf.append(' ');
-          }
+            }
         }
         if (buf.length() > 0) {
           buf.setLength(buf.length() - 1);
@@ -597,12 +591,16 @@
     /**
      * Write Tool element for linker.
      * @param content serialization content handler.
+     * @param isDebug true if generating debug configuration.
+     * @param dependencies project dependencies.
      * @param basePath path to directory containing project file.
      * @param linkTarget link target.
      * @param targets  all targets.
      * @throws SAXException thrown if error during serialization.
      */
     private void writeLinkerElement(final ContentHandler content,
+                                    final boolean isDebug,
+                                    final List dependencies,
                                     final String basePath,
                                     final TargetInfo linkTarget,
                                     final Map targets) throws SAXException {
@@ -616,8 +614,11 @@
             if (linkerConfig.getLinker() instanceof DevStudioCompatibleLinker) {
                 addAttribute(attributes, "LinkIncremental",
                         getLinkIncremental(linkerConfig));
-                addAttribute(attributes, "GenerateDebugInformation",
-                        getGenerateDebugInformation(linkerConfig));
+                if (isDebug) {
+                    addAttribute(attributes, "GenerateDebugInformation", trueLiteral);
+                } else {
+                    addAttribute(attributes, "GenerateDebugInformation", falseLiteral);
+                }
                 addAttribute(attributes, "SubSystem",
                         getSubsystem(linkerConfig));
                 addAttribute(attributes, "TargetMachine",
@@ -625,7 +626,7 @@
             }
         }
         addAttribute(attributes, "AdditionalDependencies",
-                getAdditionalDependencies(linkTarget, targets, basePath));
+                getAdditionalDependencies(linkTarget, dependencies, targets, basePath));
         content.startElement(null, "Tool", "Tool", attributes);
         content.endElement(null, "Tool", "Tool");
     }
@@ -706,13 +707,22 @@
         content.startElement(null, "Configurations",
                 "Configurations", emptyAttrs);
 
-        writeConfigurationStartTag(content, basePath, task, compilerConfig);
+        //
+        //   write debug configuration
+        //
+        writeConfigurationStartTag(content, true, task, compilerConfig);
+        writeCompilerElement(content, true, basePath, compilerConfig);
+        writeLinkerElement(content, true, projectDef.getDependencies(), basePath, linkTarget, targets);
+        content.endElement(null, "Configuration", "Configuration");
 
-        writeCompilerElement(content, basePath, compilerConfig);
+        //
+        //    write release configuration
+        //
+        writeConfigurationStartTag(content, false, task, compilerConfig);
+        writeCompilerElement(content, false, basePath, compilerConfig);
+        writeLinkerElement(content, false, projectDef.getDependencies(), basePath, linkTarget, targets);
+        content.endElement(null, "Configuration", "Configuration");
 
-        writeLinkerElement(content, basePath, linkTarget, targets);
-
-        content.endElement(null, "Configuration", "Configuration");
         content.endElement(null, "Configurations", "Configurations");
         content.startElement(null, "References", "References", emptyAttrs);
         content.endElement(null, "References", "References");


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/