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