Merge remote-tracking branch 'origin/12.0' into qds/dev

Change-Id: I264d3ce1a2d568c9f68c12c9ecd58fefd4c672a5
This commit is contained in:
Tim Jenssen
2024-01-18 12:06:08 +01:00
50 changed files with 350 additions and 553 deletions

View File

@@ -8,7 +8,7 @@ on:
env: env:
QT_VERSION: 6.6.0 QT_VERSION: 6.6.0
MACOS_DEPLOYMENT_TARGET: 10.15 MACOS_DEPLOYMENT_TARGET: 11.0
CLANG_VERSION: 17.0.1 CLANG_VERSION: 17.0.1
ELFUTILS_VERSION: 0.175 ELFUTILS_VERSION: 0.175
CMAKE_VERSION: 3.21.1 CMAKE_VERSION: 3.21.1

View File

@@ -17,8 +17,11 @@ https://doc.qt.io/qtcreator/creator-overview.html
The standalone binary packages support the following platforms: The standalone binary packages support the following platforms:
* Windows 10 (64-bit) or later * Windows 10 (64-bit) or later
* (K)Ubuntu Linux 20.04 (64-bit) or later * (K)Ubuntu Linux 22.04 (64-bit) or later
* macOS 10.15 or later * macOS 11 or later
When you compile Qt Creator yourself, the Qt version that you build with
determines the supported platforms.
## Contributing ## Contributing

View File

@@ -1,6 +1,6 @@
set(IDE_VERSION "12.0.1") # The IDE version. set(IDE_VERSION "12.0.2") # The IDE version.
set(IDE_VERSION_COMPAT "12.0.0") # The IDE Compatibility version. set(IDE_VERSION_COMPAT "12.0.0") # The IDE Compatibility version.
set(IDE_VERSION_DISPLAY "12.0.1") # The IDE display version. set(IDE_VERSION_DISPLAY "12.0.2") # The IDE display version.
set(IDE_COPYRIGHT_YEAR "2023") # The IDE current copyright year. set(IDE_COPYRIGHT_YEAR "2023") # The IDE current copyright year.
set(IDE_SETTINGSVARIANT "QtProject") # The IDE settings variation. set(IDE_SETTINGSVARIANT "QtProject") # The IDE settings variation.

View File

@@ -13,7 +13,7 @@ instructions:
variableValue: "https://ci-files02-hki.ci.qt.io/packages/jenkins/archive/qt/6.6/6.6.0-released/Qt" variableValue: "https://ci-files02-hki.ci.qt.io/packages/jenkins/archive/qt/6.6/6.6.0-released/Qt"
- type: EnvironmentVariable - type: EnvironmentVariable
variableName: QTC_QT_MODULES variableName: QTC_QT_MODULES
variableValue: "qt5compat qtbase qtdeclarative qtimageformats qtquick3d qtquickcontrols2 qtquicktimeline qtserialport qtshadertools qtsvg qttools qttranslations qtwebengine" variableValue: "qt5compat qtbase qtdeclarative qtimageformats qtquick3d qtquicktimeline qtserialport qtshadertools qtsvg qttools qttranslations qtwebengine"
- type: EnvironmentVariable - type: EnvironmentVariable
variableName: MACOSX_DEPLOYMENT_TARGET variableName: MACOSX_DEPLOYMENT_TARGET
variableValue: 10.15 variableValue: 10.15

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -1,4 +1,4 @@
// Copyright (C) 2023 The Qt Company Ltd. // Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*! /*!
@@ -183,6 +183,16 @@
To hide the output, select the \inlineimage icons/rightsidebaricon.png To hide the output, select the \inlineimage icons/rightsidebaricon.png
(\uicontrol {Hide/Show Right Sidebar}) button or press \key {Alt+Shift+0}. (\uicontrol {Hide/Show Right Sidebar}) button or press \key {Alt+Shift+0}.
\section1 CLICOLOR_FORCE Environment Variable
\QC sets the environment variable \c CLICOLOR_FORCE to \e 1 to show
ANSI-colored output for CMake. This might affect the process output.
If the output looks incorrect or different from earlier \QC versions, try
setting \c CLICOLOR_FORCE to \e 0 in \uicontrol {Use Build Environment}.
\image qtcreator-build-configuration-set-clicolor-force.webp {Build Environment with CLICOLOR_FORCE set}
\section1 CMake Build Steps \section1 CMake Build Steps
\QC builds CMake projects by running \c {cmake . --build}, which then runs \QC builds CMake projects by running \c {cmake . --build}, which then runs

View File

@@ -25,7 +25,7 @@
\section1 Linux \section1 Linux
(K)Ubuntu Linux 20.04 (64-bit) or later is supported. (K)Ubuntu Linux 22.04 (64-bit) or later is supported.
To build Qt applications using \QC on Linux, you usually need the To build Qt applications using \QC on Linux, you usually need the
following: following:
@@ -51,7 +51,7 @@
\section1 macOS \section1 macOS
\macos 10.15 or later is supported with the Xcode tools for your \macos \macos 11.0 or later is supported with the Xcode tools for your \macos
version available in the Mac App Store. version available in the Mac App Store.
\section1 Windows \section1 Windows

View File

@@ -7,7 +7,7 @@ Module {
property string qtcreator_display_version: '12.0.1' property string qtcreator_display_version: '12.0.1'
property string ide_version_major: '12' property string ide_version_major: '12'
property string ide_version_minor: '0' property string ide_version_minor: '0'
property string ide_version_release: '1' property string ide_version_release: '2'
property string qtcreator_version: ide_version_major + '.' + ide_version_minor + '.' property string qtcreator_version: ide_version_major + '.' + ide_version_minor + '.'
+ ide_version_release + ide_version_release

View File

@@ -1125,6 +1125,11 @@ public:
[[maybe_unused]] const Document *context, [[maybe_unused]] const Document *context,
[[maybe_unused]] ValueOwner *valueOwner, [[maybe_unused]] ValueOwner *valueOwner,
[[maybe_unused]] Snapshot *snapshot) {} [[maybe_unused]] Snapshot *snapshot) {}
virtual Utils::FilePaths prioritizeImportPaths([[maybe_unused]] const Document *context,
const Utils::FilePaths &importPaths)
{
return importPaths;
}
}; };
} // namespace QmlJS } // namespace QmlJS

View File

@@ -219,6 +219,7 @@ Context::ImportsPerDocument LinkPrivate::linkImports()
document.data(), document.data(),
m_valueOwner, m_valueOwner,
&m_snapshot); &m_snapshot);
m_importPaths = provider->prioritizeImportPaths(document.data(), m_importPaths);
} }
populateImportedTypes(imports, document); populateImportedTypes(imports, document);

View File

