forked from qt-creator/qt-creator
Clang: Change temporary directory for clangbackend
This is meant to 1. Work around a libclang bug on Windows (not deleting preamble files) 2. Delete left-over preamble files in case of a clangbackend crash The temporary diretory will be removed on Qt Creator exit. Task-number: QTCREATORBUG-10988 Change-Id: Ia5837c2a6ab2d55366d167dd591d87faaededf3e Reviewed-by: Marco Bubke <marco.bubke@theqtcompany.com> Reviewed-by: Nikolai Kosjar <nikolai.kosjar@theqtcompany.com>
This commit is contained in:
committed by
Nikolai Kosjar
parent
a5a0864741
commit
5f29a00c89
@@ -37,11 +37,19 @@
|
|||||||
|
|
||||||
#include <QCoreApplication>
|
#include <QCoreApplication>
|
||||||
#include <QProcess>
|
#include <QProcess>
|
||||||
|
#include <QTemporaryDir>
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
|
|
||||||
namespace ClangBackEnd {
|
namespace ClangBackEnd {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
const QTemporaryDir &temporaryDirectory()
|
||||||
|
{
|
||||||
|
static QTemporaryDir temporaryDirectory(QDir::tempPath() + QStringLiteral("/qtc-clang-XXXXXX"));
|
||||||
|
|
||||||
|
return temporaryDirectory;
|
||||||
|
}
|
||||||
|
|
||||||
QString currentProcessId()
|
QString currentProcessId()
|
||||||
{
|
{
|
||||||
return QString::number(QCoreApplication::applicationPid());
|
return QString::number(QCoreApplication::applicationPid());
|
||||||
@@ -49,7 +57,7 @@ QString currentProcessId()
|
|||||||
|
|
||||||
QString connectionName()
|
QString connectionName()
|
||||||
{
|
{
|
||||||
return QStringLiteral("ClangBackEnd-") + currentProcessId();
|
return temporaryDirectory().path() + QStringLiteral("/ClangBackEnd-") + currentProcessId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -128,6 +136,20 @@ void ConnectionClient::setProcessAliveTimerInterval(int processTimerInterval)
|
|||||||
processAliveTimer.setInterval(processTimerInterval);
|
processAliveTimer.setInterval(processTimerInterval);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QProcessEnvironment ConnectionClient::processEnvironment() const
|
||||||
|
{
|
||||||
|
auto processEnvironment = QProcessEnvironment::systemEnvironment();
|
||||||
|
|
||||||
|
if (temporaryDirectory().isValid()) {
|
||||||
|
const QString temporaryDirectoryPath = temporaryDirectory().path();
|
||||||
|
processEnvironment.insert(QStringLiteral("TMPDIR"), temporaryDirectoryPath);
|
||||||
|
processEnvironment.insert(QStringLiteral("TMP"), temporaryDirectoryPath);
|
||||||
|
processEnvironment.insert(QStringLiteral("TEMP"), temporaryDirectoryPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
return processEnvironment;
|
||||||
|
}
|
||||||
|
|
||||||
void ConnectionClient::startProcess()
|
void ConnectionClient::startProcess()
|
||||||
{
|
{
|
||||||
TIME_SCOPE_DURATION("ConnectionClient::startProcess");
|
TIME_SCOPE_DURATION("ConnectionClient::startProcess");
|
||||||
@@ -135,6 +157,7 @@ void ConnectionClient::startProcess()
|
|||||||
if (!isProcessIsRunning()) {
|
if (!isProcessIsRunning()) {
|
||||||
connectProcessFinished();
|
connectProcessFinished();
|
||||||
connectStandardOutputAndError();
|
connectStandardOutputAndError();
|
||||||
|
process()->setProcessEnvironment(processEnvironment());
|
||||||
process()->start(processPath(), {connectionName()});
|
process()->start(processPath(), {connectionName()});
|
||||||
process()->waitForStarted();
|
process()->waitForStarted();
|
||||||
resetProcessAliveTimer();
|
resetProcessAliveTimer();
|
||||||
|
@@ -35,6 +35,7 @@
|
|||||||
#include "lineprefixer.h"
|
#include "lineprefixer.h"
|
||||||
|
|
||||||
#include <QLocalSocket>
|
#include <QLocalSocket>
|
||||||
|
#include <QProcessEnvironment>
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
@@ -100,6 +101,8 @@ private:
|
|||||||
|
|
||||||
void ensureMessageIsWritten();
|
void ensureMessageIsWritten();
|
||||||
|
|
||||||
|
QProcessEnvironment processEnvironment() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
mutable std::unique_ptr<QProcess> process_;
|
mutable std::unique_ptr<QProcess> process_;
|
||||||
QLocalSocket localSocket;
|
QLocalSocket localSocket;
|
||||||
|
Reference in New Issue
Block a user