Commit Graph

162 Commits

Author SHA1 Message Date
Jarek Kobus
2bd6498278 Fix canceling compilation
Don't expect that the process being reaped will emit any signal.
Before deleting the process inside AbstractProcessStep::doCancel()
we do the expected cleanup immediately. We can't expect that the
process being reaped will return fine, so we set exitCode to -1
and exitStatus to CrashExit.

Fixes: QTCREATORBUG-26271
Change-Id: I0afd7ba8846d0fa57a0531201bbed9bd7a490942
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
2021-09-21 10:59:00 +00:00
Jarek Kobus
ace765c199 Move ProcessReaper into lib/utils
Reuse ProcessReaper inside process launcher.
Automatically reap all internal QProcesses of QtcProcess
(either direct child of QtcProcess in QProcessImpl
or indirectly inside process launcher).
Make ProcessReaper work again on QProcess instead of on
QtcProcess, so it may still be reused for non-QtcProcesses.

Change-Id: I950cac5cec28f17ae97fe474d6a4e48c01d6aaa2
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: hjk <hjk@qt.io>
2021-09-06 21:28:19 +00:00
hjk
fe7d6f0def Utils: Drop QProcess specific parameters from QtcProcess::finished()
Mid-term plan is to concentrate on use of QtcProcess::result()
instead which is a bit more system-agnostic.

There's quite a bit of potential for downstream cleanup by
re-using QtcProcess::exitMessage() now.

Change-Id: I3806b3f5933d96e64b7cfb18cc6c52823fddcbcd
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
2021-06-14 13:31:05 +00:00
hjk
4245d89a67 ProjectExplorer: Show a verbose error message if available
... when a start failed, e.g. due to a inacessible working directory.

Change-Id: Ibcec1c5323c37f1e8f6c9e55439439b24f3b40b1
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
2021-06-07 15:18:08 +00:00
hjk
a09851ff1f ProjectExplorer: Fix Coverity warning in AbstractProcessStep
*** CID 1505141:  Null pointer dereferences  (FORWARD_NULL)
/qt-creator/src/plugins/projectexplorer/abstractprocessstep.cpp: 409 in ProjectExplorer::AbstractProcessStep::slotProcessFinished(int, QProcess::ExitStatus)()
403         if (!process) // Happens when the process was canceled and handed over to the Reaper.
404             process = qobject_cast<QtcProcess *>(sender()); // The process was canceled!
405         if (process) {
406             stdError(d->stderrStream->toUnicode(process->readAllStandardError()));
407             stdOutput(d->stdoutStream->toUnicode(process->readAllStandardOutput()));
408         }
>>>    CID 1505141:  Null pointer dereferences  (FORWARD_NULL)
>>>    Passing null pointer "process" to "cleanUp", which dereferences it.
409         d->cleanUp(process);
410     }
411

Amends 4a26a2c28.

Change-Id: If9a66841b05e389a87a1b843ee5ef9e66edf15dd
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
2021-06-07 08:22:58 +00:00
hjk
accb1e6e08 Utils: Make QtcProcess::{setW,w}orkingDirectory use FilePath
But keep the old setter for a while to ease transition.

Change-Id: If02b79b1fcd31fbf8b06ef26876c41af891127f9
Reviewed-by: hjk <hjk@qt.io>
2021-06-03 10:31:13 +00:00
hjk
08040e4e94 Utils: Move QProcess base to QtcProcessPrivate
Change-Id: I4c6811d42e051fadfcf32edb664ff3bc09e692e6
Reviewed-by: David Schulz <david.schulz@qt.io>
2021-06-02 13:21:08 +00:00
hjk
77d7b24326 Utils: Make Environment::setEnglishOutput a proper member function
The previous indirection was useful as long as they were overloads
for QProcessEnvironment and QStringList, but these are gone now.

Change-Id: I5066bd2e72fd06948a5cc7bbac6dda9006db96ed
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
2021-05-21 15:07:34 +00:00
hjk
29b58f3488 ProjectExplorer: Remove some unneeded #includes
Change-Id: I08cdf8bb02a1cc394dc0698d1eaa5341ab82aa71
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
2021-05-06 13:12:00 +00:00
hjk
ebd8d520fc ProjectExplorer: Make AbstractProcessStep::doRun() tests work remotely
By funneling file system accesses through Utils::FilePath.

