/************************************************************************** ** ** This file is part of Qt Creator ** ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** Commercial Usage ** ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at http://www.qtsoftware.com/contact. ** **************************************************************************/ #include "qtversionmanager.h" #include "qt4projectmanagerconstants.h" #include "profilereader.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef Q_OS_WIN32 #include #endif using namespace Qt4ProjectManager; using namespace Qt4ProjectManager::Internal; using ProjectExplorer::DebuggingHelperLibrary; static const char *QtVersionsSectionName = "QtVersions"; static const char *defaultQtVersionKey = "DefaultQtVersion"; static const char *newQtVersionsKey = "NewQtVersions"; static const char *PATH_AUTODETECTION_SOURCE = "PATH"; QtVersionManager *QtVersionManager::m_self = 0; QtVersionManager::QtVersionManager() : m_emptyVersion(new QtVersion) { m_self = this; QSettings *s = Core::ICore::instance()->settings(); m_defaultVersion = s->value(defaultQtVersionKey, 0).toInt(); m_idcount = 1; int size = s->beginReadArray(QtVersionsSectionName); for (int i = 0; i < size; ++i) { s->setArrayIndex(i); // Find the right id // Either something saved or something generated // Note: This code assumes that either all ids are read from the settings // or generated on the fly. int id = s->value("Id", -1).toInt(); if (id == -1) id = getUniqueId(); else if (id > m_idcount) m_idcount = id; bool isAutodetected; QString autodetectionSource; if (s->contains("isAutodetected")) { isAutodetected = s->value("isAutodetected", false).toBool(); autodetectionSource = s->value("autodetectionSource", QString()).toString(); } else {// compatibility isAutodetected = s->value("IsSystemVersion", false).toBool(); if (isAutodetected) autodetectionSource = QLatin1String(PATH_AUTODETECTION_SOURCE); } QtVersion *version = new QtVersion(s->value("Name").toString(), s->value("Path").toString(), id, isAutodetected, autodetectionSource); version->setMingwDirectory(s->value("MingwDirectory").toString()); version->setMsvcVersion(s->value("msvcVersion").toString()); m_versions.append(version); } s->endArray(); updateUniqueIdToIndexMap(); ++m_idcount; addNewVersionsFromInstaller(); updateSystemVersion(); writeVersionsIntoSettings(); if (Core::Internal::WelcomeMode *welcomeMode = qobject_cast (Core::ICore::instance()->modeManager()->mode(Core::Constants::MODE_WELCOME))) { connect(this, SIGNAL(updatedExamples(QString, QString)), welcomeMode, SIGNAL(updatedExamples(QString, QString))); } updateDocumentation(); updateExamples(); } QtVersionManager::~QtVersionManager() { qDeleteAll(m_versions); m_versions.clear(); delete m_emptyVersion; m_emptyVersion = 0; } QtVersionManager *QtVersionManager::instance() { return m_self; } void QtVersionManager::addVersion(QtVersion *version) { m_versions.append(version); emit qtVersionsChanged(); writeVersionsIntoSettings(); } void QtVersionManager::removeVersion(QtVersion *version) { m_versions.removeAll(version); emit qtVersionsChanged(); writeVersionsIntoSettings(); delete version; } void QtVersionManager::updateDocumentation() { Help::HelpManager *helpManager = ExtensionSystem::PluginManager::instance()->getObject(); Q_ASSERT(helpManager); QStringList fileEndings = QStringList() << "/qch/qt.qch" << "/qch/qmake.qch" << "/qch/designer.qch"; QStringList files; foreach (QtVersion *version, m_versions) { QString docPath = version->documentationPath(); foreach (const QString &fileEnding, fileEndings) files << docPath+fileEnding; } helpManager->registerDocumentation(files); } void QtVersionManager::updateExamples() { QList versions; versions.append(currentQtVersion()); versions.append(m_versions); QString examplesPath; QString docPath; QString demosPath; QtVersion *version = 0; // try to find a version which has both, demos and examples, starting with default Qt foreach (version, versions) { if (version->hasExamples()) examplesPath = version->examplesPath(); if (version->hasDemos()) demosPath = version->demosPath(); if (!examplesPath.isEmpty() && !demosPath.isEmpty()) { emit updatedExamples(examplesPath, demosPath); return; } } } int QtVersionManager::getUniqueId() { return m_idcount++; } void QtVersionManager::updateUniqueIdToIndexMap() { m_uniqueIdToIndex.clear(); for (int i = 0; i < m_versions.size(); ++i) m_uniqueIdToIndex.insert(m_versions.at(i)->uniqueId(), i); } void QtVersionManager::writeVersionsIntoSettings() { QSettings *s = Core::ICore::instance()->settings(); s->setValue(defaultQtVersionKey, m_defaultVersion); s->beginWriteArray(QtVersionsSectionName); for (int i = 0; i < m_versions.size(); ++i) { const QtVersion *version = m_versions.at(i); s->setArrayIndex(i); s->setValue("Name", version->name()); s->setValue("Path", version->path()); s->setValue("Id", version->uniqueId()); s->setValue("MingwDirectory", version->mingwDirectory()); s->setValue("msvcVersion", version->msvcVersion()); s->setValue("isAutodetected", version->isAutodetected()); if (version->isAutodetected()) s->setValue("autodetectionSource", version->autodetectionSource()); } s->endArray(); } QList QtVersionManager::versions() const { return m_versions; } QtVersion *QtVersionManager::version(int id) const { int pos = m_uniqueIdToIndex.value(id, -1); if (pos != -1) return m_versions.at(pos); if (m_defaultVersion < m_versions.count()) return m_versions.at(m_defaultVersion); else return m_emptyVersion; } void QtVersionManager::addNewVersionsFromInstaller() { // Add new versions which may have been installed by the WB installer in the form: // NewQtVersions="qt 4.3.2=c:\\qt\\qt432;qt embedded=c:\\qtembedded;" // or NewQtVersions="qt 4.3.2=c:\\qt\\qt432=c:\\qtcreator\\mingw\\=prependToPath; // Duplicate entries are not added, the first new version is set as default. QSettings *settings = Core::ICore::instance()->settings(); if (!settings->contains(newQtVersionsKey) && !settings->contains(QLatin1String("Installer/")+newQtVersionsKey)) return; // qDebug()<<"QtVersionManager::addNewVersionsFromInstaller()"; QString newVersionsValue = settings->value(newQtVersionsKey).toString(); if (newVersionsValue.isEmpty()) newVersionsValue = settings->value(QLatin1String("Installer/")+newQtVersionsKey).toString(); QStringList newVersionsList = newVersionsValue.split(';', QString::SkipEmptyParts); bool defaultVersionWasReset = false; foreach (QString newVersion, newVersionsList) { QStringList newVersionData = newVersion.split('='); if (newVersionData.count()>=2) { if (QDir(newVersionData[1]).exists()) { QtVersion *version = new QtVersion(newVersionData[0], newVersionData[1], m_idcount++ ); if (newVersionData.count() >= 3) version->setMingwDirectory(newVersionData[2]); bool versionWasAlreadyInList = false; foreach(const QtVersion * const it, m_versions) { if (QDir(version->path()).canonicalPath() == QDir(it->path()).canonicalPath()) { versionWasAlreadyInList = true; break; } } if (!versionWasAlreadyInList) { m_versions.append(version); } else { // clean up delete version; } if (!defaultVersionWasReset) { m_defaultVersion = versionWasAlreadyInList? m_defaultVersion : m_versions.count() - 1; defaultVersionWasReset = true; } } } } settings->remove(newQtVersionsKey); settings->remove(QLatin1String("Installer/")+newQtVersionsKey); updateUniqueIdToIndexMap(); } void QtVersionManager::updateSystemVersion() { bool haveSystemVersion = false; QString systemQMakePath = DebuggingHelperLibrary::findSystemQt(ProjectExplorer::Environment::systemEnvironment()); QString systemQtPath; if (systemQMakePath.isNull()) { systemQtPath = tr(""); } else { QDir dir(QFileInfo(systemQMakePath).absoluteDir()); dir.cdUp(); systemQtPath = dir.absolutePath(); } foreach (QtVersion *version, m_versions) { if (version->isAutodetected() && version->autodetectionSource() == PATH_AUTODETECTION_SOURCE) { version->setPath(systemQtPath); version->setName(tr("Qt in PATH")); haveSystemVersion = true; } } if (haveSystemVersion) return; QtVersion *version = new QtVersion(tr("Qt in PATH"), systemQtPath, getUniqueId(), true, PATH_AUTODETECTION_SOURCE); m_versions.prepend(version); updateUniqueIdToIndexMap(); if (m_versions.size() > 1) // we had other versions before adding system version ++m_defaultVersion; } QtVersion *QtVersionManager::currentQtVersion() const { if (m_defaultVersion < m_versions.count()) return m_versions.at(m_defaultVersion); else return m_emptyVersion; } void QtVersionManager::setNewQtVersions(QList newVersions, int newDefaultVersion) { bool versionPathsChanged = m_versions.size() != newVersions.size(); if (!versionPathsChanged) { for (int i = 0; i < m_versions.size(); ++i) { if (m_versions.at(i)->path() != newVersions.at(i)->path()) { versionPathsChanged = true; break; } } } qDeleteAll(m_versions); m_versions.clear(); foreach(QtVersion *version, newVersions) m_versions.append(new QtVersion(*version)); if (versionPathsChanged) updateDocumentation(); updateUniqueIdToIndexMap(); bool emitDefaultChanged = false; if (m_defaultVersion != newDefaultVersion) { m_defaultVersion = newDefaultVersion; emitDefaultChanged = true; } emit qtVersionsChanged(); if (emitDefaultChanged) { emit defaultQtVersionChanged(); updateExamples(); } writeVersionsIntoSettings(); } /// /// QtVersion /// QtVersion::QtVersion(const QString &name, const QString &path, int id, bool isAutodetected, const QString &autodetectionSource) : m_name(name), m_isAutodetected(isAutodetected), m_autodetectionSource(autodetectionSource), m_hasDebuggingHelper(false), m_notInstalled(false), m_defaultConfigIsDebug(true), m_defaultConfigIsDebugAndRelease(true), m_hasExamples(false), m_hasDemos(false), m_hasDocumentation(false), m_toolChain(0) { if (id == -1) m_id = getUniqueId(); else m_id = id; setPath(path); } QtVersion::QtVersion(const QString &name, const QString &path, bool isAutodetected, const QString &autodetectionSource) : m_name(name), m_isAutodetected(isAutodetected), m_autodetectionSource(autodetectionSource), m_hasDebuggingHelper(false), m_mkspecUpToDate(false), m_versionInfoUpToDate(false), m_toolChain(0) { m_id = getUniqueId(); setPath(path); } QtVersion::~QtVersion() { } QString QtVersion::name() const { return m_name; } QString QtVersion::path() const { return m_path; } QString QtVersion::sourcePath() const { return m_sourcePath; } QString QtVersion::mkspec() const { updateMkSpec(); return m_mkspec; } QString QtVersion::mkspecPath() const { updateMkSpec(); return m_mkspecFullPath; } QString QtVersion::qtVersionString() const { qmakeCommand(); return m_qtVersionString; } QHash QtVersion::versionInfo() const { updateVersionInfo(); return m_versionInfo; } QString QtVersion::qmakeCXX() const { updateQMakeCXX(); return m_qmakeCXX; } void QtVersion::setName(const QString &name) { m_name = name; } void QtVersion::setPath(const QString &path) { m_path = QDir::cleanPath(path); updateSourcePath(); m_versionInfoUpToDate = false; m_mkspecUpToDate = false; m_designerCommand = m_linguistCommand = m_qmakeCommand = m_uicCommand = QString::null; // TODO do i need to optimize this? m_hasDebuggingHelper = !debuggingHelperLibrary().isEmpty(); m_qmakeCXX = QString::null; m_qmakeCXXUpToDate = false; m_toolChainUpToDate = false; } void QtVersion::updateSourcePath() { m_sourcePath = m_path; QFile qmakeCache(m_path + QLatin1String("/.qmake.cache")); if (qmakeCache.exists()) { qmakeCache.open(QIODevice::ReadOnly | QIODevice::Text); QTextStream stream(&qmakeCache); while (!stream.atEnd()) { QString line = stream.readLine().trimmed(); if (line.startsWith(QLatin1String("QT_SOURCE_TREE"))) { m_sourcePath = line.split(QLatin1Char('=')).at(1).trimmed(); if (m_sourcePath.startsWith(QLatin1String("$$quote("))) { m_sourcePath.remove(0, 8); m_sourcePath.chop(1); } break; } } } } // Returns the version that was used to build the project in that directory // That is returns the directory // To find out wheter we already have a qtversion for that directory call // QtVersion *QtVersionManager::qtVersionForDirectory(const QString directory); QString QtVersionManager::findQtVersionFromMakefile(const QString &directory) { bool debugAdding = false; QFile makefile(directory + "/Makefile" ); if (makefile.exists() && makefile.open(QFile::ReadOnly)) { QTextStream ts(&makefile); while (!ts.atEnd()) { QString line = ts.readLine(); QRegExp r1("QMAKE\\s*=(.*)"); if (r1.exactMatch(line)) { if (debugAdding) qDebug()<<"#~~ QMAKE is:"<path() == directory) { return v; break; } } return 0; } QtVersion::QmakeBuildConfig QtVersionManager::scanMakefileForQmakeConfig(const QString &directory, QtVersion::QmakeBuildConfig defaultBuildConfig) { bool debugScan = false; QtVersion::QmakeBuildConfig result = QtVersion::NoBuild; QFile makefile(directory + "/Makefile" ); if (makefile.exists() && makefile.open(QFile::ReadOnly)) { QTextStream ts(&makefile); while (!ts.atEnd()) { QString line = ts.readLine(); if (line.startsWith("# Command:")) { // if nothing is specified result = defaultBuildConfig; // Actually parsing that line is not trivial in the general case // There might things like this // # Command: /home/dteske/git/bqt-45/bin/qmake -unix CONFIG+=debug\ release CONFIG\ +=\ debug_and_release\ debug -o Makefile test.pro // which sets debug_and_release and debug // or something like this: //[...] CONFIG+=debug\ release CONFIG\ +=\ debug_and_release\ debug CONFIG\ -=\ debug_and_release CONFIG\ -=\ debug -o Makefile test.pro // which sets -build_all and release // To parse that, we search for the first CONFIG, then look for " " which is not after a "\" or the end // And then look at each config individually // we then remove all "\ " with just " " // += sets adding flags // -= sets removing flags // and then split the string after the = // and go over each item separetly // debug sets/removes the flag DebugBuild // release removes/sets the flag DebugBuild // debug_and_release sets/removes the flag BuildAll int pos = line.indexOf("CONFIG"); if (pos != -1) { // Chopped of anything that is not interesting line = line.mid(pos); line = line.trimmed(); if (debugScan) qDebug()<<"chopping line :"<= 17 && QStringRef(&part, i, 17) == "debug_and_release") { if (setFlags) result = QtVersion::QmakeBuildConfig(result | QtVersion::BuildAll); else result = QtVersion::QmakeBuildConfig(result & ~QtVersion::BuildAll); if (debugScan) qDebug()<<"found debug_and_release new value"<=7 && QStringRef(&part, i, 7) == "release") { if (setFlags) result = QtVersion::QmakeBuildConfig(result & ~QtVersion::DebugBuild); else result = QtVersion::QmakeBuildConfig(result | QtVersion::DebugBuild); if (debugScan) qDebug()<<"found release new value"<= 5 && QStringRef(&part, i, 5) == "debug") { if (setFlags) result = QtVersion::QmakeBuildConfig(result | QtVersion::DebugBuild); else result = QtVersion::QmakeBuildConfig(result & ~QtVersion::DebugBuild); if (debugScan) qDebug()<<"found debug new value"< &temp = line.split('='); if (temp.size() == 2) { mkspec = temp.at(1).trimmed(); } break; } } f2.close(); } #elif defined(Q_OS_MAC) QFile f2(mkspecPath + "/qmake.conf"); if (f2.exists() && f2.open(QIODevice::ReadOnly)) { while (!f2.atEnd()) { QByteArray line = f2.readLine(); if (line.startsWith("MAKEFILE_GENERATOR")) { const QList &temp = line.split('='); if (temp.size() == 2) { const QByteArray &value = temp.at(1); if (value.contains("XCODE")) { // we don't want to generate xcode projects... // qDebug() << "default mkspec is xcode, falling back to g++"; mkspec = "macx-g++"; } else { //resolve mkspec link QFileInfo f3(mkspecPath); if (f3.isSymLink()) { mkspec = f3.symLinkTarget(); } } } break; } } f2.close(); } #else QFileInfo f2(mkspecPath); if (f2.isSymLink()) { mkspec = f2.symLinkTarget(); } #endif m_mkspecFullPath = mkspec; int index = mkspec.lastIndexOf('/'); if (index == -1) index = mkspec.lastIndexOf('\\'); QString mkspecDir = QDir(m_path + "/mkspecs/").canonicalPath(); if (index >= 0 && QDir(mkspec.left(index)).canonicalPath() == mkspecDir) mkspec = mkspec.mid(index+1).trimmed(); m_mkspec = mkspec; m_mkspecUpToDate = true; // qDebug()<<"mkspec for "<setCumulative(false); reader->setParsePreAndPostFiles(false); reader->readProFile(mkspecPath() + "/qmake.conf"); m_qmakeCXX = reader->value("QMAKE_CXX"); delete reader; m_qmakeCXXUpToDate = true; } ProjectExplorer::ToolChain *QtVersion::toolChain() const { updateToolChain(); return m_toolChain.data(); } void QtVersion::updateToolChain() const { if (m_toolChainUpToDate) return; ProjectExplorer::ToolChain *m_test= 0; ProjectExplorer::ToolChain::ToolChainType t = toolchainType(); if (t == ProjectExplorer::ToolChain::MinGW) { QString qmake_cxx = qmakeCXX(); ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment(); //addToEnvironment(env); env.prependOrSetPath(mingwDirectory()+"/bin"); qmake_cxx = env.searchInPath(qmake_cxx); m_test = ProjectExplorer::ToolChain::createMinGWToolChain(qmake_cxx, mingwDirectory()); //qDebug()<<"Mingw ToolChain"; } else if(t == ProjectExplorer::ToolChain::MSVC) { m_test = ProjectExplorer::ToolChain::createMSVCToolChain(msvcVersion(), isMSVC64Bit()); //qDebug()<<"MSVC ToolChain ("<msvcVersion()<<")"; } else if(t == ProjectExplorer::ToolChain::WINCE) { m_test = ProjectExplorer::ToolChain::createWinCEToolChain(msvcVersion(), wincePlatform()); //qDebug()<<"WinCE ToolChain ("<msvcVersion()<<","<wincePlatform()<<")"; } else if(t == ProjectExplorer::ToolChain::GCC || t == ProjectExplorer::ToolChain::LinuxICC) { QString qmake_cxx = qmakeCXX(); ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment(); //addToEnvironment(env); qmake_cxx = env.searchInPath(qmake_cxx); if (qmake_cxx.isEmpty()) { // macx-xcode mkspec resets the value of QMAKE_CXX. // Unfortunately, we need a valid QMAKE_CXX to configure the parser. qmake_cxx = QLatin1String("cc"); } m_test = ProjectExplorer::ToolChain::createGccToolChain(qmake_cxx); //qDebug()<<"GCC ToolChain ("<(m_test); } m_toolChainUpToDate = true; } QString QtVersion::findQtBinary(const QStringList &possibleCommands) const { const QString qtdirbin = versionInfo().value(QLatin1String("QT_INSTALL_BINS")) + QLatin1Char('/'); foreach (const QString &possibleCommand, possibleCommands) { const QString fullPath = qtdirbin + possibleCommand; if (QFileInfo(fullPath).isFile()) return QDir::cleanPath(fullPath); } return QString::null; } QString QtVersion::uicCommand() const { if (!isValid()) return QString::null; if (!m_uicCommand.isNull()) return m_uicCommand; #ifdef Q_OS_WIN const QStringList possibleCommands(QLatin1String("uic.exe")); #else QStringList possibleCommands; possibleCommands << QLatin1String("uic-qt4") << QLatin1String("uic4") << QLatin1String("uic"); #endif m_uicCommand = findQtBinary(possibleCommands); return m_uicCommand; } // Return a list of GUI binary names // 'foo', 'foo.exe', 'Foo.app/Contents/MacOS/Foo' static inline QStringList possibleGuiBinaries(const QString &name) { #ifdef Q_OS_WIN return QStringList(name + QLatin1String(".exe")); #elif defined(Q_OS_MAC) // 'Foo.app/Contents/MacOS/Foo' QString upCaseName = name; upCaseName[0] = upCaseName.at(0).toUpper(); QString macBinary = upCaseName; macBinary += QLatin1String(".app/Contents/MacOS/"); macBinary += upCaseName; return QStringList(macBinary); #else return QStringList(name); #endif } QString QtVersion::designerCommand() const { if (!isValid()) return QString::null; if (m_designerCommand.isNull()) m_designerCommand = findQtBinary(possibleGuiBinaries(QLatin1String("designer"))); return m_designerCommand; } QString QtVersion::linguistCommand() const { if (!isValid()) return QString::null; if (m_linguistCommand.isNull()) m_linguistCommand = findQtBinary(possibleGuiBinaries(QLatin1String("linguist"))); return m_linguistCommand; } ProjectExplorer::ToolChain::ToolChainType QtVersion::toolchainType() const { if (!isValid()) return ProjectExplorer::ToolChain::INVALID; const QString &spec = mkspec(); // qDebug()<<"spec="<addToEnvironment(env); } int QtVersion::uniqueId() const { return m_id; } int QtVersion::getUniqueId() { return QtVersionManager::instance()->getUniqueId(); } bool QtVersion::isValid() const { return (!(m_id == -1 || m_path == QString::null || m_name == QString::null || mkspec() == QString::null) && !m_notInstalled); } QtVersion::QmakeBuildConfig QtVersion::defaultBuildConfig() const { updateVersionInfo(); QtVersion::QmakeBuildConfig result = QtVersion::QmakeBuildConfig(0); if (m_defaultConfigIsDebugAndRelease) result = QtVersion::BuildAll; if (m_defaultConfigIsDebug) result = QtVersion::QmakeBuildConfig(result | QtVersion::DebugBuild); return result; } bool QtVersion::hasDebuggingHelper() const { return m_hasDebuggingHelper; } QString QtVersion::debuggingHelperLibrary() const { QString qtInstallData = versionInfo().value("QT_INSTALL_DATA"); if (qtInstallData.isEmpty()) qtInstallData = path(); return DebuggingHelperLibrary::debuggingHelperLibrary(qtInstallData, path()); } bool QtVersion::hasDocumentation() const { updateVersionInfo(); return m_hasDocumentation; } QString QtVersion::documentationPath() const { updateVersionInfo(); return m_versionInfo["QT_INSTALL_DOCS"]; } bool QtVersion::hasDemos() const { updateVersionInfo(); return m_hasDemos; } QString QtVersion::demosPath() const { updateVersionInfo(); return m_versionInfo["QT_INSTALL_DEMOS"]; } bool QtVersion::hasExamples() const { updateVersionInfo(); return m_hasExamples; } QString QtVersion::examplesPath() const { updateVersionInfo(); return m_versionInfo["QT_INSTALL_EXAMPLES"]; } bool QtVersion::isMSVC64Bit() const { const QString make = qmakeCommand(); // qDebug() << make; bool isAmd64 = false; #ifdef Q_OS_WIN32 # ifdef __GNUC__ // MinGW lacking some definitions/winbase.h # define SCS_64BIT_BINARY 6 # endif DWORD binaryType = 0; bool success = GetBinaryTypeW(reinterpret_cast(make.utf16()), &binaryType) != 0; if (success && binaryType == SCS_64BIT_BINARY) isAmd64=true; // qDebug() << "isAmd64:" << isAmd64 << binaryType; return isAmd64; #else Q_UNUSED(isAmd64) return false; #endif } QString QtVersion::buildDebuggingHelperLibrary() { QString qtInstallData = versionInfo().value("QT_INSTALL_DATA"); if (qtInstallData.isEmpty()) qtInstallData = path(); ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment(); addToEnvironment(env); ProjectExplorer::ToolChain *tc = toolChain(); QString directory = DebuggingHelperLibrary::copyDebuggingHelperLibrary(qtInstallData, path()); QString output = DebuggingHelperLibrary::buildDebuggingHelperLibrary(directory, tc->makeCommand(), qmakeCommand(), mkspec(), env); m_hasDebuggingHelper = !debuggingHelperLibrary().isEmpty(); return output; }