[cmake-commits] alex committed CMakeLists.txt 1.366 1.367 cmExtraCodeBlocksGenerator.cxx NONE 1.1 cmExtraCodeBlocksGenerator.h NONE 1.1 cmake.cxx 1.307 1.308

cmake-commits at cmake.org cmake-commits at cmake.org
Fri Jul 13 00:58:45 EDT 2007


Update of /cvsroot/CMake/CMake/Source
In directory public:/mounts/ram/cvs-serv19791

Modified Files:
	CMakeLists.txt cmake.cxx 
Added Files:
	cmExtraCodeBlocksGenerator.cxx cmExtraCodeBlocksGenerator.h 
Log Message:

ENH: add a simple CodeBlocks extra generator, early alpha stage, there seems
to be interest in it

Alex


Index: CMakeLists.txt
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/CMakeLists.txt,v
retrieving revision 1.366
retrieving revision 1.367
diff -u -d -r1.366 -r1.367
--- CMakeLists.txt	19 Jun 2007 17:10:21 -0000	1.366
+++ CMakeLists.txt	13 Jul 2007 04:58:43 -0000	1.367
@@ -174,7 +174,8 @@
 # Kdevelop only works on UNIX and not windows
 IF(UNIX)
   SET(SRCS ${SRCS}
-    cmGlobalKdevelopGenerator.cxx)
+    cmGlobalKdevelopGenerator.cxx
+    cmExtraCodeBlocksGenerator.cxx)
 ENDIF(UNIX)
 # XCode only works on apple
 IF(APPLE)

--- NEW FILE: cmExtraCodeBlocksGenerator.h ---
/*=========================================================================

  Program:   CMake - Cross-Platform Makefile Generator
  Module:    $RCSfile: cmExtraCodeBlocksGenerator.h,v $
  Language:  C++
  Date:      $Date: 2007/07/13 04:58:43 $
  Version:   $Revision: 1.1 $

  Copyright (c) 2002 Kitware, Inc., Insight Consortium.  All rights reserved.
  Copyright (c) 2004 Alexander Neundorf, neundorf at kde.org. 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 cmExtraCodeBlocksGenerator_h
#define cmExtraCodeBlocksGenerator_h

#include "cmExternalMakefileProjectGenerator.h"

class cmLocalGenerator;
class cmMakefile;

/** \class cmExtraCodeBlocksGenerator
 * \brief Write CodeBlocks project files for Makefile based projects
 *
 * This generator is in early alpha stage.
 */
class cmExtraCodeBlocksGenerator : public cmExternalMakefileProjectGenerator
{
public:
  cmExtraCodeBlocksGenerator();
  virtual void SetGlobalGenerator(cmGlobalGenerator* generator);

  virtual const char* GetName() const
                          { return cmExtraCodeBlocksGenerator::GetActualName();}
  static const char* GetActualName()                     { return "CodeBlocks";}
  static cmExternalMakefileProjectGenerator* New() 
                                      { return new cmExtraCodeBlocksGenerator; }
  /** Get the documentation entry for this generator.  */
  virtual void GetDocumentation(cmDocumentationEntry& entry, 
                                const char* fullName) const;

  virtual void Generate();
private:

  /** Create the foo.kdevelop file. This one calls MergeProjectFiles()
    if it already exists, otherwise createNewProjectFile() The project
    files will be created in \a outputDir (in the build tree), the
    kdevelop project dir will be set to \a projectDir (in the source
    tree). \a cmakeFilePattern consists of a lists of all cmake
    listfiles used by this CMakeLists.txt */
  void CreateProjectFile(const std::vector<cmLocalGenerator*>& lgs);

  ///! Creates a new foo.kdevelop and a new foo.kdevses file
  void CreateNewProjectFile(const std::vector<cmLocalGenerator*>& lgs,
                                const std::string& filename);

};

#endif

Index: cmake.cxx
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/cmake.cxx,v
retrieving revision 1.307
retrieving revision 1.308
diff -u -d -r1.307 -r1.308
--- cmake.cxx	11 Jul 2007 19:53:58 -0000	1.307
+++ cmake.cxx	13 Jul 2007 04:58:43 -0000	1.308
@@ -72,6 +72,7 @@
 
 #ifdef CMAKE_USE_KDEVELOP
 # include "cmGlobalKdevelopGenerator.h"
+# include "cmExtraCodeBlocksGenerator.h"
 #endif
 
 #include <stdlib.h> // required for atoi
@@ -1447,6 +1448,8 @@
 #endif
 // e.g. eclipse ?
 #ifdef CMAKE_USE_KDEVELOP
+  this->AddExtraGenerator(cmExtraCodeBlocksGenerator::GetActualName(), 
+                          &cmExtraCodeBlocksGenerator::New);
   this->AddExtraGenerator(cmGlobalKdevelopGenerator::GetActualName(), 
                           &cmGlobalKdevelopGenerator::New);
   // for kdevelop also add the generator with just the name of the 

--- NEW FILE: cmExtraCodeBlocksGenerator.cxx ---
/*=========================================================================

  Program:   CMake - Cross-Platform Makefile Generator
  Module:    $RCSfile: cmExtraCodeBlocksGenerator.cxx,v $
  Language:  C++
  Date:      $Date: 2007/07/13 04:58:43 $
  Version:   $Revision: 1.1 $

  Copyright (c) 2002 Kitware, Inc., Insight Consortium.  All rights reserved.
  Copyright (c) 2004 Alexander Neundorf neundorf at kde.org, 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 "cmExtraCodeBlocksGenerator.h"
#include "cmGlobalUnixMakefileGenerator3.h"
#include "cmLocalUnixMakefileGenerator3.h"
#include "cmMakefile.h"
#include "cmake.h"
#include "cmSourceFile.h"
#include "cmGeneratedFileStream.h"
#include "cmTarget.h"

#include <cmsys/SystemTools.hxx>

//----------------------------------------------------------------------------
void cmExtraCodeBlocksGenerator
::GetDocumentation(cmDocumentationEntry& entry, const char*) const
{
  entry.name = this->GetName();
  entry.brief = "Generates CodeBlocks project files.";
  entry.full =
    "Project files for CodeBlocks will be created in the top directory "
    "and in every subdirectory which features a CMakeLists.txt file "
    "containing a PROJECT() call. "
    "Additionally 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.";
}

cmExtraCodeBlocksGenerator::cmExtraCodeBlocksGenerator()
:cmExternalMakefileProjectGenerator()
{
  this->SupportedGlobalGenerators.push_back("Unix Makefiles");
}


void cmExtraCodeBlocksGenerator::SetGlobalGenerator(
                                                  cmGlobalGenerator* generator)
{
  cmExternalMakefileProjectGenerator::SetGlobalGenerator(generator);
  cmGlobalUnixMakefileGenerator3* mf = (cmGlobalUnixMakefileGenerator3*)
                                                                     generator;
  mf->SetToolSupportsColor(false);
  mf->SetForceVerboseMakefiles(true);
}

void cmExtraCodeBlocksGenerator::Generate()
{

  const cmMakefile* topLevelMakefile = this->GlobalGenerator->GetLocalGenerators()[0]->GetMakefile();

  std::string workspaceName = topLevelMakefile->GetProjectName();
  std::string outputDir=topLevelMakefile->GetStartOutputDirectory();
  std::string workspaceFilename = outputDir;
  workspaceFilename += "/";
  workspaceFilename += workspaceName;
  workspaceFilename += ".workspace";

  cmGeneratedFileStream fout(workspaceFilename.c_str());
  if(!fout)
  {
    return;
  }

  fout<<"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n"
        "<CodeBlocks_workspace_file>\n"
        "   <Workspace title=\""<<workspaceName<<"\">\n";

  bool firstProject = true;
  // for each sub project in the project create
  // a kdevelop project
  for (std::map<cmStdString, std::vector<cmLocalGenerator*> >::const_iterator
       it = this->GlobalGenerator->GetProjectMap().begin();
      it!= this->GlobalGenerator->GetProjectMap().end();
      ++it)
    {
    const cmMakefile* mf=it->second[0]->GetMakefile();
    std::string filename=mf->GetStartOutputDirectory();
    filename+="/";
    filename+=mf->GetProjectName();
    filename+=".cbp";

    if (firstProject)
    {
      fout<<"      <Project filename=\""<< filename<<"\" active=\"1\"/>\n";
    }
    else
    {
      fout<<"      <Project filename=\""<< filename<<"\" />\n";
    }
    // create a project file
    this->CreateProjectFile(it->second);
    }

  fout<<"   </Workspace>\n"
        "</CodeBlocks_workspace_file>\n";
}


/* create the project file, if it already exists, merge it with the
existing one, otherwise create a new one */
void cmExtraCodeBlocksGenerator::CreateProjectFile(const std::vector<cmLocalGenerator*>& lgs)
{
  const cmMakefile* mf=lgs[0]->GetMakefile();
  std::string outputDir=mf->GetStartOutputDirectory();
  std::string projectDir=mf->GetHomeDirectory();
  std::string projectName=mf->GetProjectName();

  std::string filename=outputDir+"/";
  filename+=projectName+".cbp";
  std::string sessionFilename=outputDir+"/";
  sessionFilename+=projectName+".layout";

/*  if (cmSystemTools::FileExists(filename.c_str()))
    {
    this->MergeProjectFiles(outputDir, projectDir, filename,
                            cmakeFilePattern, sessionFilename);
    }
  else */
    {
    this->CreateNewProjectFile(lgs, filename);
    }

}


