From 58e8cf83ed14dde10c3ee64e89544e1a505c535a Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 4 Sep 2017 15:52:10 +0200 Subject: [PATCH] GCC/Clang: Use sysroot from build system if kit doesn't set sysroot If the kit has a sysroot set, we use that when determining the system header paths of the tool chain for the code model. But if the kit doesn't have a sysroot set, we should use the sysroot setting that we find in the CXX flags that we get from the build system. In the specific issue, we detect the Clang compiler from the Xcode installation on macOS, which actually needs to be passed a sysroot to return sensible system header paths. Task-number: QTCREATORBUG-18633 Change-Id: Ida401bee8c4b82bb4fa2e6f952b8cc174ea081c6 Reviewed-by: Vikas Pachdha --- src/plugins/projectexplorer/gcctoolchain.cpp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp index cfe0ca314cb..56a744b01f5 100644 --- a/src/plugins/projectexplorer/gcctoolchain.cpp +++ b/src/plugins/projectexplorer/gcctoolchain.cpp @@ -638,14 +638,26 @@ ToolChain::SystemHeaderPathsRunner GccToolChain::createSystemHeaderPathsRunner() (const QStringList &cxxflags, const QString &sysRoot) { // Prepare arguments QStringList arguments; - if (!sysRoot.isEmpty()) + const bool hasKitSysroot = !sysRoot.isEmpty(); + if (hasKitSysroot) arguments.append(QString::fromLatin1("--sysroot=%1").arg(sysRoot)); QStringList flags; flags << platformCodeGenFlags << cxxflags; - foreach (const QString &a, flags) { - if (a.startsWith("-stdlib=") || a.startsWith("--gcctoolchain=")) - arguments << a; + for (int i = 0; i < flags.size(); ++i) { + const QString &flag = flags.at(i); + if (flag.startsWith("-stdlib=") || flag.startsWith("--gcctoolchain=")) { + arguments << flag; + } else if (!hasKitSysroot) { + // pass build system's sysroot to compiler, if we didn't pass one from kit + if (flag.startsWith("--sysroot=")) { + arguments << flag; + } else if ((flag.startsWith("-isysroot") || flag.startsWith("--sysroot")) + && i < flags.size() - 1) { + arguments << flag << flags.at(i + 1); + ++i; + } + } } arguments << "-xc++" << "-E" << "-v" << "-";