Browse Source

support for debug and opt libraries

Ken Martin 24 years ago
parent
commit
41e1270413

+ 2 - 2
Source/DLLHeader.dsptemplate

@@ -68,7 +68,7 @@ BSC32=bscmake.exe
 # ADD BSC32 /nologo
 LINK32=link.exe
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
-# ADD LINK32 CM_LIBRARIES kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
+# ADD LINK32 CM_OPTIMIZED_LIBRARIES CM_LIBRARIES kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
 
 !ELSEIF  "$(CFG)" == "OUTPUT_LIBNAME - Win32 Debug"
 
@@ -95,7 +95,7 @@ BSC32=bscmake.exe
 # ADD BSC32 /nologo
 LINK32=link.exe
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 CM_LIBRARIES kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 CM_DEBUG_LIBRARIES CM_LIBRARIES kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
 
 !ENDIF
 

+ 3 - 3
Source/EXEHeader.dsptemplate

@@ -63,7 +63,7 @@ BSC32=bscmake.exe
 # ADD BSC32 /nologo
 LINK32=link.exe
 # ADD BASE LINK32  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /IGNORE:4089
-# ADD LINK32  CM_LIBRARIES kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /IGNORE:4089
+# ADD LINK32  CM_OPTIMIZED_LIBRARIES CM_LIBRARIES kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /IGNORE:4089
 
 !ELSEIF  "$(CFG)" == "OUTPUT_LIBNAME - Win32 Debug"
 
@@ -88,7 +88,7 @@ BSC32=bscmake.exe
 # ADD BSC32 /nologo
 LINK32=link.exe
 # ADD BASE LINK32   kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /IGNORE:4089
-# ADD LINK32 CM_LIBRARIES kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /IGNORE:4089
+# ADD LINK32 CM_DEBUG_LIBRARIES CM_LIBRARIES kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /IGNORE:4089
 
 !ELSEIF  "$(CFG)" == "OUTPUT_LIBNAME - Win32 Release MinSize"
 # PROP BASE Use_MFC 0
@@ -110,7 +110,7 @@ BSC32=bscmake.exe
 # ADD BSC32 /nologo
 LINK32=link.exe
 # ADD BASE LINK32  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /IGNORE:4089
-# ADD LINK32  CM_LIBRARIES kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /IGNORE:4089
+# ADD LINK32  CM_OPTIMIZED_LIBRARIES CM_LIBRARIES kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /IGNORE:4089
 
 !ENDIF 
 

+ 6 - 9
Source/MFCDialog/CMakeSetup.rc

@@ -91,7 +91,7 @@ EXSTYLE WS_EX_APPWINDOW
 CAPTION "CMakeSetupDialog"
 FONT 8, "MS Sans Serif"
 BEGIN
-    DEFPUSHBUTTON   "Close",IDOK,319,39,50,14
+    DEFPUSHBUTTON   "Close",IDOK,231,206,50,14
     EDITTEXT        IDC_WhereSource,129,4,135,13,ES_AUTOHSCROLL
     PUSHBUTTON      "Browse...",IDC_BUTTON2,269,5,43,13
     LTEXT           "Where is the source code:",IDC_STATIC,39,6,86,9
@@ -99,11 +99,13 @@ BEGIN
     PUSHBUTTON      "Browse...",IDC_BUTTON3,268,25,43,13
     LTEXT           "Where do you want to build the binaries:",IDC_STATIC,1,
                     27,128,9
-    PUSHBUTTON      "Build Project Files",IDC_BuildProjects,6,39,67,15
-    GROUPBOX        "Cache Values",IDC_STATIC,2,67,370,156
-    LISTBOX         IDC_LIST2,13,84,344,122,LBS_OWNERDRAWVARIABLE | 
+    PUSHBUTTON      "Build Project Files",IDC_BuildProjects,81,205,67,15
+    GROUPBOX        "Cache Values",IDC_STATIC,9,43,356,141
+    LISTBOX         IDC_LIST2,15,55,344,122,LBS_OWNERDRAWVARIABLE | 
                     LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | 
                     WS_TABSTOP
