From c95cba39a68bea4dc4c3c003e768412f0640e24f Mon Sep 17 00:00:00 2001
From: Martin Smith <martin.smith@qt.io>
Date: Fri, 30 Sep 2016 09:51:10 +0200
Subject: [PATCH] qdoc: Find the system include path if not provided
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

clang needs the path to the system include files. There is
an option to pass system include paths to qdoc on the command
line, but currently there is no way to get the information
from the build system.

With this change, clangqdoc asks if the system include paths
have been provided. If not, it uses the path to <locale.h> as
the system include path, which it passes to clang using the
-isystem option.

Thanks to Edward Welbourne for this solution.

Change-Id: I2716505126d7780fc616b8ffd7cd2865576bae16
Reviewed-by: Topi Reiniö <topi.reinio@qt.io>
---
 src/qdoc/main.cpp | 27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/src/qdoc/main.cpp b/src/qdoc/main.cpp
index 8cc5a704a..5f29f222c 100644
--- a/src/qdoc/main.cpp
+++ b/src/qdoc/main.cpp
@@ -26,6 +26,15 @@
 **
 ****************************************************************************/
 
+// There must be no #include before this !
+#define setlocale locale_file_name_for_clang_qdoc() { \
+        static char data[] = __FILE__;           \
+        return data;                             \
+    }                                            \
+    extern char *setlocale
+#include <locale.h>
+#undef setlocale
+
 #include <qglobal.h>
 #include <qhashfunctions.h>
 #include <stdlib.h>
@@ -636,6 +645,20 @@ QDocCommandLineParser::QDocCommandLineParser()
     addOption(frameworkOption);
 }
 
+/*!
+  Return the system include directory used when compiling this file.
+ */
+static QByteArray getSystemIncludePath()
+{
+    const char *raw = locale_file_name_for_clang_qdoc();
+    const char *slash = strrchr(raw, '/');
+    if (slash == NULL)
+        slash = strrchr(raw, '\\');
+    if (slash == NULL)
+        return QByteArray();
+    return QByteArray(raw, slash - raw);
+}
+
 void QDocCommandLineParser::process(const QCoreApplication &app)
 {
     QCommandLineParser::process(app);
@@ -683,7 +706,9 @@ void QDocCommandLineParser::process(const QCoreApplication &app)
     const auto paths = values(includePathOption);
     for (const auto &i : paths)
         includesPaths << "-I" << currentDir.absoluteFilePath(i);
-    const auto paths2 = values(includePathSystemOption);
+    auto paths2 = values(includePathSystemOption);
+    if (paths2.isEmpty())
+        paths2 << QString(getSystemIncludePath());
     for (const auto &i : paths2)
         includesPaths << "-isystem" << currentDir.absoluteFilePath(i);
     const auto paths3 = values(frameworkOption);
-- 
GitLab