@@ -386,10 +386,13 @@ QString TerminalView::textFromSelection() const
if (!d->m_selection) if (!d->m_selection)
return {}; return {};
if (d->m_selection->start == d->m_selection->end)
return {};
CellIterator it = d->m_surface->iteratorAt(d->m_selection->start); CellIterator it = d->m_surface->iteratorAt(d->m_selection->start);
CellIterator end = d->m_surface->iteratorAt(d->m_selection->end); CellIterator end = d->m_surface->iteratorAt(d->m_selection->end);
if (it.position() >= end.position()) { if (it.position() > end.position()) {
qCWarning(selectionLog) << "Invalid selection: start >= end"; qCWarning(selectionLog) << "Invalid selection: start >= end";
return {}; return {};
} }
@@ -1070,7 +1073,7 @@ void TerminalView::mousePressEvent(QMouseEvent *event)
} }
if (event->button() == Qt::LeftButton) { if (event->button() == Qt::LeftButton) {
if (std::chrono::system_clock::now() - d->m_lastDoubleClick < 500ms) { if (d->m_selection && std::chrono::system_clock::now() - d->m_lastDoubleClick < 500ms) {
d->m_selectLineMode = true; d->m_selectLineMode = true;
const Selection newSelection{d->m_surface->gridToPos( const Selection newSelection{d->m_surface->gridToPos(
{0, {0,

View File

@@ -14,6 +14,11 @@ namespace Timeline {
class TraceEvent : public SafeCastable<TraceEvent> class TraceEvent : public SafeCastable<TraceEvent>
{ {
public: public:
TraceEvent(const TraceEvent &) = default;
TraceEvent(TraceEvent &&) = default;
TraceEvent &operator=(const TraceEvent &) = default;
TraceEvent &operator=(TraceEvent &&) = default;
qint64 timestamp() const { return m_timestamp; } qint64 timestamp() const { return m_timestamp; }
void setTimestamp(qint64 timestamp) { m_timestamp = timestamp; } void setTimestamp(qint64 timestamp) { m_timestamp = timestamp; }
@@ -29,11 +34,6 @@ protected:
: m_timestamp(timestamp), m_typeIndex(typeIndex), m_classId(classId) : m_timestamp(timestamp), m_typeIndex(typeIndex), m_classId(classId)
{} {}
TraceEvent(const TraceEvent &) = default;
TraceEvent(TraceEvent &&) = default;
TraceEvent &operator=(const TraceEvent &) = default;
TraceEvent &operator=(TraceEvent &&) = default;
private: private:
qint64 m_timestamp; qint64 m_timestamp;
qint32 m_typeIndex; qint32 m_typeIndex;

View File

@@ -15,6 +15,11 @@ namespace Timeline {
class TraceEventType : public SafeCastable<TraceEventType> class TraceEventType : public SafeCastable<TraceEventType>
{ {
public: public:
TraceEventType(const TraceEventType &) = default;
TraceEventType(TraceEventType &&) = default;
TraceEventType &operator=(const TraceEventType &) = default;
TraceEventType &operator=(TraceEventType &&) = default;
const QString &displayName() const { return m_displayName; } const QString &displayName() const { return m_displayName; }
void setDisplayName(const QString &displayName) { m_displayName = displayName; } void setDisplayName(const QString &displayName) { m_displayName = displayName; }
@@ -28,11 +33,6 @@ protected:
: m_displayName(displayName), m_classId(classId), m_feature(feature) : m_displayName(displayName), m_classId(classId), m_feature(feature)
{} {}
TraceEventType(const TraceEventType &) = default;
TraceEventType(TraceEventType &&) = default;
TraceEventType &operator=(const TraceEventType &) = default;
TraceEventType &operator=(TraceEventType &&) = default;
private: private:
QString m_displayName; QString m_displayName;
qint32 m_classId; qint32 m_classId;

View File

@@ -604,7 +604,7 @@ TreeItem::~TreeItem()
{ {
QTC_CHECK(m_parent == nullptr); QTC_CHECK(m_parent == nullptr);
QTC_CHECK(m_model == nullptr); QTC_CHECK(m_model == nullptr);
removeChildren(); removeChildrenSilently();
} }
TreeItem *TreeItem::childAt(int pos) const TreeItem *TreeItem::childAt(int pos) const
@@ -714,6 +714,13 @@ void TreeItem::removeChildren()
} }
} }
void TreeItem::removeChildrenSilently()
{
if (childCount() == 0)
return;
clear();
}
void TreeItem::sortChildren(const std::function<bool(const TreeItem *, const TreeItem *)> &cmp) void TreeItem::sortChildren(const std::function<bool(const TreeItem *, const TreeItem *)> &cmp)
{ {
if (m_model) { if (m_model) {
@@ -1060,6 +1067,13 @@ TreeItem *BaseTreeModel::rootItem() const
} }
void BaseTreeModel::setRootItem(TreeItem *item) void BaseTreeModel::setRootItem(TreeItem *item)
{
beginResetModel();
setRootItemInternal(item);
endResetModel();
}
void BaseTreeModel::setRootItemInternal(TreeItem *item)
{ {
QTC_ASSERT(item, return); QTC_ASSERT(item, return);
QTC_ASSERT(item->m_model == nullptr, return); QTC_ASSERT(item->m_model == nullptr, return);
@@ -1067,19 +1081,17 @@ void BaseTreeModel::setRootItem(TreeItem *item)
QTC_ASSERT(item != m_root, return); QTC_ASSERT(item != m_root, return);
QTC_CHECK(m_root); QTC_CHECK(m_root);
beginResetModel();
if (m_root) { if (m_root) {
QTC_CHECK(m_root->m_parent == nullptr); QTC_CHECK(m_root->m_parent == nullptr);
QTC_CHECK(m_root->m_model == this); QTC_CHECK(m_root->m_model == this);
// needs to be done explicitly before setting the model to 0, otherwise it might lead to a // needs to be done explicitly before setting the model to 0, otherwise it might lead to a
// crash inside a view or proxy model, especially if there are selected items // crash inside a view or proxy model, especially if there are selected items
m_root->removeChildren(); m_root->removeChildrenSilently();
m_root->m_model = nullptr; m_root->m_model = nullptr;
delete m_root; delete m_root;
} }
m_root = item; m_root = item;
item->propagateModel(this); item->propagateModel(this);
endResetModel();
} }
void BaseTreeModel::setHeader(const QStringList &displays) void BaseTreeModel::setHeader(const QStringList &displays)

View File

@@ -39,6 +39,7 @@ public:
void removeChildAt(int pos); void removeChildAt(int pos);
void removeChildren(); void removeChildren();
void removeChildrenSilently();
void sortChildren(const std::function<bool(const TreeItem *, const TreeItem *)> &cmp); void sortChildren(const std::function<bool(const TreeItem *, const TreeItem *)> &cmp);
void update(); void update();
void updateAll(); void updateAll();
@@ -180,7 +181,8 @@ protected:
void clear(); void clear();
TreeItem *rootItem() const; TreeItem *rootItem() const;
void setRootItem(TreeItem *item); void setRootItem(TreeItem *item); // resets the model
void setRootItemInternal(TreeItem *item);
TreeItem *itemForIndex(const QModelIndex &) const; TreeItem *itemForIndex(const QModelIndex &) const;
QModelIndex indexForItem(const TreeItem *needle) const; QModelIndex indexForItem(const TreeItem *needle) const;

View File

@@ -126,10 +126,8 @@ void AndroidPlugin::kitsRestored()
return v->targetDeviceTypes().contains(Android::Constants::ANDROID_DEVICE_TYPE); return v->targetDeviceTypes().contains(Android::Constants::ANDROID_DEVICE_TYPE);
}).isEmpty(); }).isEmpty();
if (!AndroidConfigurations::currentConfig().sdkFullyConfigured() && qtForAndroidInstalled) { if (!AndroidConfigurations::currentConfig().sdkFullyConfigured() && qtForAndroidInstalled)
connect(Core::ICore::instance(), &Core::ICore::coreOpened, this, askUserAboutAndroidSetup();
&AndroidPlugin::askUserAboutAndroidSetup, Qt::QueuedConnection);
}
AndroidConfigurations::registerNewToolChains(); AndroidConfigurations::registerNewToolChains();
AndroidConfigurations::updateAutomaticKitList(); AndroidConfigurations::updateAutomaticKitList();

View File

@@ -392,6 +392,7 @@ Utils::ChangeSet convertReplacements(const QTextDocument *doc,
.size(); .size();
QString replacementText = QString::fromStdString(replacement.getReplacementText().str()); QString replacementText = QString::fromStdString(replacement.getReplacementText().str());
replacementText.replace("\r", "");
auto sameCharAt = [&](int replacementOffset) { auto sameCharAt = [&](int replacementOffset) {
if (replacementText.size() <= replacementOffset || replacementOffset < 0) if (replacementText.size() <= replacementOffset || replacementOffset < 0)
return false; return false;
@@ -782,7 +783,8 @@ void ClangFormatBaseIndenter::autoIndent(const QTextCursor &cursor,
} }
} }
clang::format::FormatStyle overrideStyle(const Utils::FilePath &fileName) clang::format::FormatStyle ClangFormatBaseIndenter::overrideStyle(
const Utils::FilePath &fileName) const
{ {
const ProjectExplorer::Project *projectForFile const ProjectExplorer::Project *projectForFile
= ProjectExplorer::ProjectManager::projectForFile(fileName); = ProjectExplorer::ProjectManager::projectForFile(fileName);
@@ -792,6 +794,9 @@ clang::format::FormatStyle overrideStyle(const Utils::FilePath &fileName)
? projectForFile->editorConfiguration()->codeStyle("Cpp")->currentPreferences() ? projectForFile->editorConfiguration()->codeStyle("Cpp")->currentPreferences()
: TextEditor::TextEditorSettings::codeStyle("Cpp")->currentPreferences(); : TextEditor::TextEditorSettings::codeStyle("Cpp")->currentPreferences();
if (m_overriddenPreferences)
preferences = m_overriddenPreferences->currentPreferences();
Utils::FilePath filePath = filePathToCurrentSettings(preferences); Utils::FilePath filePath = filePathToCurrentSettings(preferences);
if (!filePath.exists()) if (!filePath.exists())
@@ -854,4 +859,9 @@ const clang::format::FormatStyle &ClangFormatBaseIndenter::styleForFile() const
return m_cachedStyle.style; return m_cachedStyle.style;
} }
void ClangFormatBaseIndenter::setOverriddenPreferences(TextEditor::ICodeStylePreferences *preferences)
{
m_overriddenPreferences = preferences;
}
} // namespace ClangFormat } // namespace ClangFormat

View File

@@ -49,6 +49,8 @@ public:
const clang::format::FormatStyle &styleForFile() const; const clang::format::FormatStyle &styleForFile() const;
void setOverriddenPreferences(TextEditor::ICodeStylePreferences *preferences);
protected: protected:
virtual bool formatCodeInsteadOfIndent() const { return false; } virtual bool formatCodeInsteadOfIndent() const { return false; }
virtual bool formatWhileTyping() const { return false; } virtual bool formatWhileTyping() const { return false; }
@@ -84,6 +86,9 @@ private:
}; };
mutable CachedStyle m_cachedStyle; mutable CachedStyle m_cachedStyle;
clang::format::FormatStyle overrideStyle(const Utils::FilePath &fileName) const;
TextEditor::ICodeStylePreferences *m_overriddenPreferences = nullptr;
}; };
} // namespace ClangFormat } // namespace ClangFormat

View File

@@ -129,7 +129,9 @@ ClangFormatConfigWidget::ClangFormatConfigWidget(TextEditor::ICodeStylePreferenc
displaySettings.m_visualizeWhitespace = true; displaySettings.m_visualizeWhitespace = true;
d->preview->setDisplaySettings(displaySettings); d->preview->setDisplaySettings(displaySettings);
d->preview->setPlainText(QLatin1String(CppEditor::Constants::DEFAULT_CODE_STYLE_SNIPPETS[0])); d->preview->setPlainText(QLatin1String(CppEditor::Constants::DEFAULT_CODE_STYLE_SNIPPETS[0]));
d->preview->textDocument()->setIndenter(new ClangFormatIndenter(d->preview->document())); auto *indenter = new ClangFormatIndenter(d->preview->document());
indenter->setOverriddenPreferences(codeStyle);
d->preview->textDocument()->setIndenter(indenter);
d->preview->textDocument()->setFontSettings(TextEditor::TextEditorSettings::fontSettings()); d->preview->textDocument()->setFontSettings(TextEditor::TextEditorSettings::fontSettings());
d->preview->textDocument()->setSyntaxHighlighter(new CppEditor::CppHighlighter); d->preview->textDocument()->setSyntaxHighlighter(new CppEditor::CppHighlighter);
d->preview->textDocument()->indenter()->setFileName(fileName); d->preview->textDocument()->indenter()->setFileName(fileName);
@@ -271,7 +273,7 @@ void ClangFormatConfigWidget::updatePreview()
QTextCursor cursor(d->preview->document()); QTextCursor cursor(d->preview->document());
cursor.setPosition(0); cursor.setPosition(0);
cursor.movePosition(QTextCursor::End, QTextCursor::KeepAnchor); cursor.movePosition(QTextCursor::End, QTextCursor::KeepAnchor);
d->preview->textDocument()->autoIndent(cursor); d->preview->textDocument()->autoFormatOrIndent(cursor);
} }
std::string ClangFormatConfigWidget::readFile(const QString &path) std::string ClangFormatConfigWidget::readFile(const QString &path)

View File

@@ -216,7 +216,8 @@ void CMakeBuildSystem::requestDebugging()
bool CMakeBuildSystem::supportsAction(Node *context, ProjectAction action, const Node *node) const bool CMakeBuildSystem::supportsAction(Node *context, ProjectAction action, const Node *node) const
{ {
if (dynamic_cast<CMakeTargetNode *>(context)) const auto cmakeTarget = dynamic_cast<CMakeTargetNode *>(context);
if (cmakeTarget && cmakeTarget->productType() != ProductType::Other)
return action == ProjectAction::AddNewFile || action == ProjectAction::AddExistingFile return action == ProjectAction::AddNewFile || action == ProjectAction::AddExistingFile
|| action == ProjectAction::AddExistingDirectory || action == ProjectAction::Rename || action == ProjectAction::AddExistingDirectory || action == ProjectAction::Rename
|| action == ProjectAction::RemoveFile; || action == ProjectAction::RemoveFile;
@@ -1623,7 +1624,9 @@ CMakeBuildConfiguration *CMakeBuildSystem::cmakeBuildConfiguration() const
static FilePaths librarySearchPaths(const CMakeBuildSystem *bs, const QString &buildKey) static FilePaths librarySearchPaths(const CMakeBuildSystem *bs, const QString &buildKey)
{ {
const CMakeBuildTarget cmakeBuildTarget const CMakeBuildTarget cmakeBuildTarget
= Utils::findOrDefault(bs->buildTargets(), Utils::equal(&CMakeBuildTarget::title, buildKey)); = Utils::findOrDefault(bs->buildTargets(), [buildKey](const auto &target) {
return target.title == buildKey && target.targetType != UtilityType;
});
return cmakeBuildTarget.libraryDirectories; return cmakeBuildTarget.libraryDirectories;
} }

View File

@@ -48,10 +48,6 @@ static LocatorMatcherTasks cmakeMatchers(const BuildAcceptor &acceptor)
continue; continue;
const int index = target.title.indexOf(input, 0, Qt::CaseInsensitive); const int index = target.title.indexOf(input, 0, Qt::CaseInsensitive);
if (index >= 0) { if (index >= 0) {
const FilePath path = target.backtrace.isEmpty()
? cmakeProject->projectFilePath()
: target.backtrace.last().path;
const int line = target.backtrace.isEmpty() ? 0 : target.backtrace.last().line;
const FilePath projectPath = cmakeProject->projectFilePath(); const FilePath projectPath = cmakeProject->projectFilePath();
const QString displayName = target.title; const QString displayName = target.title;
LocatorFilterEntry entry; LocatorFilterEntry entry;
@@ -62,11 +58,20 @@ static LocatorMatcherTasks cmakeMatchers(const BuildAcceptor &acceptor)
return AcceptResult(); return AcceptResult();
}; };
} }
entry.linkForEditor = {path, line}; bool realTarget = false;
entry.extraInfo = path.shortNativePath(); if (!target.backtrace.isEmpty() && target.targetType != UtilityType) {
const FilePath path = target.backtrace.last().path;
const int line = target.backtrace.last().line;
entry.linkForEditor = {path, line};
entry.extraInfo = path.shortNativePath();
realTarget = true;
} else {
entry.extraInfo = projectPath.shortNativePath();
}
entry.highlightInfo = {index, int(input.length())}; entry.highlightInfo = {index, int(input.length())};
entry.filePath = cmakeProject->projectFilePath(); entry.filePath = cmakeProject->projectFilePath();
entries.append(entry); if (acceptor || realTarget)
entries.append(entry);
} }
} }
} }