+    CTEXT           "Right click on cache entries for additional options",
+                    IDC_STATIC,19,190,333,11
 END
 
 
@@ -165,11 +167,6 @@ BEGIN
         TOPMARGIN, 7
         BOTTOMMARGIN, 48
     END
-
-    IDD_CMakeSetupDialog_DIALOG, DIALOG
-    BEGIN
-        BOTTOMMARGIN, 215
-    END
 END
 #endif    // APSTUDIO_INVOKED
 

+ 2 - 1
Source/MFCDialog/resource.h

@@ -13,6 +13,7 @@
 #define IDC_BUTTON3                     1004
 #define IDC_BuildProjects               1006
 #define IDC_LIST2                       1007
+#define IDC_LIST3                       1010
 
 // Next default values for new objects
 // 
@@ -20,7 +21,7 @@
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #define _APS_NEXT_RESOURCE_VALUE        131
 #define _APS_NEXT_COMMAND_VALUE         32771
-#define _APS_NEXT_CONTROL_VALUE         1008
+#define _APS_NEXT_CONTROL_VALUE         1011
 #define _APS_NEXT_SYMED_VALUE           101
 #endif
 #endif

+ 58 - 36
Source/cmDSPMakefile.cxx

@@ -53,10 +53,8 @@ void cmDSPMakefile::OutputDSPFile()
     }
   
   // Create the DSP or set of DSP's for libraries and executables
-  const char* cacheValue
-    = cmCacheManager::GetInstance()->GetCacheValue("BUILD_SHARED_LIBS");
   m_LibraryBuildType = STATIC_LIBRARY;
-  if(cacheValue && strcmp(cacheValue,"0"))
+  if(cmCacheManager::GetInstance()->IsOn("BUILD_SHARED_LIBS"))
     {
     m_LibraryBuildType = DLL;
     }
@@ -69,30 +67,6 @@ void cmDSPMakefile::OutputDSPFile()
   for(cmTargets::iterator l = tgts.begin(); 
       l != tgts.end(); l++)
     {
-    std::string libOptions;
-    std::vector<std::string>& libdirs = m_Makefile->GetLinkDirectories();
-    for(i = libdirs.begin(); i != libdirs.end(); ++i)
-      {
-      libOptions += " /LIBPATH:\"";
-      libOptions += *i;
-      libOptions += "/$(OUTDIR)\" ";
-      libOptions += " /LIBPATH:\"";
-      libOptions += *i;
-      libOptions += "\" ";
-      }
-    std::vector<std::string>& libs = m_Makefile->GetLinkLibraries();
-    for(i = libs.begin(); i != libs.end(); ++i)
-      {
-      // add libraries to executables and dlls (but never include
-      // a library in a library, bad recursion)
-      if (!l->second.IsALibrary() || 
-          (m_LibraryBuildType == DLL && l->first.c_str() != *i))
-        {
-        libOptions += " ";
-        libOptions += *i;
-        libOptions += ".lib ";
-        }
-      }
     if (l->second.IsALibrary())
       {
       this->SetBuildType(m_LibraryBuildType, l->first.c_str());
@@ -101,13 +75,11 @@ void cmDSPMakefile::OutputDSPFile()
       {
       this->SetBuildType(EXECUTABLE,l->first.c_str());
       }
-    libOptions += "/STACK:10000000 ";
-    this->CreateSingleDSP(l->first.c_str(),l->second, libOptions);
+    this->CreateSingleDSP(l->first.c_str(),l->second);
     }
 }
 