Change-Id: I13a3aac23bd5fc301edf5e5c52e0c7ebd1e6ca6c
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
2021-05-03 13:38:05 +00:00
hjk
8e2522f290 ProjectExplorer: Better start/stop messages for remote commands
Change-Id: I749e178d87e1721b09b8a6d867ab799967acad7c
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
2021-04-29 08:41:40 +00:00
hjk
77fd9661ec ProjectExplorer: AbstractProcessStep code cosmetics
Namespaces.

Change-Id: I7781bcf7125ad854e05a3b3a6a97d0c39b76df69
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
2021-04-23 10:10:29 +00:00
Alessandro Portale
176122fa94 ProjectExplorer: Make APS::setupProcessParameters const
Change-Id: I357505131cff5c98b5c9fe0a3967c79d009167e6
Reviewed-by: hjk <hjk@qt.io>
2021-04-21 13:32:17 +00:00
hjk
0d185a0ad3 ProjectExplorer: Simplify use of AbstractProcessStep::init()
1. Systematically check for AbstractProcessStep::init() first in
   derived classes.
2. Use setupProcessParameters(processParameters()); by default in
   the base implementation.
3. Drop all re-implementations that are effectively the same.

Change-Id: I0ae54dd4909b354672a63ee56d0b7c2ea0732494
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
2020-09-16 16:16:13 +00:00
hjk
070e0932c9 ProjectExplorer: Remove redundant MakeStep::{is,set}Clean()
This was only used for setIgnoreReturnValue(), which can be done
directly and also does not need to be stored in the settings.

Change-Id: I7419efe66d164b223463e19c3daf2350b4a2bae4
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
2020-08-26 04:51:47 +00:00
hjk
70b226144f 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 <christian.kandeler@qt.io>
2020-08-14 14:15:23 +00:00
hjk
0e5cc282e6 ProjectExplorer: Small code cosmetics
Unused declaration, const, ..

Change-Id: I0de544ba9be36a291fec5d1ab187e038a4fcc464
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
2020-07-28 11:59:22 +00:00
hjk
430a33dcd9 Core/Utils: Migrate further to Utils::Id
The coreplugin/id.h header is kept for downstream for now.

Change-Id: I8c44590f7b988b3770ecdc177c40783e12353e66
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
2020-07-06 06:07:13 +00:00
Christian Kandeler
1c6e4fbd32 Merge output formatters and output parsers
Now only one piece of code needs to be written to both linkify output in
an output pane and create tasks for it in the issues pane.
The calling sites are also simplified. For instance, until now, build
steps had to feed their output parsers manually and then push the
created tasks up the signal stack in parallel with the actual output,
which the build manager relied upon for cross-linking the output pane
content. Afterwards, the output would get forwarded to the formatter
(and parsed for ANSI escape codes a second time). In contrast, a build
step now just forwards the process output, and task parsing as well as
output formatting is done centrally further up the stack.
Concrete user-visible improvements so far:
    - File paths in compiler/linker messages are clickable links now.
    - QtTest applications now create clickable links also when run
      as part of a build step, not just in the app output pane.

Task-number: QTCREATORBUG-22665
Change-Id: Ic9fb95b2d97f2520ab3ec653315e9219466ec08d
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
2020-04-23 08:47:08 +00:00
Eike Ziller
5838b40c6d Enforce PWD in the environment of build steps
In the shell PWD can be different from the "real" working directory,
because the latter never contains symbolic links (getcwd).
E.g. Clang uses PWD as the basis for debug information.

Fixes: QTCREATORBUG-23788
Change-Id: I19f06dcfded5ccca2dc0162a3a543cdc756bffb0
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
2020-04-21 12:31:22 +00:00
Christian Kandeler
c564805095 Output parsers: Make file look-up self-contained
Change-Id: Iffe104b6b52f0902f1977adeaa0fee3dc1e374a4
Reviewed-by: hjk <hjk@qt.io>
2020-04-17 08:14:14 +00:00
Christian Kandeler
6f32538c5d ProjectExplorer: Split up the IOutputParser class
For symmetry with Utils::OutputFormatter.

Task-number: QTCREATORBUG-22665
Change-Id: I148fed69dba042ad3ef26e080829c31cd3f357fd
Reviewed-by: hjk <hjk@qt.io>
2020-04-16 10:40:33 +00:00
Christian Kandeler
45ba9fcd53 Output parsers: Replace the chaining approach
Use "flat" aggregation instead.
This is another step towards the formatter/parser merger.
Along the way, also fix some some subclasses (mostly in BareMetal) that
erroneously forwarded handled output to other parsers.