View File

@@ -307,6 +307,8 @@ QVariant DocumentModelPrivate::data(const QModelIndex &index, int role) const
return QVariant(); return QVariant();
case Qt::ToolTipRole: case Qt::ToolTipRole:
return entry->filePath().isEmpty() ? entry->displayName() : entry->filePath().toUserOutput(); return entry->filePath().isEmpty() ? entry->displayName() : entry->filePath().toUserOutput();
case DocumentModel::FilePathRole:
return entry->filePath().toVariant();
default: default:
break; break;
} }

View File

@@ -69,6 +69,8 @@ public:
static QList<IEditor *> editorsForDocuments(const QList<IDocument *> &entries); static QList<IEditor *> editorsForDocuments(const QList<IDocument *> &entries);
static QList<IEditor *> editorsForOpenedDocuments(); static QList<IEditor *> editorsForOpenedDocuments();
static const int FilePathRole = Qt::UserRole + 23;
private: private:
DocumentModel(); DocumentModel();
}; };

View File

@@ -17,6 +17,8 @@
#include <QApplication> #include <QApplication>
#include <QMenu> #include <QMenu>
using namespace Utils;
namespace Core::Internal { namespace Core::Internal {
class ProxyModel : public QAbstractProxyModel class ProxyModel : public QAbstractProxyModel
@@ -253,8 +255,8 @@ QVariant ProxyModel::data(const QModelIndex &index, int role) const
const QVariant sourceDecoration = QAbstractProxyModel::data(index, role); const QVariant sourceDecoration = QAbstractProxyModel::data(index, role);
if (sourceDecoration.isValid()) if (sourceDecoration.isValid())
return sourceDecoration; return sourceDecoration;
const QString fileName = QAbstractProxyModel::data(index, Qt::DisplayRole).toString(); const QVariant filePath = QAbstractProxyModel::data(index, DocumentModel::FilePathRole);
return Utils::FileIconProvider::icon(Utils::FilePath::fromString(fileName)); return FileIconProvider::icon(FilePath::fromVariant(filePath));
} }
return QAbstractProxyModel::data(index, role); return QAbstractProxyModel::data(index, role);

