瀏覽代碼

NEW: add kdevelop patch from Alexander Neundorf

Bill Hoffman 21 年之前
父節點
當前提交
766c093d69

+ 9 - 0
Source/CMakeLists.txt

@@ -42,6 +42,7 @@ cmLocalUnixMakefileGenerator.h
 cmVariableWatch.h
 )
 
+
 # configure the .h file
 CONFIGURE_FILE(
 ${CMake_SOURCE_DIR}/Source/cmConfigure.cmake.h.in 
@@ -63,6 +64,14 @@ IF (APPLE)
     )
 ENDIF (APPLE)
 
+# Kdevelop only works on UNIX and not windows
+IF(UNIX AND NOT WIN32)
+  SET(SRCS ${SRCS}
+    cmGlobalKdevelopGenerator.cxx
+    cmLocalKdevelopGenerator.cxx)
+ENDIF(UNIX AND NOT WIN32)
+
+
 IF (WIN32)
   IF(NOT UNIX)
     SET(SRCS ${SRCS}

+ 52 - 0
Source/cmGlobalKdevelopGenerator.cxx

@@ -0,0 +1,52 @@
+/*=========================================================================
+
+  Program:   CMake - Cross-Platform Makefile Generator
+  Module:    $RCSfile$
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+  Copyright (c) 2002 Kitware, Inc., Insight Consortium.  All rights reserved.
+  Copyright (c) 2004 Alexander Neundorf, [email protected]. All rights reserved.
+  See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+
+#include "cmGlobalKdevelopGenerator.h"
+#include "cmLocalKdevelopGenerator.h"
+#include "cmMakefile.h"
+#include "cmake.h"
+
+cmGlobalKdevelopGenerator::cmGlobalKdevelopGenerator()
+{
+  // This type of makefile always requires unix style paths
+  m_ForceUnixPaths = true;
+  m_FindMakeProgramFile = "CMakeUnixFindMake.cmake";
+}
+
+///! Create a local generator appropriate to this Global Generator
+cmLocalGenerator *cmGlobalKdevelopGenerator::CreateLocalGenerator()
+{
+  cmLocalGenerator *lg = new cmLocalKdevelopGenerator;
+  lg->SetGlobalGenerator(this);
+  return lg;
+}
+
+//----------------------------------------------------------------------------
+void cmGlobalKdevelopGenerator::GetDocumentation(cmDocumentationEntry& entry) const
+{
+  entry.name = this->GetName();
+  entry.brief = "Generates KDevelop 3 project files.";
+  entry.full =
+    "A hierarchy of UNIX makefiles is generated into the build tree.  Any "
+    "standard UNIX-style make program can build the project through the "
+     "default make target.  A \"make install\" target is also provided."
+     "Additionally in each directory which features executable or library"
+     " targets a KDevelop 3 project file is generated.\n"
+     "If you change the settings using KDevelop your cmake will try its best"
+     "to keep your changes when regenerating the project files.";
+}

+ 47 - 0
Source/cmGlobalKdevelopGenerator.h

@@ -0,0 +1,47 @@
+/*=========================================================================
+
+  Program:   CMake - Cross-Platform Makefile Generator
+  Module:    $RCSfile$
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+  Copyright (c) 2002 Kitware, Inc., Insight Consortium.  All rights reserved.
+  Copyright (c) 2004 Alexander Neundorf, [email protected]. All rights reserved.
+  See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef cmGlobalKdevelopGenerator_h
+#define cmGlobalKdevelopGenerator_h
+
+#include "cmGlobalUnixMakefileGenerator.h"
+
+/** \class cmGlobalUnixMakefileGenerator
+ * \brief Write a Unix makefiles.
+ *
+ * cmGlobalUnixMakefileGenerator manages UNIX build process for a tree
+ */
+class cmGlobalKdevelopGenerator : public cmGlobalUnixMakefileGenerator
+{
+public:
+  cmGlobalKdevelopGenerator();
+  static cmGlobalGenerator* New() { return new cmGlobalKdevelopGenerator; }
+
+  ///! Get the name for the generator.
+  virtual const char* GetName() const {
+    return cmGlobalKdevelopGenerator::GetActualName();}
+  static const char* GetActualName() {return "KDevelop3";}
+
+  /** Get the documentation entry for this generator.  */
+  virtual void GetDocumentation(cmDocumentationEntry& entry) const;
+  
+  ///! Create a local generator appropriate to this Global Generator
+  virtual cmLocalGenerator *CreateLocalGenerator();
+
+};
+
+#endif

+ 378 - 0
Source/cmLocalKdevelopGenerator.cxx

@@ -0,0 +1,378 @@
+/*=========================================================================
+
+  Program:   CMake - Cross-Platform Makefile Generator
+  Module:    $RCSfile$
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+  Copyright (c) 2002 Kitware, Inc., Insight Consortium.  All rights reserved.
+  Copyright (c) 2004 Alexander Neundorf, [email protected]. All rights reserved.
+  See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#include "cmGlobalGenerator.h"
+#include "cmLocalKdevelopGenerator.h"
+#include "cmMakefile.h"
+#include "cmSystemTools.h"
+#include "cmSourceFile.h"
+#include "cmMakeDepend.h"
+#include "cmCacheManager.h"
+#include "cmGeneratedFileStream.h"
+
+#include <cmsys/RegularExpression.hxx>
+
+#include <iostream>
+
+
+cmLocalKdevelopGenerator::cmLocalKdevelopGenerator()
+  :cmLocalUnixMakefileGenerator()
+{
+}
+
+cmLocalKdevelopGenerator::~cmLocalKdevelopGenerator()
+{
+}
+
+#include <stdio.h>
+#include <string>
+#include <vector>
+
+void cmLocalKdevelopGenerator::Generate(bool fromTheTop)
+{
+  cmLocalUnixMakefileGenerator::Generate(fromTheTop);
+
+  bool containsTargets=false;
+  std::string executable;
+  cmTargets& targets=m_Makefile->GetTargets();
+  for (cmTargets::const_iterator ti = targets.begin(); ti != targets.end(); ti++)
+    {
+    switch (ti->second.GetType())
+      {
+      case cmTarget::EXECUTABLE:
+        executable=ti->first;
+      case cmTarget::STATIC_LIBRARY:
+      case cmTarget::SHARED_LIBRARY:
+      case cmTarget::MODULE_LIBRARY:
+      case cmTarget::UTILITY:
+        containsTargets=true;
+        break;
+      case cmTarget::INSTALL_FILES:
+      case cmTarget::INSTALL_PROGRAMS:
+      default:
+        break;
+      }
+    }
+
+  if (containsTargets)
+    {
+    std::string projectFileDir=m_Makefile->GetStartOutputDirectory();
+    std::string filelistDir=m_Makefile->GetDefinition("PROJECT_SOURCE_DIR");
+    //build the project name by taking the subdir
+    std::string projectName=m_Makefile->GetProjectName();
+    projectName+=m_Makefile->GetStartOutputDirectory();
+    cmSystemTools::ReplaceString(projectName, filelistDir.c_str(), "");
+    cmSystemTools::ReplaceString(projectName, "/", "_");
+
+    std::string cmakeFilePattern("*/CMakeLists.txt;*.cmake;");
+
+    if (!this->CreateFilelistFile(filelistDir, projectName, cmakeFilePattern))
+      {
+      return;
+      }
+
+    this->CreateProjectFile(filelistDir, projectName, executable, cmakeFilePattern);
+    }
+}
+
+void cmLocalKdevelopGenerator::CreateProjectFile(const std::string& dir,
+                                                 const std::string& projectname, 
+                                                 const std::string& executable,
+                                                 const std::string& cmakeFilePattern)
+{
+  std::string filename=m_Makefile->GetStartOutputDirectory();
+  filename+="/";
+  filename+=projectname+".kdevelop";
+
+  if (cmSystemTools::FileExists(filename.c_str()))
+    {
+    this->MergeProjectFiles(dir, filename, executable, cmakeFilePattern);
+    }
+  else
+    {
+    this->CreateNewProjectFile(dir, filename, executable, cmakeFilePattern);
+    }
+   
+}
+
+void cmLocalKdevelopGenerator::MergeProjectFiles(const std::string& dir, 
+                                                 const std::string& filename, 
+                                                 const std::string& executable, 
+                                                 const std::string& cmakeFilePattern)
+{
+  std::ifstream oldProjectFile(filename.c_str());
+  if (!oldProjectFile)
+    {
+    this->CreateNewProjectFile(dir, filename, executable, cmakeFilePattern);
+    return;
+    }
+
+  std::string tmp;
+  std::vector<std::string> lines;
+  while (cmSystemTools::GetLineFromStream(oldProjectFile, tmp))
+    {
+    lines.push_back(tmp);
+    }
+  oldProjectFile.close();
+
+  cmGeneratedFileStream tempFile(filename.c_str());
+  tempFile.SetAlwaysCopy(true);
+  std::ostream&  fout = tempFile.GetStream();
+  if(!fout)
+    {
+    cmSystemTools::Error("Error can not open for write: ", filename.c_str());
+    return;
+    }
+
+  for (std::vector<std::string>::const_iterator it=lines.begin(); 
+       it!=lines.end(); it++)
+    {
+    const char* line=(*it).c_str();
+
+    if ((strstr(line, "<projectdirectory>")!=0)
+        || (strstr(line, "<projectmanagement>")!=0)
+        || (strstr(line, "<absoluteprojectpath>")!=0)
+        || (strstr(line, "<buildtool>")!=0)
+        || (strstr(line, "<builddir>")!=0))
+      {
+      continue;
+      }
+
+    fout<<*it<<"\n";
+
+    if (strstr(line, "<general>"))
+      {
+      fout<<"  <projectmanagement>KDevCustomProject</projectmanagement>\n";
+      fout<<"  <projectdirectory>"<<dir.c_str()<<"</projectdirectory>\n";   //this one is important
+      fout<<"  <absoluteprojectpath>true</absoluteprojectpath>\n";          //and this one
+      }
+
+    if (strstr(line, "<build>"))
+      {
+      fout<<"      <buildtool>make</buildtool>\n";                                        //this one is important
+      fout<<"      <builddir>"<<m_Makefile->GetStartOutputDirectory()<<"</builddir>\n";   //and this one
+
+      }
+    }
+}
+
+void cmLocalKdevelopGenerator::CreateNewProjectFile(const std::string& dir, const std::string& filename,
+                                                    const std::string& executable, const std::string& cmakeFilePattern)
+{
+
+  cmGeneratedFileStream tempFile(filename.c_str());
+  tempFile.SetAlwaysCopy(true);
+
+  std::ostream&  fout = tempFile.GetStream();
+  if(!fout)
+    {
+    cmSystemTools::Error("Error can not open for write: ", filename.c_str());
+    return;
+    }
+
+  fout<<"<?xml version = '1.0'?>\n";
+  fout<<"<kdevelop>\n";
+  fout<<"  <general>\n";
+  fout<<"  <author></author>\n";
+  fout<<"  <email></email>\n";
+  fout<<"  <version>$VERSION$</version>\n";
+  fout<<"  <projectmanagement>KDevCustomProject</projectmanagement>\n";
+  fout<<"  <primarylanguage>C++</primarylanguage>\n";
+  fout<<"  <ignoreparts/>\n";
+  fout<<"  <projectdirectory>"<<dir.c_str()<<"</projectdirectory>\n";   //this one is important
+  fout<<"  <absoluteprojectpath>true</absoluteprojectpath>\n";          //and this one
+  fout<<"  <secondaryLanguages>\n";
+  fout<<"     <language>C</language>\n";
+  fout<<"  </secondaryLanguages>\n";
+  fout<<"  </general>\n";
+  fout<<"  <kdevcustomproject>\n";
+  fout<<"    <run>\n";
+  fout<<"      <mainprogram>"<<m_Makefile->GetStartOutputDirectory()<<"/"<<executable.c_str()<<"</mainprogram>\n";
+  fout<<"      <directoryradio>custom</directoryradio>\n";
+  fout<<"      <customdirectory>/</customdirectory>\n";
+  fout<<"      <programargs></programargs>\n";
+  fout<<"      <terminal>false</terminal>\n";
+  fout<<"      <autocompile>true</autocompile>\n";
+  fout<<"      <envvars/>\n";
+  fout<<"    </run>\n";
+  fout<<"    <build>\n";
+  fout<<"      <buildtool>make</buildtool>\n";                                        //this one is important
+  fout<<"      <builddir>"<<m_Makefile->GetStartOutputDirectory()<<"</builddir>\n";   //and this one
+  fout<<"    </build>\n";
+  fout<<"    <make>\n";
+  fout<<"      <abortonerror>false</abortonerror>\n";
+  fout<<"      <numberofjobs>1</numberofjobs>\n";
+  fout<<"      <dontact>false</dontact>\n";
+  fout<<"      <makebin></makebin>\n";
+  fout<<"      <selectedenvironment>default</selectedenvironment>\n";
+  fout<<"      <environments>\n";
+  fout<<"        <default/>\n";
+  fout<<"      </environments>\n";
+  fout<<"    </make>\n";
+  fout<<"  </kdevcustomproject>\n";
+  fout<<"  <kdevfileCreate>\n";
+  fout<<"    <filetypes/>\n";
+  fout<<"    <useglobaltypes>\n";
+  fout<<"      <type ext=\"ui\" />\n";
+  fout<<"      <type ext=\"cpp\" />\n";
+  fout<<"      <type ext=\"h\" />\n";
+  fout<<"    </useglobaltypes>\n";
+  fout<<"  </kdevfilecreate>\n";
+  fout<<"  <kdevdoctreeview>\n";
+  fout<<"    <projectdoc>\n";
+  fout<<"      <userdocDir>html/</userdocDir>\n";
+  fout<<"      <apidocDir>html/</apidocDir>\n";
+  fout<<"    </projectdoc>\n";
+  fout<<"    <ignoreqt_xml/>\n";
+  fout<<"    <ignoredoxygen/>\n";
+  fout<<"    <ignorekdocs/>\n";
+  fout<<"    <ignoretocs/>\n";
+  fout<<"    <ignoredevhelp/>\n";
+  fout<<"  </kdevdoctreeview>\n";
+  fout<<"  <cppsupportpart>\n";
+  fout<<"    <filetemplates>\n";
+  fout<<"      <interfacesuffix>.h</interfacesuffix>\n";
+  fout<<"      <implementationsuffix>.cpp</implementationsuffix>\n";
+  fout<<"    </filetemplates>\n";
+  fout<<"  </cppsupportpart>\n";
+  fout<<"  <kdevcppsupport>\n";
+  fout<<"    <codecompletion>\n";
+  fout<<"      <includeGlobalFunctions>true</includeGlobalFunctions>\n";
+  fout<<"      <includeTypes>true</includeTypes>\n";
+  fout<<"      <includeEnums>true</includeEnums>\n";
+  fout<<"      <includeTypedefs>false</includeTypedefs>\n";
+  fout<<"      <automaticCodeCompletion>true</automaticCodeCompletion>\n";
+  fout<<"      <automaticArgumentsHint>true</automaticArgumentsHint>\n";
+  fout<<"      <automaticHeaderCompletion>true</automaticHeaderCompletion>\n";
+  fout<<"      <codeCompletionDelay>250</codeCompletionDelay>\n";
+  fout<<"      <argumentsHintDelay>400</argumentsHintDelay>\n";
+  fout<<"      <headerCompletionDelay>250</headerCompletionDelay>\n";
+  fout<<"    </codecompletion>\n";
+  fout<<"    <references/>\n";
+  fout<<"  </kdevcppsupport>\n";
+  fout<<"  <kdevfileview>\n";
+  fout<<"    <groups>\n";
+  fout<<"      <group pattern=\""<<cmakeFilePattern.c_str()<<"\" name=\"CMake\" />\n";
+  fout<<"      <group pattern=\"*.h;*.hxx\" name=\"Header\" />\n";
+  fout<<"      <group pattern=\"*.cpp;*.c;*.C;*.cxx\" name=\"Sources\" />\n";
+  fout<<"      <group pattern=\"*.ui\" name=\"Qt Designer files\" />\n";
+  fout<<"      <hidenonprojectfiles>true</hidenonprojectfiles>\n";
+  fout<<"    </groups>\n";
+  fout<<"    <tree>\n";
+  fout<<"      <hidepatterns>*.o,*.lo,CVS,*~,cmake*</hidepatterns>\n";
+  fout<<"      <hidenonprojectfiles>true</hidenonprojectfiles>\n";
+  fout<<"    </tree>\n";
+  fout<<"  </kdevfileview>\n";
+  fout<<"</kdevelop>\n";
+}
+
+bool cmLocalKdevelopGenerator::CreateFilelistFile(const std::string& _dir, 
+                                                  const std::string& projectname,
+                                                  std::string& cmakeFilePattern)
+{
+  std::string filelistDir=_dir+"/";
+  std::string filename=filelistDir+projectname+".kdevelop.filelist";
+
+  std::set<cmStdString> files;
+
+  //get all cmake files
+  std::string tmp;
+  const std::vector<std::string>& listFiles=m_Makefile->GetListFiles();
+  for (std::vector<std::string>::const_iterator it=listFiles.begin(); it!=listFiles.end(); it++)
+    {
+    tmp=*it;
+    cmSystemTools::ReplaceString(tmp, filelistDir.c_str(), "");
+    if (tmp[0]!='/')
+      {
+      files.insert(tmp);
+      tmp=cmSystemTools::GetFilenameName(tmp);
+      //add all files which dont match the default */CMakeLists.txt;*cmake; to the file pattern
+      if ((tmp!="CMakeLists.txt")
+          && (strstr(tmp.c_str(), ".cmake")==0))
+        {
+        cmakeFilePattern+="*/"+tmp+";";
+        }
+      }
+    }
+
+  //get all sources
+  cmTargets& targets=m_Makefile->GetTargets();
+  for (cmTargets::const_iterator ti = targets.begin(); ti != targets.end(); ti++)
+    {
+    const std::vector<std::string>& sources=ti->second.GetSourceLists();
+    for (std::vector<std::string>::const_iterator it=sources.begin(); it!=sources.end(); it++)
+      {
+      tmp=*it;
+
+      if (tmp[0]!='/') //no absolute path
+        {
+        tmp=std::string(m_Makefile->GetDefinition("CMAKE_CURRENT_SOURCE_DIR"))+"/"+tmp;
+        }
+
+      tmp=cmSystemTools::CollapseFullPath(tmp.c_str());
+      cmSystemTools::ReplaceString(tmp, filelistDir.c_str(), "");
+      if (tmp[0]=='/')
+        {
+        std::string errorMessage("In order to get working KDevelop project files, you have to call "
+                                 "PROJECT() in a directory which is a parent directory of all source files. The source file ");
+        errorMessage+=tmp+" is not located beneath your current project directory "+filelistDir+" .";
+        cmSystemTools::Error(errorMessage.c_str());
+        return false;
+        }
+      files.insert(tmp);
+      }
+    }
+
+
+  //check if the output file already exists and read it
+  //insert all files which exist into the set of files
+  std::ifstream oldFilelist(filename.c_str());
+  if (oldFilelist)
+    {
+    while (cmSystemTools::GetLineFromStream(oldFilelist, tmp))
+      {
+      if (tmp[0]=='/')
+        {
+        continue;
+        }
+      std::string completePath=filelistDir+tmp;
+      if (cmSystemTools::FileExists(completePath.c_str()))
+        {
+        files.insert(tmp);
+        }
+      }
+    oldFilelist.close();
+    }
+   
+
+  cmGeneratedFileStream tempFile(filename.c_str());
+  tempFile.SetAlwaysCopy(true);
+  std::ostream&  fout = tempFile.GetStream();
+  if(!fout)
+    {
+    cmSystemTools::Error("Error can not open for write: ", filename.c_str());
+    return false;
+    }
+   
+  for (std::set<cmStdString>::const_iterator it=files.begin(); it!=files.end(); it++)
+    {
+    fout<<*it<<"\n";
+    }
+  return true;
+}
+
+

