QList<Utils::FileName> GccToolChain::suggestedMkspecList() const { Abi abi = targetAbi(); Abi host = Abi::hostAbi(); // Cross compile: Leave the mkspec alone! if (abi.architecture() != host.architecture() || abi.os() != host.os() || abi.osFlavor() != host.osFlavor()) // Note: This can fail:-( return QList<Utils::FileName>(); if (abi.os() == Abi::MacOS) { QString v = version(); // prefer versioned g++ on mac. This is required to enable building for older Mac OS versions if (v.startsWith(QLatin1String("4.0")) && m_compilerCommand.endsWith(QLatin1String("-4.0"))) return QList<Utils::FileName>() << Utils::FileName::fromString(QLatin1String("macx-g++40")); if (v.startsWith(QLatin1String("4.2")) && m_compilerCommand.endsWith(QLatin1String("-4.2"))) return QList<Utils::FileName>() << Utils::FileName::fromString(QLatin1String("macx-g++42")); return QList<Utils::FileName>() << Utils::FileName::fromString(QLatin1String("macx-g++")); } if (abi.os() == Abi::LinuxOS) { if (abi.osFlavor() != Abi::GenericLinuxFlavor) return QList<Utils::FileName>(); // most likely not a desktop, so leave the mkspec alone. if (abi.wordWidth() == host.wordWidth()) return QList<Utils::FileName>() << Utils::FileName::fromString(QLatin1String("linux-g++")); // no need to explicitly set the word width return QList<Utils::FileName>() << Utils::FileName::fromString(QLatin1String("linux-g++-") + QString::number(m_targetAbi.wordWidth())); } if (abi.os() == Abi::BsdOS && abi.osFlavor() == Abi::FreeBsdFlavor) return QList<Utils::FileName>() << Utils::FileName::fromString(QLatin1String("freebsd-g++")); return QList<Utils::FileName>(); }
void AbiWidget::setCustomAbi(const Abi ¤t) { bool blocked = blockSignals(true); d->m_architectureComboBox->setCurrentIndex(static_cast<int>(current.architecture())); d->m_osComboBox->setCurrentIndex(static_cast<int>(current.os())); osChanged(); for (int i = 0; i < d->m_osFlavorComboBox->count(); ++i) { if (d->m_osFlavorComboBox->itemData(i).toInt() == current.osFlavor()) { d->m_osFlavorComboBox->setCurrentIndex(i); break; } } d->m_binaryFormatComboBox->setCurrentIndex(static_cast<int>(current.binaryFormat())); for (int i = 0; i < d->m_wordWidthComboBox->count(); ++i) { if (d->m_wordWidthComboBox->itemData(i).toInt() == current.wordWidth()) { d->m_wordWidthComboBox->setCurrentIndex(i); break; } } if (d->isCustom()) d->m_abi->setItemData(0, current.toString()); blockSignals(blocked); emit abiChanged(); }
// Detect Clang-cl on top of MSVC2015 or MSVC2013. static void detectClangClToolChain(QList<ToolChain *> *list) { #ifdef Q_OS_WIN64 const char registryNode[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\LLVM\\LLVM"; #else const char registryNode[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\LLVM\\LLVM"; #endif const QSettings registry(QLatin1String(registryNode), QSettings::NativeFormat); if (registry.status() != QSettings::NoError) return; const QString path = QDir::cleanPath(registry.value(QStringLiteral(".")).toString()); if (path.isEmpty()) return; const unsigned char wordWidth = Utils::is64BitWindowsBinary(path + QStringLiteral("/bin/") + QLatin1String(clangClBinary)) ? 64 : 32; const ToolChain *toolChain = findMsvcToolChain(*list, wordWidth, Abi::WindowsMsvc2015Flavor); if (!toolChain) toolChain = findMsvcToolChain(*list, wordWidth, Abi::WindowsMsvc2013Flavor); if (!toolChain) { qWarning("Unable to find a suitable MSVC version for \"%s\".", qPrintable(QDir::toNativeSeparators(path))); return; } const MsvcToolChain *msvcToolChain = static_cast<const MsvcToolChain *>(toolChain); const Abi targetAbi = msvcToolChain->targetAbi(); const QString name = QStringLiteral("LLVM ") + QString::number(wordWidth) + QStringLiteral("bit based on ") + Abi::toString(targetAbi.osFlavor()).toUpper(); list->append(new ClangClToolChain(name, path, targetAbi, msvcToolChain->varsBat(), msvcToolChain->varsBatArg(), ToolChain::AutoDetection)); }
static ToolChain *findMsvcToolChain(const QList<ToolChain *> &list, unsigned char wordWidth, Abi::OSFlavor flavor) { return Utils::findOrDefault(list, [wordWidth, flavor] (const ToolChain *tc) { const Abi abi = tc->targetAbi(); return abi.osFlavor() == flavor && wordWidth == abi.wordWidth();} ); }
bool Abi::isCompatibleWith(const Abi &other) const { bool isCompat = (architecture() == other.architecture() || other.architecture() == Abi::UnknownArchitecture) && (os() == other.os() || other.os() == Abi::UnknownOS) && (osFlavor() == other.osFlavor() || other.osFlavor() == Abi::UnknownFlavor) && (binaryFormat() == other.binaryFormat() || other.binaryFormat() == Abi::UnknownFormat) && ((wordWidth() == other.wordWidth() && wordWidth() != 0) || other.wordWidth() == 0); // *-linux-generic-* is compatible with *-linux-* (both ways): This is for the benefit of // people building Qt themselves using e.g. a meego toolchain. // // We leave it to the specific targets to catch filter out the tool chains that do not // work for them. if (!isCompat && (architecture() == other.architecture() || other.architecture() == Abi::UnknownArchitecture) && ((os() == other.os()) && (os() == LinuxOS)) && (osFlavor() == GenericLinuxFlavor || other.osFlavor() == GenericLinuxFlavor) && (binaryFormat() == other.binaryFormat() || other.binaryFormat() == Abi::UnknownFormat) && ((wordWidth() == other.wordWidth() && wordWidth() != 0) || other.wordWidth() == 0)) isCompat = true; return isCompat; }
void AbiWidget::setCustomAbi(const Abi ¤t) { d->m_architectureComboBox->setCurrentIndex(static_cast<int>(current.architecture())); d->m_osComboBox->setCurrentIndex(static_cast<int>(current.os())); osChanged(); for (int i = 0; i < d->m_osFlavorComboBox->count(); ++i) { if (d->m_osFlavorComboBox->itemData(i).toInt() == current.osFlavor()) { d->m_osFlavorComboBox->setCurrentIndex(i); break; } } d->m_binaryFormatComboBox->setCurrentIndex(static_cast<int>(current.binaryFormat())); for (int i = 0; i < d->m_wordWidthComboBox->count(); ++i) { if (d->m_wordWidthComboBox->itemData(i).toInt() == current.wordWidth()) { d->m_wordWidthComboBox->setCurrentIndex(i); break; } } }
MsvcToolChain::MsvcToolChain(const QString &name, const Abi &abi, const QString &varsBat, const QString &varsBatArg, bool autodetect) : ToolChain(QLatin1String(Constants::MSVC_TOOLCHAIN_ID), autodetect), m_varsBat(varsBat), m_varsBatArg(varsBatArg), m_lastEnvironment(Utils::Environment::systemEnvironment()), m_abi(abi) { Q_ASSERT(!name.isEmpty()); Q_ASSERT(!m_varsBat.isEmpty()); Q_ASSERT(QFileInfo(m_varsBat).exists()); Q_ASSERT(abi.os() == Abi::WindowsOS); Q_ASSERT(abi.binaryFormat() == Abi::PEFormat); Q_ASSERT(abi.osFlavor() != Abi::WindowsMSysFlavor); setId(QString::fromLatin1("%1:%2.%3.%4").arg(Constants::MSVC_TOOLCHAIN_ID).arg(m_varsBat) .arg(m_varsBatArg).arg(m_debuggerCommand)); setDisplayName(name); }
Abi QmlProjectRunConfiguration::abi() const { Abi hostAbi = Abi::hostAbi(); return Abi(hostAbi.architecture(), hostAbi.os(), hostAbi.osFlavor(), Abi::RuntimeQmlFormat, hostAbi.wordWidth()); }