View File

@@ -623,10 +623,8 @@ void ExternalToolRunner::run()
} }
m_process = new Process(this); m_process = new Process(this);
connect(m_process, &Process::done, this, &ExternalToolRunner::done); connect(m_process, &Process::done, this, &ExternalToolRunner::done);
connect(m_process, &Process::readyReadStandardOutput, m_process->setStdOutLineCallback([this](const QString &s) { readStandardOutput(s); });
this, &ExternalToolRunner::readStandardOutput); m_process->setStdErrLineCallback([this](const QString &s) { readStandardError(s); });
connect(m_process, &Process::readyReadStandardError,
this, &ExternalToolRunner::readStandardError);
if (!m_resolvedWorkingDirectory.isEmpty()) if (!m_resolvedWorkingDirectory.isEmpty())
m_process->setWorkingDirectory(m_resolvedWorkingDirectory); m_process->setWorkingDirectory(m_resolvedWorkingDirectory);
const CommandLine cmd{m_resolvedExecutable, m_resolvedArguments, CommandLine::Raw}; const CommandLine cmd{m_resolvedExecutable, m_resolvedArguments, CommandLine::Raw};
@@ -665,30 +663,29 @@ void ExternalToolRunner::done()
deleteLater(); deleteLater();
} }
void ExternalToolRunner::readStandardOutput() static QString stripNewline(const QString &output)
{
if (output.endsWith('\n'))
return output.chopped(1);
return output;
}
void ExternalToolRunner::readStandardOutput(const QString &output)
{ {
if (m_tool->outputHandling() == ExternalTool::Ignore) if (m_tool->outputHandling() == ExternalTool::Ignore)
return; return;
const QByteArray data = m_process->readAllRawStandardOutput();
const QString output = m_outputCodec->toUnicode(data.constData(),
data.length(),
&m_outputCodecState);
if (m_tool->outputHandling() == ExternalTool::ShowInPane) if (m_tool->outputHandling() == ExternalTool::ShowInPane)
MessageManager::writeSilently(output); MessageManager::writeSilently(stripNewline(output));
else if (m_tool->outputHandling() == ExternalTool::ReplaceSelection) else if (m_tool->outputHandling() == ExternalTool::ReplaceSelection)
m_processOutput.append(output); m_processOutput.append(output);
} }
void ExternalToolRunner::readStandardError() void ExternalToolRunner::readStandardError(const QString &output)
{ {
if (m_tool->errorHandling() == ExternalTool::Ignore) if (m_tool->errorHandling() == ExternalTool::Ignore)
return; return;
const QByteArray data = m_process->readAllRawStandardError();
const QString output = m_outputCodec->toUnicode(data.constData(),
data.length(),
&m_errorCodecState);
if (m_tool->errorHandling() == ExternalTool::ShowInPane) if (m_tool->errorHandling() == ExternalTool::ShowInPane)
MessageManager::writeSilently(output); MessageManager::writeSilently(stripNewline(output));
else if (m_tool->errorHandling() == ExternalTool::ReplaceSelection) else if (m_tool->errorHandling() == ExternalTool::ReplaceSelection)
m_processOutput.append(output); m_processOutput.append(output);
} }