-void cmDSPMakefile::CreateSingleDSP(const char *lname, cmTarget &target, 
-                                    const std::string &libOptions)
+void cmDSPMakefile::CreateSingleDSP(const char *lname, cmTarget &target)
 {
   std::string fname;
   fname = m_Makefile->GetStartOutputDirectory();
@@ -121,7 +93,7 @@ void cmDSPMakefile::CreateSingleDSP(const char *lname, cmTarget &target,
     {
     cmSystemTools::Error("Error Writing ", fname.c_str());
     }
-  this->WriteDSPFile(fout,lname,target, libOptions);
+  this->WriteDSPFile(fout,lname,target);
 }
 
 void cmDSPMakefile::WriteDSPBuildRule(std::ostream& fout)
@@ -189,11 +161,10 @@ void cmDSPMakefile::AddDSPBuildRule(cmSourceGroup& sourceGroup)
 
 void cmDSPMakefile::WriteDSPFile(std::ostream& fout, 
                                  const char *libName,
-                                 cmTarget &target, 
-                                 const std::string &libOptions)
+                                 cmTarget &target)
 {
   // Write the DSP file's header.
-  this->WriteDSPHeader(fout, libName, libOptions);
+  this->WriteDSPHeader(fout, libName, target);
   
   // We may be modifying the source groups temporarily, so make a copy.
   std::vector<cmSourceGroup> sourceGroups = m_Makefile->GetSourceGroups();
@@ -405,8 +376,55 @@ void cmDSPMakefile::SetBuildType(BuildType b, const char *libName)
 }
   
 void cmDSPMakefile::WriteDSPHeader(std::ostream& fout, const char *libName,
-                                   const std::string &libOptions)
+                                   const cmTarget &target)
 {
+  // determine the link directories
+  std::string libOptions;
+  std::string libDebugOptions;
+  std::string libOptimizedOptions;
+  std::vector<std::string>::iterator i;
+  std::vector<std::string>& libdirs = m_Makefile->GetLinkDirectories();
+  for(i = libdirs.begin(); i != libdirs.end(); ++i)
+    {
+    libOptions += " /LIBPATH:\"";
+    libOptions += *i;
+    libOptions += "/$(OUTDIR)\" ";
+    libOptions += " /LIBPATH:\"";
+    libOptions += *i;
+    libOptions += "\" ";
+    }
+  // find link libraries
+  cmMakefile::LinkLibraries& libs = m_Makefile->GetLinkLibraries();
+  cmMakefile::LinkLibraries::const_iterator j;
+  for(j = libs.begin(); j != libs.end(); ++j)
+    {
+    // add libraries to executables and dlls (but never include
+    // a library in a library, bad recursion)
+    if (!target.IsALibrary() || 
+        (m_LibraryBuildType == DLL && libName != j->first))
+      {
+      if (j->second == cmMakefile::GENERAL)
+        {
+        libOptions += " ";
+        libOptions += j->first;
+        libOptions += ".lib ";
+        }
+      if (j->second == cmMakefile::DEBUG)
+        {
+        libDebugOptions += " ";
+        libDebugOptions += j->first;
+        libDebugOptions += ".lib ";
+        }
+      if (j->second == cmMakefile::OPTIMIZED)
+        {
+        libOptimizedOptions += " ";
+        libOptimizedOptions += j->first;
+        libOptimizedOptions += ".lib ";
+        }      
+      }
+    }
+  libOptions += "/STACK:10000000 ";
+  
   std::ifstream fin(m_DSPHeaderTemplate.c_str());
   if(!fin)
     {
@@ -420,6 +438,10 @@ void cmDSPMakefile::WriteDSPHeader(std::ostream& fout, const char *libName,
       std::string line = buffer;
       cmSystemTools::ReplaceString(line, "CM_LIBRARIES",
                                    libOptions.c_str());
+      cmSystemTools::ReplaceString(line, "CM_DEBUG_LIBRARIES",
+                                   libDebugOptions.c_str());
+      cmSystemTools::ReplaceString(line, "CM_OPTIMIZED_LIBRARIES",
+                                   libOptimizedOptions.c_str());
       cmSystemTools::ReplaceString(line, "BUILD_INCLUDES",
                                    m_IncludeOptions.c_str());
       cmSystemTools::ReplaceString(line, "OUTPUT_LIBNAME",libName);

+ 3 - 4
Source/cmDSPMakefile.h

@@ -67,16 +67,15 @@ private:
   std::string m_DSPFooterTemplate;
   std::vector<std::string> m_CreatedProjectNames;
   
-  void CreateSingleDSP(const char *lname, cmTarget &tgt, 
-                       const std::string &libs);
+  void CreateSingleDSP(const char *lname, cmTarget &tgt);
   void WriteDSPFile(std::ostream& fout, const char *libName, 
-                    cmTarget &tgt, const std::string &libs);
+                    cmTarget &tgt);
   void WriteDSPBeginGroup(std::ostream& fout, 
 			  const char* group,
 			  const char* filter);
   void WriteDSPEndGroup(std::ostream& fout);
   void WriteDSPHeader(std::ostream& fout, const char *libName,
-                      const std::string &libs);
+                      const cmTarget &tgt);
   void WriteDSPBuildRule(std::ostream& fout, const char*);
   void WriteDSPBuildRule(std::ostream& fout);
   void WriteDSPFooter(std::ostream& fout);

+ 58 - 36
Source/cmDSPWriter.cxx

@@ -53,10 +53,8 @@ void cmDSPMakefile::OutputDSPFile()
     }
   
   // Create the DSP or set of DSP's for libraries and executables
