diff options
author | Eike Ziller <eike.ziller@qt.io> | 2018-04-13 10:54:42 +0200 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2018-04-13 10:54:42 +0200 |
commit | 428fcb476ba2c5bbe1d16dfe437e510dafce1777 (patch) | |
tree | 10b130ef79d87dd1339004857c8f1e31e29c3f95 /src | |
parent | 9e29a32e1ab3af42a4d70984449ba33b3092a50b (diff) | |
parent | f4594c922fe3ffcfaf715cf09622ba48c3d1d620 (diff) | |
download | qt-creator-428fcb476ba2c5bbe1d16dfe437e510dafce1777.tar.gz |
Merge remote-tracking branch 'origin/4.6'
Conflicts:
src/libs/utils/settingsaccessor.cpp
src/plugins/autotest/autotestplugin.cpp
src/plugins/git/gitclient.cpp
src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp
src/plugins/qbsprojectmanager/qbsrunconfiguration.h
Change-Id: I65f143cad18af509a2621d6c5925abbd038ea70f
Diffstat (limited to 'src')
44 files changed, 181 insertions, 72 deletions
diff --git a/src/libs/utils/settingsaccessor.cpp b/src/libs/utils/settingsaccessor.cpp index fa359358db..0c41e20cbe 100644 --- a/src/libs/utils/settingsaccessor.cpp +++ b/src/libs/utils/settingsaccessor.cpp @@ -454,7 +454,7 @@ bool UpgradingSettingsAccessor::isValidVersionAndId(const int version, const QBy { return (version >= 0 && version >= firstSupportedVersion() && version <= currentVersion()) - && (id == m_id || m_id.isEmpty()); + && (id.isEmpty() || id == m_id || m_id.isEmpty()); } SettingsAccessor::RestoreData UpgradingSettingsAccessor::readData(const FileName &path, diff --git a/src/plugins/android/androiddeployqtstep.cpp b/src/plugins/android/androiddeployqtstep.cpp index 9142d3fd26..5e264117e9 100644 --- a/src/plugins/android/androiddeployqtstep.cpp +++ b/src/plugins/android/androiddeployqtstep.cpp @@ -156,8 +156,8 @@ bool AndroidDeployQtStep::init(QList<const BuildStep *> &earlierSteps) m_filesToPull["/system/bin/app_process32"] = buildDir + "app_process"; } } else { - m_appProcessBinaries << QLatin1String("/system/bin/app_process32") - << QLatin1String("/system/bin/app_process"); + m_filesToPull["/system/bin/app_process32"] = buildDir + "app_process"; + m_filesToPull["/system/bin/app_process"] = buildDir + "app_process"; } m_filesToPull["/system/bin/" + linkerName] = buildDir + linkerName; diff --git a/src/plugins/android/androiddeployqtstep.h b/src/plugins/android/androiddeployqtstep.h index fad99d545a..4b5534fda5 100644 --- a/src/plugins/android/androiddeployqtstep.h +++ b/src/plugins/android/androiddeployqtstep.h @@ -116,7 +116,6 @@ private: QString m_avdName; QString m_apkPath; QMap<QString, QString> m_filesToPull; - QStringList m_appProcessBinaries; QString m_targetArch; bool m_uninstallPreviousPackage = false; diff --git a/src/plugins/android/androidtoolchain.cpp b/src/plugins/android/androidtoolchain.cpp index a2aa988d47..9d3b8db27b 100644 --- a/src/plugins/android/androidtoolchain.cpp +++ b/src/plugins/android/androidtoolchain.cpp @@ -150,7 +150,8 @@ QString AndroidToolChain::typeDisplayName() const bool AndroidToolChain::isValid() const { return GccToolChain::isValid() && targetAbi().isValid() && !m_ndkToolChainVersion.isEmpty() - && compilerCommand().isChildOf(AndroidConfigurations::currentConfig().ndkLocation()); + && compilerCommand().isChildOf(AndroidConfigurations::currentConfig().ndkLocation()) + && !originalTargetTriple().isEmpty(); } void AndroidToolChain::addToEnvironment(Environment &env) const @@ -417,6 +418,9 @@ bool AndroidToolChainFactory::versionCompareLess(const QList<int> &a, const QLis bool AndroidToolChainFactory::versionCompareLess(QList<AndroidToolChain *> atc, QList<AndroidToolChain *> btc) { + if (atc.isEmpty() || btc.isEmpty()) + return false; + const QList<int> a = versionNumberFromString(atc.at(0)->ndkToolChainVersion()); const QList<int> b = versionNumberFromString(btc.at(0)->ndkToolChainVersion()); @@ -463,7 +467,7 @@ AndroidToolChainFactory::autodetectToolChainsForNdk(const FileName &ndkPath, FileName compilerPath = AndroidConfigurations::currentConfig().gccPath(abi, lang, version); AndroidToolChain *tc = findToolChain(compilerPath, lang, alreadyKnown); - if (!tc) { + if (!tc || tc->originalTargetTriple().isEmpty()) { tc = new AndroidToolChain(abi, version, lang, ToolChain::AutoDetection); tc->resetToolChain(compilerPath); @@ -473,6 +477,8 @@ AndroidToolChainFactory::autodetectToolChainsForNdk(const FileName &ndkPath, toolChainBundle.append(tc); } + QTC_ASSERT(!toolChainBundle.isEmpty(), continue); + auto it = newestToolChainForArch.constFind(abi); if (it == newestToolChainForArch.constEnd()) newestToolChainForArch.insert(abi, toolChainBundle); diff --git a/src/plugins/autotest/autotestplugin.cpp b/src/plugins/autotest/autotestplugin.cpp index 6d6957c83c..d7bb68cdec 100644 --- a/src/plugins/autotest/autotestplugin.cpp +++ b/src/plugins/autotest/autotestplugin.cpp @@ -53,6 +53,8 @@ #include <projectexplorer/buildmanager.h> #include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorericons.h> +#include <projectexplorer/session.h> +#include <projectexplorer/target.h> #include <texteditor/texteditor.h> #include <utils/textutils.h> #include <utils/utilsicons.h> @@ -248,12 +250,16 @@ void AutotestPlugin::onRunUnderCursorTriggered(TestRunMode mode) void AutotestPlugin::updateMenuItemsEnabledState() { + const ProjectExplorer::Project *project = ProjectExplorer::SessionManager::startupProject(); + const ProjectExplorer::Target *target = project ? project->activeTarget() : nullptr; const bool canScan = !TestRunner::instance()->isTestRunning() && TestTreeModel::instance()->parser()->state() == TestCodeParser::Idle; const bool hasTests = TestTreeModel::instance()->hasTests(); + // avoid expensive call to PE::canRunStartupProject() - limit to minimum necessary checks const bool canRun = hasTests && canScan - && ProjectExplorer::ProjectExplorerPlugin::canRunStartupProject( - ProjectExplorer::Constants::NORMAL_RUN_MODE); + && project && !project->needsConfiguration() + && target && target->activeRunConfiguration() + && !ProjectExplorer::BuildManager::isBuilding(); ActionManager::command(Constants::ACTION_RUN_ALL_ID)->action()->setEnabled(canRun); ActionManager::command(Constants::ACTION_RUN_SELECTED_ID)->action()->setEnabled(canRun); diff --git a/src/plugins/autotest/qtest/qttestoutputreader.cpp b/src/plugins/autotest/qtest/qttestoutputreader.cpp index a6b22a7b19..4fe43333d2 100644 --- a/src/plugins/autotest/qtest/qttestoutputreader.cpp +++ b/src/plugins/autotest/qtest/qttestoutputreader.cpp @@ -172,7 +172,9 @@ void QtTestOutputReader::processXMLOutput(const QByteArray &outputLine) if (m_className.isEmpty() && outputLine.trimmed().isEmpty()) return; - m_xmlReader.addData(outputLine); + // avoid encoding problems for Quick tests + m_xmlReader.addData(m_testType == TestType::QuickTest ? QString::fromLatin1(outputLine) + : QString::fromLocal8Bit(outputLine)); while (!m_xmlReader.atEnd()) { if (m_futureInterface.isCanceled()) return; diff --git a/src/plugins/autotoolsprojectmanager/makestep.cpp b/src/plugins/autotoolsprojectmanager/makestep.cpp index 596c2a025b..222978d44a 100644 --- a/src/plugins/autotoolsprojectmanager/makestep.cpp +++ b/src/plugins/autotoolsprojectmanager/makestep.cpp @@ -65,9 +65,6 @@ MakeStepFactory::MakeStepFactory() registerStep<MakeStep>(MAKE_STEP_ID); setDisplayName(tr("Make", "Display name for AutotoolsProjectManager::MakeStep id.")); setSupportedProjectType(AUTOTOOLS_PROJECT_ID); - setSupportedStepLists({ProjectExplorer::Constants::BUILDSTEPS_BUILD, - ProjectExplorer::Constants::BUILDSTEPS_CLEAN, - ProjectExplorer::Constants::BUILDSTEPS_DEPLOY}); } // MakeStep diff --git a/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp b/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp index 7a5a5c42d4..9df1862529 100644 --- a/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp +++ b/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp @@ -165,7 +165,9 @@ private: QString text; - if (m_displayHints.showCategoryAndEnableOption) + // Diagnostics from clazy/tidy do not have any category or option set, so + // avoid to add an empty line. + if (m_displayHints.showCategoryAndEnableOption && !diagnostic.category.isEmpty()) text.append(diagnosticCategoryAndEnableOptionRow(diagnostic)); text.append(diagnosticRow(diagnostic, IndentMode::DoNotIndent)); text.append(diagnosticRowsForChildren(diagnostic)); diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp index 3f35640c78..8a0e03deb3 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp @@ -448,6 +448,7 @@ public: , m_projectPart(projectPart) { addLanguageOptions(); + addGlobalDiagnosticOptions(); // Before addDiagnosticOptions() so users still can overwrite. addDiagnosticOptions(); addGlobalOptions(); addPrecompiledHeaderOptions(); @@ -546,6 +547,15 @@ private: addXclangArg("-plugin-arg-clang-lazy", "ignore-included-files"); } + void addGlobalDiagnosticOptions() + { + m_options.append({ + // Avoid undesired warnings from e.g. Q_OBJECT + QStringLiteral("-Wno-unknown-pragmas"), + QStringLiteral("-Wno-unknown-warning-option") + }); + } + void addGlobalOptions() { if (!m_projectPart.project) diff --git a/src/plugins/coreplugin/dialogs/ioptionspage.cpp b/src/plugins/coreplugin/dialogs/ioptionspage.cpp index 49d72dc1d9..6a336a5550 100644 --- a/src/plugins/coreplugin/dialogs/ioptionspage.cpp +++ b/src/plugins/coreplugin/dialogs/ioptionspage.cpp @@ -138,13 +138,14 @@ QIcon Core::IOptionsPage::categoryIcon() const static QList<Core::IOptionsPage *> g_optionsPages; /*! - Constructs an options page with the given \a parent. + Constructs an options page with the given \a parent and registers it + at the global options page pool if \a registerGlobally is true. */ -Core::IOptionsPage::IOptionsPage(QObject *parent) - : QObject(parent), - m_keywordsInitialized(false) +Core::IOptionsPage::IOptionsPage(QObject *parent, bool registerGlobally) + : QObject(parent) { - g_optionsPages.append(this); + if (registerGlobally) + g_optionsPages.append(this); } /*! diff --git a/src/plugins/coreplugin/dialogs/ioptionspage.h b/src/plugins/coreplugin/dialogs/ioptionspage.h index 16e6d285c0..7f55c25c88 100644 --- a/src/plugins/coreplugin/dialogs/ioptionspage.h +++ b/src/plugins/coreplugin/dialogs/ioptionspage.h @@ -44,7 +44,7 @@ class CORE_EXPORT IOptionsPage : public QObject Q_OBJECT public: - IOptionsPage(QObject *parent = 0); + IOptionsPage(QObject *parent = nullptr, bool registerGlobally = true); virtual ~IOptionsPage(); static const QList<IOptionsPage *> allOptionsPages(); @@ -73,7 +73,7 @@ protected: QString m_displayCategory; Utils::Icon m_categoryIcon; - mutable bool m_keywordsInitialized; + mutable bool m_keywordsInitialized = false; mutable QStringList m_keywords; }; diff --git a/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp b/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp index 4580e82801..d06afa909b 100644 --- a/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp +++ b/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp @@ -33,11 +33,6 @@ namespace CppTools { -static QStringList commonWarnings() -{ - return { QStringLiteral("-Wno-unknown-pragmas") }; -} - static void addConfigForQuestionableConstructs(ClangDiagnosticConfigsModel &model) { ClangDiagnosticConfig config; @@ -48,7 +43,7 @@ static void addConfigForQuestionableConstructs(ClangDiagnosticConfigsModel &mode config.setClangOptions(QStringList{ QStringLiteral("-Wall"), QStringLiteral("-Wextra"), - } + commonWarnings()); + }); model.appendOrUpdate(config); } @@ -60,7 +55,7 @@ static void addConfigForPedanticWarnings(ClangDiagnosticConfigsModel &model) config.setDisplayName(QCoreApplication::translate("ClangDiagnosticConfigsModel", "Pedantic Warnings")); config.setIsReadOnly(true); - config.setClangOptions(QStringList{QStringLiteral("-Wpedantic")} + commonWarnings()); + config.setClangOptions(QStringList{QStringLiteral("-Wpedantic")}); model.appendOrUpdate(config); } @@ -86,7 +81,7 @@ static void addConfigForAlmostEveryWarning(ClangDiagnosticConfigsModel &model) QStringLiteral("-Wno-switch-enum"), QStringLiteral("-Wno-missing-prototypes"), // Not optimal for C projects. QStringLiteral("-Wno-used-but-marked-unused"), // e.g. QTest::qWait - } + commonWarnings()); + }); model.appendOrUpdate(config); } diff --git a/src/plugins/debugger/qml/qmlengineutils.cpp b/src/plugins/debugger/qml/qmlengineutils.cpp index 563a472450..455a559e31 100644 --- a/src/plugins/debugger/qml/qmlengineutils.cpp +++ b/src/plugins/debugger/qml/qmlengineutils.cpp @@ -210,6 +210,7 @@ void appendDebugOutput(QtMsgType type, const QString &message, const QDebugConte { ConsoleItem::ItemType itemType; switch (type) { + case QtInfoMsg: case QtDebugMsg: itemType = ConsoleItem::DebugType; break; @@ -220,11 +221,10 @@ void appendDebugOutput(QtMsgType type, const QString &message, const QDebugConte case QtFatalMsg: itemType = ConsoleItem::ErrorType; break; - default: - //This case is not possible - return; } + QTC_ASSERT(itemType != ConsoleItem::DefaultType, return); + debuggerConsole()->printItem(new ConsoleItem(itemType, message, info.file, info.line)); } diff --git a/src/plugins/designer/settingspage.cpp b/src/plugins/designer/settingspage.cpp index 04670e5741..248478934a 100644 --- a/src/plugins/designer/settingspage.cpp +++ b/src/plugins/designer/settingspage.cpp @@ -36,6 +36,7 @@ using namespace Designer::Internal; SettingsPage::SettingsPage(QDesignerOptionsPageInterface *designerPage) : + Core::IOptionsPage(nullptr, false), m_designerPage(designerPage) { setId(Core::Id::fromString(m_designerPage->name())); diff --git a/src/plugins/diffeditor/descriptionwidgetwatcher.cpp b/src/plugins/diffeditor/descriptionwidgetwatcher.cpp index 0e310cfbcd..5b266ebe74 100644 --- a/src/plugins/diffeditor/descriptionwidgetwatcher.cpp +++ b/src/plugins/diffeditor/descriptionwidgetwatcher.cpp @@ -44,7 +44,7 @@ DescriptionWidgetWatcher::DescriptionWidgetWatcher(DiffEditorController *control m_widgets.append(widget); } - connect(EditorManager::instance(), &EditorManager::editorOpened, + connect(EditorManager::instance(), &EditorManager::editorOpened, this, [this](IEditor *editor) { if (TextEditor::TextEditorWidget *widget = descriptionWidget(editor)) { m_widgets.append(widget); @@ -52,7 +52,7 @@ DescriptionWidgetWatcher::DescriptionWidgetWatcher(DiffEditorController *control } }); - connect(EditorManager::instance(), &EditorManager::editorAboutToClose, + connect(EditorManager::instance(), &EditorManager::editorAboutToClose, this, [this](IEditor *editor) { if (TextEditor::TextEditorWidget *widget = descriptionWidget(editor)) { emit descriptionWidgetRemoved(widget); diff --git a/src/plugins/diffeditor/diffeditorwidgetcontroller.cpp b/src/plugins/diffeditor/diffeditorwidgetcontroller.cpp index c4a826bfe9..834c320a52 100644 --- a/src/plugins/diffeditor/diffeditorwidgetcontroller.cpp +++ b/src/plugins/diffeditor/diffeditorwidgetcontroller.cpp @@ -227,7 +227,7 @@ void DiffEditorWidgetController::addCodePasterAction(QMenu *menu, int fileIndex, if (ExtensionSystem::PluginManager::getObject<CodePaster::Service>()) { // optional code pasting service QAction *sendChunkToCodePasterAction = menu->addAction(tr("Send Chunk to CodePaster...")); - connect(sendChunkToCodePasterAction, &QAction::triggered, [this, fileIndex, chunkIndex]() { + connect(sendChunkToCodePasterAction, &QAction::triggered, this, [this, fileIndex, chunkIndex]() { sendChunkToCodePaster(fileIndex, chunkIndex); }); } @@ -253,7 +253,7 @@ bool DiffEditorWidgetController::fileNamesAreDifferent(int fileIndex) const void DiffEditorWidgetController::addApplyAction(QMenu *menu, int fileIndex, int chunkIndex) { QAction *applyAction = menu->addAction(tr("Apply Chunk...")); - connect(applyAction, &QAction::triggered, [this, fileIndex, chunkIndex]() { + connect(applyAction, &QAction::triggered, this, [this, fileIndex, chunkIndex]() { patch(false, fileIndex, chunkIndex); }); applyAction->setEnabled(chunkExists(fileIndex, chunkIndex) && fileNamesAreDifferent(fileIndex)); @@ -262,7 +262,7 @@ void DiffEditorWidgetController::addApplyAction(QMenu *menu, int fileIndex, int void DiffEditorWidgetController::addRevertAction(QMenu *menu, int fileIndex, int chunkIndex) { QAction *revertAction = menu->addAction(tr("Revert Chunk...")); - connect(revertAction, &QAction::triggered, [this, fileIndex, chunkIndex]() { + connect(revertAction, &QAction::triggered, this, [this, fileIndex, chunkIndex]() { patch(true, fileIndex, chunkIndex); }); revertAction->setEnabled(chunkExists(fileIndex, chunkIndex)); diff --git a/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp b/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp index 81942a9a66..0836e9a952 100644 --- a/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp +++ b/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp @@ -166,7 +166,7 @@ SideDiffEditorWidget::SideDiffEditorWidget(QWidget *parent) settings.m_highlightBlocks = false; SelectableTextEditorWidget::setDisplaySettings(settings); - connect(this, &TextEditorWidget::tooltipRequested, [this](const QPoint &point, int position) { + connect(this, &TextEditorWidget::tooltipRequested, this, [this](const QPoint &point, int position) { const int block = document()->findBlock(position).blockNumber(); const auto it = m_fileInfo.constFind(block); if (it != m_fileInfo.constEnd()) @@ -648,10 +648,10 @@ SideBySideDiffEditorWidget::SideBySideDiffEditorWidget(QWidget *parent) }; setupHighlightController(); - connect(m_leftEditor, &SideDiffEditorWidget::gotDisplaySettings, setupHighlightController); + connect(m_leftEditor, &SideDiffEditorWidget::gotDisplaySettings, this, setupHighlightController); m_rightEditor->verticalScrollBar()->setFocusProxy(m_leftEditor); - connect(m_leftEditor, &SideDiffEditorWidget::gotFocus, [this]() { + connect(m_leftEditor, &SideDiffEditorWidget::gotFocus, this, [this]() { if (m_rightEditor->verticalScrollBar()->focusProxy() == m_leftEditor) return; // We already did it before. @@ -672,7 +672,7 @@ SideBySideDiffEditorWidget::SideBySideDiffEditorWidget(QWidget *parent) // too. We bring back the original policy to keep tab focus working. m_leftEditor->setFocusPolicy(Qt::StrongFocus); }); - connect(m_rightEditor, &SideDiffEditorWidget::gotFocus, [this]() { + connect(m_rightEditor, &SideDiffEditorWidget::gotFocus, this, [this]() { // Unhack #1. m_rightEditor->verticalScrollBar()->setFocusProxy(nullptr); // Unhack #2. diff --git a/src/plugins/genericprojectmanager/genericmakestep.cpp b/src/plugins/genericprojectmanager/genericmakestep.cpp index 7bd16b8308..37951d0308 100644 --- a/src/plugins/genericprojectmanager/genericmakestep.cpp +++ b/src/plugins/genericprojectmanager/genericmakestep.cpp @@ -318,7 +318,8 @@ GenericMakeAllStepFactory::GenericMakeAllStepFactory() setDisplayName(QCoreApplication::translate( "GenericProjectManager::Internal::GenericMakeStep", GENERIC_MS_DISPLAY_NAME)); setSupportedProjectType(Constants::GENERICPROJECT_ID); - setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); + setSupportedStepLists({ProjectExplorer::Constants::BUILDSTEPS_BUILD, + ProjectExplorer::Constants::BUILDSTEPS_DEPLOY}); } // diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 327633dea9..3f03428594 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -303,7 +303,7 @@ void GitDiffEditorController::updateBranchList() VcsCommand *command = GitPlugin::client()->vcsExec( workingDirectory, {"branch", noColorOption, "-a", "--contains", revision}, nullptr, false, 0, workingDirectory); - connect(command, &VcsCommand::stdOutText, [this](const QString &text) { + connect(command, &VcsCommand::stdOutText, this, [this](const QString &text) { const QString remotePrefix = "remotes/"; const QString localPrefix = "<Local>"; const int prefixLength = remotePrefix.length(); @@ -829,12 +829,12 @@ void GitClient::chunkActionsRequested(QMenu *menu, int fileIndex, int chunkIndex menu->addSeparator(); QAction *stageChunkAction = menu->addAction(tr("Stage Chunk")); - connect(stageChunkAction, &QAction::triggered, + connect(stageChunkAction, &QAction::triggered, this, [stageChunk, diffController, fileIndex, chunkIndex]() { stageChunk(diffController, fileIndex, chunkIndex, false); }); QAction *unstageChunkAction = menu->addAction(tr("Unstage Chunk")); - connect(unstageChunkAction, &QAction::triggered, + connect(unstageChunkAction, &QAction::triggered, this, [stageChunk, diffController, fileIndex, chunkIndex]() { stageChunk(diffController, fileIndex, chunkIndex, true); }); @@ -1000,7 +1000,7 @@ void GitClient::log(const QString &workingDirectory, const QString &fileName, if (!argWidget) { argWidget = new GitLogArgumentsWidget(settings(), editor->toolBar()); argWidget->setBaseArguments(args); - connect(argWidget, &VcsBaseEditorConfig::commandExecutionRequested, + connect(argWidget, &VcsBaseEditorConfig::commandExecutionRequested, this, [=]() { this->log(workingDir, fileName, enableAnnotationContextMenu, args); }); editor->setEditorConfig(argWidget); } @@ -1086,7 +1086,7 @@ VcsBaseEditorWidget *GitClient::annotate( if (!argWidget) { argWidget = new GitBlameArgumentsWidget(settings(), editor->toolBar()); argWidget->setBaseArguments(extraOptions); - connect(argWidget, &VcsBaseEditorConfig::commandExecutionRequested, + connect(argWidget, &VcsBaseEditorConfig::commandExecutionRequested, this, [=] { const int line = VcsBaseEditor::lineNumberOfCurrentEditor(); annotate(workingDir, file, revision, line, extraOptions); diff --git a/src/plugins/ios/iosdsymbuildstep.cpp b/src/plugins/ios/iosdsymbuildstep.cpp index 9579018538..2cf4834bc6 100644 --- a/src/plugins/ios/iosdsymbuildstep.cpp +++ b/src/plugins/ios/iosdsymbuildstep.cpp @@ -328,9 +328,6 @@ void IosDsymBuildStepConfigWidget::resetDefaults() IosDsymBuildStepFactory::IosDsymBuildStepFactory() { registerStep<IosDsymBuildStep>(Constants::IOS_DSYM_BUILD_STEP_ID); - setSupportedStepLists({ProjectExplorer::Constants::BUILDSTEPS_CLEAN, - ProjectExplorer::Constants::BUILDSTEPS_BUILD, - ProjectExplorer::Constants::BUILDSTEPS_DEPLOY}); setSupportedDeviceTypes({Constants::IOS_DEVICE_TYPE, Constants::IOS_SIMULATOR_TYPE}); setDisplayName("dsymutil"); diff --git a/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp b/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp index 96a9d1a554..578023972f 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp @@ -904,12 +904,15 @@ void ListField::initializeData(MacroExpander *expander) { QTC_ASSERT(widget(), return); + if (m_index >= int(m_itemList.size())) { + qWarning().noquote() << QString("%1 (\"%2\") has an index of %3 which does not exist.").arg(type(), name(), QString::number(m_index)); + m_index = -1; + } + QStandardItem *currentItem = m_index >= 0 ? m_itemList[uint(m_index)].get() : nullptr; QList<QStandardItem*> expandedValuesItems; expandedValuesItems.reserve(int(m_itemList.size())); - QSize maxIconSize; - for (const std::unique_ptr<QStandardItem> &item : m_itemList) { bool condition = JsonWizard::boolFromVariant(item->data(ConditionRole), expander); if (!condition) diff --git a/src/plugins/projectexplorer/processstep.cpp b/src/plugins/projectexplorer/processstep.cpp index afe2f9ada4..82805fa3ee 100644 --- a/src/plugins/projectexplorer/processstep.cpp +++ b/src/plugins/projectexplorer/processstep.cpp @@ -148,9 +148,6 @@ ProcessStepFactory::ProcessStepFactory() { registerStep<ProcessStep>(PROCESS_STEP_ID); setDisplayName(ProcessStep::tr("Custom Process Step", "item in combobox")); - setSupportedStepLists({ProjectExplorer::Constants::BUILDSTEPS_BUILD, - ProjectExplorer::Constants::BUILDSTEPS_CLEAN, - ProjectExplorer::Constants::BUILDSTEPS_DEPLOY}); } //******* diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index f852d8f792..8a9f6e410a 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -88,7 +88,7 @@ namespace ProjectExplorer { static bool isListedFileNode(const Node *node) { - return node->asContainerNode() || (node->nodeType() == NodeType::File && node->listInProject()); + return node->asContainerNode() || node->listInProject(); } static bool nodeLessThan(const Node *n1, const Node *n2) diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index a64b6040cf..1a246e2fe8 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -460,6 +460,7 @@ void QbsProject::updateAfterParse() updateCppCodeModel(); updateQmlJsCodeModel(); emit fileListChanged(); + emit dataChanged(); } void QbsProject::delayedUpdateAfterParse() @@ -617,6 +618,7 @@ void QbsProject::updateAfterBuild() m_extraCompilersPending = false; updateCppCodeModel(); } + emit dataChanged(); } void QbsProject::registerQbsProjectParser(QbsProjectParser *p) diff --git a/src/plugins/qbsprojectmanager/qbsproject.h b/src/plugins/qbsprojectmanager/qbsproject.h index c45a595dff..d2e951a78e 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.h +++ b/src/plugins/qbsprojectmanager/qbsproject.h @@ -105,6 +105,9 @@ public: void delayParsing(); +signals: + void dataChanged(); + private: void handleQbsParsingDone(bool success); diff --git a/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp index d56911bfbc..de58b4e067 100644 --- a/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp +++ b/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp @@ -112,8 +112,8 @@ QbsRunConfiguration::QbsRunConfiguration(Target *target) connect(target, &Target::kitChanged, this, &QbsRunConfiguration::updateTargetInformation); - connect(target->project(), &Project::parsingFinished, - this, &QbsRunConfiguration::updateTargetInformation); + QbsProject *qbsProject = static_cast<QbsProject *>(project()); + connect(qbsProject, &QbsProject::dataChanged, this, [this] { m_envCache.clear(); }); } QVariantMap QbsRunConfiguration::toMap() const @@ -164,9 +164,16 @@ void QbsRunConfiguration::setUsingLibraryPaths(bool useLibPaths) void QbsRunConfiguration::addToBaseEnvironment(Utils::Environment &env) const { + const auto key = qMakePair(env.toStringList(), m_usingLibraryPaths); + const auto it = m_envCache.constFind(key); + if (it != m_envCache.constEnd()) { + env = it.value(); + return; + } BuildTargetInfo bti = target()->applicationTargets().buildTargetInfo(buildKey()); if (bti.runEnvModifier) bti.runEnvModifier(env, m_usingLibraryPaths); + m_envCache.insert(key, env); } Utils::OutputFormatter *QbsRunConfiguration::createOutputFormatter() const diff --git a/src/plugins/qbsprojectmanager/qbsrunconfiguration.h b/src/plugins/qbsprojectmanager/qbsrunconfiguration.h index 3e2a360da6..8d3a2ffb98 100644 --- a/src/plugins/qbsprojectmanager/qbsrunconfiguration.h +++ b/src/plugins/qbsprojectmanager/qbsrunconfiguration.h @@ -28,7 +28,9 @@ #include <projectexplorer/runnables.h> #include <QCheckBox> +#include <QHash> #include <QLabel> +#include <QPair> #include <QStringList> #include <QWidget> @@ -62,6 +64,8 @@ private: void updateTargetInformation(); + using EnvCache = QHash<QPair<QStringList, bool>, Utils::Environment>; + mutable EnvCache m_envCache; bool m_usingLibraryPaths = true; }; diff --git a/src/plugins/qmakeprojectmanager/makestep.cpp b/src/plugins/qmakeprojectmanager/makestep.cpp index bbcf04fdc8..5195bba0a0 100644 --- a/src/plugins/qmakeprojectmanager/makestep.cpp +++ b/src/plugins/qmakeprojectmanager/makestep.cpp @@ -461,6 +461,4 @@ MakeStepFactory::MakeStepFactory() registerStep<MakeStep>(MAKESTEP_BS_ID); setSupportedProjectType(Constants::QMAKEPROJECT_ID); setDisplayName(tr("Make")); - setSupportedStepLists({ProjectExplorer::Constants::BUILDSTEPS_BUILD, - ProjectExplorer::Constants::BUILDSTEPS_CLEAN}); } diff --git a/src/plugins/qmldesigner/components/integration/designdocument.cpp b/src/plugins/qmldesigner/components/integration/designdocument.cpp index 2004614fdd..b4a1bdabdb 100644 --- a/src/plugins/qmldesigner/components/integration/designdocument.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocument.cpp @@ -633,7 +633,7 @@ static inline Kit *getActiveKit(DesignDocument *designDocument) if (!target) return 0; - if (!target->kit()->isValid()) + if (!target->kit() || !target->kit()->isValid()) return 0; QObject::connect(target, &Target::kitChanged, designDocument, &DesignDocument::updateActiveQtVersion, Qt::UniqueConnection); diff --git a/src/plugins/qmldesigner/components/integration/designdocumentview.cpp b/src/plugins/qmldesigner/components/integration/designdocumentview.cpp index bc8930edb6..ef4e900d0f 100644 --- a/src/plugins/qmldesigner/components/integration/designdocumentview.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocumentview.cpp @@ -24,6 +24,8 @@ ****************************************************************************/ #include "designdocumentview.h" + +#include <exception.h> #include <rewriterview.h> #include <basetexteditmodifier.h> #include <modelmerger.h> @@ -156,7 +158,11 @@ void DesignDocumentView::fromText(QString text) if (rewriterView->errors().isEmpty() && rewriterView->rootModelNode().isValid()) { ModelMerger merger(this); - merger.replaceModel(rewriterView->rootModelNode()); + try { + merger.replaceModel(rewriterView->rootModelNode()); + } catch(Exception &e) { + e.showException(); + } } } diff --git a/src/plugins/qmldesigner/components/itemlibrary/customfilesystemmodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/customfilesystemmodel.cpp index bf7f99edd1..45ff279512 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/customfilesystemmodel.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/customfilesystemmodel.cpp @@ -90,6 +90,33 @@ void CustomFileSystemModel::setFilter(QDir::Filters) } +QString filterMetaIcons(const QString fileName) +{ + + QFileInfo info(fileName); + + if (info.dir().path().split("/").contains("designer")) { + + QDir currentDir = info.dir(); + + int i = 0; + while (!currentDir.isRoot() && i < 3) { + if (currentDir.dirName() == "designer") { + if (!currentDir.entryList({"*.metainfo"}).isEmpty()) + return {}; + } + + currentDir.cdUp(); + ++i; + } + + if (info.dir().dirName() == "designer") + return {}; + } + + return fileName; +} + QModelIndex CustomFileSystemModel::setRootPath(const QString &newPath) { beginResetModel(); @@ -116,7 +143,7 @@ QModelIndex CustomFileSystemModel::setRootPath(const QString &newPath) QDirIterator fileIterator(newPath, nameFilterList, QDir::Files, QDirIterator::Subdirectories); while (fileIterator.hasNext()) - m_files.append(fileIterator.next()); + m_files.append(filterMetaIcons(fileIterator.next())); QDirIterator dirIterator(newPath, {}, QDir::Dirs | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); while (dirIterator.hasNext()) diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp index 229dbfab13..cadd15c47c 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp @@ -225,6 +225,8 @@ NodeInstanceServerProxy::NodeInstanceServerProxy(NodeInstanceView *nodeInstanceV NodeInstanceServerProxy::~NodeInstanceServerProxy() { + m_destructing = true; + disconnect(this, SLOT(processFinished(int,QProcess::ExitStatus))); writeCommand(QVariant::fromValue(EndPuppetCommand())); @@ -273,6 +275,9 @@ void NodeInstanceServerProxy::dispatchCommand(const QVariant &command, PuppetStr static const int debugOutputCommandType = QMetaType::type("DebugOutputCommand"); static const int puppetAliveCommandType = QMetaType::type("PuppetAliveCommand"); + if (m_destructing) + return; + qCInfo(instanceViewBenchmark) << "dispatching command" << command.userType() << command.typeName(); if (command.userType() == informationChangedCommandType) { nodeInstanceClient()->informationChanged(command.value<InformationChangedCommand>()); diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h index 4cf8f1241e..6b2469de9e 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h @@ -128,6 +128,7 @@ private: RunModus m_runModus; int m_synchronizeId = -1; QTime m_benchmarkTimer; + bool m_destructing = false; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index cb2032046e..94d9253431 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -76,7 +76,7 @@ static inline bool isSupportedAttachedProperties(const QString &propertyName) static inline QStringList supportedVersionsList() { static const QStringList list = { - "2.0", "2.1", "2.2", "2.3", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10" + "2.0", "2.1", "2.2", "2.3", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11" }; return list; } @@ -96,7 +96,7 @@ static inline QStringList globalQtEnums() static inline QStringList knownEnumScopes() { static const QStringList list = { - "TextInput", "TextEdit", "Material", "Universal", "Font", "Shape", "ShapePath" + "TextInput", "TextEdit", "Material", "Universal", "Font", "Shape", "ShapePath", "AbstractButton" }; return list; } diff --git a/src/plugins/qmljseditor/qmljseditordocument.cpp b/src/plugins/qmljseditor/qmljseditordocument.cpp index 8441de6285..6325c7b673 100644 --- a/src/plugins/qmljseditor/qmljseditordocument.cpp +++ b/src/plugins/qmljseditor/qmljseditordocument.cpp @@ -499,6 +499,10 @@ QmlJSEditorDocumentPrivate::~QmlJSEditorDocumentPrivate() { m_semanticInfoUpdater->abort(); m_semanticInfoUpdater->wait(); + // clean up all marks, otherwise a callback could try to access deleted members. + // see QTCREATORBUG-20199 + cleanDiagnosticMarks(); + cleanSemanticMarks(); } void QmlJSEditorDocumentPrivate::invalidateFormatterCache() diff --git a/src/plugins/qtsupport/baseqtversion.cpp b/src/plugins/qtsupport/baseqtversion.cpp index cb38340e7c..12941ee0d2 100644 --- a/src/plugins/qtsupport/baseqtversion.cpp +++ b/src/plugins/qtsupport/baseqtversion.cpp @@ -413,6 +413,12 @@ QSet<Id> BaseQtVersion::availableFeatures() const if (qtVersion().matches(5, 10)) return features; + features.unite(versionedIds(Constants::FEATURE_QT_QUICK_PREFIX, 2, 11)); + features.unite(versionedIds(Constants::FEATURE_QT_QUICK_CONTROLS_2_PREFIX, 2, 4)); + + if (qtVersion().matches(5, 11)) + return features; + return features; } diff --git a/src/plugins/qtsupport/qtcreator_tutorials.xml b/src/plugins/qtsupport/qtcreator_tutorials.xml index 0948cca5fa..9da1f6e5ff 100644 --- a/src/plugins/qtsupport/qtcreator_tutorials.xml +++ b/src/plugins/qtsupport/qtcreator_tutorials.xml @@ -70,6 +70,14 @@ <description><![CDATA[Using Qt Quick Designer to develop Qt Quick applications.]]></description> <tags>qt creator,qt quick,video</tags> </tutorial> + <tutorial imageUrl=":qtsupport/images/icons/videotutorialicon.png" difficulty="" projectPath="" name="Online: QML - Introduction" isVideo="true" videoUrl="https://www.youtube.com/watch?v=GkzncJ71mm0" videoLength="9:42"> + <description><![CDATA[Using signals, slots, and property bindings Qt Quick applications.]]></description> + <tags>qt creator,qt quick,qml,video</tags> + </tutorial> + <tutorial imageUrl=":qtsupport/images/icons/videotutorialicon.png" difficulty="" projectPath="" name="Online: Qt Quick Designer - Qt Quick Controls" isVideo="true" videoUrl="https://www.youtube.com/watch?v=uuhmSZxK1mk" videoLength="7:09"> + <description><![CDATA[Using Qt Quick Controls to develop Qt Quick applications.]]></description> + <tags>qt creator,qt quick,controls,video</tags> + </tutorial> <tutorial imageUrl=":qtsupport/images/icons/qteventicon.png" difficulty="" projectPath="" name="Talk: Qt Creator - Getting Started" isVideo="true" videoUrl="https://www.youtube.com/watch?v=nGFmjOiT22Y" videoLength="50:36"> <description><![CDATA[Getting started with using Qt Creator for cross-platform development.]]></description> diff --git a/src/plugins/texteditor/generichighlighter/specificrules.cpp b/src/plugins/texteditor/generichighlighter/specificrules.cpp index 8c4b80dc66..82a9de23ca 100644 --- a/src/plugins/texteditor/generichighlighter/specificrules.cpp +++ b/src/plugins/texteditor/generichighlighter/specificrules.cpp @@ -247,6 +247,14 @@ bool RegExprRule::doMatchSucceed(const QString &text, return false; } +RegExprRule *RegExprRule::doClone() const +{ + auto clone = new RegExprRule(*this); + if (m_progress) + m_progress->trackRule(clone); + return clone; +} + // Keyword KeywordRule::KeywordRule(const QSharedPointer<HighlightDefinition> &definition) : m_overrideGlobal(false), diff --git a/src/plugins/texteditor/generichighlighter/specificrules.h b/src/plugins/texteditor/generichighlighter/specificrules.h index 63beaf8df9..a5533dcd0d 100644 --- a/src/plugins/texteditor/generichighlighter/specificrules.h +++ b/src/plugins/texteditor/generichighlighter/specificrules.h @@ -124,7 +124,7 @@ private: virtual bool doMatchSucceed(const QString &text, const int length, ProgressData *progress); - virtual RegExprRule *doClone() const { return new RegExprRule(*this); } + virtual RegExprRule *doClone() const; virtual void doReplaceExpressions(const QStringList &captures); virtual void doProgressFinished(); diff --git a/src/shared/qbs b/src/shared/qbs -Subproject 0b141d7ecb103d53cc3ea93db505400fe29b46e +Subproject 8da0e97f40abf19a089197c6aec8333a4e92d72 diff --git a/src/tools/clangbackend/clangbackend.pro b/src/tools/clangbackend/clangbackend.pro index 3b7c5de518..c1c72036ea 100644 --- a/src/tools/clangbackend/clangbackend.pro +++ b/src/tools/clangbackend/clangbackend.pro @@ -19,7 +19,7 @@ SOURCES += clangbackendmain.cpp HEADERS += ../qtcreatorcrashhandler/crashhandlersetup.h SOURCES += ../qtcreatorcrashhandler/crashhandlersetup.cpp -unix { +unix:!disable_external_rpath:!contains(QMAKE_DEFAULT_LIBDIRS, $${LLVM_LIBDIR}) { !osx: QMAKE_LFLAGS += -Wl,-z,origin - !contains(QMAKE_DEFAULT_LIBDIRS, $${LLVM_LIBDIR}):!disable_external_rpath: QMAKE_LFLAGS += -Wl,-rpath,$$shell_quote($${LLVM_LIBDIR}) + QMAKE_LFLAGS += -Wl,-rpath,$$shell_quote($${LLVM_LIBDIR}) } diff --git a/src/tools/clangbackend/source/clangtranslationunit.cpp b/src/tools/clangbackend/source/clangtranslationunit.cpp index baabcaf50b..f0bbc78934 100644 --- a/src/tools/clangbackend/source/clangtranslationunit.cpp +++ b/src/tools/clangbackend/source/clangtranslationunit.cpp @@ -237,6 +237,17 @@ static bool isHeaderErrorDiagnostic(const Utf8String &mainFilePath, const Diagno return isCritical && diagnostic.location().filePath() != mainFilePath; } +static bool isIgnoredHeaderErrorDiagnostic(const Diagnostic &diagnostic) +{ + // FIXME: This diagnostic can appear if e.g. a main file includes a -isystem header and then the + // header is opened in the editor - the provided unsaved file for the newly opened editor + // overrides the file from the preamble. In this case, clang uses the version from the preamble + // and changes in the header are not reflected in the main file. Typically that's not a problem + // because only non-project headers are opened as -isystem headers. + return diagnostic.text().endsWith( + Utf8StringLiteral("from the precompiled header has been overridden")); +} + void TranslationUnit::extractDiagnostics(DiagnosticContainer &firstHeaderErrorDiagnostic, QVector<DiagnosticContainer> &mainFileDiagnostics) const { @@ -246,7 +257,9 @@ void TranslationUnit::extractDiagnostics(DiagnosticContainer &firstHeaderErrorDi bool hasFirstHeaderErrorDiagnostic = false; for (const Diagnostic &diagnostic : diagnostics()) { - if (!hasFirstHeaderErrorDiagnostic && isHeaderErrorDiagnostic(m_filePath, diagnostic)) { + if (!hasFirstHeaderErrorDiagnostic + && isHeaderErrorDiagnostic(m_filePath, diagnostic) + && !isIgnoredHeaderErrorDiagnostic(diagnostic)) { hasFirstHeaderErrorDiagnostic = true; firstHeaderErrorDiagnostic = diagnostic.toDiagnosticContainer(); } diff --git a/src/tools/clangpchmanagerbackend/clangpchmanagerbackend.pro b/src/tools/clangpchmanagerbackend/clangpchmanagerbackend.pro index b54db0be04..efdd94377b 100644 --- a/src/tools/clangpchmanagerbackend/clangpchmanagerbackend.pro +++ b/src/tools/clangpchmanagerbackend/clangpchmanagerbackend.pro @@ -28,9 +28,9 @@ SOURCES += \ ../clangrefactoringbackend/source/refactoringcompilationdatabase.cpp -unix { +unix:!disable_external_rpath:!contains(QMAKE_DEFAULT_LIBDIRS, $${LLVM_LIBDIR}) { !macx: QMAKE_LFLAGS += -Wl,-z,origin - !disable_external_rpath: QMAKE_LFLAGS += -Wl,-rpath,$$shell_quote($${LLVM_LIBDIR}) + QMAKE_LFLAGS += -Wl,-rpath,$$shell_quote($${LLVM_LIBDIR}) } DEFINES += CLANG_COMPILER_PATH=\"R\\\"xxx($${LLVM_BINDIR}/clang)xxx\\\"\" diff --git a/src/tools/clangrefactoringbackend/clangrefactoringbackend.pro b/src/tools/clangrefactoringbackend/clangrefactoringbackend.pro index 3b94d003c0..6e7c8262a9 100644 --- a/src/tools/clangrefactoringbackend/clangrefactoringbackend.pro +++ b/src/tools/clangrefactoringbackend/clangrefactoringbackend.pro @@ -23,7 +23,7 @@ QMAKE_CXXFLAGS += $$LLVM_CXXFLAGS SOURCES += \ clangrefactoringbackendmain.cpp -unix { +unix:!disable_external_rpath:!contains(QMAKE_DEFAULT_LIBDIRS, $$LLVM_LIBDIR) { !osx: QMAKE_LFLAGS += -Wl,-z,origin - !disable_external_rpath: QMAKE_LFLAGS += -Wl,-rpath,$$shell_quote($${LLVM_LIBDIR}) + QMAKE_LFLAGS += -Wl,-rpath,$$shell_quote($${LLVM_LIBDIR}) } |