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:
Marco Bubke
2015-11-30 20:32:47 +01:00
committed by Nikolai Kosjar
parent a5a0864741
commit 5f29a00c89
2 changed files with 27 additions and 1 deletions

View File

@@ -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();

View File

@@ -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;