diff options
author | Alexander Neundorf <neundorf@kde.org> | 2007-08-01 13:18:50 (GMT) |
---|---|---|
committer | Alexander Neundorf <neundorf@kde.org> | 2007-08-01 13:18:50 (GMT) |
commit | f7f522e61a32c93c86ee455d8c465d8e7e52ae5a (patch) | |
tree | f8808c7b68ee0ad42e5e465f419d1becd9940348 /Source | |
parent | 21f73ebc363a6819ed387c6e5c2fd784db81014a (diff) | |
download | CMake-f7f522e61a32c93c86ee455d8c465d8e7e52ae5a.zip CMake-f7f522e61a32c93c86ee455d8c465d8e7e52ae5a.tar.gz CMake-f7f522e61a32c93c86ee455d8c465d8e7e52ae5a.tar.bz2 |
ENH: add Eclipse CDT4 generator, patch from Miguel A. Figueroa-Villanueva
Alex
Diffstat (limited to 'Source')
-rw-r--r-- | Source/CMakeLists.txt | 2 | ||||
-rw-r--r-- | Source/cmExtraEclipseCDT4Generator.cxx | 706 | ||||
-rw-r--r-- | Source/cmExtraEclipseCDT4Generator.h | 93 | ||||
-rw-r--r-- | Source/cmake.cxx | 13 |
4 files changed, 814 insertions, 0 deletions
diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index 3e670a1..1a0e8ab 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -106,6 +106,8 @@ SET(SRCS cmExprLexer.cxx cmExprParser.cxx cmExprParserHelper.cxx + cmExtraEclipseCDT4Generator.cxx + cmExtraEclipseCDT4Generator.h cmFileTimeComparison.cxx cmFileTimeComparison.h cmGeneratedFileStream.cxx diff --git a/Source/cmExtraEclipseCDT4Generator.cxx b/Source/cmExtraEclipseCDT4Generator.cxx new file mode 100644 index 0000000..8fd06a3 --- /dev/null +++ b/Source/cmExtraEclipseCDT4Generator.cxx @@ -0,0 +1,706 @@ +/*========================================================================= + + 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. + Copyright (c) 2007 Miguel A. Figueroa-Villanueva. 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 "cmExtraEclipseCDT4Generator.h" +#include "cmGlobalUnixMakefileGenerator3.h" +#include "cmLocalUnixMakefileGenerator3.h" +#include "cmMakefile.h" +#include "cmGeneratedFileStream.h" +#include "cmTarget.h" + +#include "cmSystemTools.h" + +//---------------------------------------------------------------------------- +cmExtraEclipseCDT4Generator +::cmExtraEclipseCDT4Generator() : cmExternalMakefileProjectGenerator() +{ +//#if defined(_WIN32) +// this->SupportedGlobalGenerators.push_back("NMake Makefiles"); +// this->SupportedGlobalGenerators.push_back("MSYS Makefiles"); +// this->SupportedGlobalGenerators.push_back("MinGW Makefiles"); +//#endif + this->SupportedGlobalGenerators.push_back("Unix Makefiles"); +} + +//---------------------------------------------------------------------------- +void cmExtraEclipseCDT4Generator +::GetDocumentation(cmDocumentationEntry& entry, const char*) const +{ + entry.name = this->GetName(); + entry.brief = "Generates Eclipse CDT 4.0 project files."; + entry.full = + "Project files for Eclipse will be created in the top directory " + "and will have a linked resource to every subdirectory which " + "features a CMakeLists.txt file containing a PROJECT() call." + "Additionally a hierarchy of makefiles is generated into the " + "build tree. The appropriate make program can build the project through " + "the default make target. A \"make install\" target is also provided."; +} + +//---------------------------------------------------------------------------- +void cmExtraEclipseCDT4Generator +::SetGlobalGenerator(cmGlobalGenerator* generator) +{ + cmExternalMakefileProjectGenerator::SetGlobalGenerator(generator); + cmGlobalUnixMakefileGenerator3* mf + = static_cast<cmGlobalUnixMakefileGenerator3*>(generator); + mf->SetToolSupportsColor(false); + mf->SetForceVerboseMakefiles(true); + mf->EnableInstallTarget(); +} + +//---------------------------------------------------------------------------- +void cmExtraEclipseCDT4Generator::Generate() +{ + // create a .project file + this->CreateProjectFile(); + + // create a .cproject file + this->CreateCProjectFile(); +} + +//---------------------------------------------------------------------------- +void cmExtraEclipseCDT4Generator::CreateProjectFile() const +{ + const cmMakefile* mf + = this->GlobalGenerator->GetLocalGenerators()[0]->GetMakefile(); + + std::string filename = mf->GetStartOutputDirectory(); + filename = filename + "/" + ".project"; + + cmGeneratedFileStream fout(filename.c_str()); + if (!fout) + { + return; + } + + fout << + "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<projectDescription>\n" + "\t<name>" << mf->GetProjectName() << "</name>\n" + "\t<comment></comment>\n" + "\t<projects>\n" + "\t</projects>\n" + "\t<buildSpec>\n" + "\t\t<buildCommand>\n" + "\t\t\t<name>org.eclipse.cdt.make.core.makeBuilder</name>\n" + "\t\t\t<triggers>clean,full,incremental,</triggers>\n" + "\t\t\t<arguments>\n" + ; + + // use clean target... + fout << + "\t\t\t\t<dictionary>\n" + "\t\t\t\t\t<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>\n" + "\t\t\t\t\t<value>clean</value>\n" + "\t\t\t\t</dictionary>\n" + "\t\t\t\t<dictionary>\n" + "\t\t\t\t\t<key>org.eclipse.cdt.make.core.enableCleanBuild</key>\n" + "\t\t\t\t\t<value>true</value>\n" + "\t\t\t\t</dictionary>\n" + "\t\t\t\t<dictionary>\n" + "\t\t\t\t\t<key>org.eclipse.cdt.make.core.append_environment</key>\n" + "\t\t\t\t\t<value>true</value>\n" + "\t\t\t\t</dictionary>\n" + "\t\t\t\t<dictionary>\n" + "\t\t\t\t\t<key>org.eclipse.cdt.make.core.stopOnError</key>\n" + "\t\t\t\t\t<value>true</value>\n" + "\t\t\t\t</dictionary>\n" + ; + + // set the make command... + std::string make = mf->GetRequiredDefinition("CMAKE_MAKE_PROGRAM"); + //fout << "\t\t\t\t<dictionary>\n" + // "\t\t\t\t\t<key>org.eclipse.cdt.make.core.buildCommand</key>\n" + // "\t\t\t\t\t<value>" + make + "</value>\n" + // "\t\t\t\t</dictionary>\n" + // ; + fout << + "\t\t\t\t<dictionary>\n" + "\t\t\t\t\t<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>\n" + "\t\t\t\t\t<value>true</value>\n" + "\t\t\t\t</dictionary>\n" + "\t\t\t\t<dictionary>\n" + "\t\t\t\t\t<key>org.eclipse.cdt.make.core.build.command</key>\n" + "\t\t\t\t\t<value>" + make + "</value>\n" + "\t\t\t\t</dictionary>\n" + "\t\t\t\t<dictionary>\n" + "\t\t\t\t\t<key>org.eclipse.cdt.make.core.contents</key>\n" + "\t\t\t\t\t<value>org.eclipse.cdt.make.core.activeConfigSettings</value>\n" + "\t\t\t\t</dictionary>\n" + "\t\t\t\t<dictionary>\n" + "\t\t\t\t\t<key>org.eclipse.cdt.make.core.build.target.inc</key>\n" + "\t\t\t\t\t<value>all</value>\n" + "\t\t\t\t</dictionary>\n" + "\t\t\t\t<dictionary>\n" + "\t\t\t\t\t<key>org.eclipse.cdt.make.core.build.arguments</key>\n" + "\t\t\t\t\t<value></value>\n" + "\t\t\t\t</dictionary>\n" + "\t\t\t\t<dictionary>\n" + "\t\t\t\t\t<key>org.eclipse.cdt.make.core.buildLocation</key>\n" + "\t\t\t\t\t<value>" + << this->GetEclipsePath(mf->GetStartOutputDirectory()) << "</value>\n" + "\t\t\t\t</dictionary>\n" + "\t\t\t\t<dictionary>\n" + "\t\t\t\t\t<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>\n" + "\t\t\t\t\t<value>false</value>\n" + "\t\t\t\t</dictionary>\n" + "\t\t\t\t<dictionary>\n" + "\t\t\t\t\t<key>org.eclipse.cdt.make.core.environment</key>\n" + "\t\t\t\t\t<value></value>\n" + "\t\t\t\t</dictionary>\n" + "\t\t\t\t<dictionary>\n" + "\t\t\t\t\t<key>org.eclipse.cdt.make.core.enableFullBuild</key>\n" + "\t\t\t\t\t<value>true</value>\n" + "\t\t\t\t</dictionary>\n" + "\t\t\t\t<dictionary>\n" + "\t\t\t\t\t<key>org.eclipse.cdt.make.core.build.target.auto</key>\n" + "\t\t\t\t\t<value>all</value>\n" + "\t\t\t\t</dictionary>\n" + "\t\t\t\t<dictionary>\n" + "\t\t\t\t\t<key>org.eclipse.cdt.make.core.enableAutoBuild</key>\n" + "\t\t\t\t\t<value>false</value>\n" + "\t\t\t\t</dictionary>\n" + "\t\t\t\t<dictionary>\n" + "\t\t\t\t\t<key>org.eclipse.cdt.make.core.build.target.clean</key>\n" + "\t\t\t\t\t<value>clean</value>\n" + "\t\t\t\t</dictionary>\n" + "\t\t\t\t<dictionary>\n" + "\t\t\t\t\t<key>org.eclipse.cdt.make.core.fullBuildTarget</key>\n" + "\t\t\t\t\t<value>all</value>\n" + "\t\t\t\t</dictionary>\n" + "\t\t\t\t<dictionary>\n" + "\t\t\t\t\t<key>org.eclipse.cdt.make.core.buildArguments</key>\n" + "\t\t\t\t\t<value></value>\n" + "\t\t\t\t</dictionary>\n" + "\t\t\t\t<dictionary>\n" + "\t\t\t\t\t<key>org.eclipse.cdt.make.core.build.location</key>\n" + "\t\t\t\t\t<value>" + << this->GetEclipsePath(mf->GetStartOutputDirectory()) << "</value>\n" + "\t\t\t\t</dictionary>\n" + "\t\t\t\t<dictionary>\n" + "\t\t\t\t\t<key>org.eclipse.cdt.make.core.autoBuildTarget</key>\n" + "\t\t\t\t\t<value>all</value>\n" + "\t\t\t\t</dictionary>\n" + "\t\t\t\t<dictionary>\n" + "\t\t\t\t\t<key>org.eclipse.cdt.core.errorOutputParser</key>\n" + "\t\t\t\t\t<value>" + "org.eclipse.cdt.core.MakeErrorParser;" + "org.eclipse.cdt.core.GCCErrorParser;" + "org.eclipse.cdt.core.GASErrorParser;" + "org.eclipse.cdt.core.GLDErrorParser;" + // *** "org.eclipse.cdt.core.VCErrorParser;" + "</value>\n" + "\t\t\t\t</dictionary>\n" + "\t\t\t</arguments>\n" + "\t\t</buildCommand>\n" + "\t\t<buildCommand>\n" + "\t\t\t<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>\n" + "\t\t\t<arguments>\n" + "\t\t\t</arguments>\n" + "\t\t</buildCommand>\n" + "\t</buildSpec>\n" + "\t<natures>\n" + // *** ccnature only if it is c++ ??? + "\t\t<nature>org.eclipse.cdt.core.ccnature</nature>\n" + "\t\t<nature>org.eclipse.cdt.make.core.makeNature</nature>\n" + "\t\t<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>\n" + "\t\t<nature>org.eclipse.cdt.core.cnature</nature>\n" + "\t</natures>\n" + "\t<linkedResources>\n" + ; + + // for each sub project create a linked resource to the source dir + for (std::map<cmStdString, std::vector<cmLocalGenerator*> >::const_iterator + it = this->GlobalGenerator->GetProjectMap().begin(); + it != this->GlobalGenerator->GetProjectMap().end(); + ++it) + { + fout << "\t\t<link>\n" + "\t\t\t<name>" << it->first << "</name>\n" + "\t\t\t<type>2</type>\n" + "\t\t\t<location>" + << this->GetEclipsePath( + it->second[0]->GetMakefile()->GetStartDirectory()) + << "</location>\n" + "\t\t</link>\n" + ; + } + + fout << "\t</linkedResources>\n" + "</projectDescription>\n" + ; +} + +//---------------------------------------------------------------------------- +void cmExtraEclipseCDT4Generator::CreateCProjectFile() const +{ + std::set<std::string> emmited; + + const cmMakefile* mf + = this->GlobalGenerator->GetLocalGenerators()[0]->GetMakefile(); + + std::string filename = mf->GetStartOutputDirectory(); + filename = filename + "/" + ".cproject"; + + cmGeneratedFileStream fout(filename.c_str()); + if (!fout) + { + return; + } + + // add header + fout << + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n" + "<?fileVersion 4.0.0?>\n\n" + "<cproject>\n" + "<storageModule moduleId=\"org.eclipse.cdt.core.settings\">\n" + ; + + fout << "<cconfiguration id=\"org.eclipse.cdt.core.default.config.1\">\n"; + + // *** what is this... + fout << + "<storageModule" + " buildSystemId=\"org.eclipse.cdt.core.defaultConfigDataProvider\"" + " id=\"org.eclipse.cdt.core.default.config.1\"" + " moduleId=\"org.eclipse.cdt.core.settings\" name=\"Configuration\">\n" + "<externalSettings/>\n" + "<extensions>\n" + ; + // *** refactor this out... + switch (GetToolChainType(*mf)) + { + case EclipseToolchainLinux : + fout << "<extension id=\"org.eclipse.cdt.core.ELF\"" + " point=\"org.eclipse.cdt.core.BinaryParser\"/>\n" + ; + fout << "<extension id=\"org.eclipse.cdt.core.GNU_ELF\"" + " point=\"org.eclipse.cdt.core.BinaryParser\">\n" + "<attribute key=\"addr2line\" value=\"addr2line\"/>\n" + "<attribute key=\"c++filt\" value=\"c++filt\"/>\n" + "</extension>\n" + ; + break; + case EclipseToolchainCygwin : + fout << "<extension id=\"org.eclipse.cdt.core.Cygwin_PE\"" + " point=\"org.eclipse.cdt.core.BinaryParser\">\n" + "<attribute key=\"addr2line\" value=\"addr2line\"/>\n" + "<attribute key=\"c++filt\" value=\"c++filt\"/>\n" + "<attribute key=\"cygpath\" value=\"cygpath\"/>\n" + "<attribute key=\"nm\" value=\"nm\"/>\n" + "</extension>\n" + ; + break; + case EclipseToolchainMinGW : + fout << "<extension id=\"org.eclipse.cdt.core.PE\"" + " point=\"org.eclipse.cdt.core.BinaryParser\"/>\n" + ; + break; + case EclipseToolchainSolaris : + fout << "<extension id=\"org.eclipse.cdt.core.ELF\"" + " point=\"org.eclipse.cdt.core.BinaryParser\"/>\n" + ; + break; + case EclipseToolchainMacOSX : + fout << "<extension id=\"org.eclipse.cdt.core.MachO\"" + " point=\"org.eclipse.cdt.core.BinaryParser\">\n" + "<attribute key=\"c++filt\" value=\"c++filt\"/>\n" + "</extension>\n" + ; + break; + case EclipseToolchainOther : + fout << "<extension id=\"org.eclipse.cdt.core.PE\"" + " point=\"org.eclipse.cdt.core.BinaryParser\"/>\n" + ; + fout << "<extension id=\"org.eclipse.cdt.core.ELF\"" + " point=\"org.eclipse.cdt.core.BinaryParser\"/>\n" + ; + break; + default : + // *** Should never get here *** + fout << "<error_toolchain_type/>\n"; + } + fout << "</extensions>\n" + "</storageModule>\n" + ; + + // ??? + fout << + "<storageModule moduleId=\"org.eclipse.cdt.core.language.mapping\">\n" + "<project-mappings/>\n" + "</storageModule>\n" + ; + + // ??? + fout<<"<storageModule moduleId=\"org.eclipse.cdt.core.externalSettings\"/>\n" + ; + + // set the path entries (includes, libs, source dirs, etc.) + fout << "<storageModule moduleId=\"org.eclipse.cdt.core.pathentry\">\n" + ; + // for each sub project with a linked resource to the source dir: + // - make it type 'src' + // - and exclude it from type 'out' + std::string exclude_from_out; + for (std::map<cmStdString, std::vector<cmLocalGenerator*> >::const_iterator + it = this->GlobalGenerator->GetProjectMap().begin(); + it != this->GlobalGenerator->GetProjectMap().end(); + ++it) + { + fout << "<pathentry kind=\"src\" path=\"" << it->first << "\"/>\n" + ; + exclude_from_out += it->first + "/,"; + } + exclude_from_out.resize(exclude_from_out.size()-1); + fout << "<pathentry excluding=\"" << exclude_from_out + << "\" kind=\"out\" path=\"\"/>\n" + ; + // include dirs + emmited.clear(); + for (std::vector<cmLocalGenerator*>::const_iterator + it = this->GlobalGenerator->GetLocalGenerators().begin(); + it != this->GlobalGenerator->GetLocalGenerators().end(); + ++it) + { + const std::vector<std::string>& includeDirs + = (*it)->GetMakefile()->GetIncludeDirectories(); + for(std::vector<std::string>::const_iterator inc = includeDirs.begin(); + inc != includeDirs.end(); + ++inc) + { + if(emmited.find(*inc) == emmited.end()) + { + emmited.insert(*inc); + fout << "<pathentry include=\"" << this->GetEclipsePath(*inc) + << "\" kind=\"inc\" path=\"\" system=\"true\"/>\n"; + } + } + } + fout << "</storageModule>\n" + ; + + // add build targets + fout << + "<storageModule moduleId=\"org.eclipse.cdt.make.core.buildtargets\">\n" + "<buildTargets>\n" + ; + emmited.clear(); + for (std::vector<cmLocalGenerator*>::const_iterator + it = this->GlobalGenerator->GetLocalGenerators().begin(); + it != this->GlobalGenerator->GetLocalGenerators().end(); + ++it) + { + const cmTargets& targets = (*it)->GetMakefile()->GetTargets(); + for(cmTargets::const_iterator t = targets.begin(); t != targets.end(); ++t) + { + if(emmited.find(t->first) == emmited.end()) + { + emmited.insert(t->first); + this->AppendTarget(fout, t->first); + } + } + } + fout << "</buildTargets>\n" + "</storageModule>\n" + ; + + this->AppendStorageScanners(fout, *mf); + + fout << "</cconfiguration>\n" + "</storageModule>\n" + "<storageModule moduleId=\"cdtBuildSystem\" version=\"4.0.0\">\n" + "<project id=\"" << mf->GetProjectName() << ".null.1\"" + " name=\"" << mf->GetProjectName() << "\"/>\n" + "</storageModule>\n" + "</cproject>\n" + ; +} + +//---------------------------------------------------------------------------- +cmExtraEclipseCDT4Generator::EclipseToolchainType +cmExtraEclipseCDT4Generator::GetToolChainType(const cmMakefile& makefile) const +{ + if (makefile.IsSet("UNIX")) + { + if (makefile.IsSet("CYGWIN")) + { + return EclipseToolchainCygwin; + } + if (makefile.IsSet("APPLE" )) + { + return EclipseToolchainMacOSX; + } + // *** how do I determine if it is Solaris ??? + return EclipseToolchainLinux; + } + else if (makefile.IsSet("WIN32")) + { + if (makefile.IsSet("MINGW")) + { + return EclipseToolchainMinGW; + } + if (makefile.IsSet("MSYS" )) + { + return EclipseToolchainMinGW; + } + return EclipseToolchainOther; + } + else + { + return EclipseToolchainOther; + } +} + +std::string +cmExtraEclipseCDT4Generator::GetEclipsePath(const std::string& path) const +{ +#if defined(__CYGWIN__) + std::string cmd = "cygpath -w " + path; + std::string out; + if (!cmSystemTools::RunCommand(cmd.c_str(), out, 0, false)) + { + return path; + } + else + { + out.erase(out.find_last_of('\n')); + return out; + } +#else + return path; +#endif +} + +//---------------------------------------------------------------------------- +// Helper functions +//---------------------------------------------------------------------------- +void cmExtraEclipseCDT4Generator +::AppendStorageScanners(cmGeneratedFileStream& fout, + const cmMakefile& makefile) const +{ + fout << + "<storageModule moduleId=\"scannerConfiguration\">\n" + "<autodiscovery enabled=\"true\" problemReportingEnabled=\"true\"" + " selectedProfileId=\"org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile\"/>\n" + ; + this->AppendScannerProfile(fout, + "org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile", + true, "", true, "specsFile", + "-E -P -v -dD ${plugin_state_location}/${specs_file}", + "gcc", true, true); + this->AppendScannerProfile(fout, + "org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile", + true, "", true, "makefileGenerator", + "-f ${project_name}_scd.mk", + "make", true, true); + this->AppendScannerProfile(fout, + "org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile", + false, "", false, "specsFile", + "-E -P -v -dD ${plugin_state_location}/${specs_file}", + "gcc", true, true); + this->AppendScannerProfile(fout, + "org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP", + false, "", false, "specsFile", + "-E -P -v -dD ${plugin_state_location}/specs.cpp", + "g++", true, true); + this->AppendScannerProfile(fout, + "org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC", + false, "", false, "specsFile", + "-E -P -v -dD ${plugin_state_location}/specs.c", + "gcc", true, true); + this->AppendScannerProfile(fout, + "org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile", + false, "", false, "specsFile", + "-E -P -v -dD ${plugin_state_location}/${specs_file}", + "gcc", true, true); + this->AppendScannerProfile(fout, + "org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP", + false, "", false, "specsFile", + "-E -P -v -dD ${plugin_state_location}/specs.cpp", + "g++", true, true); + this->AppendScannerProfile(fout, + "org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC", + false, "", false, "specsFile", + "-E -P -v -dD ${plugin_state_location}/specs.c", + "gcc", true, true); + +/* + // *** this needs to be conditional on platform ??? + fout << "<scannerConfigBuildInfo instanceId=\"" + "cdt.managedbuild.toolchain.gnu.cygwin.base.1;" + "cdt.managedbuild.toolchain.gnu.cygwin.base.1.1;" + "cdt.managedbuild.tool.gnu.cpp.compiler.cygwin.base.1;" + "cdt.managedbuild.tool.gnu.cpp.compiler.input.cygwin.1\">\n" + "<autodiscovery enabled=\"true\" problemReportingEnabled=\"true\"" + " selectedProfileId=\"" + "org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP\"/>\n" + ; + + AppendScannerProfile(fout, + "org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile", + true, "", true, "specsFile", + "-E -P -v -dD ${plugin_state_location}/${specs_file}", + "gcc", true, true); + AppendScannerProfile(fout, + "org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile", + true, "", true, "makefileGenerator", + "-f ${project_name}_scd.mk", + "make", true, true); + AppendScannerProfile(fout, + "org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile", + true, "", false, "specsFile", + "-E -P -v -dD ${plugin_state_location}/${specs_file}", + "gcc", true, true); + AppendScannerProfile(fout, + "org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP", + true, "", false, "specsFile", + "-E -P -v -dD ${plugin_state_location}/specs.cpp", + "g++", true, true); + AppendScannerProfile(fout, + "org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC", + true, "", false, "specsFile", + "-E -P -v -dD ${plugin_state_location}/specs.c", + "gcc", true, true); + AppendScannerProfile(fout, + "org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile", + true, "", false, "specsFile", + "-E -P -v -dD ${plugin_state_location}/${specs_file}", + "gcc", true, true); + AppendScannerProfile(fout, + "org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP", + true, "", false, "specsFile", + "-E -P -v -dD ${plugin_state_location}/specs.cpp", + "g++", true, true); + AppendScannerProfile(fout, + "org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC", + true, "", false, "specsFile", + "-E -P -v -dD ${plugin_state_location}/specs.c", + "gcc", true, true); + + // *** this needs to be conditional on platform ??? + fout << "</scannerConfigBuildInfo>\n" + "<scannerConfigBuildInfo instanceId=\"" + "cdt.managedbuild.toolchain.gnu.cygwin.base.1;" + "cdt.managedbuild.toolchain.gnu.cygwin.base.1.1;" + "cdt.managedbuild.tool.gnu.c.compiler.cygwin.base.1;" + "cdt.managedbuild.tool.gnu.c.compiler.input.cygwin.1\">\n" + "<autodiscovery enabled=\"true\" problemReportingEnabled=\"true\"" + " selectedProfileId=\"" + "org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC\"/>\n" + ; + + AppendScannerProfile(fout, + "org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile", + true, "", true, "specsFile", + "-E -P -v -dD ${plugin_state_location}/${specs_file}", + "gcc", true, true); + AppendScannerProfile(fout, + "org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile", + true, "", true, "makefileGenerator", + "-f ${project_name}_scd.mk", + "make", true, true); + AppendScannerProfile(fout, + "org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile", + false, "", false, "specsFile", + "-E -P -v -dD ${plugin_state_location}/${specs_file}", + "gcc", true, true); + AppendScannerProfile(fout, + "org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP", + false, "", false, "specsFile", + "-E -P -v -dD ${plugin_state_location}/specs.cpp", + "g++", true, true); + AppendScannerProfile(fout, + "org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC", + false, "", false, "specsFile", + "-E -P -v -dD ${plugin_state_location}/specs.c", + "gcc", true, true); + AppendScannerProfile(fout, + "org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile", + false, "", false, "specsFile", + "-E -P -v -dD ${plugin_state_location}/${specs_file}", + "gcc", true, true); + AppendScannerProfile(fout, + "org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP", + false, "", false, "specsFile", + "-E -P -v -dD ${plugin_state_location}/specs.cpp", + "g++", true, true); + AppendScannerProfile(fout, + "org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC", + false, "", false, "specsFile", + "-E -P -v -dD ${plugin_state_location}/specs.c", + "gcc", true, true); + + fout << "</scannerConfigBuildInfo>\n" + ; +*/ + + fout << "</storageModule>\n" + ; +} + +void cmExtraEclipseCDT4Generator +::AppendTarget(cmGeneratedFileStream& fout, + const std::string& target) const +{ + const cmMakefile& mf + = *(this->GlobalGenerator->GetLocalGenerators()[0]->GetMakefile()); + std::string make = mf.GetRequiredDefinition("CMAKE_MAKE_PROGRAM"); + + fout << + "<target name=\"" << target << "\"" + " path=\"\"" + " targetID=\"org.eclipse.cdt.make.MakeTargetBuilder\">\n" + "<buildCommand>" << make << "</buildCommand>\n" + "<buildArguments/>\n" + "<buildTarget>" << target << "</buildTarget>\n" + "<stopOnError>true</stopOnError>\n" + "<useDefaultCommand>false</useDefaultCommand>\n" + "</target>\n" + ; +} + +void cmExtraEclipseCDT4Generator +::AppendScannerProfile(cmGeneratedFileStream& fout, + const std::string& profileID, + bool openActionEnabled, + const std::string& openActionFilePath, + bool pParserEnabled, + const std::string& scannerInfoProviderID, + const std::string& runActionArguments, + const std::string& runActionCommand, + bool runActionUseDefault, + bool sipParserEnabled) const +{ + fout << + "<profile id=\"" << profileID << "\">\n" + "<buildOutputProvider>\n" + "<openAction enabled=\"" << (openActionEnabled ? "true" : "false") + << "\" filePath=\"" << openActionFilePath << "\"/>\n" + "<parser enabled=\"" << (pParserEnabled ? "true" : "false") << "\"/>\n" + "</buildOutputProvider>\n" + "<scannerInfoProvider id=\"" << scannerInfoProviderID << "\">\n" + "<runAction arguments=\"" << runActionArguments << "\"" + " command=\"" << runActionCommand + << "\" useDefault=\"" << (runActionUseDefault ? "true":"false") << "\"/>\n" + "<parser enabled=\"" << (sipParserEnabled ? "true" : "false") << "\"/>\n" + "</scannerInfoProvider>\n" + "</profile>\n" + ; +} diff --git a/Source/cmExtraEclipseCDT4Generator.h b/Source/cmExtraEclipseCDT4Generator.h new file mode 100644 index 0000000..17fd10d --- /dev/null +++ b/Source/cmExtraEclipseCDT4Generator.h @@ -0,0 +1,93 @@ +/*========================================================================= + + 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. + Copyright (c) 2007 Miguel A. Figueroa-Villanueva. 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 cmExtraEclipseCDT4Generator_h +#define cmExtraEclipseCDT4Generator_h + +#include "cmExternalMakefileProjectGenerator.h" + +class cmMakefile; +class cmGeneratedFileStream; + +/** \class cmExtraEclipseCDT4Generator + * \brief Write Eclipse project files for Makefile based projects + * + * This generator is in early alpha stage. + */ +class cmExtraEclipseCDT4Generator : public cmExternalMakefileProjectGenerator +{ +public: + cmExtraEclipseCDT4Generator(); + + static cmExternalMakefileProjectGenerator* New() { + return new cmExtraEclipseCDT4Generator; + } + + virtual const char* GetName() const { + return cmExtraEclipseCDT4Generator::GetActualName(); + } + + static const char* GetActualName() { return "Eclipse CDT4"; } + + virtual void GetDocumentation(cmDocumentationEntry& entry, + const char* fullName) const; + + virtual void SetGlobalGenerator(cmGlobalGenerator* generator); + + virtual void Generate(); + +private: + // create .project file + void CreateProjectFile() const; + + // create .cproject file + void CreateCProjectFile() const; + + // Eclipse supported toolchain types + enum EclipseToolchainType + { + EclipseToolchainOther, + EclipseToolchainLinux, + EclipseToolchainCygwin, + EclipseToolchainMinGW, + EclipseToolchainSolaris, + EclipseToolchainMacOSX + }; + EclipseToolchainType GetToolChainType(const cmMakefile& makefile) const; + + // If built with cygwin cmake, convert posix to windows path. + std::string GetEclipsePath(const std::string& path) const; + + // Helper functions + void AppendStorageScanners(cmGeneratedFileStream& fout, + const cmMakefile& makefile) const; + void AppendTarget (cmGeneratedFileStream& fout, + const std::string& target) const; + void AppendScannerProfile (cmGeneratedFileStream& fout, + const std::string& profileID, + bool openActionEnabled, + const std::string& openActionFilePath, + bool pParserEnabled, + const std::string& scannerInfoProviderID, + const std::string& runActionArguments, + const std::string& runActionCommand, + bool runActionUseDefault, + bool sipParserEnabled) const; +}; + +#endif diff --git a/Source/cmake.cxx b/Source/cmake.cxx index ea1e8b7..85a1127 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -47,6 +47,10 @@ # endif #endif +#if defined(CMAKE_BUILD_WITH_CMAKE) +# define CMAKE_USE_ECLIPSE +#endif + #if defined(__MINGW32__) && !defined(CMAKE_BUILD_WITH_CMAKE) # define CMAKE_BOOT_MINGW #endif @@ -78,6 +82,10 @@ # include "cmGlobalKdevelopGenerator.h" #endif +#ifdef CMAKE_USE_ECLIPSE +# include "cmExtraEclipseCDT4Generator.h" +#endif + #include <stdlib.h> // required for atoi #if defined( __APPLE__ ) @@ -1523,6 +1531,11 @@ void cmake::AddDefaultExtraGenerators() &cmExtraCodeBlocksGenerator::New); #endif +#ifdef CMAKE_USE_ECLIPSE + this->AddExtraGenerator(cmExtraEclipseCDT4Generator::GetActualName(), + &cmExtraEclipseCDT4Generator::New); +#endif + #ifdef CMAKE_USE_KDEVELOP this->AddExtraGenerator(cmGlobalKdevelopGenerator::GetActualName(), &cmGlobalKdevelopGenerator::New); |