diff options
author | Orgad Shaneh <orgad.shaneh@audiocodes.com> | 2017-06-02 15:03:36 +0300 |
---|---|---|
committer | Orgad Shaneh <orgad.shaneh@audiocodes.com> | 2017-06-02 15:13:51 +0300 |
commit | 89057b552b0b9bbe24d4e3552e12ae94aa713fa8 (patch) | |
tree | ed1dfaa961828b6e08e7f348d7567cf8b2248320 /src | |
parent | a9d511ff7d3e42c6f516a98c036c624e969be2d8 (diff) | |
parent | ec3015663a536ebeb96a24b5cf5643b4324f6c54 (diff) |
Merge remote-tracking branch 'origin/4.3'
Change-Id: I56004e3ec9dc9d92d33bdae438c4f7e069eccc45
Diffstat (limited to 'src')
25 files changed, 145 insertions, 32 deletions
diff --git a/src/libs/3rdparty/cplusplus/Symbols.h b/src/libs/3rdparty/cplusplus/Symbols.h index 4cd8141beb..e29f78bf01 100644 --- a/src/libs/3rdparty/cplusplus/Symbols.h +++ b/src/libs/3rdparty/cplusplus/Symbols.h @@ -503,7 +503,7 @@ protected: virtual void visitSymbol0(SymbolVisitor *visitor); private: - bool _isVariadic; + bool _isVariadic = false; bool _isVirtual; FullySpecifiedType _type; }; diff --git a/src/libs/libs.pro b/src/libs/libs.pro index 34a5d938bf..178a7a4cb8 100644 --- a/src/libs/libs.pro +++ b/src/libs/libs.pro @@ -38,5 +38,11 @@ win32:SUBDIRS += utils/process_ctrlc_stub.pro # Windows: Compile Qt Creator CDB extension if Debugging tools can be detected. win32: isEmpty(QTC_SKIP_CDBEXT) { include(qtcreatorcdbext/cdb_detect.pri) - exists($$CDB_PATH):SUBDIRS += qtcreatorcdbext + exists($$CDB_PATH) { + SUBDIRS += qtcreatorcdbext + } else { + message("Compiling Qt Creator without a CDB extension.") + message("If CDB is installed in a none default path define a CDB_PATH") + message("environment variable pointing to your CDB installation.") + } } diff --git a/src/libs/qtcreatorcdbext/pytype.cpp b/src/libs/qtcreatorcdbext/pytype.cpp index 2525a65114..ec67771824 100644 --- a/src/libs/qtcreatorcdbext/pytype.cpp +++ b/src/libs/qtcreatorcdbext/pytype.cpp @@ -40,6 +40,8 @@ #include <dbghelp.h> #endif +#include <regex> + constexpr bool debugPyType = false; constexpr bool debuggingTypeEnabled() { return debugPyType || debugPyCdbextModule; } @@ -289,6 +291,9 @@ int PyType::code() const if (FAILED(ExtensionCommandContext::instance()->symbols()->CreateSymbolGroup2(&sg))) return TypeCodeStruct; + if (knownType(name(), 0) != KT_Unknown) + return TypeCodeStruct; + const std::string helperValueName = SymbolGroupValue::pointedToSymbolName(0, name(true)); ULONG index = DEBUG_ANY_ID; if (SUCCEEDED(sg->AddSymbol(helperValueName.c_str(), &index))) @@ -411,6 +416,10 @@ PyType PyType::lookupType(const std::string &typeNameIn, ULONG64 module) if (typeName == "__int64" || typeName == "unsigned __int64") typeName.erase(typeName.find("__"), 2); + const static std::regex typeNameRE("^[a-zA-Z_][a-zA-Z0-9_]*!?[a-zA-Z0-9_<>:, \\*\\&\\[\\]]*$"); + if (!std::regex_match(typeName, typeNameRE)) + return PyType(); + CIDebugSymbols *symbols = ExtensionCommandContext::instance()->symbols(); ULONG typeId; HRESULT result = S_FALSE; diff --git a/src/libs/qtcreatorcdbext/qtcreatorcdbext.pro b/src/libs/qtcreatorcdbext/qtcreatorcdbext.pro index 058ed485b6..545656dc24 100644 --- a/src/libs/qtcreatorcdbext/qtcreatorcdbext.pro +++ b/src/libs/qtcreatorcdbext/qtcreatorcdbext.pro @@ -138,6 +138,8 @@ exists($$PYTHON_INSTALL_DIR) { CONFIG(release, debug|release): deploy_python.recurse = Release CONFIG(debug, debug|release): deploy_python.recurse = Debug QMAKE_EXTRA_TARGETS += deploy_python +} else { + message("Set PYTHON_INSTALL_DIR pointing to Python 3.5 or greater to enable the python dumpers for cdb.") } target.path = $$QTC_PREFIX/lib/$${DIRNAME} # TODO this should go to INSTALL_LIBRARY_PATH/$${DIRNAME} diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index e1c3b47128..fc6d80f729 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -49,6 +49,11 @@ class QWidget; QTCREATOR_UTILS_EXPORT QDebug operator<<(QDebug dbg, const Utils::FileName &c); +// for withNTFSPermissions +#ifdef Q_OS_WIN +extern Q_CORE_EXPORT int qt_ntfs_permission_lookup; +#endif + QT_END_NAMESPACE namespace Utils { @@ -121,6 +126,28 @@ public: static QString resolvePath(const QString &baseDir, const QString &fileName); }; +// for actually finding out if e.g. directories are writable on Windows +#ifdef Q_OS_WIN + +template <typename T> +static T withNTFSPermissions(const std::function<T()> &task) +{ + qt_ntfs_permission_lookup++; + T result = task(); + qt_ntfs_permission_lookup--; + return result; +} + +#else // Q_OS_WIN + +template <typename T> +static T withNTFSPermissions(const std::function<T()> &task) +{ + return task(); +} + +#endif // Q_OS_WIN + class QTCREATOR_UTILS_EXPORT FileReader { Q_DECLARE_TR_FUNCTIONS(Utils::FileUtils) // sic! diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 0aa9b46740..be5f6df961 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -100,18 +100,21 @@ namespace { const QLatin1String ArmToolchainPrefix("arm-linux-androideabi"); const QLatin1String X86ToolchainPrefix("x86"); const QLatin1String MipsToolchainPrefix("mipsel-linux-android"); + const QLatin1String Mips64ToolchainPrefix("mips64el-linux-android"); const QLatin1String AArch64ToolchainPrefix("aarch64-linux-android"); const QLatin1String X86_64ToolchainPrefix("x86_64"); const QLatin1String ArmToolsPrefix("arm-linux-androideabi"); const QLatin1String X86ToolsPrefix("i686-linux-android"); const QLatin1String MipsToolsPrefix("mipsel-linux-android"); + const QLatin1String Mips64ToolsPrefix("mips64el-linux-android"); const QLatin1String AArch64ToolsPrefix("aarch64-linux-android"); const QLatin1String X86_64ToolsPrefix("x86_64-linux-android"); const QLatin1String ArmToolsDisplayName("arm"); const QLatin1String X86ToolsDisplayName("i686"); const QLatin1String MipsToolsDisplayName("mipsel"); + const QLatin1String Mips64ToolsDisplayName("mips64el"); const QLatin1String AArch64ToolsDisplayName("aarch64"); const QLatin1String X86_64ToolsDisplayName("x86_64"); @@ -172,6 +175,9 @@ Abi AndroidConfig::abiForToolChainPrefix(const QString &toolchainPrefix) } else if (toolchainPrefix == X86_64ToolchainPrefix) { arch = Abi::X86Architecture; wordWidth = 64; + } else if (toolchainPrefix == Mips64ToolchainPrefix) { + arch = Abi::MipsArchitecture; + wordWidth = 64; } return Abi(arch, Abi::LinuxOS, Abi::AndroidLinuxFlavor, Abi::ElfFormat, wordWidth); @@ -189,6 +195,8 @@ QLatin1String AndroidConfig::toolchainPrefix(const Abi &abi) return X86_64ToolchainPrefix; return X86ToolchainPrefix; case Abi::MipsArchitecture: + if (abi.wordWidth() == 64) + return Mips64ToolchainPrefix; return MipsToolchainPrefix; default: return Unknown; @@ -207,6 +215,8 @@ QLatin1String AndroidConfig::toolsPrefix(const Abi &abi) return X86_64ToolsPrefix; return X86ToolsPrefix; case Abi::MipsArchitecture: + if (abi.wordWidth() == 64) + return Mips64ToolsPrefix; return MipsToolsPrefix; default: return Unknown; @@ -225,6 +235,8 @@ QLatin1String AndroidConfig::displayName(const Abi &abi) return X86_64ToolsDisplayName; return X86ToolsDisplayName; case Abi::MipsArchitecture: + if (abi.wordWidth() == 64) + return Mips64ToolsDisplayName; return MipsToolsDisplayName; default: return Unknown; diff --git a/src/plugins/android/androidtoolchain.cpp b/src/plugins/android/androidtoolchain.cpp index 0f8defe6d1..c8223dd81a 100644 --- a/src/plugins/android/androidtoolchain.cpp +++ b/src/plugins/android/androidtoolchain.cpp @@ -311,7 +311,7 @@ QList<AndroidToolChainFactory::AndroidToolChainInformation> AndroidToolChainFact ati.version = fileName.mid(idx + 1); QString platform = fileName.left(idx); ati.abi = AndroidConfig::abiForToolChainPrefix(platform); - if (ati.abi.architecture() == Abi::UnknownArchitecture) // e.g. mipsel which is not yet supported + if (ati.abi.architecture() == Abi::UnknownArchitecture) continue; ati.compilerCommand = AndroidConfigurations::currentConfig().gccPath(ati.abi, lang, ati.version); result.append(ati); @@ -399,7 +399,7 @@ AndroidToolChainFactory::autodetectToolChainsForNdk(const FileName &ndkPath, QString version = fileName.mid(idx + 1); QString platform = fileName.left(idx); Abi abi = AndroidConfig::abiForToolChainPrefix(platform); - if (abi.architecture() == Abi::UnknownArchitecture) // e.g. mipsel which is not yet supported + if (abi.architecture() == Abi::UnknownArchitecture) continue; QList<AndroidToolChain *> toolChainBundle; for (Core::Id lang : {ProjectExplorer::Constants::CXX_LANGUAGE_ID, ProjectExplorer::Constants::C_LANGUAGE_ID}) { @@ -447,7 +447,7 @@ QList<int> AndroidToolChainFactory::newestToolChainVersionForArch(const Abi &abi QList<int> version = versionNumberFromString(fileName.mid(idx + 1)); QString platform = fileName.left(idx); Abi abi = AndroidConfig::abiForToolChainPrefix(platform); - if (abi.architecture() == Abi::UnknownArchitecture) // e.g. mipsel which is not yet supported + if (abi.architecture() == Abi::UnknownArchitecture) continue; QHash<Abi, QList<int> >::const_iterator it = m_newestVersionForAbi.constFind(abi); diff --git a/src/plugins/android/avddialog.cpp b/src/plugins/android/avddialog.cpp index eb7da93e90..03d29d4e23 100644 --- a/src/plugins/android/avddialog.cpp +++ b/src/plugins/android/avddialog.cpp @@ -45,10 +45,12 @@ AvdDialog::AvdDialog(int minApiLevel, const QString &targetArch, const AndroidCo m_hideTipTimer.setInterval(2000); m_hideTipTimer.setSingleShot(true); - if (targetArch.isEmpty()) - m_avdDialog.abiComboBox->addItems(QStringList({"armeabi-v7a", "armeabi", "x86", "mips"})); - else + if (targetArch.isEmpty()) { + m_avdDialog.abiComboBox->addItems(QStringList({"armeabi-v7a", "armeabi", "x86", "mips", + "arm64-v8a", "x86_64", "mips64"})); + } else { m_avdDialog.abiComboBox->addItems(QStringList(targetArch)); + } QRegExpValidator *v = new QRegExpValidator(m_allowedNameChars, this); m_avdDialog.nameLineEdit->setValidator(v); diff --git a/src/plugins/cmakeprojectmanager/cmakekitconfigwidget.cpp b/src/plugins/cmakeprojectmanager/cmakekitconfigwidget.cpp index a3c0b396df..f0be80b42e 100644 --- a/src/plugins/cmakeprojectmanager/cmakekitconfigwidget.cpp +++ b/src/plugins/cmakeprojectmanager/cmakekitconfigwidget.cpp @@ -279,11 +279,20 @@ QString CMakeGeneratorKitConfigWidget::toolTip() const void CMakeGeneratorKitConfigWidget::changeGenerator() { QPointer<QDialog> changeDialog = new QDialog(m_changeButton); + + // Disable help button in titlebar on windows: + Qt::WindowFlags flags = changeDialog->windowFlags(); + flags &= ~Qt::WindowContextHelpButtonHint; + flags |= Qt::MSWindowsFixedSizeDialogHint; + changeDialog->setWindowFlags(flags); + changeDialog->setWindowTitle(tr("CMake Generator")); auto *layout = new QGridLayout(changeDialog); + layout->setSizeConstraint(QLayout::SetFixedSize); auto *cmakeLabel = new QLabel; + cmakeLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); auto *generatorCombo = new QComboBox; auto *extraGeneratorCombo = new QComboBox; diff --git a/src/plugins/coreplugin/find/searchresultwidget.cpp b/src/plugins/coreplugin/find/searchresultwidget.cpp index 5bf7e49240..b09fc6e8fd 100644 --- a/src/plugins/coreplugin/find/searchresultwidget.cpp +++ b/src/plugins/coreplugin/find/searchresultwidget.cpp @@ -157,6 +157,7 @@ SearchResultWidget::SearchResultWidget(QWidget *parent) : m_label = new QLabel(m_descriptionContainer); m_label->setVisible(false); m_searchTerm = new QLabel(m_descriptionContainer); + m_searchTerm->setTextFormat(Qt::PlainText); m_searchTerm->setVisible(false); descriptionLayout->addWidget(m_label); descriptionLayout->addWidget(m_searchTerm); diff --git a/src/plugins/git/gerrit/gerritmodel.cpp b/src/plugins/git/gerrit/gerritmodel.cpp index 36e24ae292..7b7f61864d 100644 --- a/src/plugins/git/gerrit/gerritmodel.cpp +++ b/src/plugins/git/gerrit/gerritmodel.cpp @@ -546,7 +546,9 @@ static GerritUser parseGerritUser(const QJsonObject &object) static int numberValue(const QJsonObject &object) { - return object.value("number").toString().toInt(); + const QJsonValue number = object.value("number"); + // Since Gerrit 2.14 (commits fa92467dc and b0cfe1401) the change and patch set numbers are int + return number.isString() ? number.toString().toInt() : number.toInt(); } /* Parse gerrit query Json output. diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 0f838dcbb2..baf1e4edcc 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -86,7 +86,7 @@ const char stashNamePrefix[] = "stash@{"; const char noColorOption[] = "--no-color"; const char decorateOption[] = "--decorate"; const char showFormatC[] = - "--pretty=format:commit %H%n" + "--pretty=format:commit %H%d%n" "Author: %an <%ae>, %ad (%ar)%n" "Committer: %cn <%ce>, %cd (%cr)%n" "%n" @@ -359,7 +359,7 @@ private: void ShowController::reload() { - const QStringList args = {"show", "-s", noColorOption, decorateOption, showFormatC, m_id}; + const QStringList args = {"show", "-s", noColorOption, showFormatC, m_id}; m_state = GettingDescription; runCommand(QList<QStringList>() << args, GitPlugin::client()->encoding(m_directory, "i18n.commitEncoding")); } diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index 4e30062424..1fa2bcb37c 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -190,6 +190,7 @@ QString GitPlugin::invalidBranchAndRemoteNamePattern() "|//" // no double slash "|^[/-]" // no leading slash or dash "|\"" // no quotes + "|\\*" // no asterisk ); } diff --git a/src/plugins/projectexplorer/abi.cpp b/src/plugins/projectexplorer/abi.cpp index 070bea6bf3..4a99590d82 100644 --- a/src/plugins/projectexplorer/abi.cpp +++ b/src/plugins/projectexplorer/abi.cpp @@ -1187,6 +1187,14 @@ void ProjectExplorer::ProjectExplorerPlugin::testAbiFromTargetTriplet_data() << int(Abi::LinuxOS) << int(Abi::GenericLinuxFlavor) << int(Abi::ElfFormat) << 32; + QTest::newRow("mips64el-linux-android") << int(Abi::MipsArchitecture) + << int(Abi::LinuxOS) << int(Abi::AndroidLinuxFlavor) + << int(Abi::ElfFormat) << 64; + + QTest::newRow("mips64el-unknown-linux-android") << int(Abi::MipsArchitecture) + << int(Abi::LinuxOS) << int(Abi::AndroidLinuxFlavor) + << int(Abi::ElfFormat) << 64; + QTest::newRow("mips64-linux-octeon-gnu") << int(Abi::MipsArchitecture) << int(Abi::LinuxOS) << int(Abi::GenericLinuxFlavor) << int(Abi::ElfFormat) << 64; diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp index a190434efd..9240aa7563 100644 --- a/src/plugins/projectexplorer/gcctoolchain.cpp +++ b/src/plugins/projectexplorer/gcctoolchain.cpp @@ -972,8 +972,13 @@ QList<ToolChain *> GccToolChainFactory::autoDetectToolchains(const QString &comp return tc->typeId() == requiredTypeId && tc->compilerCommand() == compilerPath; }); - if (!result.isEmpty()) + if (!result.isEmpty()) { + for (ToolChain *tc : result) { + if (tc->isAutoDetected()) + tc->setLanguage(language); + } return result; + } result = autoDetectToolChain(compilerPath, language, requiredAbi); @@ -1632,6 +1637,10 @@ void ProjectExplorerPlugin::testGccAbiGuessing_data() << QString::fromLatin1("powerpc64-suse-linux") << QByteArray("#define __SIZEOF_SIZE_T__ 8\n") << QStringList({"ppc-linux-generic-elf-64bit"}); + QTest::newRow("Linux 11 (64bit mips)") + << QString::fromLatin1("mips64el-linux-uclibc") + << QByteArray("#define __SIZEOF_SIZE_T__ 8") + << QStringList({"mips-linux-generic-elf-64bit"}); QTest::newRow("Mingw 1 (32bit)") << QString::fromLatin1("i686-w64-mingw32") diff --git a/src/plugins/projectexplorer/jsonwizard/jsonwizardgeneratorfactory.cpp b/src/plugins/projectexplorer/jsonwizard/jsonwizardgeneratorfactory.cpp index c58395d8a5..6d96f67114 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonwizardgeneratorfactory.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonwizardgeneratorfactory.cpp @@ -212,18 +212,15 @@ JsonWizardGenerator::OverwriteResult JsonWizardGenerator::promptForOverwrite(Jso if (overwriteDialog.exec() != QDialog::Accepted) return OverwriteCanceled; - const QStringList existingFilesToKeep = overwriteDialog.uncheckedFiles(); + const QSet<QString> existingFilesToKeep = QSet<QString>::fromList(overwriteDialog.uncheckedFiles()); if (existingFilesToKeep.size() == files->size()) // All exist & all unchecked->Cancel. return OverwriteCanceled; // Set 'keep' attribute in files - foreach (const QString &keepFile, existingFilesToKeep) { - JsonWizard::GeneratorFile file - = Utils::findOr(*files, JsonWizard::GeneratorFile(), - [&keepFile](const JsonWizard::GeneratorFile &f) - { return f.file.path() == keepFile; }); - if (!file.isValid()) - return OverwriteCanceled; + for (JsonWizard::GeneratorFile &file : *files) { + if (!existingFilesToKeep.contains(file.file.path())) + continue; + file.file.setAttributes(file.file.attributes() | GeneratedFile::KeepExistingFileAttribute); } return OverwriteOk; diff --git a/src/plugins/projectexplorer/msvctoolchain.cpp b/src/plugins/projectexplorer/msvctoolchain.cpp index af5c567f48..e931a0bd30 100644 --- a/src/plugins/projectexplorer/msvctoolchain.cpp +++ b/src/plugins/projectexplorer/msvctoolchain.cpp @@ -624,7 +624,10 @@ Utils::FileNameList MsvcToolChain::suggestedMkspecList() const << Utils::FileName::fromLatin1("winrt-x64-msvc2015"); break; case Abi::WindowsMsvc2017Flavor: - result << Utils::FileName::fromLatin1("win32-msvc2017"); + result << Utils::FileName::fromLatin1("win32-msvc2017") + << Utils::FileName::fromLatin1("winrt-arm-msvc2017") + << Utils::FileName::fromLatin1("winrt-x86-msvc2017") + << Utils::FileName::fromLatin1("winrt-x64-msvc2017"); break; default: result.clear(); diff --git a/src/plugins/projectexplorer/projectwindow.cpp b/src/plugins/projectexplorer/projectwindow.cpp index 7cbfcef34b..064e1cfffc 100644 --- a/src/plugins/projectexplorer/projectwindow.cpp +++ b/src/plugins/projectexplorer/projectwindow.cpp @@ -439,6 +439,8 @@ public: void updatePanel() { ProjectItem *projectItem = m_projectsModel.rootItem()->childAt(0); + if (!projectItem) + return; setPanel(projectItem->data(0, PanelWidgetRole).value<QWidget *>()); QModelIndex activeIndex = projectItem->activeIndex(); diff --git a/src/plugins/projectexplorer/toolchain.cpp b/src/plugins/projectexplorer/toolchain.cpp index cb63643704..53e03e16ad 100644 --- a/src/plugins/projectexplorer/toolchain.cpp +++ b/src/plugins/projectexplorer/toolchain.cpp @@ -133,7 +133,7 @@ ToolChain::ToolChain(const ToolChain &other) : void ToolChain::setLanguage(Core::Id language) { - QTC_ASSERT(!d->m_language.isValid(), return); + QTC_ASSERT(!d->m_language.isValid() || isAutoDetected(), return); QTC_ASSERT(language.isValid(), return); QTC_ASSERT(ToolChainManager::isLanguageSupported(language), return); diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp index 341ef74652..6022602f51 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp @@ -258,7 +258,7 @@ bool QmakeProjectManagerPlugin::initialize(const QStringList &arguments, QString connect(EditorManager::instance(), &EditorManager::currentEditorChanged, this, &QmakeProjectManagerPlugin::updateBuildFileAction); - updateRunQMakeAction(); + updateActions(); return true; } @@ -277,9 +277,12 @@ void QmakeProjectManagerPlugin::projectChanged() else m_previousStartupProject = qobject_cast<QmakeProject *>(SessionManager::startupProject()); - if (m_previousStartupProject) + if (m_previousStartupProject) { connect(m_previousStartupProject, &Project::activeTargetChanged, this, &QmakeProjectManagerPlugin::activeTargetChanged); + connect(m_previousStartupProject, &QmakeProject::parsingFinished, + this, &QmakeProjectManagerPlugin::updateActions); + } activeTargetChanged(); } @@ -299,6 +302,12 @@ void QmakeProjectManagerPlugin::activeTargetChanged() updateRunQMakeAction(); } +void QmakeProjectManagerPlugin::updateActions() +{ + updateRunQMakeAction(); + updateContextActions(); +} + void QmakeProjectManagerPlugin::updateRunQMakeAction() { bool enable = true; @@ -307,6 +316,7 @@ void QmakeProjectManagerPlugin::updateRunQMakeAction() auto pro = qobject_cast<QmakeProject *>(m_previousStartupProject); m_runQMakeAction->setVisible(pro); if (!pro + || !pro->rootProjectNode() || !pro->activeTarget() || !pro->activeTarget()->activeBuildConfiguration()) enable = false; @@ -334,7 +344,11 @@ void QmakeProjectManagerPlugin::updateContextActions() FileNode *fileNode = node ? node->asFileNode() : nullptr; bool buildFilePossible = subProjectNode && fileNode && (fileNode->fileType() == FileType::Source); - bool subProjectActionsVisible = qmakeProject && subProjectNode && (subProjectNode != qmakeProject->rootProjectNode()); + bool subProjectActionsVisible = false; + if (qmakeProject && subProjectNode) { + if (QmakeProFileNode *rootNode = qmakeProject->rootProjectNode()) + subProjectActionsVisible = subProjectNode != rootNode; + } QString subProjectName; if (subProjectActionsVisible) diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.h b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.h index 73e60b4bac..b6d94a9aea 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.h +++ b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.h @@ -65,6 +65,7 @@ private slots: private: void projectChanged(); void activeTargetChanged(); + void updateActions(); void updateRunQMakeAction(); void updateContextActions(); void buildStateChanged(ProjectExplorer::Project *pro); diff --git a/src/plugins/qmakeprojectmanager/qmakestep.cpp b/src/plugins/qmakeprojectmanager/qmakestep.cpp index 25c9a34cbc..99dab8044d 100644 --- a/src/plugins/qmakeprojectmanager/qmakestep.cpp +++ b/src/plugins/qmakeprojectmanager/qmakestep.cpp @@ -256,6 +256,7 @@ bool QMakeStep::init(QList<const BuildStep *> &earlierSteps) QmakeProFileNode *node = static_cast<QmakeProject *>(qmakeBc->target()->project())->rootProjectNode(); if (qmakeBc->subNodeBuild()) node = qmakeBc->subNodeBuild(); + QTC_ASSERT(node, return false); QString proFile = node->filePath().toString(); QList<ProjectExplorer::Task> tasks = qtVersion->reportIssues(proFile, workingDirectory); diff --git a/src/plugins/qtsupport/gettingstartedwelcomepage.cpp b/src/plugins/qtsupport/gettingstartedwelcomepage.cpp index 4561ce5a0f..c5ca314c05 100644 --- a/src/plugins/qtsupport/gettingstartedwelcomepage.cpp +++ b/src/plugins/qtsupport/gettingstartedwelcomepage.cpp @@ -28,6 +28,7 @@ #include "exampleslistmodel.h" #include "screenshotcropper.h" +#include <utils/fileutils.h> #include <utils/pathchooser.h> #include <utils/winutils.h> @@ -199,13 +200,16 @@ void ExamplesWelcomePage::openProject(const ExampleItem &item) if (!proFileInfo.exists()) return; - QFileInfo pathInfo(proFileInfo.path()); // If the Qt is a distro Qt on Linux, it will not be writable, hence compilation will fail - if (!proFileInfo.isWritable() - || !pathInfo.isWritable() /* path of .pro file */ - || !QFileInfo(pathInfo.path()).isWritable() /* shadow build directory */) { + // Same if it is installed in non-writable location for other reasons + const bool needsCopy = withNTFSPermissions<bool>([proFileInfo] { + QFileInfo pathInfo(proFileInfo.path()); + return !proFileInfo.isWritable() + || !pathInfo.isWritable() /* path of .pro file */ + || !QFileInfo(pathInfo.path()).isWritable() /* shadow build directory */; + }); + if (needsCopy) proFile = copyToAlternativeLocation(proFileInfo, filesToOpen, item.dependencies); - } // don't try to load help and files if loading the help request is being cancelled if (proFile.isEmpty()) diff --git a/src/plugins/valgrind/valgrindengine.cpp b/src/plugins/valgrind/valgrindengine.cpp index 8fe8d4e2a7..569b0d21f6 100644 --- a/src/plugins/valgrind/valgrindengine.cpp +++ b/src/plugins/valgrind/valgrindengine.cpp @@ -87,7 +87,8 @@ void ValgrindToolRunner::start() run->setValgrindExecutable(m_settings->valgrindExecutable()); run->setValgrindArguments(genericToolArguments() + toolArguments()); run->setDevice(device()); - run->setDebuggee(runControl()->runnable().as<StandardRunnable>()); + if (runControl()->runnable().is<StandardRunnable>()) + run->setDebuggee(runControl()->runnable().as<StandardRunnable>()); connect(run, &ValgrindRunner::processOutputReceived, this, &ValgrindToolRunner::receiveProcessOutput); @@ -113,7 +114,9 @@ void ValgrindToolRunner::stop() QString ValgrindToolRunner::executable() const { - return runControl()->runnable().as<StandardRunnable>().executable; + const Runnable &runnable = runControl()->runnable(); + return runnable.is<StandardRunnable>() ? + runnable.as<StandardRunnable>().executable : QString(); } QStringList ValgrindToolRunner::genericToolArguments() const diff --git a/src/shared/qbs b/src/shared/qbs -Subproject da5e38c5618b1ebc81f0049af3b959a65b90539 +Subproject 7687d8a145d1b00f855b306f9f364830f8dec8c |