From 10cb0b77a0429a0ac6b427bbc3f07540172c2894 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 17 Oct 2017 12:27:37 +0200 Subject: [PATCH] ProjectExplorer: Do not prepend compiler path to PATH everywhere! Do not unconditionally prepend the (c++) compiler path to PATH for all projects using GCC-derived toolchains. Prepend the compiler path in the Qmake- and GenericBuildConfigurations instead. Also change the order: Apply buildconfiguration's addToEnvironment first, only then apply the kit's addToEnvironment. This does change a few things: * CMake and Qbs will now get the normal PATH * MSVC compilers will have their compiler path prepended to PATH by the effected BuildConfigurations. This should be harmless, since that happens before the environment setup script is appended. Task-number: QTCREATORBUG-18714 Change-Id: I548182bc447d80d24f4de4ce7cf12ee1a753ed26 Reviewed-by: Eike Ziller --- .../genericbuildconfiguration.cpp | 5 ++++ .../genericbuildconfiguration.h | 2 ++ .../projectexplorer/buildconfiguration.cpp | 24 ++++++++++++++++++- .../projectexplorer/buildconfiguration.h | 2 ++ src/plugins/projectexplorer/gcctoolchain.cpp | 2 +- .../qmakebuildconfiguration.cpp | 5 ++++ .../qmakebuildconfiguration.h | 2 ++ 7 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp index 461232e4c87..4ba1127ffe7 100644 --- a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp +++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp @@ -196,6 +196,11 @@ BuildConfiguration::BuildType GenericBuildConfiguration::buildType() const return Unknown; } +void GenericBuildConfiguration::addToEnvironment(Utils::Environment &env) const +{ + prependCompilerPathToEnvironment(env); +} + //////////////////////////////////////////////////////////////////////////////////// // GenericBuildSettingsWidget //////////////////////////////////////////////////////////////////////////////////// diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.h b/src/plugins/genericprojectmanager/genericbuildconfiguration.h index 75f5ceef5d4..54e375e88f7 100644 --- a/src/plugins/genericprojectmanager/genericbuildconfiguration.h +++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.h @@ -52,6 +52,8 @@ public: BuildType buildType() const override; + void addToEnvironment(Utils::Environment &env) const final; + protected: GenericBuildConfiguration(ProjectExplorer::Target *parent, GenericBuildConfiguration *source); GenericBuildConfiguration(ProjectExplorer::Target *parent, Core::Id id); diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp index 705d9b9b967..af7aef4c7c2 100644 --- a/src/plugins/projectexplorer/buildconfiguration.cpp +++ b/src/plugins/projectexplorer/buildconfiguration.cpp @@ -33,7 +33,10 @@ #include "kit.h" #include +#include +#include #include +#include #include #include @@ -238,8 +241,8 @@ Utils::Environment BuildConfiguration::baseEnvironment() const Utils::Environment result; if (useSystemEnvironment()) result = Utils::Environment::systemEnvironment(); - target()->kit()->addToEnvironment(result); addToEnvironment(result); + target()->kit()->addToEnvironment(result); return result; } @@ -330,6 +333,25 @@ bool BuildConfiguration::isActive() const return target()->isActive() && target()->activeBuildConfiguration() == this; } +/*! + * Helper function that prepends the directory containing the C++ toolchain to + * PATH. This is used to in build configurations targeting broken build systems + * to provide hints about which compiler to use. + */ +void BuildConfiguration::prependCompilerPathToEnvironment(Utils::Environment &env) const +{ + const ToolChain *tc + = ToolChainKitInformation::toolChain(target()->kit(), + ProjectExplorer::Constants::CXX_LANGUAGE_ID); + + if (!tc) + return; + + const Utils::FileName compilerDir = tc->compilerCommand().parentDir(); + if (!compilerDir.isEmpty()) + env.prependOrSetPath(compilerDir.toString()); +} + /// // IBuildConfigurationFactory /// diff --git a/src/plugins/projectexplorer/buildconfiguration.h b/src/plugins/projectexplorer/buildconfiguration.h index cc30d2ba44d..c0ad651f4d5 100644 --- a/src/plugins/projectexplorer/buildconfiguration.h +++ b/src/plugins/projectexplorer/buildconfiguration.h @@ -90,6 +90,8 @@ public: bool isActive() const override; + void prependCompilerPathToEnvironment(Utils::Environment &env) const; + signals: void environmentChanged(); void buildDirectoryChanged(); diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp index 1948fdc178b..79d2b2a1e50 100644 --- a/src/plugins/projectexplorer/gcctoolchain.cpp +++ b/src/plugins/projectexplorer/gcctoolchain.cpp @@ -718,7 +718,7 @@ GccToolChain::GccToolChain(const GccToolChain &) = default; void GccToolChain::addToEnvironment(Environment &env) const { - addCommandPathToEnvironment(m_compilerCommand, env); + Q_UNUSED(env); } FileNameList GccToolChain::suggestedMkspecList() const diff --git a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp index e95fcdd86ca..c4253f68e67 100644 --- a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp +++ b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp @@ -756,6 +756,11 @@ BuildConfiguration::BuildType QmakeBuildConfiguration::buildType() const return Release; } +void QmakeBuildConfiguration::addToEnvironment(Environment &env) const +{ + prependCompilerPathToEnvironment(env); +} + QmakeBuildConfiguration::LastKitState::LastKitState() { } QmakeBuildConfiguration::LastKitState::LastKitState(Kit *k) diff --git a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h index c526760c62e..87afc6c9376 100644 --- a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h +++ b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h @@ -99,6 +99,8 @@ public: BuildType buildType() const override; + void addToEnvironment(Utils::Environment &env) const override; + void emitProFileEvaluateNeeded(); signals: