By default, look for the clang executable in Creator's libexec dir.

It will be part of the installation from 3.5 on.
Also look explicitly for "clang-cl" on Windows now, as we do not
ship clang.exe.

Change-Id: I67e22ed4251791dd59015dd6f9648c7a14d941d7
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@theqtcompany.com>
This commit is contained in:
Christian Kandeler
2015-07-09 17:19:21 +02:00
parent d8d5bff071
commit 378b057a9f
4 changed files with 49 additions and 12 deletions

View File

@@ -40,11 +40,31 @@ ClangStaticAnalyzerConfigWidget::ClangStaticAnalyzerConfigWidget(
chooser->setHistoryCompleter(QLatin1String("ClangStaticAnalyzer.ClangCommand.History")); chooser->setHistoryCompleter(QLatin1String("ClangStaticAnalyzer.ClangCommand.History"));
chooser->setPromptDialogTitle(tr("Clang Command")); chooser->setPromptDialogTitle(tr("Clang Command"));
const auto validator = [chooser](Utils::FancyLineEdit *edit, QString *errorMessage) { const auto validator = [chooser](Utils::FancyLineEdit *edit, QString *errorMessage) {
return chooser->defaultValidationFunction()(edit, errorMessage) const QString currentFilePath = chooser->fileName().toString();
&& isClangExecutableUsable(chooser->fileName().toString(), errorMessage); Utils::PathChooser pc;
Utils::PathChooser *helperPathChooser;
if (currentFilePath.isEmpty()) {
pc.setExpectedKind(chooser->expectedKind());
pc.setPath(edit->placeholderText());
helperPathChooser = &pc;
} else {
helperPathChooser = chooser;
}
return chooser->defaultValidationFunction()(helperPathChooser->lineEdit(), errorMessage)
&& isClangExecutableUsable(helperPathChooser->fileName().toString(), errorMessage);
}; };
chooser->setValidationFunction(validator); chooser->setValidationFunction(validator);
chooser->setPath(settings->clangExecutable()); bool clangExeIsSet;
const QString clangExe = settings->clangExecutable(&clangExeIsSet);
chooser->lineEdit()->setPlaceholderText(settings->defaultClangExecutable());
if (clangExeIsSet) {
chooser->setPath(clangExe);
} else {
// Setting an empty string does not trigger the validator, as that is the initial value
// in the line edit.
chooser->setPath(QLatin1String(" "));
chooser->lineEdit()->clear();
}
connect(m_ui->clangExecutableChooser, &Utils::PathChooser::changed, connect(m_ui->clangExecutableChooser, &Utils::PathChooser::changed,
[settings](const QString &path) { settings->setClangExecutable(path); }); [settings](const QString &path) { settings->setClangExecutable(path); });

View File

@@ -22,7 +22,6 @@
namespace ClangStaticAnalyzer { namespace ClangStaticAnalyzer {
namespace Constants { namespace Constants {
const char CLANG_EXECUTABLE_BASE_NAME[] = "clang";
const char SETTINGS_ID[] = "ClangStaticAnalyzer"; const char SETTINGS_ID[] = "ClangStaticAnalyzer";
const char CLANGSTATICANALYZER_RUN_MODE[] = "ClangStaticAnalyzer.RunMode"; const char CLANGSTATICANALYZER_RUN_MODE[] = "ClangStaticAnalyzer.RunMode";

View File

@@ -46,14 +46,34 @@ ClangStaticAnalyzerSettings *ClangStaticAnalyzerSettings::instance()
return &instance; return &instance;
} }
QString ClangStaticAnalyzerSettings::clangExecutable() const static QString clangExecutableFileName()
{ {
return QLatin1String(Utils::HostOsInfo::isWindowsHost() ? "clang-cl.exe" : "clang");
}
QString ClangStaticAnalyzerSettings::defaultClangExecutable() const
{
const QString shippedBinary = Core::ICore::libexecPath() + QLatin1Char('/')
+ clangExecutableFileName();
if (QFileInfo(shippedBinary).isExecutable())
return shippedBinary;
return clangExecutableFileName();
}
QString ClangStaticAnalyzerSettings::clangExecutable(bool *isSet) const
{
if (m_clangExecutable.isEmpty()) {
if (isSet)
*isSet = false;
return defaultClangExecutable();
}
if (isSet)
*isSet = true;
return m_clangExecutable; return m_clangExecutable;
} }
void ClangStaticAnalyzerSettings::setClangExecutable(const QString &exectuable) void ClangStaticAnalyzerSettings::setClangExecutable(const QString &exectuable)
{ {
QTC_ASSERT(!exectuable.isEmpty(), return);
m_clangExecutable = exectuable; m_clangExecutable = exectuable;
} }
@@ -73,10 +93,7 @@ void ClangStaticAnalyzerSettings::readSettings()
QSettings *settings = Core::ICore::settings(); QSettings *settings = Core::ICore::settings();
settings->beginGroup(QLatin1String(Constants::SETTINGS_ID)); settings->beginGroup(QLatin1String(Constants::SETTINGS_ID));
const QString defaultClangExecutable = Utils::HostOsInfo::withExecutableSuffix( setClangExecutable(settings->value(QLatin1String(clangExecutableKey)).toString());
QLatin1String(Constants::CLANG_EXECUTABLE_BASE_NAME));
setClangExecutable(settings->value(QLatin1String(clangExecutableKey),
defaultClangExecutable).toString());
const int defaultSimultaneousProcesses = qMax(0, QThread::idealThreadCount() / 2); const int defaultSimultaneousProcesses = qMax(0, QThread::idealThreadCount() / 2);
setSimultaneousProcesses(settings->value(QLatin1String(simultaneousProcessesKey), setSimultaneousProcesses(settings->value(QLatin1String(simultaneousProcessesKey),
@@ -89,7 +106,7 @@ void ClangStaticAnalyzerSettings::writeSettings() const
{ {
QSettings *settings = Core::ICore::settings(); QSettings *settings = Core::ICore::settings();
settings->beginGroup(QLatin1String(Constants::SETTINGS_ID)); settings->beginGroup(QLatin1String(Constants::SETTINGS_ID));
settings->setValue(QLatin1String(clangExecutableKey), clangExecutable()); settings->setValue(QLatin1String(clangExecutableKey), m_clangExecutable);
settings->setValue(QLatin1String(simultaneousProcessesKey), simultaneousProcesses()); settings->setValue(QLatin1String(simultaneousProcessesKey), simultaneousProcesses());
settings->endGroup(); settings->endGroup();
} }

View File

@@ -31,7 +31,8 @@ public:
void writeSettings() const; void writeSettings() const;
QString clangExecutable() const; QString defaultClangExecutable() const;
QString clangExecutable(bool *isSet = nullptr) const;
void setClangExecutable(const QString &exectuable); void setClangExecutable(const QString &exectuable);
int simultaneousProcesses() const; int simultaneousProcesses() const;