View File

@@ -115,8 +115,8 @@ public:
private: private:
void done(); void done();
void readStandardOutput(); void readStandardOutput(const QString &output);
void readStandardError(); void readStandardError(const QString &output);
void run(); void run();
bool resolve(); bool resolve();
@@ -128,6 +128,7 @@ private:
Utils::FilePath m_resolvedWorkingDirectory; Utils::FilePath m_resolvedWorkingDirectory;
Utils::Environment m_resolvedEnvironment; Utils::Environment m_resolvedEnvironment;
Utils::Process *m_process; Utils::Process *m_process;
// TODO remove codec handling, that is done by Process now
QTextCodec *m_outputCodec; QTextCodec *m_outputCodec;
QTextCodec::ConverterState m_outputCodecState; QTextCodec::ConverterState m_outputCodecState;
QTextCodec::ConverterState m_errorCodecState; QTextCodec::ConverterState m_errorCodecState;

View File

@@ -811,10 +811,24 @@ ListModel *SectionedGridView::addSection(const Section &section, const QList<Lis
vbox->insertWidget(position, sectionLabel); vbox->insertWidget(position, sectionLabel);
vbox->insertWidget(position + 1, gridView); vbox->insertWidget(position + 1, gridView);
struct ItemHash
{
std::size_t operator()(ListItem *item) const { return std::hash<QString>{}(item->name); }
};
struct ItemEqual
{
bool operator()(ListItem *lhs, ListItem *rhs) const
{
return lhs->name == rhs->name && lhs->description == rhs->description;
}
};
// add the items also to the all products model to be able to search correctly // add the items also to the all products model to be able to search correctly
const QSet<ListItem *> allItems = toSet(m_allItemsModel->items()); const QList<ListItem *> allItems = m_allItemsModel->items();
const QList<ListItem *> newItems = filtered(items, [&allItems](ListItem *item) { const std::unordered_set<ListItem *, ItemHash, ItemEqual> uniqueItems{allItems.constBegin(),
return !allItems.contains(item); allItems.constEnd()};
const QList<ListItem *> newItems = filtered(items, [&uniqueItems](ListItem *item) {
return uniqueItems.find(item) == uniqueItems.end();
}); });
m_allItemsModel->appendItems(newItems); m_allItemsModel->appendItems(newItems);

View File

@@ -605,6 +605,11 @@ public:
m_codeStyleEditor->apply(); m_codeStyleEditor->apply();
} }
void finish() final
{
m_codeStyleEditor->finish();
}
CppCodeStylePreferences *m_pageCppCodeStylePreferences = nullptr; CppCodeStylePreferences *m_pageCppCodeStylePreferences = nullptr;
CodeStyleEditorWidget *m_codeStyleEditor; CodeStyleEditorWidget *m_codeStyleEditor;
}; };

View File

@@ -219,7 +219,7 @@ void OutlineModel::rebuild()
auto root = new SymbolItem; auto root = new SymbolItem;
if (m_cppDocument) if (m_cppDocument)
buildTree(root, true); buildTree(root, true);
setRootItem(root); setRootItemInternal(root);
endResetModel(); endResetModel();
} }

View File

@@ -782,6 +782,7 @@ SearchResultItems symbolOccurrencesInDeclarationComments(
QList<Text::Range> symbolOccurrencesInText(const QTextDocument &doc, QStringView text, int offset, QList<Text::Range> symbolOccurrencesInText(const QTextDocument &doc, QStringView text, int offset,
const QString &symbolName) const QString &symbolName)
{ {
QTC_ASSERT(!symbolName.isEmpty(), return QList<Text::Range>());
QList<Text::Range> ranges; QList<Text::Range> ranges;
int index = 0; int index = 0;
while (true) { while (true) {

View File

@@ -4407,6 +4407,13 @@ void GdbEngine::setupInferior()
if (rp.breakOnMain) if (rp.breakOnMain)
runCommand({"tbreak " + mainFunction()}); runCommand({"tbreak " + mainFunction()});
if (!rp.solibSearchPath.isEmpty()) {
DebuggerCommand cmd("appendSolibSearchPath");
cmd.arg("path", transform(rp.solibSearchPath, &FilePath::path));
cmd.arg("separator", HostOsInfo::pathListSeparator());
runCommand(cmd);
}
if (rp.startMode == AttachToRemoteProcess) { if (rp.startMode == AttachToRemoteProcess) {
handleInferiorPrepared(); handleInferiorPrepared();
@@ -4429,13 +4436,6 @@ void GdbEngine::setupInferior()
// if (!remoteArch.isEmpty()) // if (!remoteArch.isEmpty())
// postCommand("set architecture " + remoteArch); // postCommand("set architecture " + remoteArch);
if (!rp.solibSearchPath.isEmpty()) {
DebuggerCommand cmd("appendSolibSearchPath");
for (const FilePath &filePath : rp.solibSearchPath)
cmd.arg("path", filePath.path());
cmd.arg("separator", HostOsInfo::pathListSeparator());
runCommand(cmd);
}
if (!args.isEmpty()) if (!args.isEmpty())
runCommand({"-exec-arguments " + args}); runCommand({"-exec-arguments " + args});

View File

@@ -1048,6 +1048,7 @@ void FakeVimPluginPrivate::initialize()
INSTALL_HANDLER, Context(Core::Constants::C_GLOBAL), true); INSTALL_HANDLER, Context(Core::Constants::C_GLOBAL), true);
cmd->setDefaultKeySequence(QKeySequence(useMacShortcuts ? Tr::tr("Meta+Shift+Y,Meta+Shift+Y") cmd->setDefaultKeySequence(QKeySequence(useMacShortcuts ? Tr::tr("Meta+Shift+Y,Meta+Shift+Y")
: Tr::tr("Alt+Y,Alt+Y"))); : Tr::tr("Alt+Y,Alt+Y")));
connect(cmd->action(), &QAction::triggered, [this] { settings().writeSettings(); });
ActionContainer *advancedMenu = ActionContainer *advancedMenu =
ActionManager::actionContainer(Core::Constants::M_EDIT_ADVANCED); ActionManager::actionContainer(Core::Constants::M_EDIT_ADVANCED);

View File

@@ -236,7 +236,7 @@ bool IosDeployStep::checkProvisioningProfile()
return true; return true;
const QStringList deviceIds = provisionPlist.value("ProvisionedDevices").toStringList(); const QStringList deviceIds = provisionPlist.value("ProvisionedDevices").toStringList();
const QString targetId = device->uniqueDeviceID(); const QString targetId = device->uniqueInternalDeviceId();
for (const QString &deviceId : deviceIds) { for (const QString &deviceId : deviceIds) {
if (deviceId == targetId) if (deviceId == targetId)
return true; return true;

View File

@@ -317,7 +317,7 @@ public:
}); });
setProposal(m_processor->start(std::move(interface)), prefix); setProposal(m_processor->start(std::move(interface)), prefix);
if (!m_processor->running()) { if (m_processor && !m_processor->running()) {
delete m_processor; delete m_processor;
m_processor = nullptr; m_processor = nullptr;
} }

View File

@@ -119,6 +119,30 @@ void McuSupportImportProvider::loadBuiltins(ImportsPerDocument *importsPerDocume
import.info = ImportInfo::moduleImport("qul", {1, 0}, QString()); import.info = ImportInfo::moduleImport("qul", {1, 0}, QString());
getInterfacesImport(context->fileName(), importsPerDocument, import, valueOwner, snapshot); getInterfacesImport(context->fileName(), importsPerDocument, import, valueOwner, snapshot);
imports->append(import); imports->append(import);
}
FilePaths McuSupportImportProvider::prioritizeImportPaths(const Document *context,
const FilePaths &importPaths)
{
if (!context)
return importPaths;
const std::optional<FilePath> cmakeFilesPathOpt = getTargetBuildFolder(context->fileName());
if (!cmakeFilesPathOpt)
return importPaths;
FilePaths ret;
// qmltocpp uses an incomplete QtQuick folder present in the build folder
// to avoid taking precedence over the correct qul_install/include/*/StyleDefault
// move the import path to be last
std::copy_if(importPaths.cbegin(),
importPaths.cend(),
std::back_inserter(ret),
[cmakeFilesPathOpt](const FilePath &path) { return path != *cmakeFilesPathOpt; });
// nothing was removed
if (ret.size() == importPaths.size())
return importPaths;
ret.push_back(*cmakeFilesPathOpt);
return ret;
}; };
void McuSupportImportProvider::getInterfacesImport(const FilePath &path, void McuSupportImportProvider::getInterfacesImport(const FilePath &path,
@@ -156,6 +180,7 @@ std::optional<FilePath> McuSupportImportProvider::getFileModule(const FilePath &
const FilePath &inputFile) const const FilePath &inputFile) const
{ {
const auto doc = QJsonDocument::fromJson(inputFile.fileContents().value_or("")); const auto doc = QJsonDocument::fromJson(inputFile.fileContents().value_or(""));
if (!doc.isObject()) if (!doc.isObject())
return {}; return {};

View File

@@ -29,6 +29,9 @@ public:
ValueOwner *valueOwner, ValueOwner *valueOwner,
Snapshot *snapshot) override; Snapshot *snapshot) override;
virtual Utils::FilePaths prioritizeImportPaths(const Document *context,
const Utils::FilePaths &importPaths) override;
// Add to the interfaces needed for a document // Add to the interfaces needed for a document
// path: opened qml document // path: opened qml document
// importsPerDocument: imports available in the document (considered imported) // importsPerDocument: imports available in the document (considered imported)

View File

@@ -2,6 +2,7 @@
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "abi.h" #include "abi.h"
#include "projectexplorerconstants.h"
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/environment.h> #include <utils/environment.h>
@@ -437,6 +438,18 @@ static Abis abiOf(const QByteArray &data)
return result; return result;
} }
static QString androidAbiFromAbi(const Abi &abi)
{
QString androidAbi;
if (abi.architecture() == Abi::Architecture::ArmArchitecture)
androidAbi = QLatin1String(abi.wordWidth() == 64 ? Constants::ANDROID_ABI_ARM64_V8A
: Constants::ANDROID_ABI_ARMEABI_V7A);
else
androidAbi = QLatin1String(abi.wordWidth() == 64 ? Constants::ANDROID_ABI_X86_64
: Constants::ANDROID_ABI_X86);
return androidAbi;
}
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// Abi // Abi
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
@@ -908,7 +921,11 @@ Abi Abi::fromString(const QString &abiString)
return Abi(architecture, os, flavor, format, 0); return Abi(architecture, os, flavor, format, 0);
} }
return Abi(architecture, os, flavor, format, wordWidth); Abi abi(architecture, os, flavor, format, wordWidth);
if (abi.os() == LinuxOS && abi.osFlavor() == AndroidLinuxFlavor)
abi.m_param = androidAbiFromAbi(abi);
return abi;
} }
Abi::Architecture Abi::architectureFromString(const QString &a) Abi::Architecture Abi::architectureFromString(const QString &a)

