aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/incredibuild/buildconsolebuildstep.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/incredibuild/buildconsolebuildstep.cpp')
-rw-r--r--src/plugins/incredibuild/buildconsolebuildstep.cpp316
1 files changed, 316 insertions, 0 deletions
diff --git a/src/plugins/incredibuild/buildconsolebuildstep.cpp b/src/plugins/incredibuild/buildconsolebuildstep.cpp
new file mode 100644
index 0000000000..a2061bbd52
--- /dev/null
+++ b/src/plugins/incredibuild/buildconsolebuildstep.cpp
@@ -0,0 +1,316 @@
+/****************************************************************************
+**
+** 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 "buildconsolebuildstep.h"
+
+#include "buildconsolestepconfigwidget.h"
+#include "cmakecommandbuilder.h"
+#include "incredibuildconstants.h"
+#include "makecommandbuilder.h"
+#include "ui_buildconsolebuildstep.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>
+
+namespace IncrediBuild {
+namespace Internal {
+
+using namespace ProjectExplorer;
+
+namespace Constants {
+const QLatin1String BUILDCONSOLE_AVOIDLOCAL("IncrediBuild.BuildConsole.AvoidLocal");
+const QLatin1String BUILDCONSOLE_PROFILEXML("IncrediBuild.BuildConsole.ProfileXml");
+const QLatin1String BUILDCONSOLE_MAXCPU("IncrediBuild.BuildConsole.MaxCpu");
+const QLatin1String BUILDCONSOLE_MAXWINVER("IncrediBuild.BuildConsole.MaxWinVer");
+const QLatin1String BUILDCONSOLE_MINWINVER("IncrediBuild.BuildConsole.MinWinVer");
+const QLatin1String BUILDCONSOLE_TITLE("IncrediBuild.BuildConsole.Title");
+const QLatin1String BUILDCONSOLE_MONFILE("IncrediBuild.BuildConsole.MonFile");
+const QLatin1String BUILDCONSOLE_SUPPRESSSTDOUT("IncrediBuild.BuildConsole.SuppressStdOut");
+const QLatin1String BUILDCONSOLE_LOGFILE("IncrediBuild.BuildConsole.LogFile");
+const QLatin1String BUILDCONSOLE_SHOWCMD("IncrediBuild.BuildConsole.ShowCmd");
+const QLatin1String BUILDCONSOLE_SHOWAGENTS("IncrediBuild.BuildConsole.ShowAgents");
+const QLatin1String BUILDCONSOLE_SHOWTIME("IncrediBuild.BuildConsole.ShowTime");
+const QLatin1String BUILDCONSOLE_HIDEHEADER("IncrediBuild.BuildConsole.HideHeader");
+const QLatin1String BUILDCONSOLE_LOGLEVEL("IncrediBuild.BuildConsole.LogLevel");
+const QLatin1String BUILDCONSOLE_SETENV("IncrediBuild.BuildConsole.SetEnv");
+const QLatin1String BUILDCONSOLE_STOPONERROR("IncrediBuild.BuildConsole.StopOnError");
+const QLatin1String BUILDCONSOLE_ADDITIONALARGUMENTS("IncrediBuild.BuildConsole.AdditionalArguments");
+const QLatin1String BUILDCONSOLE_OPENMONITOR("IncrediBuild.BuildConsole.OpenMonitor");
+const QLatin1String BUILDCONSOLE_KEEPJOBNUM("IncrediBuild.BuildConsole.KeepJobNum");
+const QLatin1String BUILDCONSOLE_COMMANDBUILDER("IncrediBuild.BuildConsole.CommandBuilder");
+}
+
+BuildConsoleBuildStep::BuildConsoleBuildStep(ProjectExplorer::BuildStepList *buildStepList,
+ Utils::Id id)
+ : ProjectExplorer::AbstractProcessStep(buildStepList, id)
+ , m_earlierSteps(buildStepList)
+{
+ setDisplayName("IncrediBuild for Windows");
+ initCommandBuilders();
+}
+
+BuildConsoleBuildStep::~BuildConsoleBuildStep()
+{
+ qDeleteAll(m_commandBuildersList);
+}
+
+void BuildConsoleBuildStep::tryToMigrate()
+{
+ // This constructor 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 BuildConsoleBuildStep::setupOutputFormatter(Utils::OutputFormatter *formatter)
+{
+ formatter->addLineParser(new GnuMakeParser());
+ formatter->addLineParsers(target()->kit()->createOutputParsers());
+ formatter->addSearchDir(processParameters()->effectiveWorkingDirectory());
+ AbstractProcessStep::setupOutputFormatter(formatter);
+}
+
+bool BuildConsoleBuildStep::fromMap(const QVariantMap &map)
+{
+ m_loadedFromMap = true;
+ m_avoidLocal = map.value(Constants::BUILDCONSOLE_AVOIDLOCAL, QVariant(false)).toBool();
+ m_profileXml = map.value(Constants::BUILDCONSOLE_PROFILEXML, QVariant(QString())).toString();
+ m_maxCpu = map.value(Constants::BUILDCONSOLE_MAXCPU, QVariant(0)).toInt();
+ m_maxWinVer = map.value(Constants::BUILDCONSOLE_MAXWINVER, QVariant(QString())).toString();
+ m_minWinVer = map.value(Constants::BUILDCONSOLE_MINWINVER, QVariant(QString())).toString();
+ m_title = map.value(Constants::BUILDCONSOLE_TITLE, QVariant(QString())).toString();
+ m_monFile = map.value(Constants::BUILDCONSOLE_MONFILE, QVariant(QString())).toString();
+ m_suppressStdOut = map.value(Constants::BUILDCONSOLE_SUPPRESSSTDOUT, QVariant(false)).toBool();
+ m_logFile = map.value(Constants::BUILDCONSOLE_LOGFILE, QVariant(QString())).toString();
+ m_showCmd = map.value(Constants::BUILDCONSOLE_SHOWCMD, QVariant(false)).toBool();
+ m_showAgents = map.value(Constants::BUILDCONSOLE_SHOWAGENTS, QVariant(false)).toBool();
+ m_showTime = map.value(Constants::BUILDCONSOLE_SHOWTIME, QVariant(false)).toBool();
+ m_hideHeader = map.value(Constants::BUILDCONSOLE_HIDEHEADER, QVariant(false)).toBool();
+ m_logLevel = map.value(Constants::BUILDCONSOLE_LOGLEVEL, QVariant(QString())).toString();
+ m_setEnv = map.value(Constants::BUILDCONSOLE_SETENV, QVariant(QString())).toString();
+ m_stopOnError = map.value(Constants::BUILDCONSOLE_STOPONERROR, QVariant(false)).toBool();
+ m_additionalArguments = map.value(Constants::BUILDCONSOLE_ADDITIONALARGUMENTS, QVariant(QString())).toString();
+ m_openMonitor = map.value(Constants::BUILDCONSOLE_OPENMONITOR, QVariant(false)).toBool();
+ m_keepJobNum = map.value(Constants::BUILDCONSOLE_KEEPJOBNUM, QVariant(false)).toBool();
+
+ // Command builder. Default to the first in list, which should be the "Custom Command"
+ commandBuilder(map.value(Constants::BUILDCONSOLE_COMMANDBUILDER,
+ QVariant(m_commandBuildersList.front()->displayName()))
+ .toString());
+ bool result = m_activeCommandBuilder->fromMap(map);
+
+ return result && AbstractProcessStep::fromMap(map);
+}
+
+QVariantMap BuildConsoleBuildStep::toMap() const
+{
+ QVariantMap map = AbstractProcessStep::toMap();
+
+ map[IncrediBuild::Constants::INCREDIBUILD_BUILDSTEP_TYPE] = QVariant(
+ IncrediBuild::Constants::BUILDCONSOLE_BUILDSTEP_ID);
+ map[Constants::BUILDCONSOLE_AVOIDLOCAL] = QVariant(m_avoidLocal);
+ map[Constants::BUILDCONSOLE_PROFILEXML] = QVariant(m_profileXml);
+ map[Constants::BUILDCONSOLE_MAXCPU] = QVariant(m_maxCpu);
+ map[Constants::BUILDCONSOLE_MAXWINVER] = QVariant(m_maxWinVer);
+ map[Constants::BUILDCONSOLE_MINWINVER] = QVariant(m_minWinVer);
+ map[Constants::BUILDCONSOLE_TITLE] = QVariant(m_title);
+ map[Constants::BUILDCONSOLE_MONFILE] = QVariant(m_monFile);
+ map[Constants::BUILDCONSOLE_SUPPRESSSTDOUT] = QVariant(m_suppressStdOut);
+ map[Constants::BUILDCONSOLE_LOGFILE] = QVariant(m_logFile);
+ map[Constants::BUILDCONSOLE_SHOWCMD] = QVariant(m_showCmd);
+ map[Constants::BUILDCONSOLE_SHOWAGENTS] = QVariant(m_showAgents);
+ map[Constants::BUILDCONSOLE_SHOWTIME] = QVariant(m_showTime);
+ map[Constants::BUILDCONSOLE_HIDEHEADER] = QVariant(m_hideHeader);
+ map[Constants::BUILDCONSOLE_LOGLEVEL] = QVariant(m_logLevel);
+ map[Constants::BUILDCONSOLE_SETENV] = QVariant(m_setEnv);
+ map[Constants::BUILDCONSOLE_STOPONERROR] = QVariant(m_stopOnError);
+ map[Constants::BUILDCONSOLE_ADDITIONALARGUMENTS] = QVariant(m_additionalArguments);
+ map[Constants::BUILDCONSOLE_OPENMONITOR] = QVariant(m_openMonitor);
+ map[Constants::BUILDCONSOLE_KEEPJOBNUM] = QVariant(m_keepJobNum);
+ map[Constants::BUILDCONSOLE_COMMANDBUILDER] = QVariant(m_activeCommandBuilder->displayName());
+
+ m_activeCommandBuilder->toMap(&map);
+
+ return map;
+}
+
+const QStringList& BuildConsoleBuildStep::supportedWindowsVersions() const
+{
+ static QStringList list({QString(),
+ "Windows 7",
+ "Windows 8",
+ "Windows 10",
+ "Windows Vista",
+ "Windows XP",
+ "Windows Server 2003",
+ "Windows Server 2008",
+ "Windows Server 2012"});
+ return list;
+}
+
+QString BuildConsoleBuildStep::normalizeWinVerArgument(QString winVer)
+{
+ winVer.remove("Windows ");
+ winVer.remove("Server ");
+ return winVer.toUpper();
+}
+
+const QStringList& BuildConsoleBuildStep::supportedLogLevels() const
+{
+ static QStringList list({ QString(), "Minimal", "Extended", "Detailed"});
+ return list;
+}
+
+bool BuildConsoleBuildStep::init()
+{
+ QStringList args;
+
+ m_activeCommandBuilder->keepJobNum(m_keepJobNum);
+ QString cmd("/Command= %0");
+ cmd = cmd.arg(m_activeCommandBuilder->fullCommandFlag());
+ args.append(cmd);
+
+ if (!m_profileXml.isEmpty())
+ args.append(QString("/Profile=" + m_profileXml));
+
+ args.append(QString("/AvoidLocal=%1").arg(m_avoidLocal ? QString("ON") : QString("OFF")));
+
+ if (m_maxCpu > 0)
+ args.append(QString("/MaxCPUs=%1").arg(m_maxCpu));
+
+ if (!m_maxWinVer.isEmpty())
+ args.append(QString("/MaxWinVer=%1").arg(normalizeWinVerArgument(m_maxWinVer)));
+
+ if (!m_minWinVer.isEmpty())
+ args.append(QString("/MinWinVer=%1").arg(normalizeWinVerArgument(m_minWinVer)));
+
+ if (!m_title.isEmpty())
+ args.append(QString("/Title=" + m_title));
+
+ if (!m_monFile.isEmpty())
+ args.append(QString("/Mon=" + m_monFile));
+
+ if (m_suppressStdOut)
+ args.append("/Silent");
+
+ if (!m_logFile.isEmpty())
+ args.append(QString("/Log=" + m_logFile));
+
+ if (m_showCmd)
+ args.append("/ShowCmd");
+
+ if (m_showAgents)
+ args.append("/ShowAgent");
+
+ if (m_showAgents)
+ args.append("/ShowTime");
+
+ if (m_hideHeader)
+ args.append("/NoLogo");
+
+ if (!m_logLevel.isEmpty())
+ args.append(QString("/LogLevel=" + m_logLevel));
+
+ if (!m_setEnv.isEmpty())
+ args.append(QString("/SetEnv=" + m_setEnv));
+
+ if (m_stopOnError)
+ args.append("/StopOnErrors");
+
+ if (!m_additionalArguments.isEmpty())
+ args.append(m_additionalArguments);
+
+ if (m_openMonitor)
+ args.append("/OpenMonitor");
+
+ Utils::CommandLine cmdLine("BuildConsole.exe", 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* BuildConsoleBuildStep::createConfigWidget()
+{
+ return new BuildConsoleStepConfigWidget(this);
+}
+
+void BuildConsoleBuildStep::initCommandBuilders()
+{
+ if (m_commandBuildersList.empty()) {
+ // "Custom Command"- needs to be first in the list.
+ m_commandBuildersList.push_back(new CommandBuilder(this));
+ 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& BuildConsoleBuildStep::supportedCommandBuilders()
+{
+ static QStringList list;
+ if (list.empty()) {
+ initCommandBuilders();
+ for (CommandBuilder* p : m_commandBuildersList)
+ list.push_back(p->displayName());
+ }
+
+ return list;
+}
+
+void BuildConsoleBuildStep::commandBuilder(const QString& commandBuilder)
+{
+ for (CommandBuilder* p : m_commandBuildersList) {
+ if (p->displayName().compare(commandBuilder) == 0) {
+ m_activeCommandBuilder = p;
+ break;
+ }
+ }
+}
+
+} // namespace Internal
+} // namespace IncrediBuild