From 018083ee12e9bc7bfa18491d3a592a18bc50ee1e Mon Sep 17 00:00:00 2001
From: Daniel Teske <daniel.teske@digia.com>
Date: Mon, 11 Mar 2013 17:15:54 +0100
Subject: [PATCH] CMake: Fix parsing of C++ defines

Partially revert 20cfccd7533fb68cc9759c015a2b6573d167581c that somehow
assumed that compiler flags would also include the defines.

See comment on
Task-number: QTCREATORBUG-3922

Change-Id: Ic7cb9dfa33f53fde9302f38018102c15cb12f83d
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
---
 .../cmakeprojectmanager/cmakeproject.cpp       | 18 +++++++++++++++++-
 src/plugins/cmakeprojectmanager/cmakeproject.h |  2 ++
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
index be9ce97c486..310a0ff8f79 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
@@ -353,6 +353,7 @@ bool CMakeProject::parseCMakeLists()
 
     QByteArray allDefines;
     allDefines.append(tc->predefinedMacros(cxxflags));
+    allDefines.append(cbpparser.defines());
 
     QStringList allFrameworkPaths;
     QList<ProjectExplorer::HeaderPath> allHeaderPaths;
@@ -1215,8 +1216,18 @@ void CMakeCbpParser::parseAdd()
 
     QString compilerOption = addAttributes.value(QLatin1String("option")).toString();
     // defining multiple times a macro to the same value makes no sense
-    if (!compilerOption.isEmpty() && !m_compilerOptions.contains(compilerOption))
+    if (!compilerOption.isEmpty() && !m_compilerOptions.contains(compilerOption)) {
         m_compilerOptions.append(compilerOption);
+        int macroNameIndex = compilerOption.indexOf(QLatin1String("-D")) + 2;
+        if (macroNameIndex != 1) {
+            int assignIndex = compilerOption.indexOf(QLatin1Char('='), macroNameIndex);
+            if (assignIndex != -1)
+                compilerOption[assignIndex] = ' ';
+            m_defines.append("#define ");
+            m_defines.append(compilerOption.mid(macroNameIndex).toLatin1());
+            m_defines.append('\n');
+        }
+    }
 
     while (!atEnd()) {
         readNext();
@@ -1314,6 +1325,11 @@ QStringList CMakeCbpParser::includeFiles()
     return m_includeFiles;
 }
 
+QByteArray CMakeCbpParser::defines() const
+{
+    return m_defines;
+}
+
 QList<CMakeBuildTarget> CMakeCbpParser::buildTargets()
 {
     return m_buildTargets;
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h
index 335bcac4a7f..f19422dcfc7 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.h
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.h
@@ -162,6 +162,7 @@ public:
     QList<ProjectExplorer::FileNode *> cmakeFileList();
     QStringList includeFiles();
     QList<CMakeBuildTarget> buildTargets();
+    QByteArray defines() const;
     QString projectName() const;
     QString compilerName() const;
     bool hasCMakeFiles();
@@ -188,6 +189,7 @@ private:
     bool m_parsingCmakeUnit;
     QStringList m_includeFiles;
     QStringList m_compilerOptions;
+    QByteArray m_defines;
 
     CMakeBuildTarget m_buildTarget;
     QList<CMakeBuildTarget> m_buildTargets;
-- 
GitLab