View File

@@ -305,6 +305,7 @@ bool CustomToolChain::operator ==(const ToolChain &other) const
auto customTc = static_cast<const CustomToolChain *>(&other); auto customTc = static_cast<const CustomToolChain *>(&other);
return m_makeCommand == customTc->m_makeCommand return m_makeCommand == customTc->m_makeCommand
&& compilerCommand() == customTc->compilerCommand()
&& targetAbi() == customTc->targetAbi() && targetAbi() == customTc->targetAbi()
&& m_predefinedMacros == customTc->m_predefinedMacros && m_predefinedMacros == customTc->m_predefinedMacros
&& m_builtInHeaderPaths == customTc->m_builtInHeaderPaths; && m_builtInHeaderPaths == customTc->m_builtInHeaderPaths;

View File

@@ -348,7 +348,7 @@ FilePath Node::pathOrDirectory(bool dir) const
QTC_CHECK(!location.needsDevice()); QTC_CHECK(!location.needsDevice());
QFileInfo fi = location.toFileInfo(); QFileInfo fi = location.toFileInfo();
while ((!fi.exists() || !fi.isDir()) && !fi.isRoot()) while ((!fi.exists() || !fi.isDir()) && !fi.isRoot() && (fi.fileName() != fi.absolutePath()))
fi.setFile(fi.absolutePath()); fi.setFile(fi.absolutePath());
return FilePath::fromString(fi.absoluteFilePath()); return FilePath::fromString(fi.absoluteFilePath());
} }

View File

@@ -78,7 +78,7 @@ class QtVersionData
{ {
public: public:
// Update version if you add data members! // Update version if you add data members!
static const int version = 2; static const int version = 3;
bool installed = true; bool installed = true;
bool hasExamples = false; bool hasExamples = false;
@@ -207,8 +207,11 @@ public:
hostDataPath = FilePath::fromSettings(map.value("HostDataPath")); hostDataPath = FilePath::fromSettings(map.value("HostDataPath"));
hostPrefixPath = FilePath::fromSettings(map.value("HostPrefixPath")); hostPrefixPath = FilePath::fromSettings(map.value("HostPrefixPath"));
auto it = map.find("QtAbis"); auto it = map.find("QtAbis");
if (it != map.end()) if (it != map.end()) {
qtAbis = Utils::transform(it.value().toStringList(), &Abi::fromString); const auto qtAbisList = it.value().toStringList();
if (!qtAbisList.isEmpty())
qtAbis = Utils::transform(qtAbisList, &Abi::fromString);
}
versionInfo = fromStore(map.value("VersionInfo").value<Store>()); versionInfo = fromStore(map.value("VersionInfo").value<Store>());
} }
}; };

View File