Task-number: QTCREATORBUG-22665
Change-Id: I12947349ca663d2e6bbfc99efd069d69e2b54969
Reviewed-by: hjk <hjk@qt.io>
2020-04-09 14:49:32 +00:00
Christian Kandeler
c58b1b2ca6 ProjectExplorer: Dissolve the AnsiFilterParser class
This class was different from all the other output parsers in that its
only responsibility was to pre-process the output before it was passed
to the real parsers. We now make this explicit by introducing the
concept of a filter function and turning the AnsiFilterParser class into
one of those.
This also gets rid of a case where the order of output parsers in the
chain matters, which we want to move away from.

Task-number: QTCREATORBUG-22665
Change-Id: Ica135e54ab43cf2ca8186073dc2487c906d4b38d
Reviewed-by: hjk <hjk@qt.io>
2020-04-07 09:21:48 +00:00
Christian Kandeler
b15d1951a2 ProjectExplorer: Let IOutputParser handle newlines
This makes IOutputParser structurally more similar to
Utils::OutputFormatter, which makes it simpler to explore possibilities
of somehow uniting these two related classes.

Task-number: QTCREATORBUG-22665
Change-Id: Ibb12ab6c8c785d863b9a921102a929864d0a5251
Reviewed-by: hjk <hjk@qt.io>
2020-04-07 08:13:58 +00:00
Christian Kandeler
cddaecfe21 ProjectExplorer: Clean up IOutputParser interface
- Remove unneeded/unused functions.
- De-virtualize where possible.

In particular, after untangling a number of self-referential
redirections, it became apparent that the outputAdded()
infrastructure was entirely unused.

Change-Id: I51e1beed008df2727b42494b087efa476342397e
Reviewed-by: hjk <hjk@qt.io>
2020-04-03 10:57:06 +00:00
Eike Ziller
897abf24e2 Merge remote-tracking branch 'origin/4.12'
Change-Id: I79083060dfc3bc4408123acd3b7305b9701650fd
2020-04-03 08:12:52 +02:00
Christian Kandeler
7834f172ce ProjectExplorer: Fix copy-paste error in AbstractProcessStep
Change-Id: Id345f3c2c51d4ac4b773113c7e22533ebcbcfaf7
Reviewed-by: hjk <hjk@qt.io>
2020-04-02 08:55:31 +00:00
hjk
3fe1911d46 ProjectExplorer: Introduce some BuildStep convenience accessors
... and use in ProcessStep and related classes.

Change-Id: Ie6f1403d0aa2b9f5bcde06e994809466700b1357
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
2020-02-19 16:11:05 +00:00
hjk
e109b731ad Utils: Rename FilePathList to simply FilePaths
The exact storage type does not really matter here.

Change-Id: Iefec40f0f5909c8e7ba3415db4a11962694e1b38
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
2019-12-18 08:43:18 +00:00
Orgad Shaneh
132abc789d ProjectExplorer: Apply low priority build immediately
The MakeSteps are instantiated when the project is opened, but if the low
priority setting is changed after that, it was not applied until reopening
the project, because the setting was only tested on the ctor.

Moved the setting test to actual execution.

Task-number: QTCREATORBUG-23048
Change-Id: Ie0bcbe07f6d9a09b173f7e0fa6f1d5d12b4ac601
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
2019-10-10 08:07:44 +00:00
Orgad Shaneh
92c067ba36 ProjectExplorer: Add a setting for low build priority
Default is false.

Task-number: QTCREATORBUG-23048
Change-Id: I0f0cc787229456aad2ddf47e4ef37bad58af2038
Reviewed-by: André Hartmann <aha_1980@gmx.de>
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
2019-10-08 08:19:16 +00:00
Orgad Shaneh
e38361b5a8 Lower priority on build
This should prevent slowdown of the IDE (and the rest of the system) while
building with all the CPU cores.

Fixes: QTCREATORBUG-5155
Change-Id: Icaadc53958f2d8e918035463e3c9344c91235615
Reviewed-by: hjk <hjk@qt.io>
2019-09-18 09:35:39 +00:00
hjk
611e1ea837 Utils: Encourage marking of raw command line parameters
Change-Id: Id66ac07732c66ab8c1232fe1f58042de8a61abb0
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
2019-06-06 12:22:47 +00:00
hjk
4098be05b2 Utils: Extract a CommandLine structure from a QtcProcess
We regularly pass around strings or filenames or pairs of strings
or filenames and stringlist etc the in the end will be used
as a kind of "command line", with quite a bit of ad-hoc user
code and QtcProcess::addArg etc to set them up and manipulate them.

Let's have a class for that concept.

Change-Id: I288ab939d853b32c717135a65242c584c2beab50
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
2019-05-29 14:36:46 +00:00
hjk
473a741c9f Utils: Rename FileName to FilePath
More in line with QFileInfo terminonlogy which appears to be
best-of-breed within Qt.

Change-Id: I1d051ff1c8363ebd4ee56376451df45216c4c9ab
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
2019-05-28 12:23:26 +00:00
hjk
9433b8a7e7 ProjectExplorer: Use Utils::FileName in ProcessParameters
For the command and the working directory.

Change-Id: Ia69dc7100aeb57bb6e1b35f4dd4f3cf3763d8cda
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
2019-05-15 12:55:22 +00:00
Christian Kandeler
eba3cd6135 AbstractProcessStep: Re-use FileInProjectFinder
Change-Id: Ifd5d24b6cac707372a95b2b31e270722a6202fc0
Reviewed-by: Antonio Di Monaco <tony@becrux.com>
Reviewed-by: hjk <hjk@qt.io>
2019-03-19 15:21:09 +00:00
hjk
6f37348b4c Replace static_casts by QOverload where possible
Mainly to get rid of the QProcess::finished deprecation warning.

Also adjust coding style in the surrounding connects when needed.

Change-Id: I12f9b248c7974b892c4a069356e578e80f8c59e9
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
2019-02-26 15:18:14 +00:00
Christian Kandeler
966f4ea6a9 ProjectExplorer: Rework the build step run interface
Originally, the build manager used to run all build steps in a dedicated
thread. Communication between the step and the manager happened via a
QFutureInterface that was passed into the step's run() function.
Later, new steps were added that operated asynchronously, so the build
manager had to differentiate between the different kinds of steps for
starting and stopping.
These days, almost all build and deploy steps work asynchronously, which
made the QFuture-based interface look increasingly odd.
With this patch, all build steps are expected to work asynchronously, so
the build manager no longer needs to differentiate. Steps are started
and requested to stop via the run() and cancel() functions,
respectively, and emit the finished() signal when they are done. Build
step implementors no longer have to deal with a QFutureInterface. For
steps whose implementation is inherently synchronous, the BuildStep base
class offers a runInThread() function.

Change-Id: If905c68b234c5a669f6e19f43142eaa57d594803
Reviewed-by: hjk <hjk@qt.io>
2019-01-31 16:10:01 +00:00
Christian Kandeler
7a5198e867 ProjectExplorer: Sanitize AbstractProcessStep cancellation
This build step runs in the main thread and thus can and should use the
cancel() function, rather than employing a polling approach.

Change-Id: Iba013f474db79820632e18224ad485bc1c4ec9b5
Reviewed-by: hjk <hjk@qt.io>
2019-01-28 12:27:28 +00:00
hjk
f007bc7593 ProjectExplorer: Simplify BuildStep::init() signature
The extra parameter was always computed but used only in one place,
and that use got removed lately.

Change-Id: Ie10c0107ca70ee97ce03f83294992aab8d1a3ffe
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
2019-01-18 09:11:37 +00:00
Orgad Shaneh
96bd65327b OutputFormatter/AbstractProcessStep: Handle \r\n as newline
\r\n means newline. It shouldn't erase the previous line.

Change-Id: I22d9919c9c0277e4c0932eba535dbfb84a1d5e71
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
2018-12-18 06:43:55 +00:00
Orgad Shaneh
85c1bab7a1 AbstractProcessStep: Support \r in output
Treat \r like \n. Pass it to the output formatter for processing.

Change-Id: Icf27a9a555c6eabdd610bca4bb874bfcde4037b3
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
2018-11-19 10:02:53 +00:00
Orgad Shaneh
04ae0c8dfb ProjectExplorer: Pimpl AbstractProcessStep
Change-Id: I0f77ff2e88b29674c306b394093deb2060db70c8
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
2018-11-19 10:02:46 +00:00
hjk
bc5e640a46 ProjectExplorer: Use a data member for BuildStep::runInGuiThread
Change-Id: Ia219fcf595c05c6f1b82f420454bd906c6870ee7
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
2018-10-23 15:38:43 +00:00
Eike Ziller
b6dfab804b Fix crash of process steps in deploy configuration
If the step is in a deploy configuration, it doesn't have a direct
parent build configuration, so we need to get that from the active
target.
This is generally improved for BuildStep in master, but here we still
have to do that by hand.

