summaryrefslogtreecommitdiffstats
path: root/qmake/property.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'qmake/property.cpp')
-rw-r--r--qmake/property.cpp234
1 files changed, 234 insertions, 0 deletions
diff --git a/qmake/property.cpp b/qmake/property.cpp
new file mode 100644
index 0000000..979678c
--- /dev/null
+++ b/qmake/property.cpp
@@ -0,0 +1,234 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the qmake application of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** 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.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "property.h"
+#include "option.h"
+
+#include <qdir.h>
+#include <qmap.h>
+#include <qsettings.h>
+#include <qstringlist.h>
+#include <stdio.h>
+
+QT_BEGIN_NAMESPACE
+
+QStringList qmake_mkspec_paths(); //project.cpp
+
+QMakeProperty::QMakeProperty() : settings(0)
+{
+}
+
+QMakeProperty::~QMakeProperty()
+{
+ delete settings;
+ settings = 0;
+}
+
+void QMakeProperty::initSettings()
+{
+ if(!settings) {
+ settings = new QSettings(QSettings::UserScope, "Trolltech", "QMake");
+ settings->setFallbacksEnabled(false);
+ }
+}
+
+QString
+QMakeProperty::keyBase(bool version) const
+{
+ if (version)
+ return QString(qmake_version()) + "/";
+ return QString();
+}
+
+QString
+QMakeProperty::value(QString v, bool just_check)
+{
+ if(v == "QT_INSTALL_PREFIX")
+ return QLibraryInfo::location(QLibraryInfo::PrefixPath);
+ else if(v == "QT_INSTALL_DATA")
+ return QLibraryInfo::location(QLibraryInfo::DataPath);
+ else if(v == "QT_INSTALL_DOCS")
+ return QLibraryInfo::location(QLibraryInfo::DocumentationPath);
+ else if(v == "QT_INSTALL_HEADERS")
+ return QLibraryInfo::location(QLibraryInfo::HeadersPath);
+ else if(v == "QT_INSTALL_LIBS")
+ return QLibraryInfo::location(QLibraryInfo::LibrariesPath);
+ else if(v == "QT_INSTALL_BINS")
+ return QLibraryInfo::location(QLibraryInfo::BinariesPath);
+ else if(v == "QT_INSTALL_PLUGINS")
+ return QLibraryInfo::location(QLibraryInfo::PluginsPath);
+ else if(v == "QT_INSTALL_TRANSLATIONS")
+ return QLibraryInfo::location(QLibraryInfo::TranslationsPath);
+ else if(v == "QT_INSTALL_CONFIGURATION")
+ return QLibraryInfo::location(QLibraryInfo::SettingsPath);
+ else if(v == "QT_INSTALL_EXAMPLES")
+ return QLibraryInfo::location(QLibraryInfo::ExamplesPath);
+ else if(v == "QT_INSTALL_DEMOS")
+ return QLibraryInfo::location(QLibraryInfo::DemosPath);
+ else if(v == "QMAKE_MKSPECS")
+ return qmake_mkspec_paths().join(Option::target_mode == Option::TARG_WIN_MODE ? ";" : ":");
+ else if(v == "QMAKE_VERSION")
+ return qmake_version();
+#ifdef QT_VERSION_STR
+ else if(v == "QT_VERSION")
+ return QT_VERSION_STR;
+#endif
+
+ initSettings();
+ int slash = v.lastIndexOf('/');
+ QVariant var = settings->value(keyBase(slash == -1) + v);
+ bool ok = var.isValid();
+ QString ret = var.toString();
+ if(!ok) {
+ QString version = qmake_version();
+ if(slash != -1) {
+ version = v.left(slash-1);
+ v = v.mid(slash+1);
+ }
+ settings->beginGroup(keyBase(false));
+ QStringList subs = settings->childGroups();
+ settings->endGroup();
+ subs.sort();
+ for (int x = subs.count() - 1; x >= 0; x--) {
+ QString s = subs[x];
+ if(s.isEmpty() || s > version)
+ continue;
+ var = settings->value(keyBase(false) + s + "/" + v);
+ ok = var.isValid();
+ ret = var.toString();
+ if (ok) {
+ if(!just_check)
+ debug_msg(1, "Fell back from %s -> %s for '%s'.", version.toLatin1().constData(),
+ s.toLatin1().constData(), v.toLatin1().constData());
+ return ret;
+ }
+ }
+ }
+ return ok ? ret : QString();
+}
+
+bool
+QMakeProperty::hasValue(QString v)
+{
+ return !value(v, true).isNull();
+}
+
+void
+QMakeProperty::setValue(QString var, const QString &val)
+{
+ initSettings();
+ settings->setValue(keyBase() + var, val);
+}
+
+bool
+QMakeProperty::exec()
+{
+ bool ret = true;
+ if(Option::qmake_mode == Option::QMAKE_QUERY_PROPERTY) {
+ if(Option::prop::properties.isEmpty()) {
+ initSettings();
+ settings->beginGroup(keyBase(false));
+ QStringList subs = settings->childGroups();
+ settings->endGroup();
+ subs.sort();
+ for(int x = subs.count() - 1; x >= 0; x--) {
+ QString s = subs[x];
+ if(s.isEmpty())
+ continue;
+ settings->beginGroup(keyBase(false) + s);
+ QStringList keys = settings->childKeys();
+ settings->endGroup();
+ for(QStringList::ConstIterator it2 = keys.begin(); it2 != keys.end(); it2++) {
+ QString ret = settings->value(keyBase(false) + s + "/" + (*it2)).toString();
+ if(s != qmake_version())
+ fprintf(stdout, "%s/", s.toLatin1().constData());
+ fprintf(stdout, "%s:%s\n", (*it2).toLatin1().constData(), ret.toLatin1().constData());
+ }
+ }
+ QStringList specialProps;
+ specialProps.append("QT_INSTALL_PREFIX");
+ specialProps.append("QT_INSTALL_DATA");
+ specialProps.append("QT_INSTALL_DOCS");
+ specialProps.append("QT_INSTALL_HEADERS");
+ specialProps.append("QT_INSTALL_LIBS");
+ specialProps.append("QT_INSTALL_BINS");
+ specialProps.append("QT_INSTALL_PLUGINS");
+ specialProps.append("QT_INSTALL_TRANSLATIONS");
+ specialProps.append("QT_INSTALL_CONFIGURATION");
+ specialProps.append("QT_INSTALL_EXAMPLES");
+ specialProps.append("QT_INSTALL_DEMOS");
+ specialProps.append("QMAKE_MKSPECS");
+ specialProps.append("QMAKE_VERSION");
+#ifdef QT_VERSION_STR
+ specialProps.append("QT_VERSION");
+#endif
+ foreach (QString prop, specialProps)
+ fprintf(stdout, "%s:%s\n", prop.toLatin1().constData(), value(prop).toLatin1().constData());
+ return true;
+ }
+ for(QStringList::ConstIterator it = Option::prop::properties.begin();
+ it != Option::prop::properties.end(); it++) {
+ if(Option::prop::properties.count() > 1)
+ fprintf(stdout, "%s:", (*it).toLatin1().constData());
+ if(!hasValue((*it))) {
+ ret = false;
+ fprintf(stdout, "**Unknown**\n");
+ } else {
+ fprintf(stdout, "%s\n", value((*it)).toLatin1().constData());
+ }
+ }
+ } else if(Option::qmake_mode == Option::QMAKE_SET_PROPERTY) {
+ for(QStringList::ConstIterator it = Option::prop::properties.begin();
+ it != Option::prop::properties.end(); it++) {
+ QString var = (*it);
+ it++;
+ if(it == Option::prop::properties.end()) {
+ ret = false;
+ break;
+ }
+ if(!var.startsWith("."))
+ setValue(var, (*it));
+ }
+ }
+ return ret;
+}
+
+QT_END_NAMESPACE