@@ -363,7 +363,8 @@ void ExamplesViewController::updateExamples()
const QStringList sources = m_exampleSetModel->exampleSources(&examplesInstallPath, const QStringList sources = m_exampleSetModel->exampleSources(&examplesInstallPath,
&demosInstallPath, &demosInstallPath,
&qtVersion); &qtVersion,
m_isExamples);
QStringList categoryOrder; QStringList categoryOrder;
QList<ExampleItem *> items; QList<ExampleItem *> items;
for (const QString &exampleSource : sources) { for (const QString &exampleSource : sources) {
@@ -493,12 +494,15 @@ QtVersion *ExampleSetModel::findHighestQtVersion(const QtVersions &versions) con
QStringList ExampleSetModel::exampleSources(QString *examplesInstallPath, QStringList ExampleSetModel::exampleSources(QString *examplesInstallPath,
QString *demosInstallPath, QString *demosInstallPath,
QVersionNumber *qtVersion) QVersionNumber *qtVersion,
bool isExamples)
{ {
QStringList sources; QStringList sources;
// Qt Creator shipped tutorials if (!isExamples) {
sources << ":/qtsupport/qtcreator_tutorials.xml"; // Qt Creator shipped tutorials
sources << ":/qtsupport/qtcreator_tutorials.xml";
}
QString examplesPath; QString examplesPath;
QString demosPath; QString demosPath;

View File

@@ -41,7 +41,8 @@ public:
bool selectExampleSet(int index); bool selectExampleSet(int index);
QStringList exampleSources(QString *examplesInstallPath, QStringList exampleSources(QString *examplesInstallPath,
QString *demosInstallPath, QString *demosInstallPath,
QVersionNumber *qtVersion); QVersionNumber *qtVersion,
bool isExamples);
bool selectedQtSupports(const Utils::Id &target) const; bool selectedQtSupports(const Utils::Id &target) const;
signals: signals:

View File

@@ -58,7 +58,11 @@ GroupItem KillAppStep::deployRecipe()
addProgressMessage(Tr::tr("Failed to kill remote application. " addProgressMessage(Tr::tr("Failed to kill remote application. "
"Assuming it was not running.")); "Assuming it was not running."));
}; };
return DeviceProcessKillerTask(setupHandler, doneHandler, errorHandler); const Group root {
finishAllAndDone,
DeviceProcessKillerTask(setupHandler, doneHandler, errorHandler)
};
return root;
} }
KillAppStepFactory::KillAppStepFactory() KillAppStepFactory::KillAppStepFactory()

View File

@@ -20,7 +20,9 @@
#include <utils/stringutils.h> #include <utils/stringutils.h>
#include <utils/utilsicons.h> #include <utils/utilsicons.h>
#include <QDesktopServices>
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QRegularExpression>
#include <QScrollBar> #include <QScrollBar>
#include <QTextBrowser> #include <QTextBrowser>
#include <QTimer> #include <QTimer>
@@ -70,9 +72,22 @@ public:
// preview // preview
m_previewWidget = new QTextBrowser(); m_previewWidget = new QTextBrowser();
m_previewWidget->setOpenExternalLinks(true); m_previewWidget->setOpenLinks(false); // we want to open files in QtC, not the browser
m_previewWidget->setFrameShape(QFrame::NoFrame); m_previewWidget->setFrameShape(QFrame::NoFrame);
new Utils::MarkdownHighlighter(m_previewWidget->document()); new Utils::MarkdownHighlighter(m_previewWidget->document());
connect(m_previewWidget, &QTextBrowser::anchorClicked, this, [this](const QUrl &link) {
if (link.hasFragment() && link.path().isEmpty() && link.scheme().isEmpty()) {
// local anchor
m_previewWidget->scrollToAnchor(link.fragment(QUrl::FullyEncoded));
} else if (link.isLocalFile() || link.scheme().isEmpty()) {
// absolute path or relative (to the document)
// open in Qt Creator
EditorManager::openEditor(
document()->filePath().parentDir().resolvePath(link.path()));
} else {
QDesktopServices::openUrl(link);
}
});
// editor // editor
m_textEditorWidget = new TextEditorWidget; m_textEditorWidget = new TextEditorWidget;
@@ -170,6 +185,26 @@ public:
m_previewRestoreScrollPosition.reset(); m_previewRestoreScrollPosition.reset();
m_previewWidget->setMarkdown(m_document->plainText()); m_previewWidget->setMarkdown(m_document->plainText());
// Add anchors to headings. This should actually be done by Qt QTBUG-120518
for (QTextBlock block = m_previewWidget->document()->begin(); block.isValid();
block = block.next()) {
QTextBlockFormat fmt = block.blockFormat();
if (fmt.hasProperty(QTextFormat::HeadingLevel)) {
QTextCharFormat cFormat = block.charFormat();
QString anchor;
const QString text = block.text();
for (const QChar &c : text) {
if (c == ' ')
anchor.append('-');
else if (c == '_' || c == '-' || c.isDigit() || c.isLetter())
anchor.append(c.toLower());
}
cFormat.setAnchor(true);
cFormat.setAnchorNames({anchor});
QTextCursor cursor(block);
cursor.setBlockCharFormat(cFormat);
}
}
m_previewWidget->horizontalScrollBar()->setValue(positions.x()); m_previewWidget->horizontalScrollBar()->setValue(positions.x());
m_previewWidget->verticalScrollBar()->setValue(positions.y()); m_previewWidget->verticalScrollBar()->setValue(positions.y());

View File

@@ -8563,7 +8563,7 @@ QAction * TextEditorWidget::insertExtraToolBarWidget(TextEditorWidget::Side side
findLeftMostAction); findLeftMostAction);
return d->m_toolBar->insertWidget(before, widget); return d->m_toolBar->insertWidget(before, widget);
} else { } else {
return d->m_toolBar->insertWidget(d->m_fileEncodingLabelAction, widget); return d->m_toolBar->insertWidget(d->m_fileLineEndingAction, widget);
} }
} }

View File

