forked from qt-creator/qt-creator
Don't attempt to analyze using icecc masquerading as clang.
Also warn the user in the settings page against this. Change-Id: I4dbae953aa85f8dbdc9baa8dd0fda8ff0da45b76 Reviewed-by: Nikolai Kosjar <nikolai.kosjar@theqtcompany.com>
This commit is contained in:
@@ -10,6 +10,7 @@ SOURCES += \
|
|||||||
clangstaticanalyzerdiagnosticmodel.cpp \
|
clangstaticanalyzerdiagnosticmodel.cpp \
|
||||||
clangstaticanalyzerdiagnosticview.cpp \
|
clangstaticanalyzerdiagnosticview.cpp \
|
||||||
clangstaticanalyzerlogfilereader.cpp \
|
clangstaticanalyzerlogfilereader.cpp \
|
||||||
|
clangstaticanalyzerpathchooser.cpp \
|
||||||
clangstaticanalyzerplugin.cpp \
|
clangstaticanalyzerplugin.cpp \
|
||||||
clangstaticanalyzerruncontrol.cpp \
|
clangstaticanalyzerruncontrol.cpp \
|
||||||
clangstaticanalyzerruncontrolfactory.cpp \
|
clangstaticanalyzerruncontrolfactory.cpp \
|
||||||
@@ -26,6 +27,7 @@ HEADERS += \
|
|||||||
clangstaticanalyzerdiagnosticview.h \
|
clangstaticanalyzerdiagnosticview.h \
|
||||||
clangstaticanalyzer_global.h \
|
clangstaticanalyzer_global.h \
|
||||||
clangstaticanalyzerlogfilereader.h \
|
clangstaticanalyzerlogfilereader.h \
|
||||||
|
clangstaticanalyzerpathchooser.h \
|
||||||
clangstaticanalyzerplugin.h \
|
clangstaticanalyzerplugin.h \
|
||||||
clangstaticanalyzerruncontrolfactory.h \
|
clangstaticanalyzerruncontrolfactory.h \
|
||||||
clangstaticanalyzerruncontrol.h \
|
clangstaticanalyzerruncontrol.h \
|
||||||
|
@@ -28,6 +28,8 @@ QtcPlugin {
|
|||||||
"clangstaticanalyzerdiagnosticview.h",
|
"clangstaticanalyzerdiagnosticview.h",
|
||||||
"clangstaticanalyzerlogfilereader.cpp",
|
"clangstaticanalyzerlogfilereader.cpp",
|
||||||
"clangstaticanalyzerlogfilereader.h",
|
"clangstaticanalyzerlogfilereader.h",
|
||||||
|
"clangstaticanalyzerpathchooser.cpp",
|
||||||
|
"clangstaticanalyzerpathchooser.h",
|
||||||
"clangstaticanalyzerplugin.cpp",
|
"clangstaticanalyzerplugin.cpp",
|
||||||
"clangstaticanalyzerplugin.h",
|
"clangstaticanalyzerplugin.h",
|
||||||
"clangstaticanalyzerruncontrol.cpp",
|
"clangstaticanalyzerruncontrol.cpp",
|
||||||
|
@@ -33,10 +33,6 @@ ClangStaticAnalyzerConfigWidget::ClangStaticAnalyzerConfigWidget(
|
|||||||
{
|
{
|
||||||
m_ui->setupUi(this);
|
m_ui->setupUi(this);
|
||||||
|
|
||||||
m_ui->clangExecutableChooser->setExpectedKind(Utils::PathChooser::ExistingCommand);
|
|
||||||
m_ui->clangExecutableChooser->setHistoryCompleter(
|
|
||||||
QLatin1String("ClangStaticAnalyzer.ClangCommand.History"));
|
|
||||||
m_ui->clangExecutableChooser->setPromptDialogTitle(tr("Clang Command"));
|
|
||||||
m_ui->clangExecutableChooser->setPath(settings->clangExecutable());
|
m_ui->clangExecutableChooser->setPath(settings->clangExecutable());
|
||||||
connect(m_ui->clangExecutableChooser, &Utils::PathChooser::changed,
|
connect(m_ui->clangExecutableChooser, &Utils::PathChooser::changed,
|
||||||
m_settings, &ClangStaticAnalyzerSettings::setClangExecutable);
|
m_settings, &ClangStaticAnalyzerSettings::setClangExecutable);
|
||||||
|
@@ -30,7 +30,7 @@
|
|||||||
<item row="0" column="1">
|
<item row="0" column="1">
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
<item>
|
<item>
|
||||||
<widget class="Utils::PathChooser" name="clangExecutableChooser" native="true"/>
|
<widget class="ClangStaticAnalyzer::Internal::PathChooser" name="clangExecutableChooser" native="true"/>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
@@ -88,9 +88,9 @@
|
|||||||
</widget>
|
</widget>
|
||||||
<customwidgets>
|
<customwidgets>
|
||||||
<customwidget>
|
<customwidget>
|
||||||
<class>Utils::PathChooser</class>
|
<class>ClangStaticAnalyzer::Internal::PathChooser</class>
|
||||||
<extends>QWidget</extends>
|
<extends>QWidget</extends>
|
||||||
<header location="global">utils/pathchooser.h</header>
|
<header location="global">clangstaticanalyzer/clangstaticanalyzerpathchooser.h</header>
|
||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
|
@@ -0,0 +1,40 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2015 The Qt Company Ltd
|
||||||
|
** All rights reserved.
|
||||||
|
** For any questions to The Qt Company, please use contact form at http://www.qt.io/contact-us
|
||||||
|
**
|
||||||
|
** This file is part of the Qt Enterprise LicenseChecker Add-on.
|
||||||
|
**
|
||||||
|
** Licensees holding valid Qt Enterprise licenses may use this file in
|
||||||
|
** accordance with the Qt Enterprise License Agreement provided with the
|
||||||
|
** Software or, alternatively, in accordance with the terms contained in
|
||||||
|
** a written agreement between you and The Qt Company.
|
||||||
|
**
|
||||||
|
** If you have questions regarding the use of this file, please use
|
||||||
|
** contact form at http://www.qt.io/contact-us
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
#include "clangstaticanalyzerpathchooser.h"
|
||||||
|
|
||||||
|
#include "clangstaticanalyzerutils.h"
|
||||||
|
|
||||||
|
namespace ClangStaticAnalyzer {
|
||||||
|
namespace Internal {
|
||||||
|
|
||||||
|
PathChooser::PathChooser(QWidget *parent) : Utils::PathChooser(parent)
|
||||||
|
{
|
||||||
|
setExpectedKind(Utils::PathChooser::ExistingCommand);
|
||||||
|
setHistoryCompleter(QLatin1String("ClangStaticAnalyzer.ClangCommand.History"));
|
||||||
|
setPromptDialogTitle(tr("Clang Command"));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PathChooser::validatePath(const QString &path, QString *errorMessage)
|
||||||
|
{
|
||||||
|
if (!Utils::PathChooser::validatePath(path, errorMessage))
|
||||||
|
return false;
|
||||||
|
return isClangExecutableUsable(fileName().toString(), errorMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Internal
|
||||||
|
} // namespace ClangStaticAnalyzer
|
40
plugins/clangstaticanalyzer/clangstaticanalyzerpathchooser.h
Normal file
40
plugins/clangstaticanalyzer/clangstaticanalyzerpathchooser.h
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2015 The Qt Company Ltd
|
||||||
|
** All rights reserved.
|
||||||
|
** For any questions to The Qt Company, please use contact form at http://www.qt.io/contact-us
|
||||||
|
**
|
||||||
|
** This file is part of the Qt Enterprise LicenseChecker Add-on.
|
||||||
|
**
|
||||||
|
** Licensees holding valid Qt Enterprise licenses may use this file in
|
||||||
|
** accordance with the Qt Enterprise License Agreement provided with the
|
||||||
|
** Software or, alternatively, in accordance with the terms contained in
|
||||||
|
** a written agreement between you and The Qt Company.
|
||||||
|
**
|
||||||
|
** If you have questions regarding the use of this file, please use
|
||||||
|
** contact form at http://www.qt.io/contact-us
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
#ifndef QTC_CLANGSTATICANALYZER_PATHCHOOSER_H
|
||||||
|
#define QTC_CLANGSTATICANALYZER_PATHCHOOSER_H
|
||||||
|
|
||||||
|
#include <utils/pathchooser.h>
|
||||||
|
|
||||||
|
namespace ClangStaticAnalyzer {
|
||||||
|
namespace Internal {
|
||||||
|
|
||||||
|
class PathChooser : public Utils::PathChooser
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
PathChooser(QWidget *parent = 0);
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool validatePath(const QString &path, QString *errorMessage = 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Internal
|
||||||
|
} // namespace ClangStaticAnalyzer
|
||||||
|
|
||||||
|
#endif // Include guard.
|
@@ -23,6 +23,7 @@
|
|||||||
|
|
||||||
#include <utils/environment.h>
|
#include <utils/environment.h>
|
||||||
|
|
||||||
|
#include <QCoreApplication>
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
|
|
||||||
static bool isFileExecutable(const QString &executablePath)
|
static bool isFileExecutable(const QString &executablePath)
|
||||||
@@ -63,7 +64,7 @@ QString clangExecutable(const QString &fileNameOrPath, bool *isValid)
|
|||||||
executable = executableFromPath;
|
executable = executableFromPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
*isValid = isFileExecutable(executable);
|
*isValid = isFileExecutable(executable) && isClangExecutableUsable(executable);
|
||||||
return executable;
|
return executable;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,5 +75,20 @@ QString createFullLocationString(const ClangStaticAnalyzer::Internal::Location &
|
|||||||
return filePath + QLatin1Char(':') + lineNumber;
|
return filePath + QLatin1Char(':') + lineNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isClangExecutableUsable(const QString &filePath, QString *errorMessage)
|
||||||
|
{
|
||||||
|
const QFileInfo fi(filePath);
|
||||||
|
if (fi.isSymLink() && fi.symLinkTarget().contains(QLatin1String("icecc"))) {
|
||||||
|
if (errorMessage) {
|
||||||
|
*errorMessage = QCoreApplication::translate("ClangStaticAnalyzer",
|
||||||
|
"The chosen file \"%1\" seems to point to an icecc binary not suitable "
|
||||||
|
"for analyzing.\nPlease set a real clang executable.")
|
||||||
|
.arg(filePath);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
} // namespace ClangStaticAnalyzer
|
} // namespace ClangStaticAnalyzer
|
||||||
|
@@ -25,13 +25,13 @@ QT_BEGIN_NAMESPACE
|
|||||||
class QString;
|
class QString;
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace ClangStaticAnalyzer {
|
namespace ClangStaticAnalyzer {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
class Location;
|
class Location;
|
||||||
|
|
||||||
|
bool isClangExecutableUsable(const QString &filePath, QString *errorMessage = 0);
|
||||||
|
|
||||||
QString clangExecutable(const QString &fileNameOrPath, bool *isValid);
|
QString clangExecutable(const QString &fileNameOrPath, bool *isValid);
|
||||||
QString clangExecutableFromSettings(const QString &toolchainType, bool *isValid);
|
QString clangExecutableFromSettings(const QString &toolchainType, bool *isValid);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user