summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Neundorf <neundorf@kde.org>2009-09-16 18:37:21 (GMT)
committerAlexander Neundorf <neundorf@kde.org>2009-09-16 18:37:21 (GMT)
commit9d967ed47b69669e6eb4996ab3e76f5a6151464d (patch)
tree01940929d69d76e66ef15ae3cd883800643af210
parent72f524efc18ce1d3b488ba544e21554ffd6d61c3 (diff)
downloadCMake-9d967ed47b69669e6eb4996ab3e76f5a6151464d.zip
CMake-9d967ed47b69669e6eb4996ab3e76f5a6151464d.tar.gz
CMake-9d967ed47b69669e6eb4996ab3e76f5a6151464d.tar.bz2
Put compiler defined macros into eclipse project files
Now gcc is queried also for the builtin definitions, and they are then added to the .cproject file. This should make the preprocessor highlighting in eclipse work better (#9272) Patch mostly from Miguel. Alex
-rw-r--r--Modules/CMakeFindEclipseCDT4.cmake25
-rw-r--r--Source/cmExtraEclipseCDT4Generator.cxx69
2 files changed, 89 insertions, 5 deletions
diff --git a/Modules/CMakeFindEclipseCDT4.cmake b/Modules/CMakeFindEclipseCDT4.cmake
index e7444bc..400e583 100644
--- a/Modules/CMakeFindEclipseCDT4.cmake
+++ b/Modules/CMakeFindEclipseCDT4.cmake
@@ -8,14 +8,14 @@ FIND_PROGRAM(CMAKE_ECLIPSE_EXECUTABLE NAMES eclipse DOC "The Eclipse executable"
# so that Eclipse ca find the headers at runtime and parsing etc. works better
# This is done here by actually running gcc with the options so it prints its
# system include directories, which are parsed then and stored in the cache.
-MACRO(_DETERMINE_GCC_SYSTEM_INCLUDE_DIRS _lang _result)
+MACRO(_DETERMINE_GCC_SYSTEM_INCLUDE_DIRS _lang _result _resultDefines)
SET(${_result})
SET(_gccOutput)
FILE(WRITE "${CMAKE_BINARY_DIR}/CMakeFiles/dummy" "\n" )
- EXECUTE_PROCESS(COMMAND ${CMAKE_C_COMPILER} -v -E -x ${_lang} dummy
+ EXECUTE_PROCESS(COMMAND ${CMAKE_C_COMPILER} -v -E -x ${_lang} -dD dummy
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/CMakeFiles
ERROR_VARIABLE _gccOutput
- OUTPUT_QUIET )
+ OUTPUT_VARIABLE _gccStdout )
FILE(REMOVE "${CMAKE_BINARY_DIR}/CMakeFiles/dummy")
IF( "${_gccOutput}" MATCHES "> search starts here[^\n]+\n *(.+) *\n *End of (search) list" )
@@ -23,6 +23,19 @@ MACRO(_DETERMINE_GCC_SYSTEM_INCLUDE_DIRS _lang _result)
STRING(REPLACE "\n" " " ${_result} "${${_result}}")
SEPARATE_ARGUMENTS(${_result})
ENDIF( "${_gccOutput}" MATCHES "> search starts here[^\n]+\n *(.+) *\n *End of (search) list" )
+
+ IF( "${_gccStdout}" MATCHES "built-in>\"\n(.+)# 1 +\"dummy\"" )
+ SET(_builtinDefines ${CMAKE_MATCH_1})
+ # Remove the '# 1 "<command-line>"' lines
+ STRING(REGEX REPLACE "# 1[^\n]+\n" "" _filteredOutput "${_builtinDefines}")
+ # Remove the "#define " parts from the output:
+ STRING(REGEX REPLACE "#define " "" _defineRemoved "${_filteredOutput}")
+ # Replace the line breaks with spaces, so we can use separate arguments afterwards
+ STRING(REGEX REPLACE "\n" " " _defineRemoved "${_defineRemoved}")
+ # Remove space at the end, this would produce empty list items
+ STRING(REGEX REPLACE " +$" "" ${_resultDefines} "${_defineRemoved}")
+ SEPARATE_ARGUMENTS(${_resultDefines})
+ ENDIF( "${_gccStdout}" MATCHES "built-in>\"\n(.+)# 1 +\"dummy\"" )
ENDMACRO(_DETERMINE_GCC_SYSTEM_INCLUDE_DIRS _lang)
# Save the current LC_ALL, LC_MESSAGES, and LANG environment variables and set them
@@ -42,14 +55,16 @@ ENDIF(_orig_lang)
# Now check for C
IF ("${CMAKE_C_COMPILER_ID}" MATCHES GNU AND NOT CMAKE_ECLIPSE_C_SYSTEM_INCLUDE_DIRS)
- _DETERMINE_GCC_SYSTEM_INCLUDE_DIRS(c _dirs)
+ _DETERMINE_GCC_SYSTEM_INCLUDE_DIRS(c _dirs _defines)
SET(CMAKE_ECLIPSE_C_SYSTEM_INCLUDE_DIRS "${_dirs}" CACHE INTERNAL "C compiler system include directories")
+ SET(CMAKE_ECLIPSE_C_SYSTEM_DEFINED_MACROS "${_defines}" CACHE INTERNAL "C compiler system defined macros")
ENDIF ("${CMAKE_C_COMPILER_ID}" MATCHES GNU AND NOT CMAKE_ECLIPSE_C_SYSTEM_INCLUDE_DIRS)
# And now the same for C++
IF ("${CMAKE_CXX_COMPILER_ID}" MATCHES GNU AND NOT CMAKE_ECLIPSE_CXX_SYSTEM_INCLUDE_DIRS)
- _DETERMINE_GCC_SYSTEM_INCLUDE_DIRS(c++ _dirs)
+ _DETERMINE_GCC_SYSTEM_INCLUDE_DIRS(c++ _dirs _defines)
SET(CMAKE_ECLIPSE_CXX_SYSTEM_INCLUDE_DIRS "${_dirs}" CACHE INTERNAL "CXX compiler system include directories")
+ SET(CMAKE_ECLIPSE_CXX_SYSTEM_DEFINED_MACROS "${_defines}" CACHE INTERNAL "CXX compiler system defined macros")
ENDIF ("${CMAKE_CXX_COMPILER_ID}" MATCHES GNU AND NOT CMAKE_ECLIPSE_CXX_SYSTEM_INCLUDE_DIRS)
# Restore original LC_ALL, LC_MESSAGES, and LANG
diff --git a/Source/cmExtraEclipseCDT4Generator.cxx b/Source/cmExtraEclipseCDT4Generator.cxx
index a21df66..b7daab6 100644
--- a/Source/cmExtraEclipseCDT4Generator.cxx
+++ b/Source/cmExtraEclipseCDT4Generator.cxx
@@ -574,6 +574,75 @@ void cmExtraEclipseCDT4Generator::CreateCProjectFile() const
}
}
}
+ // add system defined c macros
+ const char* cDefs=mf->GetDefinition("CMAKE_ECLIPSE_C_SYSTEM_DEFINED_MACROS");
+ if(cDefs)
+ {
+ // Expand the list.
+ std::vector<std::string> defs;
+ cmSystemTools::ExpandListArgument(cDefs, defs, true);
+
+ // the list must contain only definition-value pairs:
+ if ((defs.size() % 2) == 0)
+ {
+ std::vector<std::string>::const_iterator di = defs.begin();
+ while (di != defs.end())
+ {
+ std::string def = *di;
+ ++di;
+ std::string val;
+ if (di != defs.end())
+ {
+ val = *di;
+ ++di;
+ }
+
+ // insert the definition if not already added.
+ if(emmited.find(def) == emmited.end())
+ {
+ emmited.insert(def);
+ fout << "<pathentry kind=\"mac\" name=\"" << def
+ << "\" path=\"\" value=\"" << this->EscapeForXML(val)
+ << "\"/>\n";
+ }
+ }
+ }
+ }
+ // add system defined c++ macros
+ const char* cxxDefs = mf->GetDefinition(
+ "CMAKE_ECLIPSE_CXX_SYSTEM_DEFINED_MACROS");
+ if(cxxDefs)
+ {
+ // Expand the list.
+ std::vector<std::string> defs;
+ cmSystemTools::ExpandListArgument(cxxDefs, defs, true);
+
+ // the list must contain only definition-value pairs:
+ if ((defs.size() % 2) == 0)
+ {
+ std::vector<std::string>::const_iterator di = defs.begin();
+ while (di != defs.end())
+ {
+ std::string def = *di;
+ ++di;
+ std::string val;
+ if (di != defs.end())
+ {
+ val = *di;
+ ++di;
+ }
+
+ // insert the definition if not already added.
+ if(emmited.find(def) == emmited.end())
+ {
+ emmited.insert(def);
+ fout << "<pathentry kind=\"mac\" name=\"" << def
+ << "\" path=\"\" value=\"" << this->EscapeForXML(val)
+ << "\"/>\n";
+ }
+ }
+ }
+ }
// include dirs
emmited.clear();