浏览代码

Merge topic 'DetectEclipseVersion'

dcd2459 Eclipse: better message when Eclipse version could not be determined
b4b2fc3 Eclipse: don't create VirtualFolders if not supported
5b200e3 Detect whether the current Eclipse version supports VirtualFolders
4974ec9 Eclipse generator: detect Eclipse version
David Cole 14 年之前
父节点
当前提交
049d2bc77d
共有 3 个文件被更改,包括 82 次插入21 次删除
  1. 37 0
      Modules/CMakeFindEclipseCDT4.cmake
  2. 44 21
      Source/cmExtraEclipseCDT4Generator.cxx
  3. 1 0
      Source/cmExtraEclipseCDT4Generator.h

+ 37 - 0
Modules/CMakeFindEclipseCDT4.cmake

@@ -17,6 +17,43 @@
 
 FIND_PROGRAM(CMAKE_ECLIPSE_EXECUTABLE NAMES eclipse DOC "The Eclipse executable")
 
+FUNCTION(_FIND_ECLIPSE_VERSION)
+  # This code is in a function so the variables used here have only local scope
+  IF(CMAKE_ECLIPSE_EXECUTABLE)
+    GET_FILENAME_COMPONENT(_ECLIPSE_DIR "${CMAKE_ECLIPSE_EXECUTABLE}" PATH)
+    FILE(GLOB _ECLIPSE_FEATURE_DIR "${_ECLIPSE_DIR}/features/org.eclipse.platform*")
+    IF("${_ECLIPSE_FEATURE_DIR}" MATCHES ".+org.eclipse.platform_([0-9]+\\.[0-9]+).+")
+      SET(_ECLIPSE_VERSION ${CMAKE_MATCH_1})
+    ENDIF()
+  ENDIF()
+
+  # Set up a map with the names of the Eclipse releases:
+  SET(_ECLIPSE_VERSION_NAME_    "Unknown" )
+  SET(_ECLIPSE_VERSION_NAME_3.2 "Callisto" )
+  SET(_ECLIPSE_VERSION_NAME_3.3 "Europa" )
+  SET(_ECLIPSE_VERSION_NAME_3.4 "Ganymede" )
+  SET(_ECLIPSE_VERSION_NAME_3.5 "Galileo" )
+  SET(_ECLIPSE_VERSION_NAME_3.6 "Helios" )
+  SET(_ECLIPSE_VERSION_NAME_3.7 "Indigo" )
+
+  IF(_ECLIPSE_VERSION)
+    MESSAGE(STATUS "Found Eclipse version ${_ECLIPSE_VERSION} (${_ECLIPSE_VERSION_NAME_${_ECLIPSE_VERSION}})")
+  ELSE()
+    SET(_ECLIPSE_VERSION "3.6" )
+    MESSAGE(STATUS "Could not determine Eclipse version, assuming at least ${_ECLIPSE_VERSION} (${_ECLIPSE_VERSION_NAME_${_ECLIPSE_VERSION}}). Adjust CMAKE_ECLIPSE_VERSION if this is wrong.")
+  ENDIF()
+
+  SET(CMAKE_ECLIPSE_VERSION "${_ECLIPSE_VERSION} (${_ECLIPSE_VERSION_NAME_${_ECLIPSE_VERSION}})" CACHE STRING "The version of Eclipse. If Eclipse has not been found, 3.6 (Helios) is assumed.")
+  SET_PROPERTY(CACHE CMAKE_ECLIPSE_VERSION PROPERTY STRINGS "3.2 (${_ECLIPSE_VERSION_NAME_3.2})"
+                                                            "3.3 (${_ECLIPSE_VERSION_NAME_3.3})"
+                                                            "3.4 (${_ECLIPSE_VERSION_NAME_3.4})"
+                                                            "3.5 (${_ECLIPSE_VERSION_NAME_3.5})"
+                                                            "3.6 (${_ECLIPSE_VERSION_NAME_3.6})"
+                                                            "3.7 (${_ECLIPSE_VERSION_NAME_3.7})")
+ENDFUNCTION()
+
+_FIND_ECLIPSE_VERSION()
+
 # This variable is used by the Eclipse generator and appended to the make invocation commands.
 SET(CMAKE_ECLIPSE_MAKE_ARGUMENTS "" CACHE STRING "Additional command line arguments when Eclipse invokes make. Enter e.g. -j<some_number> to get parallel builds")
 

+ 44 - 21
Source/cmExtraEclipseCDT4Generator.cxx

@@ -34,6 +34,8 @@ cmExtraEclipseCDT4Generator
 //  this->SupportedGlobalGenerators.push_back("MSYS Makefiles");
 #endif
   this->SupportedGlobalGenerators.push_back("Unix Makefiles");
+
+  this->SupportsVirtualFolders = true;
 }
 
 //----------------------------------------------------------------------------
@@ -57,6 +59,24 @@ void cmExtraEclipseCDT4Generator::Generate()
   const cmMakefile* mf
     = this->GlobalGenerator->GetLocalGenerators()[0]->GetMakefile();
 
+  std::string eclipseVersion = mf->GetSafeDefinition("CMAKE_ECLIPSE_VERSION");
+  cmsys::RegularExpression regex(".*([0-9]+\\.[0-9]+).*");
+  if (regex.find(eclipseVersion.c_str()))
+    {
+    unsigned int majorVersion = 0;
+    unsigned int minorVersion = 0;
+    int res=sscanf(regex.match(1).c_str(), "%u.%u", &majorVersion,
+                                                    &minorVersion);
+    if (res == 2)
+      {
+      int version = majorVersion * 1000 + minorVersion;
+      if (version < 3006) // 3.6 is Helios
+        {
+        this->SupportsVirtualFolders = false;
+        }
+      }
+    }
+
   // TODO: Decide if these are local or member variables
   this->HomeDirectory       = mf->GetHomeDirectory();
   this->HomeOutputDirectory = mf->GetHomeOutputDirectory();
@@ -400,29 +420,32 @@ void cmExtraEclipseCDT4Generator::CreateProjectFile()
 
     }
 
-  // for each sub project create a linked resource to the source dir
-  // - only if it is an out-of-source build
-  this->AppendLinkedResource(fout, "[Subprojects]",
-                             "virtual:/virtual", true);
-
-  for (std::map<cmStdString, std::vector<cmLocalGenerator*> >::const_iterator
-       it = this->GlobalGenerator->GetProjectMap().begin();
-       it != this->GlobalGenerator->GetProjectMap().end();
-       ++it)
+  if (this->SupportsVirtualFolders)
     {
-    std::string linkSourceDirectory = this->GetEclipsePath(
-                            it->second[0]->GetMakefile()->GetStartDirectory());
-    // a linked resource must not point to a parent directory of .project or
-    // .project itself
-    if ((this->HomeOutputDirectory != linkSourceDirectory) &&
-        !cmSystemTools::IsSubDirectory(this->HomeOutputDirectory.c_str(),
-                                       linkSourceDirectory.c_str()))
+    // for each sub project create a linked resource to the source dir
+    // - only if it is an out-of-source build
+    this->AppendLinkedResource(fout, "[Subprojects]",
+                               "virtual:/virtual", true);
+
+    for (std::map<cmStdString, std::vector<cmLocalGenerator*> >::const_iterator
+         it = this->GlobalGenerator->GetProjectMap().begin();
+         it != this->GlobalGenerator->GetProjectMap().end();
+         ++it)
       {
-      std::string linkName = "[Subprojects]/";
-      linkName += it->first;
-      this->AppendLinkedResource(fout, linkName,
-                                 this->GetEclipsePath(linkSourceDirectory));
-      this->SrcLinkedResources.push_back(it->first);
+      std::string linkSourceDirectory = this->GetEclipsePath(
+                            it->second[0]->GetMakefile()->GetStartDirectory());
+      // a linked resource must not point to a parent directory of .project or
+      // .project itself
+      if ((this->HomeOutputDirectory != linkSourceDirectory) &&
+          !cmSystemTools::IsSubDirectory(this->HomeOutputDirectory.c_str(),
+                                         linkSourceDirectory.c_str()))
+        {
+        std::string linkName = "[Subprojects]/";
+        linkName += it->first;
+        this->AppendLinkedResource(fout, linkName,
+                                   this->GetEclipsePath(linkSourceDirectory));
+        this->SrcLinkedResources.push_back(it->first);
+        }
       }
     }
 

+ 1 - 0
Source/cmExtraEclipseCDT4Generator.h

@@ -107,6 +107,7 @@ private:
   std::string HomeOutputDirectory;
   bool IsOutOfSourceBuild;
   bool GenerateSourceProject;
+  bool SupportsVirtualFolders;
 
 };