+ 62 - 0
Source/cmLocalKdevelopGenerator.h

@@ -0,0 +1,62 @@
+/*=========================================================================
+
+  Program:   CMake - Cross-Platform Makefile Generator
+  Module:    $RCSfile$
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+  Copyright (c) 2002 Kitware, Inc., Insight Consortium.  All rights reserved.
+  Copyright (c) 2004 Alexander Neundorf, [email protected]. All rights reserved.
+  See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef cmLocalKdevelopGenerator_h
+#define cmLocalKdevelopGenerator_h
+
+#include "cmLocalUnixMakefileGenerator.h"
+
+class cmDependInformation;
+class cmMakeDepend;
+class cmTarget;
+class cmSourceFile;
+
+/** \class cmLocalKdevelopGenerator
+ * \brief Write a LocalUnix makefiles.
+ *
+ * cmLocalKdevelopGenerator produces a LocalUnix makefile from its
+ * member m_Makefile.
+ */
+class cmLocalKdevelopGenerator : public cmLocalUnixMakefileGenerator
+{
+public:
+  ///! Set cache only and recurse to false by default.
+  cmLocalKdevelopGenerator();
+
+  virtual ~cmLocalKdevelopGenerator();
+  
+  /**
+   * Generate the makefile for this directory. fromTheTop indicates if this
+   * is being invoked as part of a global Generate or specific to this
+   * directory. The difference is that when done from the Top we might skip
+   * some steps to save time, such as dependency generation for the
+   * makefiles. This is done by a direct invocation from make. 
+   */
+  virtual void Generate(bool fromTheTop);
+protected:
+   ///Create the foo.kdevelop file. This one calls MergeProjectFiles() if it already exists, otherwise createNewProjectFile()
+   void CreateProjectFile(const std::string& dir, const std::string& projectname, const std::string& executable, const std::string& cmakeFilePattern);
+   /// Create the foo.kdevelop.filelist file, return false if it doesn't succeed
+   bool CreateFilelistFile(const std::string& dir, const std::string& projectname, std::string& cmakeFilePattern);
+   ///Reads the old foo.kdevelop line by line and only replaces the "important" lines
+   void MergeProjectFiles(const std::string& dir, const std::string& filename, const std::string& executable, const std::string& cmakeFilePattern);
+   ///Creates a new foo.kdevelop file
+   void CreateNewProjectFile(const std::string& dir, const std::string& filename, const std::string& executable, const std::string& cmakeFilePattern);
+
+};
+
+#endif

