From 5f29a00c8984598e8679be15bea3e6568559469f Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Mon, 30 Nov 2015 20:32:47 +0100 Subject: [PATCH] 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 Reviewed-by: Nikolai Kosjar --- src/libs/clangbackendipc/connectionclient.cpp | 25 ++++++++++++++++++- src/libs/clangbackendipc/connectionclient.h | 3 +++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/libs/clangbackendipc/connectionclient.cpp b/src/libs/clangbackendipc/connectionclient.cpp index f535604168f..0e043cb115e 100644 --- a/src/libs/clangbackendipc/connectionclient.cpp +++ b/src/libs/clangbackendipc/connectionclient.cpp @@ -37,11 +37,19 @@ #include #include +#include #include namespace ClangBackEnd { namespace { +const QTemporaryDir &temporaryDirectory() +{ + static QTemporaryDir temporaryDirectory(QDir::tempPath() + QStringLiteral("/qtc-clang-XXXXXX")); + + return temporaryDirectory; +} + QString currentProcessId() { return QString::number(QCoreApplication::applicationPid()); @@ -49,7 +57,7 @@ QString currentProcessId() QString connectionName() { - return QStringLiteral("ClangBackEnd-") + currentProcessId(); + return temporaryDirectory().path() + QStringLiteral("/ClangBackEnd-") + currentProcessId(); } } @@ -128,6 +136,20 @@ void ConnectionClient::setProcessAliveTimerInterval(int 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() { TIME_SCOPE_DURATION("ConnectionClient::startProcess"); @@ -135,6 +157,7 @@ void ConnectionClient::startProcess() if (!isProcessIsRunning()) { connectProcessFinished(); connectStandardOutputAndError(); + process()->setProcessEnvironment(processEnvironment()); process()->start(processPath(), {connectionName()}); process()->waitForStarted(); resetProcessAliveTimer(); diff --git a/src/libs/clangbackendipc/connectionclient.h b/src/libs/clangbackendipc/connectionclient.h index bcd83d67673..147c9bd4f8d 100644 --- a/src/libs/clangbackendipc/connectionclient.h +++ b/src/libs/clangbackendipc/connectionclient.h @@ -35,6 +35,7 @@ #include "lineprefixer.h" #include +#include #include @@ -100,6 +101,8 @@ private: void ensureMessageIsWritten(); + QProcessEnvironment processEnvironment() const; + private: mutable std::unique_ptr process_; QLocalSocket localSocket;