| /**************************************************************************** |
| ** |
| ** Copyright (C) 2016 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the qmake application of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ |
| ** Commercial License Usage |
| ** Licensees holding valid commercial Qt licenses may use this file in |
| ** accordance with the commercial license agreement provided with the |
| ** Software or, alternatively, in accordance with the terms contained in |
| ** a written agreement between you and The Qt Company. For licensing terms |
| ** and conditions see https://www.qt.io/terms-conditions. For further |
| ** information use the contact form at https://www.qt.io/contact-us. |
| ** |
| ** GNU General Public License Usage |
| ** Alternatively, this file may be used under the terms of the GNU |
| ** General Public License version 3 as published by the Free Software |
| ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT |
| ** included in the packaging of this file. Please review the following |
| ** information to ensure the GNU General Public License requirements will |
| ** be met: https://www.gnu.org/licenses/gpl-3.0.html. |
| ** |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| #include "property.h" |
| #include "option.h" |
| |
| #include <qdir.h> |
| #include <qsettings.h> |
| #include <qlibraryinfo.h> |
| #include <qstringlist.h> |
| #include <stdio.h> |
| |
| QT_BEGIN_NAMESPACE |
| |
| static const struct { |
| const char *name; |
| QLibraryInfo::LibraryLocation loc; |
| bool raw; |
| bool singular; |
| } propList[] = { |
| { "QT_SYSROOT", QLibraryInfo::SysrootPath, true, true }, |
| { "QT_INSTALL_PREFIX", QLibraryInfo::PrefixPath, false, false }, |
| { "QT_INSTALL_ARCHDATA", QLibraryInfo::ArchDataPath, false, false }, |
| { "QT_INSTALL_DATA", QLibraryInfo::DataPath, false, false }, |
| { "QT_INSTALL_DOCS", QLibraryInfo::DocumentationPath, false, false }, |
| { "QT_INSTALL_HEADERS", QLibraryInfo::HeadersPath, false, false }, |
| { "QT_INSTALL_LIBS", QLibraryInfo::LibrariesPath, false, false }, |
| { "QT_INSTALL_LIBEXECS", QLibraryInfo::LibraryExecutablesPath, false, false }, |
| { "QT_INSTALL_BINS", QLibraryInfo::BinariesPath, false, false }, |
| { "QT_INSTALL_TESTS", QLibraryInfo::TestsPath, false, false }, |
| { "QT_INSTALL_PLUGINS", QLibraryInfo::PluginsPath, false, false }, |
| { "QT_INSTALL_IMPORTS", QLibraryInfo::ImportsPath, false, false }, |
| { "QT_INSTALL_QML", QLibraryInfo::Qml2ImportsPath, false, false }, |
| { "QT_INSTALL_TRANSLATIONS", QLibraryInfo::TranslationsPath, false, false }, |
| { "QT_INSTALL_CONFIGURATION", QLibraryInfo::SettingsPath, false, false }, |
| { "QT_INSTALL_EXAMPLES", QLibraryInfo::ExamplesPath, false, false }, |
| { "QT_INSTALL_DEMOS", QLibraryInfo::ExamplesPath, false, false }, // Just backwards compat |
| { "QT_HOST_PREFIX", QLibraryInfo::HostPrefixPath, true, false }, |
| { "QT_HOST_DATA", QLibraryInfo::HostDataPath, true, false }, |
| { "QT_HOST_BINS", QLibraryInfo::HostBinariesPath, true, false }, |
| { "QT_HOST_LIBS", QLibraryInfo::HostLibrariesPath, true, false }, |
| { "QMAKE_SPEC", QLibraryInfo::HostSpecPath, true, true }, |
| { "QMAKE_XSPEC", QLibraryInfo::TargetSpecPath, true, true }, |
| }; |
| |
| QMakeProperty::QMakeProperty() : settings(nullptr) |
| { |
| reload(); |
| } |
| |
| void QMakeProperty::reload() |
| { |
| QLibraryInfo::reload(); |
| for (unsigned i = 0; i < sizeof(propList)/sizeof(propList[0]); i++) { |
| QString name = QString::fromLatin1(propList[i].name); |
| if (!propList[i].singular) { |
| m_values[ProKey(name + "/src")] = QLibraryInfo::rawLocation(propList[i].loc, QLibraryInfo::EffectiveSourcePaths); |
| m_values[ProKey(name + "/get")] = QLibraryInfo::rawLocation(propList[i].loc, QLibraryInfo::EffectivePaths); |
| } |
| QString val = QLibraryInfo::rawLocation(propList[i].loc, QLibraryInfo::FinalPaths); |
| if (!propList[i].raw) { |
| m_values[ProKey(name + "/dev")] = QLibraryInfo::rawLocation(propList[i].loc, QLibraryInfo::DevicePaths); |
| m_values[ProKey(name)] = QLibraryInfo::location(propList[i].loc); |
| name += "/raw"; |
| } |
| m_values[ProKey(name)] = val; |
| } |
| m_values["QMAKE_VERSION"] = ProString(QMAKE_VERSION_STR); |
| #ifdef QT_VERSION_STR |
| m_values["QT_VERSION"] = ProString(QT_VERSION_STR); |
| #endif |
| } |
| |
| QMakeProperty::~QMakeProperty() |
| { |
| delete settings; |
| settings = nullptr; |
| } |
| |
| void QMakeProperty::initSettings() |
| { |
| if(!settings) { |
| settings = new QSettings(QSettings::UserScope, "QtProject", "QMake"); |
| settings->setFallbacksEnabled(false); |
| } |
| } |
| |
| ProString |
| QMakeProperty::value(const ProKey &vk) |
| { |
| ProString val = m_values.value(vk); |
| if (!val.isNull()) |
| return val; |
| |
| initSettings(); |
| return settings->value(vk.toQString()).toString(); |
| } |
| |
| bool |
| QMakeProperty::hasValue(const ProKey &v) |
| { |
| return !value(v).isNull(); |
| } |
| |
| void |
| QMakeProperty::setValue(QString var, const QString &val) |
| { |
| initSettings(); |
| settings->setValue(var, val); |
| } |
| |
| void |
| QMakeProperty::remove(const QString &var) |
| { |
| initSettings(); |
| settings->remove(var); |
| } |
| |
| bool |
| QMakeProperty::exec() |
| { |
| bool ret = true; |
| if(Option::qmake_mode == Option::QMAKE_QUERY_PROPERTY) { |
| if(Option::prop::properties.isEmpty()) { |
| initSettings(); |
| const auto keys = settings->childKeys(); |
| for (const QString &key : keys) { |
| QString val = settings->value(key).toString(); |
| fprintf(stdout, "%s:%s\n", qPrintable(key), qPrintable(val)); |
| } |
| QStringList specialProps; |
| for (unsigned i = 0; i < sizeof(propList)/sizeof(propList[0]); i++) |
| specialProps.append(QString::fromLatin1(propList[i].name)); |
| specialProps.append("QMAKE_VERSION"); |
| #ifdef QT_VERSION_STR |
| specialProps.append("QT_VERSION"); |
| #endif |
| for (const QString &prop : qAsConst(specialProps)) { |
| ProString val = value(ProKey(prop)); |
| ProString pval = value(ProKey(prop + "/raw")); |
| ProString gval = value(ProKey(prop + "/get")); |
| ProString sval = value(ProKey(prop + "/src")); |
| ProString dval = value(ProKey(prop + "/dev")); |
| fprintf(stdout, "%s:%s\n", prop.toLatin1().constData(), val.toLatin1().constData()); |
| if (!pval.isEmpty() && pval != val) |
| fprintf(stdout, "%s/raw:%s\n", prop.toLatin1().constData(), pval.toLatin1().constData()); |
| if (!gval.isEmpty() && gval != (pval.isEmpty() ? val : pval)) |
| fprintf(stdout, "%s/get:%s\n", prop.toLatin1().constData(), gval.toLatin1().constData()); |
| if (!sval.isEmpty() && sval != gval) |
| fprintf(stdout, "%s/src:%s\n", prop.toLatin1().constData(), sval.toLatin1().constData()); |
| if (!dval.isEmpty() && dval != pval) |
| fprintf(stdout, "%s/dev:%s\n", prop.toLatin1().constData(), dval.toLatin1().constData()); |
| } |
| return true; |
| } |
| for (QStringList::ConstIterator it = Option::prop::properties.cbegin(); |
| it != Option::prop::properties.cend(); it++) { |
| if(Option::prop::properties.count() > 1) |
| fprintf(stdout, "%s:", (*it).toLatin1().constData()); |
| const ProKey pkey(*it); |
| if (!hasValue(pkey)) { |
| ret = false; |
| fprintf(stdout, "**Unknown**\n"); |
| } else { |
| fprintf(stdout, "%s\n", value(pkey).toLatin1().constData()); |
| } |
| } |
| } else if(Option::qmake_mode == Option::QMAKE_SET_PROPERTY) { |
| for (QStringList::ConstIterator it = Option::prop::properties.cbegin(); |
| it != Option::prop::properties.cend(); it++) { |
| QString var = (*it); |
| it++; |
| if (it == Option::prop::properties.cend()) { |
| ret = false; |
| break; |
| } |
| if(!var.startsWith(".")) |
| setValue(var, (*it)); |
| } |
| } else if(Option::qmake_mode == Option::QMAKE_UNSET_PROPERTY) { |
| for (QStringList::ConstIterator it = Option::prop::properties.cbegin(); |
| it != Option::prop::properties.cend(); it++) { |
| QString var = (*it); |
| if(!var.startsWith(".")) |
| remove(var); |
| } |
| } |
| return ret; |
| } |
| |
| QT_END_NAMESPACE |