From 70b226144f15d1e8397418a3659b52b86ce9273a Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 13 Aug 2020 12:20:41 +0200 Subject: [PATCH] ProjectExplorer: Start to consolidate AbstractProcessStep setup Add some convenience functions to the base class to avoid repetition in the derived classes. Will be used immediately it in some derived classes. Change-Id: I8fd6aa4f8351720cdc8f63f7fa5f506e32a8143b Reviewed-by: Christian Kandeler --- src/plugins/android/androidbuildapkstep.cpp | 4 +- .../projectexplorer/abstractprocessstep.cpp | 41 +++++++++++++++++++ .../projectexplorer/abstractprocessstep.h | 6 +++ src/plugins/projectexplorer/makestep.cpp | 4 +- 4 files changed, 50 insertions(+), 5 deletions(-) diff --git a/src/plugins/android/androidbuildapkstep.cpp b/src/plugins/android/androidbuildapkstep.cpp index 7bba90bf9c7..751db7abe82 100644 --- a/src/plugins/android/androidbuildapkstep.cpp +++ b/src/plugins/android/androidbuildapkstep.cpp @@ -257,11 +257,11 @@ bool AndroidBuildApkStep::init() } ProjectExplorer::ProcessParameters *pp = processParameters(); - setupProcessParameters(pp, this, arguments, command); + Android::setupProcessParameters(pp, this, arguments, command); // Generate arguments with keystore password concealed ProjectExplorer::ProcessParameters pp2; - setupProcessParameters(&pp2, this, argumentsPasswordConcealed, command); + Android::setupProcessParameters(&pp2, this, argumentsPasswordConcealed, command); m_command = pp2.effectiveCommand().toString(); m_argumentsPasswordConcealed = pp2.prettyArguments(); diff --git a/src/plugins/projectexplorer/abstractprocessstep.cpp b/src/plugins/projectexplorer/abstractprocessstep.cpp index cd7558b6a0b..924e6716902 100644 --- a/src/plugins/projectexplorer/abstractprocessstep.cpp +++ b/src/plugins/projectexplorer/abstractprocessstep.cpp @@ -108,6 +108,9 @@ public: AbstractProcessStep *q; std::unique_ptr m_process; ProcessParameters m_param; + std::function m_commandLineProvider; + std::function m_workingDirectoryProvider; + std::function m_environmentModifier; bool m_ignoreReturnValue = false; bool m_lowPriority = false; std::unique_ptr stdoutStream; @@ -149,6 +152,26 @@ void AbstractProcessStep::setIgnoreReturnValue(bool b) d->m_ignoreReturnValue = b; } +void AbstractProcessStep::setEnvironmentModifier(const std::function &modifier) +{ + d->m_environmentModifier = modifier; +} + +void AbstractProcessStep::setUseEnglishOutput() +{ + d->m_environmentModifier = [](Environment &env) { Environment::setupEnglishOutput(&env); }; +} + +void AbstractProcessStep::setCommandLineProvider(const std::function &provider) +{ + d->m_commandLineProvider = provider; +} + +void AbstractProcessStep::setWorkingDirectoryProvider(const std::function &provider) +{ + d->m_workingDirectoryProvider = provider; +} + /*! Reimplemented from BuildStep::init(). You need to call this from YourBuildStep::init(). @@ -242,6 +265,24 @@ ProcessParameters *AbstractProcessStep::processParameters() return &d->m_param; } +void AbstractProcessStep::setupProcessParameters(ProcessParameters *params) +{ + params->setMacroExpander(macroExpander()); + + Utils::Environment env = buildEnvironment(); + if (d->m_environmentModifier) + d->m_environmentModifier(env); + params->setEnvironment(env); + + if (d->m_workingDirectoryProvider) + params->setWorkingDirectory(d->m_workingDirectoryProvider()); + else + params->setWorkingDirectory(buildDirectory()); + + if (d->m_commandLineProvider) + params->setCommandLine(d->m_commandLineProvider()); +} + void AbstractProcessStep::Private::cleanUp(QProcess *process) { // The process has finished, leftover data is read in processFinished diff --git a/src/plugins/projectexplorer/abstractprocessstep.h b/src/plugins/projectexplorer/abstractprocessstep.h index f4835de070e..218e68a1bcf 100644 --- a/src/plugins/projectexplorer/abstractprocessstep.h +++ b/src/plugins/projectexplorer/abstractprocessstep.h @@ -39,10 +39,16 @@ class PROJECTEXPLORER_EXPORT AbstractProcessStep : public BuildStep public: ProcessParameters *processParameters(); + void setupProcessParameters(ProcessParameters *params); bool ignoreReturnValue() const; void setIgnoreReturnValue(bool b); + void setCommandLineProvider(const std::function &provider); + void setWorkingDirectoryProvider(const std::function &provider); + void setEnvironmentModifier(const std::function &modifier); + void setUseEnglishOutput(); + void emitFaultyConfigurationMessage(); protected: diff --git a/src/plugins/projectexplorer/makestep.cpp b/src/plugins/projectexplorer/makestep.cpp index 6013bc7f0f3..698d8dc069a 100644 --- a/src/plugins/projectexplorer/makestep.cpp +++ b/src/plugins/projectexplorer/makestep.cpp @@ -226,9 +226,7 @@ bool MakeStep::init() } ProcessParameters *pp = processParameters(); - pp->setMacroExpander(macroExpander()); - pp->setWorkingDirectory(buildDirectory()); - pp->setEnvironment(buildEnvironment()); + setupProcessParameters(pp); pp->setCommandLine(make); pp->resolveAll();