diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index 971276f70aa..d4f8c96f81b 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -61,6 +61,8 @@ #include #include #include +#include +#include #include #include #include @@ -90,6 +92,7 @@ static const bool DumpProjectInfo = qgetenv("QTC_DUMP_PROJECT_INFO") == "1"; using namespace CppTools; using namespace CppTools::Internal; using namespace CPlusPlus; +using namespace ProjectExplorer; #ifdef QTCREATOR_WITH_DUMP_AST @@ -1276,6 +1279,19 @@ ProjectPart::Ptr CppModelManager::fallbackProjectPart() Utils::LanguageExtension::ObjectiveC); part->qtVersion = Utils::QtVersion::Qt5; + + // TODO: Use different fallback toolchain for different kinds of files + const auto * const defaultKit = KitManager::defaultKit(); + const ToolChain * const defaultTc = ToolChainKitAspect::cxxToolChain(defaultKit); + if (defaultKit && defaultTc) { + Utils::FilePath sysroot = SysRootKitAspect::sysRoot(defaultKit); + if (sysroot.isEmpty()) + sysroot = Utils::FilePath::fromString(defaultTc->sysRoot()); + Utils::Environment env = Utils::Environment::systemEnvironment(); + defaultKit->addToEnvironment(env); + ToolChainInfo tcInfo(defaultTc, sysroot.toString(), env); + part->setupToolchainProperties(tcInfo, {}); + } part->updateLanguageFeatures(); return part; diff --git a/src/plugins/cpptools/cppprojectinfogenerator.cpp b/src/plugins/cpptools/cppprojectinfogenerator.cpp index f5da863a33c..cf3152163f7 100644 --- a/src/plugins/cpptools/cppprojectinfogenerator.cpp +++ b/src/plugins/cpptools/cppprojectinfogenerator.cpp @@ -196,51 +196,10 @@ ProjectPart::Ptr ProjectInfoGenerator::createProjectPart( ProjectPart::Ptr part(templateProjectPart->copy()); part->displayName = partName; part->files = projectFiles; - part->toolchainType = tcInfo.type; - part->isMsvc2015Toolchain = tcInfo.isMsvc2015ToolChain; - part->toolChainWordWidth = tcInfo.wordWidth == 64 ? ProjectPart::WordWidth64Bit - : ProjectPart::WordWidth32Bit; - part->toolChainInstallDir = tcInfo.installDir; - part->toolChainTargetTriple = tcInfo.targetTriple; - part->extraCodeModelFlags = tcInfo.extraCodeModelFlags; - part->compilerFlags = flags.commandLineFlags; part->warningFlags = flags.warningFlags; - if (part->includedFiles.isEmpty()) { - // The project manager did not provide the included files, so take - // the ones we were able to detect from the toolchain's command line. - part->includedFiles = flags.includedFiles; - } part->language = language; - part->languageExtensions = flags.languageExtensions; - - // Toolchain macros and language version - if (tcInfo.macroInspectionRunner) { - auto macroInspectionReport = tcInfo.macroInspectionRunner(flags.commandLineFlags); - part->toolChainMacros = macroInspectionReport.macros; - part->languageVersion = macroInspectionReport.languageVersion; - // No compiler set in kit. - } else if (language == Language::C) { - part->languageVersion = Utils::LanguageVersion::LatestC; - } else { - part->languageVersion = Utils::LanguageVersion::LatestCxx; - } - - // Header paths - if (tcInfo.headerPathsRunner) { - const HeaderPaths builtInHeaderPaths - = tcInfo.headerPathsRunner(flags.commandLineFlags, - tcInfo.sysRootPath, - tcInfo.targetTriple); - - HeaderPaths &headerPaths = part->headerPaths; - for (const HeaderPath &header : builtInHeaderPaths) { - const HeaderPath headerPath{header.path, header.type}; - if (!headerPaths.contains(headerPath)) - headerPaths.push_back(headerPath); - } - } - - part->languageExtensions |= languageExtensions; + part->languageExtensions = flags.languageExtensions | languageExtensions; + part->setupToolchainProperties(tcInfo, flags.commandLineFlags); part->updateLanguageFeatures(); return part; diff --git a/src/plugins/cpptools/projectpart.cpp b/src/plugins/cpptools/projectpart.cpp index f88fefac82a..d3d4668a814 100644 --- a/src/plugins/cpptools/projectpart.cpp +++ b/src/plugins/cpptools/projectpart.cpp @@ -31,6 +31,8 @@ #include #include +using namespace ProjectExplorer; + namespace CppTools { void ProjectPart::updateLanguageFeatures() @@ -53,6 +55,41 @@ void ProjectPart::updateLanguageFeatures() } } +void ProjectPart::setupToolchainProperties(const ToolChainInfo &tcInfo, const QStringList &flags) +{ + toolchainType = tcInfo.type; + isMsvc2015Toolchain = tcInfo.isMsvc2015ToolChain; + toolChainWordWidth = tcInfo.wordWidth == 64 ? ProjectPart::WordWidth64Bit + : ProjectPart::WordWidth32Bit; + toolChainInstallDir = tcInfo.installDir; + toolChainTargetTriple = tcInfo.targetTriple; + extraCodeModelFlags = tcInfo.extraCodeModelFlags; + compilerFlags = flags; + + // Toolchain macros and language version + if (tcInfo.macroInspectionRunner) { + const auto macroInspectionReport = tcInfo.macroInspectionRunner(compilerFlags); + toolChainMacros = macroInspectionReport.macros; + languageVersion = macroInspectionReport.languageVersion; + // No compiler set in kit. + } else if (language == Utils::Language::C) { + languageVersion = Utils::LanguageVersion::LatestC; + } else { + languageVersion = Utils::LanguageVersion::LatestCxx; + } + + // Header paths + if (tcInfo.headerPathsRunner) { + const HeaderPaths builtInHeaderPaths + = tcInfo.headerPathsRunner(compilerFlags, tcInfo.sysRootPath, tcInfo.targetTriple); + for (const HeaderPath &header : builtInHeaderPaths) { + const HeaderPath headerPath{header.path, header.type}; + if (!headerPaths.contains(headerPath)) + headerPaths.push_back(headerPath); + } + } +} + ProjectPart::Ptr ProjectPart::copy() const { return Ptr(new ProjectPart(*this)); diff --git a/src/plugins/cpptools/projectpart.h b/src/plugins/cpptools/projectpart.h index 2f38563687c..010a21a3120 100644 --- a/src/plugins/cpptools/projectpart.h +++ b/src/plugins/cpptools/projectpart.h @@ -65,6 +65,8 @@ public: Ptr copy() const; void updateLanguageFeatures(); + void setupToolchainProperties(const ProjectExplorer::ToolChainInfo &tcInfo, + const QStringList &flags); static QByteArray readProjectConfigFile(const Ptr &projectPart);