-  const char* cacheValue
-    = cmCacheManager::GetInstance()->GetCacheValue("BUILD_SHARED_LIBS");
   m_LibraryBuildType = STATIC_LIBRARY;
-  if(cacheValue && strcmp(cacheValue,"0"))
+  if(cmCacheManager::GetInstance()->IsOn("BUILD_SHARED_LIBS"))
     {
     m_LibraryBuildType = DLL;
     }
@@ -69,30 +67,6 @@ void cmDSPMakefile::OutputDSPFile()
   for(cmTargets::iterator l = tgts.begin(); 
       l != tgts.end(); l++)
     {
-    std::string libOptions;
-    std::vector<std::string>& libdirs = m_Makefile->GetLinkDirectories();
-    for(i = libdirs.begin(); i != libdirs.end(); ++i)
-      {
-      libOptions += " /LIBPATH:\"";
-      libOptions += *i;
-      libOptions += "/$(OUTDIR)\" ";
-      libOptions += " /LIBPATH:\"";
-      libOptions += *i;
-      libOptions += "\" ";
-      }
-    std::vector<std::string>& libs = m_Makefile->GetLinkLibraries();
-    for(i = libs.begin(); i != libs.end(); ++i)
-      {
-      // add libraries to executables and dlls (but never include
-      // a library in a library, bad recursion)
-      if (!l->second.IsALibrary() || 
-          (m_LibraryBuildType == DLL && l->first.c_str() != *i))
-        {
-        libOptions += " ";
-        libOptions += *i;
-        libOptions += ".lib ";
-        }
-      }
     if (l->second.IsALibrary())
       {
       this->SetBuildType(m_LibraryBuildType, l->first.c_str());
@@ -101,13 +75,11 @@ void cmDSPMakefile::OutputDSPFile()
       {
       this->SetBuildType(EXECUTABLE,l->first.c_str());
       }
-    libOptions += "/STACK:10000000 ";
-    this->CreateSingleDSP(l->first.c_str(),l->second, libOptions);
+    this->CreateSingleDSP(l->first.c_str(),l->second);
     }
 }
 
-void cmDSPMakefile::CreateSingleDSP(const char *lname, cmTarget &target, 
-                                    const std::string &libOptions)
+void cmDSPMakefile::CreateSingleDSP(const char *lname, cmTarget &target)
 {
   std::string fname;
   fname = m_Makefile->GetStartOutputDirectory();
@@ -121,7 +93,7 @@ void cmDSPMakefile::CreateSingleDSP(const char *lname, cmTarget &target,
     {
     cmSystemTools::Error("Error Writing ", fname.c_str());
     }
-  this->WriteDSPFile(fout,lname,target, libOptions);
+  this->WriteDSPFile(fout,lname,target);
 }
 
 void cmDSPMakefile::WriteDSPBuildRule(std::ostream& fout)
@@ -189,11 +161,10 @@ void cmDSPMakefile::AddDSPBuildRule(cmSourceGroup& sourceGroup)
 
 void cmDSPMakefile::WriteDSPFile(std::ostream& fout, 
                                  const char *libName,
-                                 cmTarget &target, 
-                                 const std::string &libOptions)
+                                 cmTarget &target)
 {
   // Write the DSP file's header.
-  this->WriteDSPHeader(fout, libName, libOptions);
+  this->WriteDSPHeader(fout, libName, target);
   
   // We may be modifying the source groups temporarily, so make a copy.
   std::vector<cmSourceGroup> sourceGroups = m_Makefile->GetSourceGroups();
@@ -405,8 +376,55 @@ void cmDSPMakefile::SetBuildType(BuildType b, const char *libName)
 }
   
 void cmDSPMakefile::WriteDSPHeader(std::ostream& fout, const char *libName,
-                                   const std::string &libOptions)
+                                   const cmTarget &target)
 {
+  // determine the link directories
+  std::string libOptions;
+  std::string libDebugOptions;
+  std::string libOptimizedOptions;
+  std::vector<std::string>::iterator i;
+  std::vector<std::string>& libdirs = m_Makefile->GetLinkDirectories();
+  for(i = libdirs.begin(); i != libdirs.end(); ++i)
+    {
+    libOptions += " /LIBPATH:\"";
+    libOptions += *i;
+    libOptions += "/$(OUTDIR)\" ";
+    libOptions += " /LIBPATH:\"";
+    libOptions += *i;
+    libOptions += "\" ";
+    }
+  // find link libraries
+  cmMakefile::LinkLibraries& libs = m_Makefile->GetLinkLibraries();
+  cmMakefile::LinkLibraries::const_iterator j;
+  for(j = libs.begin(); j != libs.end(); ++j)
+    {
+    // add libraries to executables and dlls (but never include
+    // a library in a library, bad recursion)
+    if (!target.IsALibrary() || 
+        (m_LibraryBuildType == DLL && libName != j->first))
+      {
+      if (j->second == cmMakefile::GENERAL)
+        {
+        libOptions += " ";
+        libOptions += j->first;
+        libOptions += ".lib ";
+        }
+      if (j->second == cmMakefile::DEBUG)
+        {
+        libDebugOptions += " ";
+        libDebugOptions += j->first;
+        libDebugOptions += ".lib ";
+        }
+      if (j->second == cmMakefile::OPTIMIZED)
+        {
+        libOptimizedOptions += " ";
+        libOptimizedOptions += j->first;
+        libOptimizedOptions += ".lib ";
+        }      
+      }
+    }
+  libOptions += "/STACK:10000000 ";
+  
   std::ifstream fin(m_DSPHeaderTemplate.c_str());
   if(!fin)
     {
@@ -420,6 +438,10 @@ void cmDSPMakefile::WriteDSPHeader(std::ostream& fout, const char *libName,
       std::string line = buffer;
       cmSystemTools::ReplaceString(line, "CM_LIBRARIES",
                                    libOptions.c_str());
+      cmSystemTools::ReplaceString(line, "CM_DEBUG_LIBRARIES",
+                                   libDebugOptions.c_str());
+      cmSystemTools::ReplaceString(line, "CM_OPTIMIZED_LIBRARIES",
+                                   libOptimizedOptions.c_str());
       cmSystemTools::ReplaceString(line, "BUILD_INCLUDES",
                                    m_IncludeOptions.c_str());
       cmSystemTools::ReplaceString(line, "OUTPUT_LIBNAME",libName);

+ 3 - 4
Source/cmDSPWriter.h

@@ -67,16 +67,15 @@ private:
   std::string m_DSPFooterTemplate;
   std::vector<std::string> m_CreatedProjectNames;
   
-  void CreateSingleDSP(const char *lname, cmTarget &tgt, 
-                       const std::string &libs);
+  void CreateSingleDSP(const char *lname, cmTarget &tgt);
   void WriteDSPFile(std::ostream& fout, const char *libName, 
-                    cmTarget &tgt, const std::string &libs);
+                    cmTarget &tgt);
   void WriteDSPBeginGroup(std::ostream& fout, 
 			  const char* group,
 			  const char* filter);
   void WriteDSPEndGroup(std::ostream& fout);
   void WriteDSPHeader(std::ostream& fout, const char *libName,
-                      const std::string &libs);
+                      const cmTarget &tgt);
   void WriteDSPBuildRule(std::ostream& fout, const char*);
   void WriteDSPBuildRule(std::ostream& fout);
   void WriteDSPFooter(std::ostream& fout);

+ 8 - 7
Source/cmDSWMakefile.cxx

@@ -126,23 +126,24 @@ void cmDSWMakefile::WriteProject(std::ostream& fout,
   fout << "{{{\n";
 
   // insert Begin Project Dependency  Project_Dep_Name project stuff here 
-  std::vector<std::string>::iterator i, end;
-  i = project->GetMakefile()->GetLinkLibraries().begin();
-  end = project->GetMakefile()->GetLinkLibraries().end();
-  for(;i!= end; ++i)
+  cmMakefile::LinkLibraries::const_iterator j, jend;
+  j = project->GetMakefile()->GetLinkLibraries().begin();
+  jend = project->GetMakefile()->GetLinkLibraries().end();
+  for(;j!= jend; ++j)
     {
-    if(*i != dspname)
+    if(j->first != dspname)
       {
       if (!l.IsALibrary() || 
           project->GetLibraryBuildType() == cmDSPMakefile::DLL)
         {
         fout << "Begin Project Dependency\n";
-        fout << "Project_Dep_Name " << *i << "\n";
+        fout << "Project_Dep_Name " << j->first << "\n";
         fout << "End Project Dependency\n";
         }
       }
     }
-  
+
+  std::vector<std::string>::iterator i, end;
   // write utility dependencies.
   i = project->GetMakefile()->GetUtilities().begin();
   end = project->GetMakefile()->GetUtilities().end();

+ 8 - 7
Source/cmDSWWriter.cxx

@@ -126,23 +126,24 @@ void cmDSWMakefile::WriteProject(std::ostream& fout,
   fout << "{{{\n";
 
   // insert Begin Project Dependency  Project_Dep_Name project stuff here 
-  std::vector<std::string>::iterator i, end;
-  i = project->GetMakefile()->GetLinkLibraries().begin();
-  end = project->GetMakefile()->GetLinkLibraries().end();
-  for(;i!= end; ++i)
+  cmMakefile::LinkLibraries::const_iterator j, jend;
+  j = project->GetMakefile()->GetLinkLibraries().begin();
+  jend = project->GetMakefile()->GetLinkLibraries().end();
+  for(;j!= jend; ++j)
     {
-    if(*i != dspname)
+    if(j->first != dspname)
       {
       if (!l.IsALibrary() || 
           project->GetLibraryBuildType() == cmDSPMakefile::DLL)
         {
         fout << "Begin Project Dependency\n";
-        fout << "Project_Dep_Name " << *i << "\n";
+        fout << "Project_Dep_Name " << j->first << "\n";
         fout << "End Project Dependency\n";
         }
       }
     }
-  
+
+  std::vector<std::string>::iterator i, end;
   // write utility dependencies.
   i = project->GetMakefile()->GetUtilities().begin();
   end = project->GetMakefile()->GetUtilities().end();

+ 18 - 1
Source/cmLinkLibrariesCommand.cxx

@@ -23,10 +23,27 @@ bool cmLinkLibrariesCommand::Invoke(std::vector<std::string>& args)
     this->SetError("called with incorrect number of arguments");
     return false;
     }
+  // add libraries, nothe that there is an optional prefix 
+  // of debug and optimized than can be used
   for(std::vector<std::string>::iterator i = args.begin();
       i != args.end(); ++i)
     {
-    m_Makefile->AddLinkLibrary((*i).c_str());
+    if (*i == "debug")
+      {
+      ++i;
+      m_Makefile->AddLinkLibrary(i->c_str(),
+                                 cmMakefile::DEBUG);
+      }
+    else if (*i == "optimized")
+      {
+      ++i;
+      m_Makefile->AddLinkLibrary(i->c_str(),
+                                 cmMakefile::OPTIMIZED);
+      }
+    else
+      {
+      m_Makefile->AddLinkLibrary(i->c_str());  
+      }
     }
   return true;
 }

+ 5 - 2
Source/cmLinkLibrariesCommand.h

@@ -70,11 +70,14 @@ public:
   virtual const char* GetFullDocumentation()
     {
     return
-      "LINK_LIBRARIES(library1 library2)\n"
+      "LINK_LIBRARIES(library1 <debug | optimized> library2 ...)\n"
       "Specify a list of libraries to be linked into\n"
       "executables or shared objects.  This command is passed\n"
       "down to all other commands. The library name should be\n"
-      "the same as the name used in the LIBRARY(library) command.";
+      "the same as the name used in the LIBRARY(library) command.\n"
+      "The debug and optimized strings may be used to indicate that\n"
+      "the next library listed is to be used only for that specific\n"
+      "type of build";
     }
   
   cmTypeMacro(cmLinkLibrariesCommand, cmCommand);

+ 12 - 6
Source/cmMakefile.cxx

@@ -127,7 +127,6 @@ void cmMakefile::Print() const
   this->PrintStringVector("m_MakeVerbatim ", m_MakeVerbatim); 
   this->PrintStringVector("m_IncludeDirectories;", m_IncludeDirectories);
   this->PrintStringVector("m_LinkDirectories", m_LinkDirectories);
-  this->PrintStringVector("m_LinkLibraries", m_LinkLibraries);
   this->PrintStringVector("m_Utilities", m_Utilities);
   this->PrintStringVector("m_UtilityDirectories", m_UtilityDirectories);
 }
