forked from qt-creator/qt-creator
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:
@@ -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); });
|
||||||
|
|
||||||
|
@@ -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";
|
||||||
|
|
||||||
|
@@ -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();
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user