diff options
author | Cristian Adam <cristian.adam@qt.io> | 2022-05-13 13:17:02 +0200 |
---|---|---|
committer | Cristian Adam <cristian.adam@qt.io> | 2022-05-13 14:44:20 +0000 |
commit | d0a9b873cb3c8a8b54cbfaa51fbf9a913bf192e7 (patch) | |
tree | 4c6e95cf40e2a2f6886c59db68d324dd7d14e074 | |
parent | 1bfd5da0248be7b7992075b12a65157412a92cea (diff) |
ProjectExplorer: Include symlinks for compiler import name matching
On macOS /Library/Developer/CommandLineTools/usr/bin/cc is a symlink
to /Library/Developer/CommandLineTools/usr/bin/clang, and should not
be matched as a GCC toolchain.
Fixes: QTCREATORBUG-27523
Change-Id: I8885a263b46fa8d8a8145f7c0faa31f21aae920a
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
-rw-r--r-- | src/plugins/projectexplorer/gcctoolchain.cpp | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp index 047ddb02b4..666ef9624e 100644 --- a/src/plugins/projectexplorer/gcctoolchain.cpp +++ b/src/plugins/projectexplorer/gcctoolchain.cpp @@ -1077,12 +1077,19 @@ Toolchains GccToolChainFactory::autoDetect(const ToolchainDetector &detector) co Toolchains GccToolChainFactory::detectForImport(const ToolChainDescription &tcd) const { const QString fileName = tcd.compilerPath.completeBaseName(); - if ((tcd.language == Constants::C_LANGUAGE_ID && (fileName.startsWith("gcc") - || fileName.endsWith("gcc") - || fileName == "cc")) - || (tcd.language == Constants::CXX_LANGUAGE_ID && (fileName.startsWith("g++") - || fileName.endsWith("g++") - || fileName == "c++"))) { + const QString resolvedSymlinksFileName = tcd.compilerPath.resolveSymlinks().completeBaseName(); + + const bool isCCompiler = tcd.language == Constants::C_LANGUAGE_ID + && (fileName.startsWith("gcc") + || fileName.endsWith("gcc") + || (fileName == "cc" && !resolvedSymlinksFileName.contains("clang"))); + + const bool isCxxCompiler = tcd.language == Constants::CXX_LANGUAGE_ID + && (fileName.startsWith("g++") + || fileName.endsWith("g++") + || (fileName == "c++" && !resolvedSymlinksFileName.contains("clang"))); + + if (isCCompiler || isCxxCompiler) { return autoDetectToolChain(tcd, [](const ToolChain *tc) { return tc->targetAbi().osFlavor() != Abi::WindowsMSysFlavor; }); @@ -1756,9 +1763,18 @@ Toolchains ClangToolChainFactory::autoDetect(const ToolchainDetector &detector) Toolchains ClangToolChainFactory::detectForImport(const ToolChainDescription &tcd) const { - const QString fileName = tcd.compilerPath.toString(); - if ((tcd.language == Constants::C_LANGUAGE_ID && fileName.startsWith("clang") && !fileName.startsWith("clang++")) - || (tcd.language == Constants::CXX_LANGUAGE_ID && fileName.startsWith("clang++"))) { + const QString fileName = tcd.compilerPath.completeBaseName(); + const QString resolvedSymlinksFileName = tcd.compilerPath.resolveSymlinks().completeBaseName(); + + const bool isCCompiler = tcd.language == Constants::C_LANGUAGE_ID + && ((fileName.startsWith("clang") && !fileName.startsWith("clang++")) + || (fileName == "cc" && resolvedSymlinksFileName.contains("clang"))); + + const bool isCxxCompiler = tcd.language == Constants::CXX_LANGUAGE_ID + && (fileName.startsWith("clang++") + || (fileName == "c++" && resolvedSymlinksFileName.contains("clang"))); + + if (isCCompiler || isCxxCompiler) { return autoDetectToolChain(tcd); } return {}; @@ -2014,7 +2030,7 @@ Toolchains LinuxIccToolChainFactory::autoDetect(const ToolchainDetector &detecto Toolchains LinuxIccToolChainFactory::detectForImport(const ToolChainDescription &tcd) const { - const QString fileName = tcd.compilerPath.toString(); + const QString fileName = tcd.compilerPath.completeBaseName(); if ((tcd.language == Constants::CXX_LANGUAGE_ID && fileName.startsWith("icpc")) || (tcd.language == Constants::C_LANGUAGE_ID && fileName.startsWith("icc"))) { return autoDetectToolChain(tcd); |