diff options
-rw-r--r-- | Source/CMakeLists.txt | 3 | ||||
-rw-r--r-- | Source/cmExtraCodeBlocksGenerator.cxx | 269 | ||||
-rw-r--r-- | Source/cmExtraCodeBlocksGenerator.h | 63 | ||||
-rw-r--r-- | Source/cmake.cxx | 3 |
4 files changed, 337 insertions, 1 deletions
diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index f7d6537..574e69d 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -174,7 +174,8 @@ SET(SRCS # 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) diff --git a/Source/cmExtraCodeBlocksGenerator.cxx b/Source/cmExtraCodeBlocksGenerator.cxx new file mode 100644 index 0000000..f2f0085 --- /dev/null +++ b/Source/cmExtraCodeBlocksGenerator.cxx @@ -0,0 +1,269 @@ +/*========================================================================= + + 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 neundorf@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"; + +} + diff --git a/Source/cmExtraCodeBlocksGenerator.h b/Source/cmExtraCodeBlocksGenerator.h new file mode 100644 index 0000000..0ef8bcf --- /dev/null +++ b/Source/cmExtraCodeBlocksGenerator.h @@ -0,0 +1,63 @@ +/*========================================================================= + + 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, neundorf@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 diff --git a/Source/cmake.cxx b/Source/cmake.cxx index 7e64476..c928603 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -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 @@ void cmake::AddDefaultExtraGenerators() #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 |