ToolChain::ToolChain(const ToolChain &other) : d(new Internal::ToolChainPrivate(other.id(), false)) { // leave the autodetection bit at false. d->m_displayName = QCoreApplication::translate("ProjectExplorer::ToolChain", "Clone of %1") .arg(other.displayName()); }
QStringList IosBuildStep::defaultArguments() const { QStringList res; Kit *kit = target()->kit(); ToolChain *tc = ToolChainKitInformation::toolChain(kit); switch (target()->activeBuildConfiguration()->buildType()) { case BuildConfiguration::Debug : res << QLatin1String("-configuration") << QLatin1String("Debug"); break; case BuildConfiguration::Release : res << QLatin1String("-configuration") << QLatin1String("Release"); break; case BuildConfiguration::Unknown : break; default: qCWarning(iosLog) << "IosBuildStep had an unknown buildType " << target()->activeBuildConfiguration()->buildType(); } if (tc->typeId() == ProjectExplorer::Constants::GCC_TOOLCHAIN_TYPEID || tc->typeId() == ProjectExplorer::Constants::CLANG_TOOLCHAIN_TYPEID) { GccToolChain *gtc = static_cast<GccToolChain *>(tc); res << gtc->platformCodeGenFlags(); } if (!SysRootKitInformation::sysRoot(kit).isEmpty()) res << QLatin1String("-sdk") << SysRootKitInformation::sysRoot(kit).toString(); res << QLatin1String("SYMROOT=") + IosManager::resDirForTarget(target()); return res; }
void ProfileChooser::init(bool hostAbiOnly) { const Abi hostAbi = Abi::hostAbi(); foreach (const Profile *st, ProfileManager::instance()->profiles()) { if (!st->isValid()) continue; ToolChain *tc = ToolChainProfileInformation::toolChain(st); if (!tc) continue; const Abi abi = tc->targetAbi(); if (hostAbiOnly && hostAbi.os() != abi.os()) continue; const QString debuggerCommand = DebuggerProfileInformation::debuggerCommand(st).toString(); if (debuggerCommand.isEmpty()) continue; const QString completeBase = QFileInfo(debuggerCommand).completeBaseName(); const QString name = tr("%1 (%2)").arg(st->displayName(), completeBase); addItem(name, qVariantFromValue(st->id())); QString debugger = QDir::toNativeSeparators(debuggerCommand); debugger.replace(QString(QLatin1Char(' ')), QLatin1String(" ")); QString toolTip = tr("<html><head/><body><table>" "<tr><td>ABI:</td><td><i>%1</i></td></tr>" "<tr><td>Debugger:</td><td>%2</td></tr>") .arg(st->displayName(), QDir::toNativeSeparators(debugger)); setItemData(count() - 1, toolTip, Qt::ToolTipRole); } setEnabled(count() > 1); }
QStringList MakeStep::automaticallyAddedArguments() const { ToolChain *tc = ToolChainKitInformation::toolChain(target()->kit(), ProjectExplorer::Constants::CXX_LANGUAGE_ID); if (!tc || tc->targetAbi().binaryFormat() == Abi::PEFormat) return QStringList(); return QStringList() << "-w" << "-r"; }
QStringList MakeStep::automaticallyAddedArguments() const { ToolChain *tc = ToolChainKitInformation::toolChain(target()->kit()); if (!tc || tc->targetAbi().binaryFormat() == Abi::PEFormat) return QStringList(); return QStringList() << QLatin1String("-w") << QLatin1String("-r"); }
void QmakeKitInformation::setup(Kit *k) { QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(k); if (!version) return; if (version->type() == "Boot2Qt.QtVersionType") // HACK: Ignore boot2Qt kits! return; FileName spec = QmakeKitInformation::mkspec(k); if (spec.isEmpty()) spec = version->mkspec(); ToolChain *tc = ToolChainKitInformation::toolChain(k, ToolChain::Language::Cxx); if (!tc || (!tc->suggestedMkspecList().empty() && !tc->suggestedMkspecList().contains(spec))) { ToolChain *possibleTc = nullptr; foreach (ToolChain *current, ToolChainManager::toolChains()) { if (current->language() == ToolChain::Language::Cxx && version->qtAbis().contains(current->targetAbi())) { possibleTc = current; if (current->suggestedMkspecList().contains(spec)) break; } } if (possibleTc) ToolChainKitInformation::setToolChain(k, possibleTc); }
bool ToolChain::operator == (const ToolChain &tc) const { if (this == &tc) return true; // We ignore displayname return typeId() == tc.typeId() && isAutoDetected() == tc.isAutoDetected(); }
Qt4BuildConfiguration::LastKitState::LastKitState(Kit *k) : m_qtVersion(QtKitInformation::qtVersionId(k)), m_sysroot(SysRootKitInformation::sysRoot(k).toString()), m_mkspec(QmakeKitInformation::mkspec(k).toString()) { ToolChain *tc = ToolChainKitInformation::toolChain(k); m_toolchain = tc ? tc->id() : QString(); }
void tools::addArchSpecificRPath(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) { std::string CandidateRPath = TC.getArchSpecificLibPath(); if (TC.getVFS().exists(CandidateRPath)) { CmdArgs.push_back("-rpath"); CmdArgs.push_back(Args.MakeArgString(CandidateRPath.c_str())); } }
QString DMakeStep::makeCommand(const Utils::Environment &environment) const { ToolChain *tc = ToolChainKitInformation::toolChain(target()->kit(), ToolChain::Language::Cxx); if (tc) return tc->makeCommand(environment); else return QLatin1String("dmd"); }
FileName AndroidGdbServerKitInformation::autoDetect(Kit *kit) { ToolChain *tc = ToolChainKitInformation::toolChain(kit); if (!tc || tc->type() != QLatin1String(Constants::ANDROID_TOOLCHAIN_TYPE)) return FileName(); AndroidToolChain *atc = static_cast<AndroidToolChain *>(tc); return atc->suggestedGdbServer(); }
bool AndroidGdbServerKitInformation::isAndroidKit(const Kit *kit) { QtSupport::BaseQtVersion *qt = QtSupport::QtKitInformation::qtVersion(kit); ToolChain *tc = ToolChainKitInformation::toolChain(kit); if (qt && tc) return qt->type() == QLatin1String(Constants::ANDROIDQT) && tc->type() == QLatin1String(Constants::ANDROID_TOOLCHAIN_TYPE); return false; }
ProjectExplorer::Abi RunConfiguration::abi() const { BuildConfiguration *bc = target()->activeBuildConfiguration(); if (!bc) return Abi::hostAbi(); ToolChain *tc = bc->toolChain(); if (!tc) return Abi::hostAbi(); return tc->targetAbi(); }
bool ToolChain::operator == (const ToolChain &tc) const { if (this == &tc) return true; const QString thisId = id().left(id().indexOf(QLatin1Char(':'))); const QString tcId = tc.id().left(tc.id().indexOf(QLatin1Char(':'))); // We ignore displayname return thisId == tcId && isAutoDetected() == tc.isAutoDetected(); }
QString MakeStep::effectiveMakeCommand() const { QString makeCmd = m_makeCmd; if (makeCmd.isEmpty()) { QmakeBuildConfiguration *bc = qmakeBuildConfiguration(); ToolChain *tc = ToolChainKitInformation::toolChain(target()->kit()); if (bc && tc) makeCmd = tc->makeCommand(bc->environment()); } return makeCmd; }
QString GenericMakeStep::makeCommand(const Utils::Environment &environment) const { QString command = m_makeCommand; if (command.isEmpty()) { ToolChain *tc = ToolChainKitInformation::toolChain(target()->kit()); if (tc) command = tc->makeCommand(environment); else command = QLatin1String("make"); } return command; }
bool PokySDKKitInformation::isPokySDKKit(const Kit *kit) { if (!kit->isAutoDetected()) return false; ToolChain *tc = ToolChainKitInformation::toolChain(kit); if (tc && !findEnvFromCompiler(tc->compilerCommand()).isEmpty()) return true; else if (!findEnvFromSysroot(SysRootKitInformation::sysRoot(kit)).isEmpty()) return true; else return false; }
void MakeStepConfigWidget::updateDetails() { ToolChain *tc = ToolChainKitInformation::toolChain(m_makeStep->target()->kit()); QmakeBuildConfiguration *bc = m_makeStep->qmakeBuildConfiguration(); if (!bc) bc = qobject_cast<QmakeBuildConfiguration *>(m_makeStep->target()->activeBuildConfiguration()); if (tc && bc) m_ui->makeLabel->setText(tr("Override %1:").arg(QDir::toNativeSeparators(tc->makeCommand(bc->environment())))); else m_ui->makeLabel->setText(tr("Make:")); if (!tc) { setSummaryText(tr("<b>Make:</b> %1").arg(ProjectExplorer::ToolChainKitInformation::msgNoToolChainInTarget())); return; } if (!bc) { setSummaryText(tr("<b>Make:</b> No Qt build configuration.")); return; } ProcessParameters param; param.setMacroExpander(bc->macroExpander()); param.setWorkingDirectory(bc->buildDirectory().toString()); QString makeCmd = tc->makeCommand(bc->environment()); if (!m_makeStep->makeCommand().isEmpty()) makeCmd = m_makeStep->makeCommand(); param.setCommand(makeCmd); QString args = m_makeStep->userArguments(); Utils::Environment env = bc->environment(); Utils::Environment::setupEnglishOutput(&env); // We prepend "L" to the MAKEFLAGS, so that nmake / jom are less verbose // FIXME doing this without the user having a way to override this is rather bad if (tc && m_makeStep->makeCommand().isEmpty()) { if (tc->targetAbi().os() == Abi::WindowsOS && tc->targetAbi().osFlavor() != Abi::WindowsMSysFlavor) { const QString makeFlags = QLatin1String("MAKEFLAGS"); env.set(makeFlags, QLatin1Char('L') + env.value(makeFlags)); } } param.setArguments(args); param.setEnvironment(env); if (param.commandMissing()) setSummaryText(tr("<b>Make:</b> %1 not found in the environment.").arg(makeCmd)); // Override display text else setSummaryText(param.summaryInWorkdir(displayName())); }
QString MakeStep::effectiveMakeCommand() const { QString makeCmd = m_makeCmd; if (makeCmd.isEmpty()) { QmakeBuildConfiguration *bc = qmakeBuildConfiguration(); if (!bc) bc = qobject_cast<QmakeBuildConfiguration *>(target()->activeBuildConfiguration()); ToolChain *tc = ToolChainKitInformation::toolChain(target()->kit(), ProjectExplorer::Constants::CXX_LANGUAGE_ID); if (bc && tc) makeCmd = tc->makeCommand(bc->environment()); } return makeCmd; }
static StringRef getArchNameForCompilerRTLib(const ToolChain &TC, const ArgList &Args) { const llvm::Triple &Triple = TC.getTriple(); bool IsWindows = Triple.isOSWindows(); if (Triple.isWindowsMSVCEnvironment() && TC.getArch() == llvm::Triple::x86) return "i386"; if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb) return (arm::getARMFloatABI(TC, Args) == arm::FloatABI::Hard && !IsWindows) ? "armhf" : "arm"; return TC.getArchName(); }
bool ToolChain::operator == (const ToolChain &tc) const { if (this == &tc) return true; return id() == tc.id(); }
bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC, const ArgList &Args, bool IsOffloadingHost, bool GompNeedsRT) { if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ, options::OPT_fno_openmp, false)) return false; switch (TC.getDriver().getOpenMPRuntime(Args)) { case Driver::OMPRT_OMP: CmdArgs.push_back("-lomp"); break; case Driver::OMPRT_GOMP: CmdArgs.push_back("-lgomp"); if (GompNeedsRT) CmdArgs.push_back("-lrt"); break; case Driver::OMPRT_IOMP5: CmdArgs.push_back("-liomp5"); break; case Driver::OMPRT_Unknown: // Already diagnosed. return false; } if (IsOffloadingHost) CmdArgs.push_back("-lomptarget"); addArchSpecificRPath(TC, Args, CmdArgs); return true; }
static StringRef getArchNameForCompilerRTLib(const ToolChain &TC, const ArgList &Args) { const llvm::Triple &Triple = TC.getTriple(); bool IsWindows = Triple.isOSWindows(); if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb) return (arm::getARMFloatABI(TC, Args) == arm::FloatABI::Hard && !IsWindows) ? "armhf" : "arm"; // For historic reasons, Android library is using i686 instead of i386. if (TC.getArch() == llvm::Triple::x86 && Triple.isAndroid()) return "i686"; return llvm::Triple::getArchTypeName(TC.getArch()); }
CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple, const ToolChain &HostTC, const ArgList &Args) : ToolChain(D, Triple, Args), HostTC(HostTC), CudaInstallation(D, HostTC.getTriple(), Args) { if (CudaInstallation.isValid()) getProgramPaths().push_back(CudaInstallation.getBinPath()); }
static ToolChain *findOrCreateToolChain(const QList<ToolChain *> &alreadyKnown, const QString &name, const Abi &abi, const QString &varsBat, const QString &varsBatArg, ToolChain::Detection d = ToolChain::ManualDetection) { ToolChain *tc = Utils::findOrDefault(alreadyKnown, [&varsBat, &varsBatArg](ToolChain *tc) -> bool { if (tc->typeId() != Constants::MSVC_TOOLCHAIN_TYPEID) return false; auto mtc = static_cast<MsvcToolChain *>(tc); return mtc->varsBat() == varsBat && mtc->varsBatArg() == varsBatArg; }); if (!tc) tc = new MsvcToolChain(name, abi, varsBat, varsBatArg, d); return tc; }
static void addLinkSanitizerLibArgsForDarwin(const ArgList &Args, ArgStringList &Arguments, StringRef Sanitizer, const ToolChain &TC, bool shared = true) { // Sanitizer runtime libraries requires C++. Arguments.push_back("-lc++"); // Add explicit dependency on -lc++abi, as -lc++ doesn't re-export // all RTTI-related symbols that are used. Arguments.push_back("-lc++abi"); auto LibName = TC.sanitizerRuntimeLibName(Sanitizer, shared); TC.addLinkRuntimeLib(Args, Arguments, LibName); if (shared) addLinkRuntimeLibRPath(Args, Arguments, LibName, TC); }
bool SanitizerArgs::hasAsanZeroBaseShadow(const ToolChain &TC) const { if (!needsAsanRt()) return false; if (AsanZeroBaseShadow != AZBSK_Default) return AsanZeroBaseShadow == AZBSK_On; // Zero-base shadow is used by default only on Android. return TC.getTriple().getEnvironment() == llvm::Triple::Android; }
FileName PokySDKKitInformation::environmentFile(const Kit *kit) { FileName envFile; ToolChain *tc = ToolChainKitInformation::toolChain(kit); if (tc) { envFile = findEnvFromCompiler(tc->compilerCommand()); if (QFile::exists(envFile.toString())) return envFile; } envFile = findEnvFromSysroot(SysRootKitInformation::sysRoot(kit)); if (QFile::exists(envFile.toString())) return envFile; else return FileName(); }
void tools::linkSanitizerRuntimeDeps(const ToolChain &TC, ArgStringList &CmdArgs) { // Force linking against the system libraries sanitizers depends on // (see PR15823 why this is necessary). CmdArgs.push_back("--no-as-needed"); // There's no libpthread or librt on RTEMS. if (TC.getTriple().getOS() != llvm::Triple::RTEMS) { CmdArgs.push_back("-lpthread"); CmdArgs.push_back("-lrt"); } CmdArgs.push_back("-lm"); // There's no libdl on FreeBSD or RTEMS. if (TC.getTriple().getOS() != llvm::Triple::FreeBSD && TC.getTriple().getOS() != llvm::Triple::NetBSD && TC.getTriple().getOS() != llvm::Triple::RTEMS) CmdArgs.push_back("-ldl"); }
// Should be called before we add system libraries (C++ ABI, libstdc++/libc++, // C runtime, etc). Returns true if sanitizer system deps need to be linked in. bool tools::addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) { SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes, NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols; collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes, NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols); // Inject libfuzzer dependencies. if (TC.getSanitizerArgs().needsFuzzer() && !Args.hasArg(options::OPT_shared)) { addSanitizerRuntime(TC, Args, CmdArgs, "fuzzer", false, true); if (!Args.hasArg(clang::driver::options::OPT_nostdlibxx)) TC.AddCXXStdlibLibArgs(Args, CmdArgs); } for (auto RT : SharedRuntimes) addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false); for (auto RT : HelperStaticRuntimes) addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true); bool AddExportDynamic = false; for (auto RT : StaticRuntimes) { addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true); AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT); } for (auto RT : NonWholeStaticRuntimes) { addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false); AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT); } for (auto S : RequiredSymbols) { CmdArgs.push_back("-u"); CmdArgs.push_back(Args.MakeArgString(S)); } // If there is a static runtime with no dynamic list, force all the symbols // to be dynamic to be sure we export sanitizer interface functions. if (AddExportDynamic) CmdArgs.push_back("-export-dynamic"); const SanitizerArgs &SanArgs = TC.getSanitizerArgs(); if (SanArgs.hasCrossDsoCfi() && !AddExportDynamic) CmdArgs.push_back("-export-dynamic-symbol=__cfi_check"); return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty(); }