void cmExtraCodeBlocksGenerator
  ::CreateNewProjectFile(const std::vector<cmLocalGenerator*>& lgs,
                         const std::string& filename)
{
  const cmMakefile* mf=lgs[0]->GetMakefile();
  cmGeneratedFileStream fout(filename.c_str());
  if(!fout)
    {
    return;
    }

  std::string make = mf->GetRequiredDefinition("CMAKE_MAKE_PROGRAM");

  fout<<"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n"
        "<CodeBlocks_project_file>\n"
        "   <FileVersion major=\"1\" minor=\"6\" />\n"
        "   <Project>\n";

  fout<<"      <Option title=\"" << mf->GetProjectName()<<"\" />\n"
        "      <Option makefile_is_custom=\"1\" />\n"
        "      <Option compiler=\"gcc\" />\n"
        "      <Build>\n";

  bool installTargetCreated = false;
  bool testTargetCreated = false;
  bool packageTargetCreated = false;
  
  for (std::vector<cmLocalGenerator*>::const_iterator lg=lgs.begin();
       lg!=lgs.end(); lg++)
    {
    cmMakefile* makefile=(*lg)->GetMakefile();
    cmTargets& targets=makefile->GetTargets();
    for (cmTargets::iterator ti = targets.begin();
         ti != targets.end(); ti++)
      {
        switch(ti->second.GetType())
        {
          case cmTarget::GLOBAL_TARGET:
            if ((ti->first=="install") && (installTargetCreated==false)) 
            {
              installTargetCreated=true;
            }
            else if ((ti->first=="package") && (packageTargetCreated==false)) 
            {
              packageTargetCreated=true;
            }
            else if ((ti->first=="test") && (testTargetCreated==false)) 
            {
              testTargetCreated=true;
            }
            else
            {
              break;
            }
          case cmTarget::EXECUTABLE:
          case cmTarget::STATIC_LIBRARY:
          case cmTarget::SHARED_LIBRARY:
          case cmTarget::MODULE_LIBRARY:
//          case cmTarget::UTILITY:
  fout<<"      <Target title=\""<<ti->first<<"\">\n"
        "         <Option output=\""<<ti->second.GetLocation(0)<<"\" prefix_auto=\"0\" extension_auto=\"0\" />\n"
        "         <Option working_dir=\""<<makefile->GetStartOutputDirectory()<<"\" />\n"
        "         <Option type=\"0\" />\n"
        "         <Option compiler=\"gcc\" />\n"
        "         <MakeCommands>\n";

  fout<<"            <Build command=\""<<make<<" -f "<<makefile->GetStartOutputDirectory()<<"/Makefile "<<ti->first<<"\" />\n";
  fout<<"            <CompileFile command=\""<<make<<" -f "<<makefile->GetStartOutputDirectory()<<"/Makefile "<<ti->first<<"\" />\n";
  fout<<"            <Clean command=\""<<make<<" -f "<<makefile->GetStartOutputDirectory()<<"/Makefile clean\" />\n";
  fout<<"            <DistClean command=\""<<make<<" -f "<<makefile->GetStartOutputDirectory()<<"/Makefile clean\" />\n";

  fout<<"         </MakeCommands>\n"
        "      </Target>\n";
//  if (ti->second.GetType()==cmTarget::UTILITY) fout<<"****** UTILITY \n";
//  if (ti->second.GetType()==cmTarget::GLOBAL_TARGET) fout<<"****** GLOBAL_YESTERDAY \n";
            break;
          default:
            break;
        }
      }
    }

  fout<<"      </Build>\n";

  
  std::map<std::string, std::string> sourceFiles;
  for (std::vector<cmLocalGenerator*>::const_iterator lg=lgs.begin();
       lg!=lgs.end(); lg++)
  {
    cmMakefile* makefile=(*lg)->GetMakefile();
    cmTargets& targets=makefile->GetTargets();
    for (cmTargets::iterator ti = targets.begin();
         ti != targets.end(); ti++)
    {
      switch(ti->second.GetType())
      {
        case cmTarget::EXECUTABLE:
        case cmTarget::STATIC_LIBRARY:
        case cmTarget::SHARED_LIBRARY:
        case cmTarget::MODULE_LIBRARY:
        {
          const std::vector<cmSourceFile*>& sources=ti->second.GetSourceFiles();
          for (std::vector<cmSourceFile*>::const_iterator si=sources.begin();
               si!=sources.end(); si++)
          {
            sourceFiles[(*si)->GetFullPath()] = ti->first;
          }
        }
        default:
          break;
      }
    }
  }
  
  for (std::map<std::string, std::string>::const_iterator sit=sourceFiles.begin();
       sit!=sourceFiles.end();
       ++sit)
  {
  fout<<"      <Unit filename=\""<<sit->first <<"\">\n";
  fout<<"      </Unit>\n";
  }
  
  fout<<"   </Project>\n"
        "</CodeBlocks_project_file>\n";

}




More information about the Cmake-commits mailing list