@@ -31,6 +31,14 @@ macro(qtc_auto_setup_compiler_standard toolchainFile)
endif() endif()
endforeach() endforeach()
endforeach() endforeach()
# Forward important CMake variables to the package manager in the toolchain file
foreach(fwd_var CMAKE_MSVC_RUNTIME_LIBRARY CMAKE_SYSROOT CMAKE_OSX_SYSROOT CMAKE_OSX_ARCHITECTURES)
if (${fwd_var})
file(APPEND "${toolchainFile}"
"set(${fwd_var} ${${fwd_var}})\n")
endif()
endforeach()
endmacro() endmacro()
# #
@@ -101,47 +109,61 @@ macro(qtc_auto_setup_conan)
"include(\"${CMAKE_TOOLCHAIN_FILE}\")\n") "include(\"${CMAKE_TOOLCHAIN_FILE}\")\n")
endif() endif()
file(WRITE "${CMAKE_BINARY_DIR}/conan-dependencies/CMakeLists.txt" " file(WRITE "${CMAKE_BINARY_DIR}/conan-dependencies/CMakeLists.txt" "
cmake_minimum_required(VERSION 3.15) cmake_minimum_required(VERSION 3.15)
unset(CMAKE_PROJECT_INCLUDE_BEFORE CACHE) unset(CMAKE_PROJECT_INCLUDE_BEFORE CACHE)
project(conan-setup) project(conan-setup)
if (${conan_version} VERSION_GREATER_EQUAL 2.0) if (${conan_version} VERSION_GREATER_EQUAL 2.0)
set(CONAN_COMMAND \"${conan_program}\") set(CONAN_COMMAND \"${conan_program}\")
include(\"${CMAKE_CURRENT_LIST_DIR}/conan_provider.cmake\") include(\"${CMAKE_CURRENT_LIST_DIR}/conan_provider.cmake\")
conan_profile_detect_default() conan_profile_detect_default()
detect_host_profile(\"${CMAKE_BINARY_DIR}/conan-dependencies/conan_host_profile\") detect_host_profile(\"${CMAKE_BINARY_DIR}/conan-dependencies/conan_host_profile\")
set(build_types \${CMAKE_BUILD_TYPE})
if (CMAKE_CONFIGURATION_TYPES)
set(build_types \${CMAKE_CONFIGURATION_TYPES})
endif()
foreach(type \${build_types})
conan_install( conan_install(
-pr \"${CMAKE_BINARY_DIR}/conan-dependencies/conan_host_profile\" -pr \"${CMAKE_BINARY_DIR}/conan-dependencies/conan_host_profile\"
--build=${QT_CREATOR_CONAN_BUILD_POLICY} --build=${QT_CREATOR_CONAN_BUILD_POLICY}
-s build_type=${CMAKE_BUILD_TYPE} -s build_type=\${type}
-g CMakeDeps) -g CMakeDeps)
endforeach()
get_property(CONAN_INSTALL_SUCCESS GLOBAL PROPERTY CONAN_INSTALL_SUCCESS) get_property(CONAN_INSTALL_SUCCESS GLOBAL PROPERTY CONAN_INSTALL_SUCCESS)
if (CONAN_INSTALL_SUCCESS) if (CONAN_INSTALL_SUCCESS)
get_property(CONAN_GENERATORS_FOLDER GLOBAL PROPERTY CONAN_GENERATORS_FOLDER) get_property(CONAN_GENERATORS_FOLDER GLOBAL PROPERTY CONAN_GENERATORS_FOLDER)
file(WRITE \"${CMAKE_BINARY_DIR}/conan-dependencies/conan_paths.cmake\" \" file(WRITE \"${CMAKE_BINARY_DIR}/conan-dependencies/conan_paths.cmake\" \"
list(PREPEND CMAKE_PREFIX_PATH \\\"\${CONAN_GENERATORS_FOLDER}\\\") list(PREPEND CMAKE_PREFIX_PATH \\\"\${CONAN_GENERATORS_FOLDER}\\\")
list(PREPEND CMAKE_MODULE_PATH \\\"\${CONAN_GENERATORS_FOLDER}\\\") list(PREPEND CMAKE_MODULE_PATH \\\"\${CONAN_GENERATORS_FOLDER}\\\")
list(REMOVE_DUPLICATES CMAKE_PREFIX_PATH) list(PREPEND CMAKE_FIND_ROOT_PATH \\\"\${CONAN_GENERATORS_FOLDER}\\\")
list(REMOVE_DUPLICATES CMAKE_MODULE_PATH) list(REMOVE_DUPLICATES CMAKE_PREFIX_PATH)
set(CMAKE_PREFIX_PATH \\\"\\\${CMAKE_PREFIX_PATH}\\\" CACHE STRING \\\"\\\" FORCE) list(REMOVE_DUPLICATES CMAKE_MODULE_PATH)
set(CMAKE_MODULE_PATH \\\"\\\${CMAKE_MODULE_PATH}\\\" CACHE STRING \\\"\\\" FORCE) list(REMOVE_DUPLICATES CMAKE_FIND_ROOT_PATH)
\") set(CMAKE_PREFIX_PATH \\\"\\\${CMAKE_PREFIX_PATH}\\\" CACHE STRING \\\"\\\" FORCE)
endif() set(CMAKE_MODULE_PATH \\\"\\\${CMAKE_MODULE_PATH}\\\" CACHE STRING \\\"\\\" FORCE)
else() set(CMAKE_FIND_ROOT_PATH \\\"\\\${CMAKE_FIND_ROOT_PATH}\\\" CACHE STRING \\\"\\\" FORCE)
include(\"${CMAKE_CURRENT_LIST_DIR}/conan.cmake\") \")
conan_cmake_run(
CONANFILE \"${conanfile_txt}\"
INSTALL_FOLDER \"${CMAKE_BINARY_DIR}/conan-dependencies\"
GENERATORS cmake_paths cmake_find_package json
BUILD ${QT_CREATOR_CONAN_BUILD_POLICY}
ENV CONAN_CMAKE_TOOLCHAIN_FILE=\"${CMAKE_BINARY_DIR}/conan-dependencies/toolchain.cmake\"
)
endif() endif()
") else()
include(\"${CMAKE_CURRENT_LIST_DIR}/conan.cmake\")
conan_cmake_run(
CONANFILE \"${conanfile_txt}\"
INSTALL_FOLDER \"${CMAKE_BINARY_DIR}/conan-dependencies\"
GENERATORS cmake_paths cmake_find_package json
BUILD ${QT_CREATOR_CONAN_BUILD_POLICY}
ENV CONAN_CMAKE_TOOLCHAIN_FILE=\"${CMAKE_BINARY_DIR}/conan-dependencies/toolchain.cmake\"
)
endif()
")
if (NOT DEFINED CMAKE_BUILD_TYPE AND NOT DEFINED CMAKE_CONFIGURATION_TYPES)
set(CMAKE_CONFIGURATION_TYPES "Debug;Release")
endif()
execute_process(COMMAND ${CMAKE_COMMAND} execute_process(COMMAND ${CMAKE_COMMAND}
-S "${CMAKE_BINARY_DIR}/conan-dependencies/" -S "${CMAKE_BINARY_DIR}/conan-dependencies/"
@@ -150,6 +172,7 @@ macro(qtc_auto_setup_conan)
-D "CMAKE_TOOLCHAIN_FILE=${CMAKE_BINARY_DIR}/conan-dependencies/toolchain.cmake" -D "CMAKE_TOOLCHAIN_FILE=${CMAKE_BINARY_DIR}/conan-dependencies/toolchain.cmake"
-G ${CMAKE_GENERATOR} -G ${CMAKE_GENERATOR}
-D CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -D CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-D "CMAKE_CONFIGURATION_TYPES=${CMAKE_CONFIGURATION_TYPES}"
RESULT_VARIABLE result RESULT_VARIABLE result
) )
if (result EQUAL 0) if (result EQUAL 0)

View File

@@ -3984,7 +3984,7 @@ namespace qstring {
// Check string "HiDu" QString. // Check string "HiDu" QString.
// Continue. // Continue.
delete pstring; delete pstring;
dummyStatement(&str, &string, pstring); dummyStatement(&str, &string, &pstring);
} }
void testQString4() void testQString4()

View File

@@ -207,7 +207,8 @@ def __getExpectedCompilers__():
for c in ('clang++', 'clang', 'afl-clang', for c in ('clang++', 'clang', 'afl-clang',
'clang-[0-9]', 'clang-[0-9].[0-9]', 'clang-1[0-9]', 'clang-1[0-9].[0-9]', 'clang-[0-9]', 'clang-[0-9].[0-9]', 'clang-1[0-9]', 'clang-1[0-9].[0-9]',
'*g++*', '*gcc*'): '*g++*', '*gcc*'):
compilers.extend(findAllFilesInPATH(c)) filesInPath = set(findAllFilesInPATH(c))
compilers.extend(filesInPath | set(map(os.path.realpath, filesInPath)))
if platform.system() == 'Darwin': if platform.system() == 'Darwin':
for compilerExe in ('clang++', 'clang'): for compilerExe in ('clang++', 'clang'):
xcodeClang = getOutputFromCmdline(["xcrun", "--find", compilerExe]).strip("\n") xcodeClang = getOutputFromCmdline(["xcrun", "--find", compilerExe]).strip("\n")