diff options
Diffstat (limited to 'src/plugins/incredibuild/ibconsolebuildstep.cpp')
-rw-r--r-- | src/plugins/incredibuild/ibconsolebuildstep.cpp | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/src/plugins/incredibuild/ibconsolebuildstep.cpp b/src/plugins/incredibuild/ibconsolebuildstep.cpp new file mode 100644 index 0000000000..8241b3896b --- /dev/null +++ b/src/plugins/incredibuild/ibconsolebuildstep.cpp @@ -0,0 +1,196 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "ibconsolebuildstep.h" + +#include "cmakecommandbuilder.h" +#include "ibconsolestepconfigwidget.h" +#include "incredibuildconstants.h" +#include "incredibuildconstants.h" +#include "makecommandbuilder.h" +#include "ui_ibconsolebuildstep.h" + +#include <projectexplorer/buildconfiguration.h> +#include <projectexplorer/gnumakeparser.h> +#include <projectexplorer/kit.h> +#include <projectexplorer/processparameters.h> +#include <projectexplorer/target.h> +#include <utils/environment.h> + +using namespace ProjectExplorer; + +namespace IncrediBuild { +namespace Internal { + +namespace Constants { +const QLatin1String IBCONSOLE_NICE("IncrediBuild.IBConsole.Nice"); +const QLatin1String IBCONSOLE_COMMANDBUILDER("IncrediBuild.IBConsole.CommandBuilder"); +const QLatin1String IBCONSOLE_KEEPJOBNUM("IncrediBuild.IBConsole.KeepJobNum"); +const QLatin1String IBCONSOLE_FORCEREMOTE("IncrediBuild.IBConsole.ForceRemote"); +const QLatin1String IBCONSOLE_ALTERNATE("IncrediBuild.IBConsole.Alternate"); +} + +IBConsoleBuildStep::IBConsoleBuildStep(ProjectExplorer::BuildStepList *buildStepList, Utils::Id id) + : ProjectExplorer::AbstractProcessStep(buildStepList, id) + , m_earlierSteps(buildStepList) +{ + setDisplayName("IncrediBuild for Linux"); + initCommandBuilders(); +} + +IBConsoleBuildStep::~IBConsoleBuildStep() +{ + for (CommandBuilder* p : m_commandBuildersList) { + delete p; + p = nullptr; + } +} + +void IBConsoleBuildStep::tryToMigrate() +{ + // This is called when creating a fresh build step. + // Attempt to detect build system from pre-existing steps. + for (CommandBuilder* p : m_commandBuildersList) { + if (p->canMigrate(m_earlierSteps)) { + m_activeCommandBuilder = p; + break; + } + } +} + +void IBConsoleBuildStep::setupOutputFormatter(Utils::OutputFormatter *formatter) +{ + formatter->addLineParser(new GnuMakeParser()); + formatter->addLineParsers(target()->kit()->createOutputParsers()); + formatter->addSearchDir(processParameters()->effectiveWorkingDirectory()); + AbstractProcessStep::setupOutputFormatter(formatter); +} + +bool IBConsoleBuildStep::fromMap(const QVariantMap &map) +{ + m_loadedFromMap = true; + m_nice = map.value(Constants::IBCONSOLE_NICE, QVariant(0)).toInt(); + m_keepJobNum = map.value(Constants::IBCONSOLE_KEEPJOBNUM, QVariant(false)).toBool(); + m_forceRemote = map.value(Constants::IBCONSOLE_FORCEREMOTE, QVariant(false)).toBool(); + m_forceRemote = map.value(Constants::IBCONSOLE_ALTERNATE, QVariant(false)).toBool(); + + // Command builder. Default to the first in list, which should be the "Custom Command" + commandBuilder(map.value(Constants::IBCONSOLE_COMMANDBUILDER, QVariant(m_commandBuildersList.front()->displayName())).toString()); + bool result = m_activeCommandBuilder->fromMap(map); + + return result && AbstractProcessStep::fromMap(map); +} + +QVariantMap IBConsoleBuildStep::toMap() const +{ + QVariantMap map = AbstractProcessStep::toMap(); + + map[IncrediBuild::Constants::INCREDIBUILD_BUILDSTEP_TYPE] = QVariant(IncrediBuild::Constants::IBCONSOLE_BUILDSTEP_ID); + map[Constants::IBCONSOLE_NICE] = QVariant(m_nice); + map[Constants::IBCONSOLE_KEEPJOBNUM] = QVariant(m_keepJobNum); + map[Constants::IBCONSOLE_ALTERNATE] = QVariant(m_forceRemote); + map[Constants::IBCONSOLE_FORCEREMOTE] = QVariant(m_forceRemote); + map[Constants::IBCONSOLE_COMMANDBUILDER] = QVariant(commandBuilder()->displayName()); + m_activeCommandBuilder->toMap(&map); + + return map; +} + +bool IBConsoleBuildStep::init() +{ + QStringList args; + + if (m_nice != 0) + args.append(QString("--nice %0 ").arg(m_nice)); + + if (m_alternate) + args.append("--alternate"); + + if (m_forceRemote) + args.append("--force-remote"); + + m_activeCommandBuilder->keepJobNum(m_keepJobNum); + args.append(m_activeCommandBuilder->fullCommandFlag()); + + Utils::CommandLine cmdLine("ib_console", args); + ProcessParameters *procParams = processParameters(); + procParams->setCommandLine(cmdLine); + procParams->setEnvironment(Utils::Environment::systemEnvironment()); + + BuildConfiguration *buildConfig = buildConfiguration(); + if (buildConfig) { + procParams->setWorkingDirectory(buildConfig->buildDirectory()); + procParams->setEnvironment(buildConfig->environment()); + + Utils::MacroExpander *macroExpander = buildConfig->macroExpander(); + if (macroExpander) + procParams->setMacroExpander(macroExpander); + } + + return AbstractProcessStep::init(); +} + +BuildStepConfigWidget* IBConsoleBuildStep::createConfigWidget() +{ + return new IBConsoleStepConfigWidget(this); +} + +void IBConsoleBuildStep::initCommandBuilders() +{ + if (m_commandBuildersList.empty()) { + m_commandBuildersList.push_back(new CommandBuilder(this)); // "Custom Command"- needs to be first in the list. + m_commandBuildersList.push_back(new MakeCommandBuilder(this)); + m_commandBuildersList.push_back(new CMakeCommandBuilder(this)); + } + + // Default to "Custom Command". + if (!m_activeCommandBuilder) + m_activeCommandBuilder = m_commandBuildersList.front(); +} + +const QStringList& IBConsoleBuildStep::supportedCommandBuilders() +{ + static QStringList list; + if (list.empty()) { + initCommandBuilders(); + for (CommandBuilder* p : m_commandBuildersList) + list.push_back(p->displayName()); + } + + return list; +} + +void IBConsoleBuildStep::commandBuilder(const QString &commandBuilder) +{ + for (CommandBuilder* p : m_commandBuildersList) { + if (p->displayName().compare(commandBuilder) == 0) { + m_activeCommandBuilder = p; + break; + } + } +} + +} // namespace Internal +} // namespace IncrediBuild |