Commit 58e8cf83 authored by Eike Ziller's avatar Eike Ziller

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's avatarVikas Pachdha <vikas.pachdha@qt.io>
parent 77f6a432
......@@ -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" << "-";
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment