Skip to content
Snippets Groups Projects
qtversionmanager.cpp 45.1 KiB
Newer Older
con's avatar
con committed
        if (m_versionInfo.contains("QT_INSTALL_BINS")) {
            QFileInfo fi(m_versionInfo.value("QT_INSTALL_BINS"));
            if (!fi.exists())
                m_notInstalled = true;
        }
        if (m_versionInfo.contains("QT_INSTALL_HEADERS")){
            QFileInfo fi(m_versionInfo.value("QT_INSTALL_HEADERS"));
            if (!fi.exists())
                m_notInstalled = true;
        }

        // Parse qconfigpri
        QString baseDir = m_versionInfo.contains("QT_INSTALL_DATA") ?
                           m_versionInfo.value("QT_INSTALL_DATA") :
                           m_path;
        QFile qconfigpri(baseDir + QLatin1String("/mkspecs/qconfig.pri"));
        if (qconfigpri.exists()) {
            qconfigpri.open(QIODevice::ReadOnly | QIODevice::Text);
            QTextStream stream(&qconfigpri);
            while (!stream.atEnd()) {
                QString line = stream.readLine().trimmed();
                if (line.startsWith(QLatin1String("CONFIG"))) {
                    m_defaultConfigIsDebugAndRelease = false;
                    QStringList values = line.split(QLatin1Char('=')).at(1).trimmed().split(" ");
                    foreach(const QString &value, values) {
                        if (value == "debug")
                            m_defaultConfigIsDebug = true;
hjk's avatar
hjk committed
                        else if (value == "release")
con's avatar
con committed
                            m_defaultConfigIsDebug = false;
hjk's avatar
hjk committed
                        else if (value == "build_all")
con's avatar
con committed
                            m_defaultConfigIsDebugAndRelease = true;
                    }
                }
            }
        }
    }
    m_versionInfoUpToDate = true;
}

bool QtVersion::isInstalled() const
{
    updateVersionInfo();
    return !m_notInstalled;
}

void QtVersion::updateMkSpec() const
{
    if (m_mkspecUpToDate)
        return;
    //qDebug()<<"Finding mkspec for"<<path();

    QString mkspec;
dt's avatar
dt committed
//    QFile f(path() + "/.qmake.cache");
//    if (f.exists() && f.open(QIODevice::ReadOnly)) {
hjk's avatar
hjk committed
//        while (!f.atEnd()) {
dt's avatar
dt committed
//            QByteArray line = f.readLine();
hjk's avatar
hjk committed
//            if (line.startsWith("QMAKESPEC")) {
dt's avatar
dt committed
//                const QList<QByteArray> &temp = line.split('=');
hjk's avatar
hjk committed
//                if (temp.size() == 2) {
dt's avatar
dt committed
//                    mkspec = temp.at(1).trimmed();
//                    if (mkspec.startsWith("$$QT_BUILD_TREE/mkspecs/"))
//                        mkspec = mkspec.mid(QString("$$QT_BUILD_TREE/mkspecs/").length());
//                    else if (mkspec.startsWith("$$QT_BUILD_TREE\\mkspecs\\"))
//                        mkspec = mkspec.mid(QString("$$QT_BUILD_TREE\\mkspecs\\").length());
//                    mkspec = QDir::fromNativeSeparators(mkspec);
dt's avatar
dt committed
//                }
//                break;
//            }
//        }
//        f.close();
//    } else {
con's avatar
con committed
        // no .qmake.cache so look at the default mkspec
        QString mkspecPath = versionInfo().value("QMAKE_MKSPECS");
        if (mkspecPath.isEmpty())
            mkspecPath = path() + "/mkspecs/default";
        else
            mkspecPath = mkspecPath + "/default";
//        qDebug() << "default mkspec is located at" << mkspecPath;
#ifdef Q_OS_WIN
        QFile f2(mkspecPath + "/qmake.conf");
        if (f2.exists() && f2.open(QIODevice::ReadOnly)) {
hjk's avatar
hjk committed
            while (!f2.atEnd()) {
con's avatar
con committed
                QByteArray line = f2.readLine();
hjk's avatar
hjk committed
                if (line.startsWith("QMAKESPEC_ORIGINAL")) {
con's avatar
con committed
                    const QList<QByteArray> &temp = line.split('=');
                    if (temp.size() == 2) {
lowinu's avatar
lowinu committed
                        mkspec = temp.at(1).trimmed();
con's avatar
con committed
                    }
                    break;
                }
            }
            f2.close();
        }
#elif defined(Q_OS_MAC)
        QFile f2(mkspecPath + "/qmake.conf");
        if (f2.exists() && f2.open(QIODevice::ReadOnly)) {
hjk's avatar
hjk committed
            while (!f2.atEnd()) {
con's avatar
con committed
                QByteArray line = f2.readLine();
hjk's avatar
hjk committed
                if (line.startsWith("MAKEFILE_GENERATOR")) {
con's avatar
con committed
                    const QList<QByteArray> &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
dt's avatar
dt committed
//    }
con's avatar
con committed

dt's avatar
dt committed
    m_mkspecFullPath = mkspec;
    int index = mkspec.lastIndexOf('/');
hjk's avatar
hjk committed
    if (index == -1)
con's avatar
con committed
        index = mkspec.lastIndexOf('\\');
Joerg Bornemann's avatar
Joerg Bornemann committed
    QString mkspecDir = QDir(m_path + "/mkspecs/").canonicalPath();
    if (index >= 0 && QDir(mkspec.left(index)).canonicalPath() == mkspecDir)
con's avatar
con committed
        mkspec = mkspec.mid(index+1).trimmed();

    m_mkspec = mkspec;
    m_mkspecUpToDate = true;
//    qDebug()<<"mkspec for "<<m_path<<" is "<<mkspec;
}

QString QtVersion::makeCommand() const
{
#ifdef Q_OS_WIN
    const QString &spec = mkspec();
Joerg Bornemann's avatar
Joerg Bornemann committed
    if (spec.contains("win32-msvc") || spec.contains(QLatin1String("win32-icc")))
con's avatar
con committed
        return "nmake.exe";
hjk's avatar
hjk committed
    else if (spec.startsWith("wince"))
con's avatar
con committed
        return "nmake.exe";
    else
        return "mingw32-make.exe";
#else
    return "make";
#endif
}

QString QtVersion::qmakeCommand() const
{
    // We can't use versionInfo QT_INSTALL_BINS here
    // because that functions calls us to find out the values for versionInfo
    if (!m_qmakeCommand.isNull())
        return m_qmakeCommand;

    QDir qtDir = path() + "/bin/";
hjk's avatar
hjk committed
    foreach (const QString &possibleCommand, QtVersionManager::possibleQMakeCommands()) {
con's avatar
con committed
        QString s = qtDir.absoluteFilePath(possibleCommand);
        QFileInfo qmake(s);
        if (qmake.exists() && qmake.isExecutable()) {
            QString qtVersion = QtVersionManager::qtVersionForQMake(qmake.absoluteFilePath());
            if (!qtVersion.isNull()) {
                m_qtVersionString = qtVersion;
con's avatar
con committed
                m_qmakeCommand = qmake.absoluteFilePath();
                return qmake.absoluteFilePath();
            }
        }
    }
    return QString::null;
}

QtVersion::ToolchainType QtVersion::toolchainType() const
{
    if (!isValid())
        return INVALID;
    const QString &spec = mkspec();
hjk's avatar
hjk committed
    if (spec.contains("win32-msvc") || spec.contains(QLatin1String("win32-icc")))
con's avatar
con committed
        return MSVC;
hjk's avatar
hjk committed
    else if (spec == "win32-g++")
con's avatar
con committed
        return MinGW;
hjk's avatar
hjk committed
    else if (spec == QString::null)
con's avatar
con committed
        return INVALID;
hjk's avatar
hjk committed
    else if (spec.startsWith("wince"))
con's avatar
con committed
        return WINCE;
    else
        return OTHER;
}

QString QtVersion::mingwDirectory() const
{
    return m_mingwDirectory;
}

void QtVersion::setMingwDirectory(const QString &directory)
{
    m_mingwDirectory = directory;
}

QString QtVersion::prependPath() const
{
    return m_prependPath;
}

void QtVersion::setPrependPath(const QString &directory)
{
    m_prependPath = directory;
}

QString QtVersion::msvcVersion() const
{
    return m_msvcVersion;
}

void QtVersion::setMsvcVersion(const QString &version)
{
    m_msvcVersion = version;
}

Environment QtVersion::addToEnvironment(const Environment &env)
{
    Environment e(env);
    e.set("QTDIR", m_path);
    QString qtdirbin = versionInfo().value("QT_INSTALL_BINS");
    e.prependOrSetPath(qtdirbin);
    // add libdir, includedir and bindir
    // or add Mingw dirs
    // or do nothing on other
    QtVersion::ToolchainType t = toolchainType();
hjk's avatar
hjk committed
    if (t == QtVersion::MinGW) {
con's avatar
con committed
        QFileInfo mingwFileInfo(m_mingwDirectory + "/bin");
hjk's avatar
hjk committed
        if (mingwFileInfo.exists())
con's avatar
con committed
            e.prependOrSetPath(m_mingwDirectory + "/bin");
hjk's avatar
hjk committed
    } else if (t == QtVersion::MSVC) {
con's avatar
con committed
        QList<MSVCEnvironment> list = MSVCEnvironment::availableVersions();
hjk's avatar
hjk committed
        if (list.count() == 1) {
con's avatar
con committed
            e = list.at(0).addToEnvironment(e);
        } else {
            foreach(const MSVCEnvironment &m, list) {
hjk's avatar
hjk committed
                if (m.name() == m_msvcVersion) {
con's avatar
con committed
                    e = m.addToEnvironment(e);
                    break;
                }
            }
        }
hjk's avatar
hjk committed
    } else if (t == QtVersion::WINCE) {
con's avatar
con committed
        QString msvcPath;
        // Find MSVC path
        QList<MSVCEnvironment> list = MSVCEnvironment::availableVersions();
hjk's avatar
hjk committed
        if (list.count() == 1) {
con's avatar
con committed
            msvcPath = list.at(0).path();
            e = list.at(0).addToEnvironment(e);
        } else {
            foreach(const MSVCEnvironment &m, list) {
hjk's avatar
hjk committed
                if (m.name() == m_msvcVersion) {
con's avatar
con committed
                    e = m.addToEnvironment(e);
                    msvcPath = m.path();
                    break;
                }
            }
        }
        msvcPath += "/";

//        qDebug()<<"MSVC path"<<msvcPath;
//        qDebug()<<"looking for platform name in"<< path() + "/mkspecs/" + mkspec() +"/qmake.conf";
        // Find Platform name

        QString platformName = CeSdkHandler::platformName(path() + "/mkspecs/" + mkspec()+ "/qmake.conf");
//        qDebug()<<"Platform Name"<<platformName;

        CeSdkHandler cesdkhandler;
        cesdkhandler.parse(msvcPath);
        e = cesdkhandler.find(platformName).addToEnvironment(e);
hjk's avatar
hjk committed
    } else if (t == QtVersion::OTHER) {
        if (!m_prependPath.isEmpty())
con's avatar
con committed
            e.prependOrSetPath(m_prependPath);
    }
    return e;
}

int QtVersion::uniqueId() const
{
    return m_id;
}

int QtVersion::getUniqueId()
{
    QtVersionManager *vm = ExtensionSystem::PluginManager::instance()->getObject<QtVersionManager>();
    return vm->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;
}