Fix-up of 75afda1798

Task-number: QTCREATORBUG-20631
Change-Id: I22fa16d424ee5928c920663e9d01c791b964e873
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
2018-06-19 09:19:07 +00:00
Ivan Donchevskii
75afda1798 ProjectExplorer: Fix switching build console to Utf8 for MSVC
Wrap make command into the script to switch console code page
to Utf8 before make (when the Kit check is on).

Task-number: QTCREATORBUG-20327
Change-Id: Ie3e372e52a09b93a41c5ac7ad63b7b14384655fb
Reviewed-by: André Hartmann <aha_1980@gmx.de>
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io>
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
2018-05-24 09:45:12 +00:00
Antonio Di Monaco
5784fce244 Fix UI freeze while building with multiple cores / distributed build
When parallelizing the build, and a verbose compiler error/warning
is printed (i.e. a template overload error), the IDE wastes a lot
of time parsing always the same file patterns, and that freezes
completely the UI. The only workaround is to kill the build process
using a terminal.

Implement a file cache, thus mitigating the freeze issue.

Change-Id: Ibcbdb6e6161af7cef424e90f7cfdc2fc34f6d7c1
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
Reviewed-by: Antonio Di Monaco <tony@becrux.com>
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
2018-04-13 16:04:08 +00:00
hjk
53a151074a ProjectExplorer/all: Re-organize BuildSteps/{Deploy,Build}Config setup
This follow the rough pattern of recent *RunConfigurationFactory changes
for build and deploy configurations.

- Collapse the two lines of constructors similar to what
  890c1906e6 did for RunConfigurations
  * Deploy* was purely mechanical
  * Build* ctors are split in connects() in the ctor body
    to create "empty shell for clone" etc
    and build step additions in initialize() functions which
    are only used in the create() case.
  -- Allows to collapse the shared 'ctor()' functions, too.

- Move FooBuildConfigurationFactory::create() implementations
  to FooBuildConfiguration() constructor. That was a strange
  and unneeded ping-pong between factories and objects, and
  furthermore allows one level less of indirection (and for a
  later, left out here, some reduction of the
  FooBuildConfiguration interfaces that were only used to
  accommodate the *Factory::create() functions.

- Most {Build,Deploy}Configuration{,Factory} classes had a canHandle(),
  but there wasn't one in the base classses. Have one there.

- Most canHandle() functions were checking simple restrictions on
  e.g. project or target types, specify those by setters in the
  constructors instead and check them in the base canHandle()

- clone() is generally replaced by a creation of a "shell object"
  and a fromMap(source->toMap()), implemented in the base, there
  are two cases left for Android and Qbs that needed(?) some extra
  polish

- generally use canHandle() in base implementation, instead
  of doing that in all Derived::canFoo()

- as a result, canCreate/create/canClone/clone reimplementations
  are not needed anymore, keep the base implementation for
  now (could be inlined into their only users later), but
  de-virtualize them.

- Combine Ios{Preset,DSym}BuildStepFactory. There was only one
  'dsym' build step they could create.

- Split the 'mangled' id into the ProjectConfiguration subtype
  specific constant identifier, and a QString extraId() bit.
  Only maintain the mangled id in saved settings.

- Make ProjectConfiguration::m_id a constant member, adapt
  all constructors of derived classe.

Not done in this patch:

- Finish possible cosmetic changes on top

- Add a way to specify restrictions to supported Qt versions
  (used in Android/Ios), as the base implementation does not
  depend on the qtsupport plugin

- Combine the QList<X> availableFoo() + createFoo(X) function
  pairs to somthing like a direct
   QList<struct { X; std::function<X()>; }> fooCreators()
  to avoid e.g. the baseId.withSuffix() <-> id.suffixAfter(base)
  pingpong

- Remove the *Factories from the global object pool

- Do something about priority(). Falling back to plain
  qmake in android+qmake setup is not helpful.

Change-Id: I2be7d88d554c5aa8b7db8edf5b93278e1ae0112a
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
2017-12-08 11:17:55 +00:00