From 6cb2e71c38fb7e1b784a1d9f9196d03a4574f0ae Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 8 Apr 2019 15:13:26 +0200 Subject: [PATCH] ProjectExplorer: Do not set up x64 compilers as x86 toolchains by default That blows up the toolchain list on Unix systems, and is usually not what users want. Those who do can opt in. Fixes: QTCREATORBUG-20044 Change-Id: I6a4ef26ff5f0aaddc660cccf59283c6e8c4bdb64 Reviewed-by: hjk --- src/plugins/projectexplorer/gcctoolchain.cpp | 16 +++--- .../projectexplorer/toolchainmanager.cpp | 18 +++++++ .../projectexplorer/toolchainmanager.h | 9 ++++ .../projectexplorer/toolchainoptionspage.cpp | 53 ++++++++++++++++++- 4 files changed, 88 insertions(+), 8 deletions(-) diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp index 05c371dc770..6f1d076621c 100644 --- a/src/plugins/projectexplorer/gcctoolchain.cpp +++ b/src/plugins/projectexplorer/gcctoolchain.cpp @@ -203,8 +203,10 @@ static QList guessGccAbi(const QString &m, const ProjectExplorer::Macros &m abiList << Abi(arch, os, flavor, format, width == 64 ? 32 : 64); } else if (arch == Abi::X86Architecture && (width == 0 || width == 64)) { abiList << Abi(arch, os, flavor, format, 64); - if (width != 64 || !m.contains("mingw")) + if (width != 64 || (!m.contains("mingw") + && ToolChainManager::detectionSettings().detectX64AsX32)) { abiList << Abi(arch, os, flavor, format, 32); + } } else { abiList << Abi(arch, os, flavor, format, width); } @@ -1885,7 +1887,7 @@ void ProjectExplorerPlugin::testGccAbiGuessing_data() QTest::newRow("Linux 3 (64bit intel)") << QString::fromLatin1("x86_64-linux-gnu") << QByteArray("#define __SIZEOF_SIZE_T__ 8\n") - << QStringList({"x86-linux-generic-elf-64bit", "x86-linux-generic-elf-32bit"}); + << QStringList("x86-linux-generic-elf-64bit"); QTest::newRow("Linux 3 (64bit intel -- non 64bit)") << QString::fromLatin1("x86_64-linux-gnu") << QByteArray("#define __SIZEOF_SIZE_T__ 4\n") @@ -1897,11 +1899,11 @@ void ProjectExplorerPlugin::testGccAbiGuessing_data() QTest::newRow("Linux 5 (QTCREATORBUG-4690)") // from QTCREATORBUG-4690 << QString::fromLatin1("x86_64-redhat-linux6E") << QByteArray("#define __SIZEOF_SIZE_T__ 8\n") - << QStringList({"x86-linux-generic-elf-64bit", "x86-linux-generic-elf-32bit"}); + << QStringList("x86-linux-generic-elf-64bit"); QTest::newRow("Linux 6 (QTCREATORBUG-4690)") // from QTCREATORBUG-4690 << QString::fromLatin1("x86_64-redhat-linux") << QByteArray("#define __SIZEOF_SIZE_T__ 8\n") - << QStringList({"x86-linux-generic-elf-64bit", "x86-linux-generic-elf-32bit"}); + << QStringList("x86-linux-generic-elf-64bit"); QTest::newRow("Linux 7 (arm)") << QString::fromLatin1("armv5tl-montavista-linux-gnueabi") << QByteArray("#define __SIZEOF_SIZE_T__ 4\n") @@ -1946,11 +1948,11 @@ void ProjectExplorerPlugin::testGccAbiGuessing_data() QTest::newRow("Clang 1: windows") << QString::fromLatin1("x86_64-pc-win32") << QByteArray("#define __SIZEOF_SIZE_T__ 8\r\n") - << QStringList({"x86-windows-msys-pe-64bit", "x86-windows-msys-pe-32bit"}); + << QStringList("x86-windows-msys-pe-64bit"); QTest::newRow("Clang 1: linux") << QString::fromLatin1("x86_64-unknown-linux-gnu") << QByteArray("#define __SIZEOF_SIZE_T__ 8\n") - << QStringList({"x86-linux-generic-elf-64bit", "x86-linux-generic-elf-32bit"}); + << QStringList("x86-linux-generic-elf-64bit"); QTest::newRow("Mac 1") << QString::fromLatin1("i686-apple-darwin10") << QByteArray("#define __SIZEOF_SIZE_T__ 8\n") @@ -1970,7 +1972,7 @@ void ProjectExplorerPlugin::testGccAbiGuessing_data() QTest::newRow("Intel 1") << QString::fromLatin1("86_64 x86_64 GNU/Linux") << QByteArray("#define __SIZEOF_SIZE_T__ 8\n") - << QStringList({"x86-linux-generic-elf-64bit", "x86-linux-generic-elf-32bit"}); + << QStringList("x86-linux-generic-elf-64bit"); QTest::newRow("FreeBSD 1") << QString::fromLatin1("i386-portbld-freebsd9.0") << QByteArray("#define __SIZEOF_SIZE_T__ 4\n") diff --git a/src/plugins/projectexplorer/toolchainmanager.cpp b/src/plugins/projectexplorer/toolchainmanager.cpp index caa15e6d2f2..6dc8703c210 100644 --- a/src/plugins/projectexplorer/toolchainmanager.cpp +++ b/src/plugins/projectexplorer/toolchainmanager.cpp @@ -68,6 +68,7 @@ public: QList m_toolChains; // prioritized List QVector m_languages; + ToolchainDetectionSettings m_detectionSettings; }; ToolChainManagerPrivate::~ToolChainManagerPrivate() @@ -83,6 +84,8 @@ static ToolChainManagerPrivate *d = nullptr; using namespace Internal; +const char DETECT_X64_AS_X32_KEY[] = "ProjectExplorer/Toolchains/DetectX64AsX32"; + // -------------------------------------------------------------------------- // ToolChainManager // -------------------------------------------------------------------------- @@ -100,6 +103,9 @@ ToolChainManager::ToolChainManager(QObject *parent) : connect(this, &ToolChainManager::toolChainAdded, this, &ToolChainManager::toolChainsChanged); connect(this, &ToolChainManager::toolChainRemoved, this, &ToolChainManager::toolChainsChanged); connect(this, &ToolChainManager::toolChainUpdated, this, &ToolChainManager::toolChainsChanged); + + QSettings * const s = Core::ICore::settings(); + d->m_detectionSettings.detectX64AsX32 = s->value(DETECT_X64_AS_X32_KEY, false).toBool(); } ToolChainManager::~ToolChainManager() @@ -130,6 +136,8 @@ void ToolChainManager::saveToolChains() QTC_ASSERT(d->m_accessor, return); d->m_accessor->saveToolChains(d->m_toolChains, Core::ICore::dialogParent()); + QSettings * const s = Core::ICore::settings(); + s->setValue(DETECT_X64_AS_X32_KEY, d->m_detectionSettings.detectX64AsX32); } QList ToolChainManager::toolChains(const ToolChain::Predicate &predicate) @@ -257,4 +265,14 @@ void ToolChainManager::aboutToShutdown() #endif } +ToolchainDetectionSettings ToolChainManager::detectionSettings() +{ + return d->m_detectionSettings; +} + +void ToolChainManager::setDetectionSettings(const ToolchainDetectionSettings &settings) +{ + d->m_detectionSettings = settings; +} + } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/toolchainmanager.h b/src/plugins/projectexplorer/toolchainmanager.h index 2e26431b84f..06178419be7 100644 --- a/src/plugins/projectexplorer/toolchainmanager.h +++ b/src/plugins/projectexplorer/toolchainmanager.h @@ -45,6 +45,12 @@ namespace ProjectExplorer { class ProjectExplorerPlugin; class Abi; +class ToolchainDetectionSettings +{ +public: + bool detectX64AsX32 = false; +}; + // -------------------------------------------------------------------------- // ToolChainManager // -------------------------------------------------------------------------- @@ -76,6 +82,9 @@ public: static void aboutToShutdown(); + static ToolchainDetectionSettings detectionSettings(); + static void setDetectionSettings(const ToolchainDetectionSettings &settings); + void saveToolChains(); signals: diff --git a/src/plugins/projectexplorer/toolchainoptionspage.cpp b/src/plugins/projectexplorer/toolchainoptionspage.cpp index dffc23b7501..278c0064f4e 100644 --- a/src/plugins/projectexplorer/toolchainoptionspage.cpp +++ b/src/plugins/projectexplorer/toolchainoptionspage.cpp @@ -42,6 +42,9 @@ #include #include +#include +#include +#include #include #include #include @@ -108,6 +111,39 @@ public: bool changed; }; +class DetectionSettingsDialog : public QDialog +{ +public: + DetectionSettingsDialog(const ToolchainDetectionSettings &settings, QWidget *parent) + : QDialog(parent) + { + setWindowTitle(ToolChainOptionsPage::tr("TGoolchain Auto-detection Settings")); + const auto layout = new QVBoxLayout(this); + m_detectX64AsX32CheckBox.setText(ToolChainOptionsPage::tr("Detect x86_64 GCC compilers " + "as x86_64 and x86")); + m_detectX64AsX32CheckBox.setToolTip(ToolChainOptionsPage::tr("If checked, Qt Creator will " + "set up two instances of each x86_64 compiler:\nOne for the native x86_64 target, " + "and one for a plain x86 target.\nEnable this if you plan to create 32-bit x86 " + "binaries without using a dedicated cross compiler.")); + m_detectX64AsX32CheckBox.setChecked(settings.detectX64AsX32); + layout->addWidget(&m_detectX64AsX32CheckBox); + const auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); + connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); + layout->addWidget(buttonBox); + } + + ToolchainDetectionSettings settings() const + { + ToolchainDetectionSettings s; + s.detectX64AsX32 = m_detectX64AsX32CheckBox.isChecked(); + return s; + } + +private: + QCheckBox m_detectX64AsX32CheckBox; +}; + // -------------------------------------------------------------------------- // ToolChainOptionsWidget // -------------------------------------------------------------------------- @@ -117,6 +153,7 @@ class ToolChainOptionsWidget : public QWidget public: ToolChainOptionsWidget() { + m_detectionSettings = ToolChainManager::detectionSettings(); m_factories = Utils::filtered(ToolChainFactory::allToolChainFactories(), [](ToolChainFactory *factory) { return factory->canCreate();}); @@ -173,6 +210,15 @@ public: m_delButton = new QPushButton(ToolChainOptionsPage::tr("Remove"), this); + m_detectionSettingsButton = new QPushButton( + ToolChainOptionsPage::tr("Auto-detection Settings..."), this); + connect(m_detectionSettingsButton, &QAbstractButton::clicked, this, + [this] { + DetectionSettingsDialog dlg(m_detectionSettings, this); + if (dlg.exec() == QDialog::Accepted) + m_detectionSettings = dlg.settings(); + }); + m_container = new DetailsWidget(this); m_container->setState(DetailsWidget::NoSummary); m_container->setVisible(false); @@ -189,6 +235,7 @@ public: buttonLayout->addWidget(m_addButton); buttonLayout->addWidget(m_cloneButton); buttonLayout->addWidget(m_delButton); + buttonLayout->addWidget(m_detectionSettingsButton); buttonLayout->addItem(new QSpacerItem(10, 40, QSizePolicy::Minimum, QSizePolicy::Expanding)); auto verticalLayout = new QVBoxLayout; @@ -238,7 +285,7 @@ public: void apply(); - public: + private: TreeModel m_model; QList m_factories; QTreeView *m_toolChainView; @@ -247,11 +294,14 @@ public: QPushButton *m_addButton; QPushButton *m_cloneButton; QPushButton *m_delButton; + QPushButton *m_detectionSettingsButton; QHash> m_languageMap; QList m_toAddList; QList m_toRemoveList; + + ToolchainDetectionSettings m_detectionSettings; }; void ToolChainOptionsWidget::markForRemoval(ToolChainTreeItem *item) @@ -378,6 +428,7 @@ void ToolChainOptionsWidget::apply() "They were not configured again.") .arg(removedTcs.join(QLatin1String(",
 ")))); } + ToolChainManager::setDetectionSettings(m_detectionSettings); } void ToolChainOptionsWidget::createToolChain(ToolChainFactory *factory, const Core::Id &language)