+ 21 - 17
Source/cmake.cxx

@@ -25,29 +25,29 @@
 
 // include the generator
 #if defined(_WIN32) && !defined(__CYGWIN__)
-#include "cmGlobalVisualStudio6Generator.h"
-#if !defined(__MINGW32__)
-#include "cmGlobalVisualStudio7Generator.h"
-#include "cmGlobalVisualStudio71Generator.h"
-#include "cmGlobalVisualStudio8Generator.h"
-#endif
-#include "cmGlobalBorlandMakefileGenerator.h"
-#include "cmGlobalNMakeMakefileGenerator.h"
-#include "cmGlobalUnixMakefileGenerator.h"
-#include "cmWin32ProcessExecution.h"
+#  include "cmGlobalVisualStudio6Generator.h"
+#  if !defined(__MINGW32__)
+#    include "cmGlobalVisualStudio7Generator.h"
+#    include "cmGlobalVisualStudio71Generator.h"
+#    include "cmGlobalVisualStudio8Generator.h"
+#  endif
+#  include "cmGlobalBorlandMakefileGenerator.h"
+#  include "cmGlobalNMakeMakefileGenerator.h"
+#  include "cmWin32ProcessExecution.h"
 #else
-#include "cmGlobalUnixMakefileGenerator.h"
 #endif
+#include "cmGlobalUnixMakefileGenerator.h"
+#include "cmGlobalKdevelopGenerator.h"
 
 #include <stdlib.h> // required for atoi
 
 #ifdef __APPLE__
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-#if defined(CMAKE_BUILD_WITH_CMAKE)
-#include "cmGlobalCodeWarriorGenerator.h"
-#endif
+#  include <sys/types.h>
+#  include <sys/time.h>
+#  include <sys/resource.h>
+#  if defined(CMAKE_BUILD_WITH_CMAKE)
+#    include "cmGlobalCodeWarriorGenerator.h"
+#  endif
 #endif
 
 #include <memory> // auto_ptr
@@ -1415,6 +1415,10 @@ void cmake::AddDefaultGenerators()
 #endif
   m_Generators[cmGlobalUnixMakefileGenerator::GetActualName()] =
     &cmGlobalUnixMakefileGenerator::New;
+#if !defined(_WIN32)
+  m_Generators[cmGlobalKdevelopGenerator::GetActualName()] =
+     &cmGlobalKdevelopGenerator::New;
+#endif
 }
 
 int cmake::LoadCache()