@@ -335,9 +334,15 @@ void cmMakefile::AddUtilityDirectory(const char* dir)
   m_UtilityDirectories.push_back(dir);
 }
 
+void cmMakefile::AddLinkLibrary(const char* lib, LinkLibraryType llt)
+{
+  m_LinkLibraries.push_back(
+    std::pair<std::string, LinkLibraryType>(lib,llt));
+}
+
 void cmMakefile::AddLinkLibrary(const char* lib)
 {
-  m_LinkLibraries.push_back(lib);
+  this->AddLinkLibrary(lib,GENERAL);
 }
 
 void cmMakefile::AddLinkDirectory(const char* dir)
@@ -483,11 +488,12 @@ void cmMakefile::ExpandVariables()
     {
     this->ExpandVariablesInString(*j);
     }
-  begin = m_LinkLibraries.begin();
-  end = m_LinkLibraries.end();
-  for(j = begin; j != end; ++j)
+  LinkLibraries::iterator j2, end2;
+  j2 = m_LinkLibraries.begin();
+  end2 = m_LinkLibraries.end();
+  for(; j2 != end2; ++j2)
     {
-    this->ExpandVariablesInString(*j);
+    this->ExpandVariablesInString(j2->first);
     }
 }
 

+ 12 - 9
Source/cmMakefile.h

@@ -118,10 +118,21 @@ public:
    */
   void AddUtilityDirectory(const char*);
 
+  /**
+   * Get a list of link libraries in the build.
+   */
+  enum LinkLibraryType {GENERAL, DEBUG, OPTIMIZED};
+  typedef std::vector<std::pair<std::string,LinkLibraryType> > LinkLibraries;
+  LinkLibraries& GetLinkLibraries()
+    { 
+    return m_LinkLibraries;
+    }
+
   /**
    * Add a link library to the build.
    */
   void AddLinkLibrary(const char*);
+  void AddLinkLibrary(const char*, LinkLibraryType type);
 
   /**
    * Add a link directory to the build.
@@ -332,14 +343,6 @@ public:
     return m_UtilityDirectories;
     }
 
-  /**
-   * Get a list of link libraries in the build.
-   */
-  std::vector<std::string>& GetLinkLibraries()
-    { 
-    return m_LinkLibraries;
-    }
-
   /**
    * Return a list of source files in this makefile.
    */
@@ -446,7 +449,7 @@ protected:
   std::vector<std::string> m_LinkDirectories;
   std::vector<std::string> m_Utilities;
   std::vector<std::string> m_UtilityDirectories;
-  std::vector<std::string> m_LinkLibraries;
+  LinkLibraries m_LinkLibraries;
   std::string m_IncludeFileRegularExpression;
   std::string m_DefineFlags;
   std::vector<cmSourceGroup> m_SourceGroups;

