48
50
CommandLineFrontend::CommandLineFrontend(const CommandLineParser &parser, Settings *settings,
50
: QObject(parent), m_parser(parser), m_settings(settings), m_observer(0), m_canceled(false)
54
, m_settings(settings)
56
, m_cancelStatus(CancelStatusNone)
57
, m_cancelTimer(new QTimer(this))
61
CommandLineFrontend::~CommandLineFrontend()
63
m_cancelTimer->stop();
66
// Called from interrupt handler. Don't do anything non-trivial here.
54
67
void CommandLineFrontend::cancel()
57
QMetaObject::invokeMethod(this, "doCancel", Qt::QueuedConnection);
69
m_cancelStatus = CancelStatusRequested;
60
void CommandLineFrontend::doCancel()
72
void CommandLineFrontend::checkCancelStatus()
62
if (m_resolveJobs.isEmpty() && m_buildJobs.isEmpty())
63
std::exit(EXIT_FAILURE);
64
foreach (AbstractJob * const job, m_resolveJobs)
66
foreach (AbstractJob * const job, m_buildJobs)
74
switch (m_cancelStatus) {
75
case CancelStatusNone:
77
case CancelStatusRequested:
78
m_cancelStatus = CancelStatusCanceling;
79
m_cancelTimer->stop();
80
if (m_resolveJobs.isEmpty() && m_buildJobs.isEmpty())
81
std::exit(EXIT_FAILURE);
82
foreach (AbstractJob * const job, m_resolveJobs)
84
foreach (AbstractJob * const job, m_buildJobs)
87
case CancelStatusCanceling:
88
QBS_ASSERT(false, return);
70
93
void CommandLineFrontend::start()
107
130
if (!m_parser.buildBeforeInstalling())
108
131
params.setRestoreBehavior(SetupProjectParameters::RestoreOnly);
109
132
foreach (const QVariantMap &buildConfig, m_parser.buildConfigurations()) {
110
params.setOverriddenValues(buildConfig);
111
params.setBuildConfiguration(buildConfig);
133
QVariantMap baseConfig;
134
QVariantMap userConfig = buildConfig;
135
QString buildVariantKey = QLatin1String("qbs.buildVariant");
136
baseConfig.insert(buildVariantKey, userConfig.take(buildVariantKey));
137
const QVariantMap::Iterator it = userConfig.find(QLatin1String("qbs.profile"));
138
if (it != userConfig.end()) {
139
baseConfig.insert(it.key(), it.value());
140
userConfig.erase(it);
142
params.setBuildConfiguration(baseConfig);
143
params.setOverriddenValues(userConfig);
112
144
const ErrorInfo err = params.expandBuildConfiguration(m_settings);
113
145
if (err.hasError())
130
162
if (m_parser.showProgress() && resolvingMultipleProjects())
131
163
m_observer->initialize(tr("Setting up projects"), m_resolveJobs.count());
165
// Check every two seconds whether we received a cancel request. This value has been
166
// experimentally found to be acceptable.
167
// Note that this polling approach is not problematic here, since we are doing work anyway,
168
// so there's no danger of waking up the processor for no reason.
169
connect(m_cancelTimer, SIGNAL(timeout()), SLOT(checkCancelStatus()));
170
m_cancelTimer->start(2000);
132
171
} catch (const ErrorInfo &error) {
133
172
qbsError() << error.toString();
134
if (m_buildJobs.isEmpty() && m_resolveJobs.isEmpty())
173
if (m_buildJobs.isEmpty() && m_resolveJobs.isEmpty()) {
135
174
qApp->exit(EXIT_FAILURE);