+ 15 - 12
Source/cmUnixMakefileGenerator.cxx

@@ -133,18 +133,21 @@ void cmUnixMakefileGenerator::OutputLinkLibraries(std::ostream& fout,
     linkLibs += " ";
     }
   std::string librariesLinked;
-  std::vector<std::string>& libs = m_Makefile->GetLinkLibraries();
-  for(j = libs.begin(); j != libs.end(); ++j)
+  cmMakefile::LinkLibraries& libs = m_Makefile->GetLinkLibraries();
+  cmMakefile::LinkLibraries::const_iterator j2;
+  for(j2 = libs.begin(); j2 != libs.end(); ++j2)
     {
     // Don't link the library against itself!
-    if(targetLibrary && (*j == targetLibrary)) continue;
-    std::string::size_type pos = (*j).find("-l");
+    if(targetLibrary && (j2->first == targetLibrary)) continue;
+    // don't look at debug libraries
+    if (j2->second == cmMakefile::DEBUG) continue;
+    std::string::size_type pos = j2->first.find("-l");
     if((pos == std::string::npos || pos > 0)
-       && (*j).find("${") == std::string::npos)
+       && j2->first.find("${") == std::string::npos)
       {
       librariesLinked += "-l";
       }
-    librariesLinked += *j;
+    librariesLinked += j2->first;
     librariesLinked += " ";
     }
   linkLibs += librariesLinked;
@@ -206,22 +209,22 @@ void cmUnixMakefileGenerator::OutputTargets(std::ostream& fout)
 void cmUnixMakefileGenerator::OutputDependencies(std::ostream& fout)
 {
   fout << "CMAKE_DEPEND_LIBS = ";
-  std::vector<std::string>& libs = m_Makefile->GetLinkLibraries();
-  std::vector<std::string>::iterator dir, lib;
+  cmMakefile::LinkLibraries& libs = m_Makefile->GetLinkLibraries();
+  cmMakefile::LinkLibraries::const_iterator lib2;
   // Search the list of libraries that will be linked into
   // the executable
-  for(lib = libs.begin(); lib != libs.end(); ++lib)
+  for(lib2 = libs.begin(); lib2 != libs.end(); ++lib2)
     {
     // loop over the list of directories that the libraries might
     // be in, looking for an ADD_LIBRARY(lib...) line. This would
     // be stored in the cache
     const char* cacheValue
-      = cmCacheManager::GetInstance()->GetCacheValue(lib->c_str());
+      = cmCacheManager::GetInstance()->GetCacheValue(lib2->first.c_str());
     if(cacheValue)
       {
       std::string libpath = cacheValue;
       libpath += "/lib";
-      libpath += *lib;
+      libpath += lib2->first;
       libpath += "${CMAKE_LIB_EXT}";
       fout << libpath << " ";
       }
@@ -229,7 +232,7 @@ void cmUnixMakefileGenerator::OutputDependencies(std::ostream& fout)
 
   std::vector<std::string>& utils = m_Makefile->GetUtilities();
   std::vector<std::string>& utildirs = m_Makefile->GetUtilityDirectories();
-  std::vector<std::string>::iterator util;
+  std::vector<std::string>::iterator dir, util;
   // Search the list of utilities that may be used to generate code for
   // this project.
   for(util = utils.begin(); util != utils.end(); ++util)

+ 1 - 3
Source/cmVTKWrapPythonCommand.cxx

@@ -26,9 +26,7 @@ bool cmVTKWrapPythonCommand::Invoke(std::vector<std::string>& args)
 
   // Now check and see if the value has been stored in the cache
   // already, if so use that value and don't look for the program
-  const char* cacheValue
-    = cmCacheManager::GetInstance()->GetCacheValue("VTK_WRAP_PYTHON");
-  if(!cacheValue || !strcmp(cacheValue,"0"))
+  if(!cmCacheManager::GetInstance()->IsOn("VTK_WRAP_PYTHON"))
     {
     return true;
     }