forked from qt-creator/qt-creator
Add sdktool
Add a tool to ease configuration of Qt versions, tool chains and kits with Qt Creator for the SDK and similar systems. Change-Id: I9727dd25ea359a935ea494b035a59411eb3529b8 Reviewed-by: Tim Jenssen <tim.jenssen@digia.com>
This commit is contained in:
committed by
Tim Jenssen
parent
9c2afc4f29
commit
4f36ad63ce
@@ -80,7 +80,8 @@ Project {
|
|||||||
"src/plugins/welcome/welcome.qbs",
|
"src/plugins/welcome/welcome.qbs",
|
||||||
"src/share/share.qbs",
|
"src/share/share.qbs",
|
||||||
"src/tools/qtcdebugger/qtcdebugger.qbs",
|
"src/tools/qtcdebugger/qtcdebugger.qbs",
|
||||||
"src/tools/qtpromaker/qtpromaker.qbs"
|
"src/tools/qtpromaker/qtpromaker.qbs",
|
||||||
|
"src/tools/sdktool/sdktool.qbs"
|
||||||
]
|
]
|
||||||
|
|
||||||
Product {
|
Product {
|
||||||
|
|||||||
135
src/tools/sdktool/README.txt
Normal file
135
src/tools/sdktool/README.txt
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
The SDK tool can be used to set up Qt versions, tool chains and kits
|
||||||
|
in Qt Creator.
|
||||||
|
|
||||||
|
There still is a lot of knowledge about Qt Creator internals required
|
||||||
|
to use this tool!
|
||||||
|
|
||||||
|
Note that some tool chains/Qt versions/kits may require settings not
|
||||||
|
available via command line switches. All operations will add any parameter
|
||||||
|
followed by another parameter in the form "<TYPE>:<VALUE>" to the
|
||||||
|
configuration that they create.
|
||||||
|
|
||||||
|
Currently supported types are int, bool, QString, QByteArray and QVariantList.
|
||||||
|
|
||||||
|
Dependencies:
|
||||||
|
The SDK tool depends on the Utils library of Qt Creator and Qt itself.
|
||||||
|
Please make sure both libraries are found by setting PATH/LD_LIBRARY_PATH.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
Qt Creator SDK setup tool.
|
||||||
|
Usage:./sdktool <ARGS> <OPERATION> <OPERATION_ARGS>
|
||||||
|
|
||||||
|
ARGS:
|
||||||
|
--help|-h Print this help text
|
||||||
|
--sdkpath=PATH|-s PATH Set the path to the SDK files
|
||||||
|
|
||||||
|
OPERATION:
|
||||||
|
One of:
|
||||||
|
addKeys add settings to Qt Creator configuration
|
||||||
|
addKit add a Kit to Qt Creator
|
||||||
|
addQt add a Qt version to Qt Creator
|
||||||
|
addTC add a tool chain to Qt Creator
|
||||||
|
findKey find a key in the settings of Qt Creator
|
||||||
|
find find a value in the settings of Qt Creator
|
||||||
|
get get settings from Qt Creator configuration
|
||||||
|
rmKeys remove settings from Qt Creator configuration
|
||||||
|
rmKit remove a Kit from Qt Creator
|
||||||
|
rmQt remove a Qt version from Qt Creator
|
||||||
|
rmTC remove a tool chain from Qt Creator
|
||||||
|
|
||||||
|
OPERATION_ARGS:
|
||||||
|
use "--help <OPERATION>" to get help on the arguments required for an operation.
|
||||||
|
|
||||||
|
|
||||||
|
Help for individual operations can be retrieved using
|
||||||
|
|
||||||
|
./sdktool --help addKit
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
Add a tool chain:
|
||||||
|
./sdktool addTC \
|
||||||
|
--id "ProjectExplorer.ToolChain.Gcc:my_test_TC" \
|
||||||
|
--name "Test TC" \
|
||||||
|
--path /usr/bin/g++ \
|
||||||
|
--abi x86-linux-generic-elf-64bit \
|
||||||
|
--supportedAbis x86-linux-generic-elf-64bit,x86-linux-generic-elf-32bit \
|
||||||
|
ADDITIONAL_INTEGER_PARAMETER int:42 \
|
||||||
|
ADDITIONAL_STRING_PARAMETER "QString:some string" \
|
||||||
|
|
||||||
|
Tricky parts:
|
||||||
|
- The id has to be in the form "ToolChainType:some_unique_part", where the
|
||||||
|
tool chain type must be one of (as of Qt Creator 2.6):
|
||||||
|
* ProjectExplorer.ToolChain.Msvc for Microsoft MSVC compilers
|
||||||
|
(Note: This one will be autodetected anyway, so there is little
|
||||||
|
need to add it from the sdktool)
|
||||||
|
* ProjectExplorer.ToolChain.WinCE for Windows CE tool chain by
|
||||||
|
Microsoft (Note: This one will be autodetected anyway, so there
|
||||||
|
is little need to add it from the sdktool)
|
||||||
|
* ProjectExplorer.ToolChain.Gcc for a normal GCC (linux/mac)
|
||||||
|
* Qt4ProjectManager.ToolChain.Android for the Android tool chain
|
||||||
|
* ProjectExplorer.ToolChain.Clang for the Clang compiler
|
||||||
|
* ProjectExplorer.ToolChain.LinuxIcc for the LinuxICC compiler
|
||||||
|
* ProjectExplorer.ToolChain.Mingw for the Mingw compiler
|
||||||
|
|
||||||
|
Check the classes derived from ProjectExplorer::ToolChain for their
|
||||||
|
Ids.
|
||||||
|
|
||||||
|
The some_unique_part can be anything. Creator uses GUIDs by default,
|
||||||
|
but any string is fine for the SDK to use.
|
||||||
|
|
||||||
|
- The ABI needs to be in a format that ProjectExplorer::Abi::fromString(...)
|
||||||
|
can parse.
|
||||||
|
|
||||||
|
Add a Qt version:
|
||||||
|
./sdktool addQt \
|
||||||
|
--id "my_test_Qt" \
|
||||||
|
--name "Test Qt" \
|
||||||
|
--qmake /home/code/build/qt4-4/bin/qmake \
|
||||||
|
--type Qt4ProjectManager.QtVersion.Desktop \
|
||||||
|
|
||||||
|
Tricky parts:
|
||||||
|
- The id can be any unique string. In creator this is set as the autodetection
|
||||||
|
source of the Qt version.
|
||||||
|
|
||||||
|
- type must be the string returned by BaseQtVersion::type().
|
||||||
|
|
||||||
|
Currently these are (Qt Creator 2.6):
|
||||||
|
* Qt4ProjectManager.QtVersion.Android for Android
|
||||||
|
* Qt4ProjectManager.QtVersion.Desktop for a desktop Qt
|
||||||
|
* RemoteLinux.EmbeddedLinuxQt for an embedded linux Qt
|
||||||
|
* Qt4ProjectManager.QtVersion.Maemo for an Maemo Qt
|
||||||
|
* Qt4ProjectManager.QtVersion.QNX.BlackBerry for Qt on BlackBerry
|
||||||
|
* Qt4ProjectManager.QtVersion.QNX.QNX for Qt on QNX
|
||||||
|
* Qt4ProjectManager.QtVersion.Simulator for Qt running in the Qt simulator
|
||||||
|
* Qt4ProjectManager.QtVersion.WinCE for Qt on WinCE
|
||||||
|
|
||||||
|
Add a Kit using the newly set up tool chain and Qt version:
|
||||||
|
./sdktool addKit \
|
||||||
|
--id "my_test_kit" \
|
||||||
|
--name "Test Kit" \
|
||||||
|
--debuggerengine 1 \
|
||||||
|
--debugger /tmp/gdb-test \
|
||||||
|
--devicetype Desktop \
|
||||||
|
--sysroot /tmp/sysroot \
|
||||||
|
--toolchain "ProjectExplorer.ToolChain.Gcc:my_test_TC" \
|
||||||
|
--qt "my_test_Qt" \
|
||||||
|
--mkspec "testspec" \
|
||||||
|
|
||||||
|
Tricky parts:
|
||||||
|
- debuggerengine is the integer used in the enum Debugger::DebuggerEngineType
|
||||||
|
The most important type is 1 for GDB.
|
||||||
|
|
||||||
|
- devicetype is the string returned IDevice::type()
|
||||||
|
|
||||||
|
Currently these are (Qt Creator 2.6):
|
||||||
|
* Android.Device.Type for Android devices
|
||||||
|
* Desktop for code running on the local desktop
|
||||||
|
* BBOsType for BlackBerry devices
|
||||||
|
* HarmattanOsType for N9/N950 devices based on Harmattan
|
||||||
|
* Maemo5OsType for N900 devices based on Maemo
|
||||||
|
|
||||||
|
- toolchain is one of the ids used when setting up toolchains with sdktool addTC.
|
||||||
|
|
||||||
|
- qt is one of the ids used when setting up Qt versions with sdktool addQt.
|
||||||
|
|
||||||
264
src/tools/sdktool/addkeysoperation.cpp
Normal file
264
src/tools/sdktool/addkeysoperation.cpp
Normal file
@@ -0,0 +1,264 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#include "addkeysoperation.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
QString AddKeysOperation::name() const
|
||||||
|
{
|
||||||
|
return QLatin1String("addKeys");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString AddKeysOperation::helpText() const
|
||||||
|
{
|
||||||
|
return QLatin1String("add settings to Qt Creator configuration");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString AddKeysOperation::argumentsHelpText() const
|
||||||
|
{
|
||||||
|
return QLatin1String("A file (profiles, qtversions or toolchains) followed by one or more Tuples\n"
|
||||||
|
"<KEY> <TYPE>:<VALUE> are required. KEY needs to start with\n"
|
||||||
|
"the name of the file to insert data into (minus the .xml extension).");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AddKeysOperation::setArguments(const QStringList &args)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < args.count(); ++i) {
|
||||||
|
const QString current = args.at(i);
|
||||||
|
const QString next = ((i + 1) < args.count()) ? args.at(i + 1) : QString();
|
||||||
|
|
||||||
|
if (m_file.isNull()) {
|
||||||
|
m_file = current;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (next.isNull())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
++i;
|
||||||
|
KeyValuePair pair(current, next);
|
||||||
|
if (pair.key.isEmpty() || !pair.value.isValid())
|
||||||
|
return false;
|
||||||
|
m_data << pair;
|
||||||
|
}
|
||||||
|
|
||||||
|
return !m_file.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
int AddKeysOperation::execute() const
|
||||||
|
{
|
||||||
|
if (m_data.isEmpty())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
QVariantMap map = load(m_file);
|
||||||
|
|
||||||
|
map = addKeys(map, m_data);
|
||||||
|
if (map.isEmpty())
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
// Write data again:
|
||||||
|
return save(map, m_file) ? 0 : 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef WITH_TESTS
|
||||||
|
bool AddKeysOperation::test() const
|
||||||
|
{
|
||||||
|
QVariantMap testMap;
|
||||||
|
QVariantMap subKeys;
|
||||||
|
subKeys.insert(QLatin1String("subsubkeys"), QVariantMap());
|
||||||
|
subKeys.insert(QLatin1String("testbool"), true);
|
||||||
|
testMap.insert(QLatin1String("subkeys"), subKeys);
|
||||||
|
subKeys.clear();
|
||||||
|
testMap.insert(QLatin1String("subkeys2"), subKeys);
|
||||||
|
testMap.insert(QLatin1String("testint"), 23);
|
||||||
|
|
||||||
|
KeyValuePairList data;
|
||||||
|
data.append(KeyValuePair(QLatin1String("bool-true"), QString::fromLatin1("bool:trUe")));
|
||||||
|
data.append(KeyValuePair(QLatin1String("bool-false"), QString::fromLatin1("bool:false")));
|
||||||
|
data.append(KeyValuePair(QLatin1String("int"), QString::fromLatin1("int:42")));
|
||||||
|
data.append(KeyValuePair(QLatin1String("qstring"), QString::fromLatin1("QString:test string.")));
|
||||||
|
data.append(KeyValuePair(QLatin1String("qbytearray"), QString::fromLatin1("QByteArray:test array.")));
|
||||||
|
|
||||||
|
data.append(KeyValuePair(QLatin1String("subkeys/qbytearray"), QString::fromLatin1("QByteArray:test array.")));
|
||||||
|
data.append(KeyValuePair(QLatin1String("subkeys/newsubkeys/qbytearray"), QString::fromLatin1("QByteArray:test array.")));
|
||||||
|
data.append(KeyValuePair(QLatin1String("newsub/1/2/3/qbytearray"), QString::fromLatin1("QByteArray:test array.")));
|
||||||
|
data.append(KeyValuePair(QLatin1String("newsub/1/2.1/3/qbytearray"), QString::fromLatin1("QByteArray:test array.")));
|
||||||
|
|
||||||
|
QVariantMap result = addKeys(testMap, data);
|
||||||
|
if (!result.count() == 8)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// subkeys:
|
||||||
|
QVariantMap cur = result.value(QLatin1String("subkeys")).toMap();
|
||||||
|
if (cur.count() != 4
|
||||||
|
|| !cur.contains(QLatin1String("qbytearray"))
|
||||||
|
|| !cur.contains(QLatin1String("testbool"))
|
||||||
|
|| !cur.contains(QLatin1String("subsubkeys"))
|
||||||
|
|| !cur.contains(QLatin1String("newsubkeys")))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// subkeys/newsubkeys:
|
||||||
|
QVariantMap tmp = cur;
|
||||||
|
cur = cur.value(QLatin1String("newsubkeys")).toMap();
|
||||||
|
if (cur.count() != 1
|
||||||
|
|| !cur.contains(QLatin1String("qbytearray")))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// subkeys/subsubkeys:
|
||||||
|
cur = tmp.value(QLatin1String("subsubkeys")).toMap();
|
||||||
|
if (cur.count() != 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// newsub:
|
||||||
|
cur = result.value(QLatin1String("newsub")).toMap();
|
||||||
|
if (cur.count() != 1
|
||||||
|
|| !cur.contains(QLatin1String("1")))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// newsub/1:
|
||||||
|
cur = cur.value(QLatin1String("1")).toMap();
|
||||||
|
if (cur.count() != 2
|
||||||
|
|| !cur.contains(QLatin1String("2"))
|
||||||
|
|| !cur.contains(QLatin1String("2.1")))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// newsub/1/2:
|
||||||
|
tmp = cur;
|
||||||
|
cur = cur.value(QLatin1String("2")).toMap();
|
||||||
|
if (cur.count() != 1
|
||||||
|
|| !cur.contains(QLatin1String("3")))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// newsub/1/2/3:
|
||||||
|
cur = cur.value(QLatin1String("3")).toMap();
|
||||||
|
if (cur.count() != 1
|
||||||
|
|| !cur.contains(QLatin1String("qbytearray")))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// newsub/1/2.1:
|
||||||
|
cur = tmp.value(QLatin1String("2.1")).toMap();
|
||||||
|
if (cur.count() != 1
|
||||||
|
|| !cur.contains(QLatin1String("3")))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// newsub/1/2.1/3:
|
||||||
|
cur = cur.value(QLatin1String("3")).toMap();
|
||||||
|
if (cur.count() != 1
|
||||||
|
|| !cur.contains(QLatin1String("qbytearray")))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// subkeys2:
|
||||||
|
cur = result.value(QLatin1String("subkeys2")).toMap();
|
||||||
|
if (cur.count() != 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// values:
|
||||||
|
if (!result.contains(QLatin1String("bool-true")) || !result.value(QLatin1String("bool-true")).toBool())
|
||||||
|
return false;
|
||||||
|
if (!result.contains(QLatin1String("bool-false")) || result.value(QLatin1String("bool-false")).toBool())
|
||||||
|
return false;
|
||||||
|
if (!result.contains(QLatin1String("int")) || result.value(QLatin1String("int")).toInt() != 42)
|
||||||
|
return false;
|
||||||
|
if (!result.contains(QLatin1String("qstring"))
|
||||||
|
|| result.value(QLatin1String("qstring")).toString() != QLatin1String("test string."))
|
||||||
|
return false;
|
||||||
|
if (!result.contains(QLatin1String("qbytearray"))
|
||||||
|
|| result.value(QLatin1String("qbytearray")).toByteArray() != "test array.")
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Make sure we do not overwrite data:
|
||||||
|
// preexisting:
|
||||||
|
data.clear();
|
||||||
|
data.append(KeyValuePair(QLatin1String("testint"), QString::fromLatin1("int:4")));
|
||||||
|
result = addKeys(testMap, data);
|
||||||
|
if (!result.isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
data.clear();
|
||||||
|
data.append(KeyValuePair(QLatin1String("subkeys/testbool"), QString::fromLatin1("int:24")));
|
||||||
|
result = addKeys(testMap, data);
|
||||||
|
if (!result.isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// data inserted before:
|
||||||
|
data.clear();
|
||||||
|
data.append(KeyValuePair(QLatin1String("bool-true"), QString::fromLatin1("bool:trUe")));
|
||||||
|
data.append(KeyValuePair(QLatin1String("bool-true"), QString::fromLatin1("bool:trUe")));
|
||||||
|
result = addKeys(testMap, data);
|
||||||
|
if (!result.isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QVariantMap AddKeysOperation::addKeys(const QVariantMap &map, const KeyValuePairList &additions)
|
||||||
|
{
|
||||||
|
// Insert data:
|
||||||
|
QVariantMap result = map;
|
||||||
|
|
||||||
|
foreach (const KeyValuePair &p, additions) {
|
||||||
|
QList<QVariantMap> stack;
|
||||||
|
|
||||||
|
// Set up a stack of QVariantMaps along the path we take:
|
||||||
|
stack.append(result);
|
||||||
|
for (int i = 0; i < p.key.count() - 1; ++i) {
|
||||||
|
QVariantMap subMap;
|
||||||
|
if (stack.last().contains(p.key.at(i)))
|
||||||
|
subMap = stack.last().value(p.key.at(i)).toMap();
|
||||||
|
stack.append(subMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
// insert
|
||||||
|
Q_ASSERT(stack.count() == p.key.count());
|
||||||
|
if (stack.last().contains(p.key.last())) {
|
||||||
|
std::cerr << "DEBUG: Adding key " << qPrintable(p.key.join(QLatin1String("/"))) << " which already exists." << std::endl;
|
||||||
|
return QVariantMap();
|
||||||
|
}
|
||||||
|
stack.last().insert(p.key.last(), p.value);
|
||||||
|
|
||||||
|
// Generate new resultset by folding maps back in:
|
||||||
|
QVariantMap foldBack = stack.takeLast();
|
||||||
|
for (int i = p.key.count() - 2; i >= 0; --i) { // skip last key, that is already taken care of
|
||||||
|
const QString k = p.key.at(i);
|
||||||
|
QVariantMap current = stack.takeLast();
|
||||||
|
current.insert(k, foldBack);
|
||||||
|
foldBack = current;
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_ASSERT(stack.count() == 0);
|
||||||
|
Q_ASSERT(foldBack != map);
|
||||||
|
|
||||||
|
result = foldBack;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
59
src/tools/sdktool/addkeysoperation.h
Normal file
59
src/tools/sdktool/addkeysoperation.h
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#ifndef ADDKEYSOPERATION_H
|
||||||
|
#define ADDKEYSOPERATION_H
|
||||||
|
|
||||||
|
#include "operation.h"
|
||||||
|
|
||||||
|
class AddKeysOperation : public Operation
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QString name() const;
|
||||||
|
QString helpText() const;
|
||||||
|
QString argumentsHelpText() const;
|
||||||
|
|
||||||
|
bool setArguments(const QStringList &args);
|
||||||
|
|
||||||
|
int execute() const;
|
||||||
|
|
||||||
|
#ifdef WITH_TESTS
|
||||||
|
bool test() const;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static QVariantMap addKeys(const QVariantMap &map, const KeyValuePairList &additions);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString m_file;
|
||||||
|
|
||||||
|
QList<KeyValuePair> m_data;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // ADDKEYSOPERATION_H
|
||||||
382
src/tools/sdktool/addkitoperation.cpp
Normal file
382
src/tools/sdktool/addkitoperation.cpp
Normal file
@@ -0,0 +1,382 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#include "addkitoperation.h"
|
||||||
|
|
||||||
|
#include "addkeysoperation.h"
|
||||||
|
#include "findkeyoperation.h"
|
||||||
|
#include "findvalueoperation.h"
|
||||||
|
#include "getoperation.h"
|
||||||
|
#include "rmkeysoperation.h"
|
||||||
|
|
||||||
|
#include "settings.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
// Qt version file stuff:
|
||||||
|
static char PREFIX[] = "Profile.";
|
||||||
|
static char VERSION[] = "Version";
|
||||||
|
static char COUNT[] = "Profile.Count";
|
||||||
|
static char DEFAULT[] = "Profile.Default";
|
||||||
|
|
||||||
|
// Kit:
|
||||||
|
static char ID[] = "PE.Profile.Id";
|
||||||
|
static char DISPLAYNAME[] = "PE.Profile.Name";
|
||||||
|
static char ICON[] = "PE.Profile.Icon";
|
||||||
|
static char AUTODETECTED[] = "PE.Profile.Autodetected";
|
||||||
|
static char DATA[] = "PE.Profile.Data";
|
||||||
|
|
||||||
|
// Standard KitInformation:
|
||||||
|
static char DEBUGGER[] = "Debugger.Information";
|
||||||
|
static char DEBUGGER_ENGINE[] = "EngineType";
|
||||||
|
static char DEBUGGER_BINARY[] = "Binary";
|
||||||
|
static char DEVICE_TYPE[] = "PE.Profile.DeviceType";
|
||||||
|
static char SYSROOT[] = "PE.Profile.SysRoot";
|
||||||
|
static char TOOLCHAIN[] = "PE.Profile.ToolChain";
|
||||||
|
static char MKSPEC[] = "QtPM4.mkSpecInformation";
|
||||||
|
static char QT[] = "QtSupport.QtInformation";
|
||||||
|
|
||||||
|
QString AddKitOperation::name() const
|
||||||
|
{
|
||||||
|
return QLatin1String("addKit");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString AddKitOperation::helpText() const
|
||||||
|
{
|
||||||
|
return QLatin1String("add a Kit to Qt Creator");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString AddKitOperation::argumentsHelpText() const
|
||||||
|
{
|
||||||
|
return QLatin1String(" --id <ID> id of the new kit.\n"
|
||||||
|
" --name <NAME> display name of the new kit.\n"
|
||||||
|
" --icon <PATH> icon of the new kit.\n"
|
||||||
|
" --debuggerengine <ENGINE> debuggerengine of the new kit.\n"
|
||||||
|
" --debugger <PATH> debugger of the new kit.\n"
|
||||||
|
" --devicetype <TYPE> device type of the new kit.\n"
|
||||||
|
" --sysroot <PATH> sysroot of the new kit.\n"
|
||||||
|
" --toolchain <ID> tool chain of the new kit.\n"
|
||||||
|
" --qt <ID> Qt of the new kit.\n"
|
||||||
|
" --mkspec <PATH> mkspec of the new kit.\n"
|
||||||
|
" <KEY> <TYPE:VALUE> extra key value pairs\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AddKitOperation::setArguments(const QStringList &args)
|
||||||
|
{
|
||||||
|
m_debuggerEngine = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < args.count(); ++i) {
|
||||||
|
const QString current = args.at(i);
|
||||||
|
const QString next = ((i + 1) < args.count()) ? args.at(i + 1) : QString();
|
||||||
|
|
||||||
|
if (current == QLatin1String("--id")) {
|
||||||
|
if (next.isNull())
|
||||||
|
return false;
|
||||||
|
++i; // skip next;
|
||||||
|
m_id = next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current == QLatin1String("--name")) {
|
||||||
|
if (next.isNull())
|
||||||
|
return false;
|
||||||
|
++i; // skip next;
|
||||||
|
m_displayName = next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current == QLatin1String("--icon")) {
|
||||||
|
if (next.isNull())
|
||||||
|
return false;
|
||||||
|
++i; // skip next;
|
||||||
|
m_icon = next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current == QLatin1String("--debuggerengine")) {
|
||||||
|
if (next.isNull())
|
||||||
|
return false;
|
||||||
|
++i; // skip next;
|
||||||
|
bool ok;
|
||||||
|
m_debuggerEngine = next.toInt(&ok);
|
||||||
|
if (!ok) {
|
||||||
|
std::cerr << "Debugger type is not an integer!" << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current == QLatin1String("--debugger")) {
|
||||||
|
if (next.isNull())
|
||||||
|
return false;
|
||||||
|
++i; // skip next;
|
||||||
|
m_debugger = next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current == QLatin1String("--devicetype")) {
|
||||||
|
if (next.isNull())
|
||||||
|
return false;
|
||||||
|
++i; // skip next;
|
||||||
|
m_deviceType = next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current == QLatin1String("--sysroot")) {
|
||||||
|
if (next.isNull())
|
||||||
|
return false;
|
||||||
|
++i; // skip next;
|
||||||
|
m_sysRoot = next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current == QLatin1String("--toolchain")) {
|
||||||
|
if (next.isNull())
|
||||||
|
return false;
|
||||||
|
++i; // skip next;
|
||||||
|
m_tc = next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current == QLatin1String("--qt")) {
|
||||||
|
if (next.isNull())
|
||||||
|
return false;
|
||||||
|
++i; // skip next;
|
||||||
|
m_qt = next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current == QLatin1String("--mkspec")) {
|
||||||
|
if (next.isNull())
|
||||||
|
return false;
|
||||||
|
++i; // skip next;
|
||||||
|
m_mkspec = next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (next.isNull())
|
||||||
|
return false;
|
||||||
|
++i; // skip next;
|
||||||
|
KeyValuePair pair(current, next);
|
||||||
|
if (!pair.value.isValid())
|
||||||
|
return false;
|
||||||
|
m_extra << pair;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_icon.isEmpty())
|
||||||
|
m_icon = QLatin1String(":///DESKTOP///");
|
||||||
|
|
||||||
|
return !m_id.isEmpty() && !m_displayName.isEmpty() && !m_deviceType.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
int AddKitOperation::execute() const
|
||||||
|
{
|
||||||
|
QVariantMap map = load(QLatin1String("profiles"));
|
||||||
|
if (map.isEmpty())
|
||||||
|
map = initializeKits();
|
||||||
|
|
||||||
|
map = addKit(map, m_id, m_displayName, m_icon, m_debuggerEngine, m_debugger,
|
||||||
|
m_deviceType, m_sysRoot, m_tc, m_qt, m_mkspec, m_extra);
|
||||||
|
|
||||||
|
if (map.isEmpty())
|
||||||
|
return -2;
|
||||||
|
|
||||||
|
return save(map, QLatin1String("profiles")) ? 0 : -3;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef WITH_TESTS
|
||||||
|
bool AddKitOperation::test() const
|
||||||
|
{
|
||||||
|
QVariantMap map = initializeKits();
|
||||||
|
|
||||||
|
if (!map.count() == 3
|
||||||
|
|| !map.contains(QLatin1String(VERSION))
|
||||||
|
|| map.value(QLatin1String(VERSION)).toInt() != 1
|
||||||
|
|| !map.contains(QLatin1String(COUNT))
|
||||||
|
|| map.value(QLatin1String(COUNT)).toInt() != 0
|
||||||
|
|| !map.contains(QLatin1String(DEFAULT))
|
||||||
|
|| map.value(QLatin1String(DEFAULT)).toInt() != -1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
map = addKit(map, QLatin1String("testId"), QLatin1String("Test Qt Version"), QLatin1String("/tmp/icon.png"),
|
||||||
|
1, QLatin1String("/usr/bin/gdb-test"),
|
||||||
|
QLatin1String("Desktop"), QString(),
|
||||||
|
QLatin1String("{some-tc-id}"), QLatin1String("{some-qt-id}"), QLatin1String("unsupported/mkspec"),
|
||||||
|
KeyValuePairList() << KeyValuePair(QLatin1String("PE.Profile.Data/extraData"), QVariant(QLatin1String("extraValue"))));
|
||||||
|
|
||||||
|
if (!map.count() == 4
|
||||||
|
|| !map.contains(QLatin1String(VERSION))
|
||||||
|
|| map.value(QLatin1String(VERSION)).toInt() != 1
|
||||||
|
|| !map.contains(QLatin1String(COUNT))
|
||||||
|
|| map.value(QLatin1String(COUNT)).toInt() != 1
|
||||||
|
|| !map.contains(QLatin1String(DEFAULT))
|
||||||
|
|| map.value(QLatin1String(DEFAULT)).toInt() != 0
|
||||||
|
|| !map.contains(QLatin1String("Profile.0")))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
QVariantMap profile0 = map.value(QLatin1String("Profile.0")).toMap();
|
||||||
|
if (!profile0.count() == 6
|
||||||
|
|| !profile0.contains(QLatin1String(ID))
|
||||||
|
|| profile0.value(QLatin1String(ID)).toString() != QLatin1String("testId")
|
||||||
|
|| !profile0.contains(QLatin1String(DISPLAYNAME))
|
||||||
|
|| profile0.value(QLatin1String(DISPLAYNAME)).toString() != QLatin1String("Test Qt Version")
|
||||||
|
|| !profile0.contains(QLatin1String(AUTODETECTED))
|
||||||
|
|| profile0.value(QLatin1String(AUTODETECTED)).toBool() != true)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Ignore existing ids:
|
||||||
|
QVariantMap result = addKit(map, QLatin1String("testId"), QLatin1String("Test Qt Version X"), QLatin1String("/tmp/icon3.png"),
|
||||||
|
1, QLatin1String("/usr/bin/gdb-test3"),
|
||||||
|
QLatin1String("Desktop"), QString(),
|
||||||
|
QLatin1String("{some-tc-id3}"), QLatin1String("{some-qt-id3}"), QLatin1String("unsupported/mkspec3"),
|
||||||
|
KeyValuePairList() << KeyValuePair(QLatin1String("PE.Profile.Data/extraData"), QVariant(QLatin1String("extraValue3"))));
|
||||||
|
if (!result.isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Make sure name is unique:
|
||||||
|
map = addKit(map, QLatin1String("testId2"), QLatin1String("Test Qt Version"), QLatin1String("/tmp/icon2.png"),
|
||||||
|
1, QLatin1String("/usr/bin/gdb-test2"),
|
||||||
|
QLatin1String("Desktop"), QString(),
|
||||||
|
QLatin1String("{some-tc-id2}"), QLatin1String("{some-qt-id2}"), QLatin1String("unsupported/mkspec2"),
|
||||||
|
KeyValuePairList() << KeyValuePair(QLatin1String("PE.Profile.Data/extraData"), QVariant(QLatin1String("extraValue2"))));
|
||||||
|
if (!map.count() == 5
|
||||||
|
|| !map.contains(QLatin1String(VERSION))
|
||||||
|
|| map.value(QLatin1String(VERSION)).toInt() != 1
|
||||||
|
|| !map.contains(QLatin1String(COUNT))
|
||||||
|
|| map.value(QLatin1String(COUNT)).toInt() != 2
|
||||||
|
|| !map.contains(QLatin1String(DEFAULT))
|
||||||
|
|| map.value(QLatin1String(DEFAULT)).toInt() != 0
|
||||||
|
|| !map.contains(QLatin1String("Profile.0"))
|
||||||
|
|| !map.contains(QLatin1String("Profile.1")))
|
||||||
|
|
||||||
|
if (map.value(QLatin1String("Profile.0")) != profile0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
QVariantMap profile1 = map.value(QLatin1String("Profile.1")).toMap();
|
||||||
|
if (!profile1.count() == 6
|
||||||
|
|| !profile1.contains(QLatin1String(ID))
|
||||||
|
|| profile1.value(QLatin1String(ID)).toString() != QLatin1String("testId2")
|
||||||
|
|| !profile1.contains(QLatin1String(DISPLAYNAME))
|
||||||
|
|| profile1.value(QLatin1String(DISPLAYNAME)).toString() != QLatin1String("Test Qt Version2")
|
||||||
|
|| !profile1.contains(QLatin1String(AUTODETECTED))
|
||||||
|
|| profile1.value(QLatin1String(AUTODETECTED)).toBool() != true)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QVariantMap AddKitOperation::addKit(const QVariantMap &map,
|
||||||
|
const QString &id, const QString &displayName, const QString &icon,
|
||||||
|
const quint32 &debuggerType, const QString &debugger,
|
||||||
|
const QString &deviceType, const QString &sysRoot,
|
||||||
|
const QString &tc, const QString &qt, const QString &mkspec,
|
||||||
|
const KeyValuePairList &extra)
|
||||||
|
{
|
||||||
|
// Sanity check: Make sure autodetection source is not in use already:
|
||||||
|
QStringList valueKeys = FindValueOperation::findValues(map, QVariant(id));
|
||||||
|
bool hasId = false;
|
||||||
|
foreach (const QString &k, valueKeys) {
|
||||||
|
if (k.endsWith(QString(QLatin1Char('/')) + QLatin1String(ID))) {
|
||||||
|
hasId = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hasId) {
|
||||||
|
std::cerr << "Error: Id " << qPrintable(id) << " already defined as kit." << std::endl;
|
||||||
|
return QVariantMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find position to insert:
|
||||||
|
bool ok;
|
||||||
|
int count = GetOperation::get(map, QLatin1String(COUNT)).toInt(&ok);
|
||||||
|
if (!ok || count < 0) {
|
||||||
|
std::cerr << "Error: Count found in kits file seems wrong." << std::endl;
|
||||||
|
return QVariantMap();
|
||||||
|
}
|
||||||
|
const QString kit = QString::fromLatin1(PREFIX) + QString::number(count);
|
||||||
|
|
||||||
|
int defaultKit = GetOperation::get(map, QLatin1String(DEFAULT)).toInt(&ok);
|
||||||
|
if (!ok) {
|
||||||
|
std::cerr << "Error: Default kit seems wrong." << std::endl;
|
||||||
|
return QVariantMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (defaultKit < 0)
|
||||||
|
defaultKit = 0;
|
||||||
|
|
||||||
|
// remove data:
|
||||||
|
QStringList toRemove;
|
||||||
|
toRemove << QLatin1String(COUNT) << QLatin1String(DEFAULT);
|
||||||
|
QVariantMap cleaned = RmKeysOperation::rmKeys(map, toRemove);
|
||||||
|
|
||||||
|
// Sanity check: Make sure displayName is unique.
|
||||||
|
QStringList nameKeys = FindKeyOperation::findKey(map, QLatin1String(DISPLAYNAME));
|
||||||
|
QStringList nameList;
|
||||||
|
foreach (const QString nameKey, nameKeys)
|
||||||
|
nameList << GetOperation::get(map, nameKey).toString();
|
||||||
|
const QString uniqueName = makeUnique(displayName, nameList);
|
||||||
|
|
||||||
|
// insert data:
|
||||||
|
KeyValuePairList data;
|
||||||
|
data << KeyValuePair(QStringList() << kit << QLatin1String(ID), QVariant(id));
|
||||||
|
data << KeyValuePair(QStringList() << kit << QLatin1String(DISPLAYNAME), QVariant(uniqueName));
|
||||||
|
data << KeyValuePair(QStringList() << kit << QLatin1String(ICON), QVariant(icon));
|
||||||
|
data << KeyValuePair(QStringList() << kit << QLatin1String(AUTODETECTED), QVariant(true));
|
||||||
|
|
||||||
|
data << KeyValuePair(QStringList() << kit << QLatin1String(DATA)
|
||||||
|
<< QLatin1String(DEBUGGER) << QLatin1String(DEBUGGER_ENGINE), QVariant(debuggerType));
|
||||||
|
data << KeyValuePair(QStringList() << kit << QLatin1String(DATA)
|
||||||
|
<< QLatin1String(DEBUGGER) << QLatin1String(DEBUGGER_BINARY), QVariant(debugger));
|
||||||
|
data << KeyValuePair(QStringList() << kit << QLatin1String(DATA) << DEVICE_TYPE, QVariant(deviceType));
|
||||||
|
data << KeyValuePair(QStringList() << kit << QLatin1String(DATA) << SYSROOT, QVariant(sysRoot));
|
||||||
|
data << KeyValuePair(QStringList() << kit << QLatin1String(DATA) << TOOLCHAIN, QVariant(tc));
|
||||||
|
data << KeyValuePair(QStringList() << kit << QLatin1String(DATA) << QT, QVariant(qt));
|
||||||
|
data << KeyValuePair(QStringList() << kit << QLatin1String(DATA) << MKSPEC, QVariant(mkspec));
|
||||||
|
|
||||||
|
data << KeyValuePair(QStringList() << QLatin1String(DEFAULT), QVariant(defaultKit));
|
||||||
|
data << KeyValuePair(QStringList() << QLatin1String(COUNT), QVariant(count + 1));
|
||||||
|
|
||||||
|
KeyValuePairList qtExtraList;
|
||||||
|
foreach (const KeyValuePair &pair, extra)
|
||||||
|
qtExtraList << KeyValuePair(QStringList() << kit << pair.key, pair.value);
|
||||||
|
data.append(qtExtraList);
|
||||||
|
|
||||||
|
return AddKeysOperation::addKeys(cleaned, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariantMap AddKitOperation::initializeKits()
|
||||||
|
{
|
||||||
|
QVariantMap map;
|
||||||
|
map.insert(QLatin1String(VERSION), 1);
|
||||||
|
map.insert(QLatin1String(DEFAULT), -1);
|
||||||
|
map.insert(QLatin1String(COUNT), 0);
|
||||||
|
return map;
|
||||||
|
}
|
||||||
76
src/tools/sdktool/addkitoperation.h
Normal file
76
src/tools/sdktool/addkitoperation.h
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#ifndef ADDKITOPERATION_H
|
||||||
|
#define ADDKITOPERATION_H
|
||||||
|
|
||||||
|
#include "operation.h"
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
class AddKitOperation : public Operation
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QString name() const;
|
||||||
|
QString helpText() const;
|
||||||
|
QString argumentsHelpText() const;
|
||||||
|
|
||||||
|
bool setArguments(const QStringList &args);
|
||||||
|
|
||||||
|
int execute() const;
|
||||||
|
|
||||||
|
#ifdef WITH_TESTS
|
||||||
|
bool test() const;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static QVariantMap addKit(const QVariantMap &map,
|
||||||
|
const QString &id, const QString &displayName, const QString &icon,
|
||||||
|
const quint32 &debuggerType, const QString &debugger,
|
||||||
|
const QString &deviceType, const QString &sysRoot,
|
||||||
|
const QString &tc, const QString &qt, const QString &mkspec,
|
||||||
|
const KeyValuePairList &extra);
|
||||||
|
|
||||||
|
static QVariantMap initializeKits();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString m_id;
|
||||||
|
QString m_displayName;
|
||||||
|
QString m_icon;
|
||||||
|
quint32 m_debuggerEngine;
|
||||||
|
QString m_debugger;
|
||||||
|
QString m_deviceType;
|
||||||
|
QString m_sysRoot;
|
||||||
|
QString m_tc;
|
||||||
|
QString m_qt;
|
||||||
|
QString m_mkspec;
|
||||||
|
KeyValuePairList m_extra;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // ADDKITOPERATION_H
|
||||||
280
src/tools/sdktool/addqtoperation.cpp
Normal file
280
src/tools/sdktool/addqtoperation.cpp
Normal file
@@ -0,0 +1,280 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#include "addqtoperation.h"
|
||||||
|
|
||||||
|
#include "addkeysoperation.h"
|
||||||
|
#include "findkeyoperation.h"
|
||||||
|
#include "findvalueoperation.h"
|
||||||
|
#include "getoperation.h"
|
||||||
|
#include "rmkeysoperation.h"
|
||||||
|
|
||||||
|
#include "settings.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
// Qt version file stuff:
|
||||||
|
static char PREFIX[] = "QtVersion.";
|
||||||
|
static char VERSION[] = "Version";
|
||||||
|
|
||||||
|
// BaseQtVersion:
|
||||||
|
static char ID[] = "Id";
|
||||||
|
static char DISPLAYNAME[] = "Name";
|
||||||
|
static char AUTODETECTED[] = "isAutodetected";
|
||||||
|
static char AUTODETECTION_SOURCE[] = "autodetectionSource";
|
||||||
|
static char QMAKE[] = "QMakePath";
|
||||||
|
static char TYPE[] = "QtVersion.Type";
|
||||||
|
|
||||||
|
QString AddQtOperation::name() const
|
||||||
|
{
|
||||||
|
return QLatin1String("addQt");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString AddQtOperation::helpText() const
|
||||||
|
{
|
||||||
|
return QLatin1String("add a Qt version to Qt Creator");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString AddQtOperation::argumentsHelpText() const
|
||||||
|
{
|
||||||
|
return QLatin1String(" --id <ID> id of the new Qt version. (required)\n"
|
||||||
|
" --name <NAME> display name of the new Qt version. (required)\n"
|
||||||
|
" --qmake <PATH> path to qmake. (required)\n"
|
||||||
|
" --type <TYPE> type of Qt version to add. (required)\n"
|
||||||
|
" --noauto do not mark tool chain as autodetected.\n"
|
||||||
|
" <KEY> <TYPE:VALUE> extra key value pairs\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AddQtOperation::setArguments(const QStringList &args)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < args.count(); ++i) {
|
||||||
|
const QString current = args.at(i);
|
||||||
|
const QString next = ((i + 1) < args.count()) ? args.at(i + 1) : QString();
|
||||||
|
|
||||||
|
if (current == QLatin1String("--id")) {
|
||||||
|
if (next.isNull())
|
||||||
|
return false;
|
||||||
|
++i; // skip next;
|
||||||
|
m_id = next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current == QLatin1String("--name")) {
|
||||||
|
if (next.isNull())
|
||||||
|
return false;
|
||||||
|
++i; // skip next;
|
||||||
|
m_displayName = next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current == QLatin1String("--qmake")) {
|
||||||
|
if (next.isNull())
|
||||||
|
return false;
|
||||||
|
++i; // skip next;
|
||||||
|
m_qmake = next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current == QLatin1String("--type")) {
|
||||||
|
if (next.isNull())
|
||||||
|
return false;
|
||||||
|
++i; // skip next;
|
||||||
|
m_type = next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (next.isNull())
|
||||||
|
return false;
|
||||||
|
++i; // skip next;
|
||||||
|
KeyValuePair pair(current, next);
|
||||||
|
if (!pair.value.isValid())
|
||||||
|
return false;
|
||||||
|
m_extra << pair;
|
||||||
|
}
|
||||||
|
|
||||||
|
return !m_id.isEmpty() && !m_displayName.isEmpty() && !m_qmake.isEmpty() && !m_type.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
int AddQtOperation::execute() const
|
||||||
|
{
|
||||||
|
QVariantMap map = load(QLatin1String("qtversions"));
|
||||||
|
if (map.isEmpty())
|
||||||
|
map = initializeQtVersions();
|
||||||
|
|
||||||
|
map = addQt(map, m_id, m_displayName, m_type, m_qmake, m_extra);
|
||||||
|
|
||||||
|
if (map.isEmpty())
|
||||||
|
return -2;
|
||||||
|
|
||||||
|
return save(map, QLatin1String("qtversions")) ? 0 : -3;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef WITH_TESTS
|
||||||
|
bool AddQtOperation::test() const
|
||||||
|
{
|
||||||
|
QVariantMap map = initializeQtVersions();
|
||||||
|
|
||||||
|
if (!map.count() == 1
|
||||||
|
|| !map.contains(QLatin1String(VERSION))
|
||||||
|
|| map.value(QLatin1String(VERSION)).toInt() != 1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
map = addQt(map, QLatin1String("testId"), QLatin1String("Test Qt Version"), QLatin1String("testType"),
|
||||||
|
QLatin1String("/tmp/test/qmake"),
|
||||||
|
KeyValuePairList() << KeyValuePair(QLatin1String("extraData"), QVariant(QLatin1String("extraValue"))));
|
||||||
|
|
||||||
|
if (!map.count() == 2
|
||||||
|
|| !map.contains(QLatin1String(VERSION))
|
||||||
|
|| map.value(QLatin1String(VERSION)).toInt() != 1
|
||||||
|
|| !map.contains(QLatin1String("QtVersion.0")))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
QVariantMap version0 = map.value(QLatin1String("QtVersion.0")).toMap();
|
||||||
|
if (!version0.count() == 6
|
||||||
|
|| !version0.contains(QLatin1String(ID))
|
||||||
|
|| version0.value(QLatin1String(ID)).toInt() != -1
|
||||||
|
|| !version0.contains(QLatin1String(DISPLAYNAME))
|
||||||
|
|| version0.value(QLatin1String(DISPLAYNAME)).toString() != QLatin1String("Test Qt Version")
|
||||||
|
|| !version0.contains(QLatin1String(AUTODETECTED))
|
||||||
|
|| version0.value(QLatin1String(AUTODETECTED)).toBool() != true
|
||||||
|
|| !version0.contains(QLatin1String(AUTODETECTION_SOURCE))
|
||||||
|
|| version0.value(QLatin1String(AUTODETECTION_SOURCE)).toString() != QLatin1String("testId")
|
||||||
|
|| !version0.contains(QLatin1String(TYPE))
|
||||||
|
|| version0.value(QLatin1String(TYPE)).toString() != QLatin1String("testType")
|
||||||
|
|| !version0.contains(QLatin1String(QMAKE))
|
||||||
|
|| version0.value(QLatin1String(QMAKE)).toString() != QLatin1String("/tmp/test/qmake")
|
||||||
|
|| !version0.contains(QLatin1String("extraData"))
|
||||||
|
|| version0.value(QLatin1String("extraData")).toString() != QLatin1String("extraValue"))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Ignore existing ids:
|
||||||
|
QVariantMap result = addQt(map, QLatin1String("testId"), QLatin1String("Test Qt Version2"), QLatin1String("testType2"),
|
||||||
|
QLatin1String("/tmp/test/qmake2"),
|
||||||
|
KeyValuePairList() << KeyValuePair(QLatin1String("extraData"), QVariant(QLatin1String("extraValue"))));
|
||||||
|
if (!result.isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Make sure name is unique:
|
||||||
|
map = addQt(map, QLatin1String("testId2"), QLatin1String("Test Qt Version"), QLatin1String("testType3"),
|
||||||
|
QLatin1String("/tmp/test/qmake2"),
|
||||||
|
KeyValuePairList() << KeyValuePair(QLatin1String("extraData"), QVariant(QLatin1String("extraValue"))));
|
||||||
|
if (!map.count() == 3
|
||||||
|
|| !map.contains(QLatin1String(VERSION))
|
||||||
|
|| map.value(QLatin1String(VERSION)).toInt() != 1
|
||||||
|
|| !map.contains(QLatin1String("QtVersion.0"))
|
||||||
|
|| !map.contains(QLatin1String("QtVersion.1")))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (map.value(QLatin1String("QtVersion.0")) != version0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
QVariantMap version1 = map.value(QLatin1String("QtVersion.1")).toMap();
|
||||||
|
if (!version1.count() == 6
|
||||||
|
|| !version1.contains(QLatin1String(ID))
|
||||||
|
|| version1.value(QLatin1String(ID)).toInt() != -1
|
||||||
|
|| !version1.contains(QLatin1String(DISPLAYNAME))
|
||||||
|
|| version1.value(QLatin1String(DISPLAYNAME)).toString() != QLatin1String("Test Qt Version2")
|
||||||
|
|| !version1.contains(QLatin1String(AUTODETECTED))
|
||||||
|
|| version1.value(QLatin1String(AUTODETECTED)).toBool() != true
|
||||||
|
|| !version1.contains(QLatin1String(AUTODETECTION_SOURCE))
|
||||||
|
|| version1.value(QLatin1String(AUTODETECTION_SOURCE)).toString() != QLatin1String("testId2")
|
||||||
|
|| !version1.contains(QLatin1String(TYPE))
|
||||||
|
|| version1.value(QLatin1String(TYPE)).toString() != QLatin1String("testType3")
|
||||||
|
|| !version1.contains(QLatin1String(QMAKE))
|
||||||
|
|| version1.value(QLatin1String(QMAKE)).toString() != QLatin1String("/tmp/test/qmake2")
|
||||||
|
|| !version1.contains(QLatin1String("extraData"))
|
||||||
|
|| version1.value(QLatin1String("extraData")).toString() != QLatin1String("extraValue"))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QVariantMap AddQtOperation::addQt(const QVariantMap &map,
|
||||||
|
const QString &id, const QString &displayName, const QString &type,
|
||||||
|
const QString &qmake, const KeyValuePairList &extra)
|
||||||
|
{
|
||||||
|
// Sanity check: Make sure autodetection source is not in use already:
|
||||||
|
QStringList valueKeys = FindValueOperation::findValues(map, id);
|
||||||
|
bool hasId = false;
|
||||||
|
foreach (const QString &k, valueKeys) {
|
||||||
|
if (k.endsWith(QString(QLatin1Char('/')) + QLatin1String(AUTODETECTION_SOURCE))) {
|
||||||
|
hasId = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hasId) {
|
||||||
|
std::cerr << "Error: Id " << qPrintable(id) << " already defined as Qt versions." << std::endl;
|
||||||
|
return QVariantMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find position to insert:
|
||||||
|
int versionCount = 0;
|
||||||
|
for (QVariantMap::const_iterator i = map.begin(); i != map.end(); ++i) {
|
||||||
|
if (!i.key().startsWith(QLatin1String(PREFIX)))
|
||||||
|
continue;
|
||||||
|
QString number = i.key().mid(QString::fromLatin1(PREFIX).count());
|
||||||
|
bool ok;
|
||||||
|
int count = number.toInt(&ok);
|
||||||
|
if (ok && count >= versionCount)
|
||||||
|
versionCount = count + 1;
|
||||||
|
}
|
||||||
|
const QString qt = QString::fromLatin1(PREFIX) + QString::number(versionCount);
|
||||||
|
|
||||||
|
// Sanity check: Make sure displayName is unique.
|
||||||
|
QStringList nameKeys = FindKeyOperation::findKey(map, QLatin1String(DISPLAYNAME));
|
||||||
|
QStringList nameList;
|
||||||
|
foreach (const QString nameKey, nameKeys)
|
||||||
|
nameList << GetOperation::get(map, nameKey).toString();
|
||||||
|
const QString uniqueName = makeUnique(displayName, nameList);
|
||||||
|
|
||||||
|
// insert data:
|
||||||
|
KeyValuePairList data;
|
||||||
|
data << KeyValuePair(QStringList() << qt << QLatin1String(ID), QVariant(-1));
|
||||||
|
data << KeyValuePair(QStringList() << qt << QLatin1String(DISPLAYNAME), QVariant(uniqueName));
|
||||||
|
data << KeyValuePair(QStringList() << qt << QLatin1String(AUTODETECTED), QVariant(true));
|
||||||
|
data << KeyValuePair(QStringList() << qt << QLatin1String(AUTODETECTION_SOURCE), QVariant(id));
|
||||||
|
data << KeyValuePair(QStringList() << qt << QLatin1String(QMAKE), QVariant(qmake));
|
||||||
|
data << KeyValuePair(QStringList() << qt << QLatin1String(TYPE), QVariant(type));
|
||||||
|
|
||||||
|
KeyValuePairList qtExtraList;
|
||||||
|
foreach (const KeyValuePair &pair, extra)
|
||||||
|
qtExtraList << KeyValuePair(QStringList() << qt << pair.key, pair.value);
|
||||||
|
data.append(qtExtraList);
|
||||||
|
|
||||||
|
return AddKeysOperation::addKeys(map, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariantMap AddQtOperation::initializeQtVersions()
|
||||||
|
{
|
||||||
|
QVariantMap map;
|
||||||
|
map.insert(QLatin1String(VERSION), 1);
|
||||||
|
return map;
|
||||||
|
}
|
||||||
67
src/tools/sdktool/addqtoperation.h
Normal file
67
src/tools/sdktool/addqtoperation.h
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#ifndef ADDQTOPERATION_H
|
||||||
|
#define ADDQTOPERATION_H
|
||||||
|
|
||||||
|
#include "operation.h"
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
class AddQtOperation : public Operation
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QString name() const;
|
||||||
|
QString helpText() const;
|
||||||
|
QString argumentsHelpText() const;
|
||||||
|
|
||||||
|
bool setArguments(const QStringList &args);
|
||||||
|
|
||||||
|
int execute() const;
|
||||||
|
|
||||||
|
#ifdef WITH_TESTS
|
||||||
|
bool test() const;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static QVariantMap addQt(const QVariantMap &map,
|
||||||
|
const QString &id, const QString &displayName, const QString &type,
|
||||||
|
const QString &qmake, const KeyValuePairList &extra);
|
||||||
|
|
||||||
|
static QVariantMap initializeQtVersions();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString m_id; // actually this is the autodetectionSource
|
||||||
|
QString m_displayName;
|
||||||
|
QString m_type;
|
||||||
|
QString m_qmake;
|
||||||
|
KeyValuePairList m_extra;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // ADDQTOPERATION_H
|
||||||
280
src/tools/sdktool/addtoolchainoperation.cpp
Normal file
280
src/tools/sdktool/addtoolchainoperation.cpp
Normal file
@@ -0,0 +1,280 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#include "addtoolchainoperation.h"
|
||||||
|
|
||||||
|
#include "addkeysoperation.h"
|
||||||
|
#include "findkeyoperation.h"
|
||||||
|
#include "findvalueoperation.h"
|
||||||
|
#include "getoperation.h"
|
||||||
|
#include "rmkeysoperation.h"
|
||||||
|
|
||||||
|
#include "settings.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
// ToolChain file stuff:
|
||||||
|
static char COUNT[] = "ToolChain.Count";
|
||||||
|
static char PREFIX[] = "ToolChain.";
|
||||||
|
static char VERSION[] = "Version";
|
||||||
|
|
||||||
|
// ToolChain:
|
||||||
|
static char ID[] = "ProjectExplorer.ToolChain.Id";
|
||||||
|
static char DISPLAYNAME[] = "ProjectExplorer.ToolChain.DisplayName";
|
||||||
|
static char AUTODETECTED[] = "ProjectExplorer.ToolChain.Autodetect";
|
||||||
|
|
||||||
|
// GCC ToolChain:
|
||||||
|
static char PATH[] = "ProjectExplorer.GccToolChain.Path";
|
||||||
|
static char TARGET_ABI[] = "ProjectExplorer.GccToolChain.TargetAbi";
|
||||||
|
static char SUPPORTED_ABIS[] = "ProjectExplorer.GccToolChain.SupportedAbis";
|
||||||
|
|
||||||
|
QString AddToolChainOperation::name() const
|
||||||
|
{
|
||||||
|
return QLatin1String("addTC");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString AddToolChainOperation::helpText() const
|
||||||
|
{
|
||||||
|
return QLatin1String("add a tool chain to Qt Creator");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString AddToolChainOperation::argumentsHelpText() const
|
||||||
|
{
|
||||||
|
return QLatin1String(" --id <ID> id of the new tool chain.\n"
|
||||||
|
" --name <NAME> display name of the new tool chain.\n"
|
||||||
|
" --path <PATH> path to the compiler.\n"
|
||||||
|
" --abi <ABI STRING> ABI of the compiler.\n"
|
||||||
|
" --supportedAbis <ABI STRING>,<ABI STRING> list of ABIs supported by the compiler.\n"
|
||||||
|
" <KEY> <TYPE:VALUE> extra key value pairs\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AddToolChainOperation::setArguments(const QStringList &args)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < args.count(); ++i) {
|
||||||
|
const QString current = args.at(i);
|
||||||
|
const QString next = ((i + 1) < args.count()) ? args.at(i + 1) : QString();
|
||||||
|
|
||||||
|
if (current == QLatin1String("--id")) {
|
||||||
|
if (next.isNull())
|
||||||
|
return false;
|
||||||
|
++i; // skip next;
|
||||||
|
m_id = next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current == QLatin1String("--name")) {
|
||||||
|
if (next.isNull())
|
||||||
|
return false;
|
||||||
|
++i; // skip next;
|
||||||
|
m_displayName = next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current == QLatin1String("--path")) {
|
||||||
|
if (next.isNull())
|
||||||
|
return false;
|
||||||
|
++i; // skip next;
|
||||||
|
m_path = next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current == QLatin1String("--abi")) {
|
||||||
|
if (next.isNull())
|
||||||
|
return false;
|
||||||
|
++i; // skip next;
|
||||||
|
m_targetAbi = next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current == QLatin1String("--supportedAbis")) {
|
||||||
|
if (next.isNull())
|
||||||
|
return false;
|
||||||
|
++i; // skip next;
|
||||||
|
m_supportedAbis = next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (next.isNull())
|
||||||
|
return false;
|
||||||
|
++i; // skip next;
|
||||||
|
KeyValuePair pair(current, next);
|
||||||
|
if (!pair.value.isValid())
|
||||||
|
return false;
|
||||||
|
m_extra << pair;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_supportedAbis.isEmpty())
|
||||||
|
m_supportedAbis = m_targetAbi;
|
||||||
|
|
||||||
|
return !m_id.isEmpty() && !m_displayName.isEmpty() && !m_path.isEmpty() && !m_targetAbi.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
int AddToolChainOperation::execute() const
|
||||||
|
{
|
||||||
|
QVariantMap map = load(QLatin1String("toolchains"));
|
||||||
|
if (map.isEmpty())
|
||||||
|
map = initializeToolChains();
|
||||||
|
|
||||||
|
map = addToolChain(map, m_id, m_displayName, m_path, m_targetAbi, m_supportedAbis, m_extra);
|
||||||
|
if (map.isEmpty())
|
||||||
|
return -2;
|
||||||
|
|
||||||
|
return save(map, QLatin1String("toolchains")) ? 0 : -3;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef WITH_TESTS
|
||||||
|
bool AddToolChainOperation::test() const
|
||||||
|
{
|
||||||
|
QVariantMap map = initializeToolChains();
|
||||||
|
|
||||||
|
// Add toolchain:
|
||||||
|
map = addToolChain(map, QLatin1String("testId"), QLatin1String("name"), QLatin1String("/tmp/test"),
|
||||||
|
QLatin1String("test-abi"), QLatin1String("test-abi,test-abi2"),
|
||||||
|
KeyValuePairList() << KeyValuePair(QLatin1String("ExtraKey"), QVariant(QLatin1String("ExtraValue"))));
|
||||||
|
if (!map.value(QLatin1String(COUNT)).toInt() == 1
|
||||||
|
|| !map.contains(QString::fromLatin1(PREFIX) + QLatin1Char('0')))
|
||||||
|
return false;
|
||||||
|
QVariantMap tcData = map.value(QString::fromLatin1(PREFIX) + QLatin1Char('0')).toMap();
|
||||||
|
if (tcData.count() != 7
|
||||||
|
|| tcData.value(QLatin1String(ID)).toString() != QLatin1String("testId")
|
||||||
|
|| tcData.value(QLatin1String(DISPLAYNAME)).toString() != QLatin1String("name")
|
||||||
|
|| tcData.value(QLatin1String(AUTODETECTED)).toBool() != true
|
||||||
|
|| tcData.value(QLatin1String(PATH)).toString() != QLatin1String("/tmp/test")
|
||||||
|
|| tcData.value(QLatin1String(TARGET_ABI)).toString() != QLatin1String("test-abi")
|
||||||
|
|| tcData.value(QLatin1String(SUPPORTED_ABIS)).toList().count() != 2
|
||||||
|
|| tcData.value(QLatin1String("ExtraKey")).toString() != QLatin1String("ExtraValue"))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Ignore same Id:
|
||||||
|
QVariantMap unchanged = addToolChain(map, QLatin1String("testId"), QLatin1String("name2"), QLatin1String("/tmp/test2"),
|
||||||
|
QLatin1String("test-abi2"), QLatin1String("test-abi2,test-abi3"),
|
||||||
|
KeyValuePairList() << KeyValuePair(QLatin1String("ExtraKey"), QVariant(QLatin1String("ExtraValue2"))));
|
||||||
|
if (!unchanged.isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Make sure name stays unique:
|
||||||
|
map = addToolChain(map, QLatin1String("testId2"), QLatin1String("name"), QLatin1String("/tmp/test"),
|
||||||
|
QLatin1String("test-abi"), QLatin1String("test-abi,test-abi2"),
|
||||||
|
KeyValuePairList() << KeyValuePair(QLatin1String("ExtraKey"), QVariant(QLatin1String("ExtraValue"))));
|
||||||
|
if (!map.value(QLatin1String(COUNT)).toInt() == 2
|
||||||
|
|| !map.contains(QString::fromLatin1(PREFIX) + QLatin1Char('0'))
|
||||||
|
|| !map.contains(QString::fromLatin1(PREFIX) + QLatin1Char('1')))
|
||||||
|
return false;
|
||||||
|
tcData = map.value(QString::fromLatin1(PREFIX) + QLatin1Char('0')).toMap();
|
||||||
|
if (tcData.count() != 7
|
||||||
|
|| tcData.value(QLatin1String(ID)).toString() != QLatin1String("testId")
|
||||||
|
|| tcData.value(QLatin1String(DISPLAYNAME)).toString() != QLatin1String("name")
|
||||||
|
|| tcData.value(QLatin1String(AUTODETECTED)).toBool() != true
|
||||||
|
|| tcData.value(QLatin1String(PATH)).toString() != QLatin1String("/tmp/test")
|
||||||
|
|| tcData.value(QLatin1String(TARGET_ABI)).toString() != QLatin1String("test-abi")
|
||||||
|
|| tcData.value(QLatin1String(SUPPORTED_ABIS)).toList().count() != 2
|
||||||
|
|| tcData.value(QLatin1String("ExtraKey")).toString() != QLatin1String("ExtraValue"))
|
||||||
|
return false;
|
||||||
|
tcData = map.value(QString::fromLatin1(PREFIX) + QLatin1Char('1')).toMap();
|
||||||
|
if (tcData.count() != 7
|
||||||
|
|| tcData.value(QLatin1String(ID)).toString() != QLatin1String("testId2")
|
||||||
|
|| tcData.value(QLatin1String(DISPLAYNAME)).toString() != QLatin1String("name2")
|
||||||
|
|| tcData.value(QLatin1String(AUTODETECTED)).toBool() != true
|
||||||
|
|| tcData.value(QLatin1String(PATH)).toString() != QLatin1String("/tmp/test")
|
||||||
|
|| tcData.value(QLatin1String(TARGET_ABI)).toString() != QLatin1String("test-abi")
|
||||||
|
|| tcData.value(QLatin1String(SUPPORTED_ABIS)).toList().count() != 2
|
||||||
|
|| tcData.value(QLatin1String("ExtraKey")).toString() != QLatin1String("ExtraValue"))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QVariantMap AddToolChainOperation::addToolChain(const QVariantMap &map,
|
||||||
|
const QString &id, const QString &displayName,
|
||||||
|
const QString &path, const QString &abi,
|
||||||
|
const QString &supportedAbis, const KeyValuePairList &extra)
|
||||||
|
{
|
||||||
|
// Sanity check: Does the Id already exist?
|
||||||
|
QStringList valueKeys = FindValueOperation::findValues(map, id);
|
||||||
|
bool hasId = false;
|
||||||
|
foreach (const QString &k, valueKeys) {
|
||||||
|
if (k.endsWith(QString(QLatin1Char('/')) + QLatin1String(ID))) {
|
||||||
|
hasId = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hasId) {
|
||||||
|
std::cerr << "Error: Id " << qPrintable(id) << " already defined for tool chains." << std::endl;
|
||||||
|
return QVariantMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find position to insert Tool Chain at:
|
||||||
|
bool ok;
|
||||||
|
int count = GetOperation::get(map, QLatin1String(COUNT)).toInt(&ok);
|
||||||
|
if (!ok || count < 0) {
|
||||||
|
std::cerr << "Error: Count found in toolchains file seems wrong." << std::endl;
|
||||||
|
return QVariantMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sanity check: Make sure displayName is unique.
|
||||||
|
QStringList nameKeys = FindKeyOperation::findKey(map, QLatin1String(DISPLAYNAME));
|
||||||
|
QStringList nameList;
|
||||||
|
foreach (const QString nameKey, nameKeys)
|
||||||
|
nameList << GetOperation::get(map, nameKey).toString();
|
||||||
|
const QString uniqueName = makeUnique(displayName, nameList);
|
||||||
|
|
||||||
|
QVariantMap result = RmKeysOperation::rmKeys(map, QStringList() << QLatin1String(COUNT));
|
||||||
|
|
||||||
|
std::cout << "Registering ToolChain " << count << std::endl;
|
||||||
|
const QString tc = QString::fromLatin1(PREFIX) + QString::number(count);
|
||||||
|
|
||||||
|
KeyValuePairList data;
|
||||||
|
data << KeyValuePair(QStringList() << tc << QLatin1String(ID), QVariant(id.toUtf8()));
|
||||||
|
data << KeyValuePair(QStringList() << tc << QLatin1String(DISPLAYNAME), QVariant(uniqueName));
|
||||||
|
data << KeyValuePair(QStringList() << tc << QLatin1String(AUTODETECTED), QVariant(true));
|
||||||
|
data << KeyValuePair(QStringList() << tc << QLatin1String(PATH), QVariant(path));
|
||||||
|
data << KeyValuePair(QStringList() << tc << QLatin1String(TARGET_ABI), QVariant(abi));
|
||||||
|
QVariantList abis;
|
||||||
|
QStringList abiStrings = supportedAbis.split(QLatin1Char(','));
|
||||||
|
foreach (const QString &s, abiStrings)
|
||||||
|
abis << QVariant(s);
|
||||||
|
data << KeyValuePair(QStringList() << tc << QLatin1String(SUPPORTED_ABIS), QVariant(abis));
|
||||||
|
KeyValuePairList tcExtraList;
|
||||||
|
foreach (const KeyValuePair &pair, extra)
|
||||||
|
tcExtraList << KeyValuePair(QStringList() << tc << pair.key, pair.value);
|
||||||
|
data.append(tcExtraList);
|
||||||
|
data << KeyValuePair(QLatin1String(COUNT), QVariant(count + 1));
|
||||||
|
|
||||||
|
return AddKeysOperation::addKeys(result, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariantMap AddToolChainOperation::initializeToolChains()
|
||||||
|
{
|
||||||
|
QVariantMap map;
|
||||||
|
map.insert(QLatin1String(COUNT), 0);
|
||||||
|
map.insert(QLatin1String(VERSION), 1);
|
||||||
|
return map;
|
||||||
|
}
|
||||||
70
src/tools/sdktool/addtoolchainoperation.h
Normal file
70
src/tools/sdktool/addtoolchainoperation.h
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#ifndef ADDTOOLCHAINOPERATION_H
|
||||||
|
#define ADDTOOLCHAINOPERATION_H
|
||||||
|
|
||||||
|
#include "operation.h"
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
class AddToolChainOperation : public Operation
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QString name() const;
|
||||||
|
QString helpText() const;
|
||||||
|
QString argumentsHelpText() const;
|
||||||
|
|
||||||
|
bool setArguments(const QStringList &args);
|
||||||
|
|
||||||
|
int execute() const;
|
||||||
|
|
||||||
|
#ifdef WITH_TESTS
|
||||||
|
bool test() const;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static QVariantMap addToolChain(const QVariantMap &map,
|
||||||
|
const QString &id, const QString &displayName,
|
||||||
|
const QString &path, const QString &abi,
|
||||||
|
const QString &supportedAbis,
|
||||||
|
const KeyValuePairList &extra);
|
||||||
|
|
||||||
|
static QVariantMap initializeToolChains();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString m_id;
|
||||||
|
QString m_displayName;
|
||||||
|
QString m_path;
|
||||||
|
QString m_targetAbi;
|
||||||
|
QString m_supportedAbis;
|
||||||
|
KeyValuePairList m_extra;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // ADDTOOLCHAINOPERATION_H
|
||||||
130
src/tools/sdktool/findkeyoperation.cpp
Normal file
130
src/tools/sdktool/findkeyoperation.cpp
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#include "findkeyoperation.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
QString FindKeyOperation::name() const
|
||||||
|
{
|
||||||
|
return QLatin1String("findKey");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString FindKeyOperation::helpText() const
|
||||||
|
{
|
||||||
|
return QLatin1String("find a key in the settings of Qt Creator");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString FindKeyOperation::argumentsHelpText() const
|
||||||
|
{
|
||||||
|
return QLatin1String("A file (profiles, qtversions or toolchains) followed by one or more keys to search for.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FindKeyOperation::setArguments(const QStringList &args)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < args.count(); ++i) {
|
||||||
|
const QString current = args.at(i);
|
||||||
|
|
||||||
|
if (m_file.isNull()) {
|
||||||
|
m_file = current;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_keys.append(current);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (!m_file.isEmpty() && !m_keys.isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
int FindKeyOperation::execute() const
|
||||||
|
{
|
||||||
|
Q_ASSERT(!m_keys.isEmpty());
|
||||||
|
QVariantMap map = load(m_file);
|
||||||
|
|
||||||
|
foreach (const QString &k, m_keys) {
|
||||||
|
const QStringList result = findKey(map, k);
|
||||||
|
foreach (const QString r, result)
|
||||||
|
std::cout << qPrintable(r) << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef WITH_TESTS
|
||||||
|
bool FindKeyOperation::test() const
|
||||||
|
{
|
||||||
|
QVariantMap testMap;
|
||||||
|
QVariantMap subKeys;
|
||||||
|
QVariantMap cur;
|
||||||
|
cur.insert(QLatin1String("testint"), 53);
|
||||||
|
subKeys.insert(QLatin1String("subsubkeys"), cur);
|
||||||
|
subKeys.insert(QLatin1String("testbool"), true);
|
||||||
|
testMap.insert(QLatin1String("subkeys"), subKeys);
|
||||||
|
subKeys.clear();
|
||||||
|
testMap.insert(QLatin1String("subkeys2"), subKeys);
|
||||||
|
testMap.insert(QLatin1String("testint"), 23);
|
||||||
|
testMap.insert(QLatin1String("testbool"), true);
|
||||||
|
|
||||||
|
QStringList result;
|
||||||
|
result = findKey(testMap, QLatin1String("missing"));
|
||||||
|
if (!result.isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
result = findKey(testMap, QLatin1String("testint"));
|
||||||
|
if (result.count() != 2
|
||||||
|
|| !result.contains(QLatin1String("testint"))
|
||||||
|
|| !result.contains(QLatin1String("subkeys/subsubkeys/testint")))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
result = findKey(testMap, QLatin1String("testbool"));
|
||||||
|
if (result.count() != 2
|
||||||
|
|| !result.contains(QLatin1String("testbool")))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QStringList FindKeyOperation::findKey(const QVariantMap &map, const QString &key)
|
||||||
|
{
|
||||||
|
QStringList result;
|
||||||
|
for (QVariantMap::const_iterator i = map.begin(); i != map.end(); ++i) {
|
||||||
|
if (i.key() == key) {
|
||||||
|
result << key;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (i.value().type() == QVariant::Map) {
|
||||||
|
QStringList subKeyList = findKey(i.value().toMap(), key);
|
||||||
|
foreach (const QString &subKey, subKeyList)
|
||||||
|
result << i.key() + QLatin1Char('/') + subKey;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
58
src/tools/sdktool/findkeyoperation.h
Normal file
58
src/tools/sdktool/findkeyoperation.h
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#ifndef FINDKEYOPERATION_H
|
||||||
|
#define FINDKEYOPERATION_H
|
||||||
|
|
||||||
|
#include "operation.h"
|
||||||
|
|
||||||
|
class FindKeyOperation : public Operation
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QString name() const;
|
||||||
|
QString helpText() const;
|
||||||
|
QString argumentsHelpText() const;
|
||||||
|
|
||||||
|
bool setArguments(const QStringList &args);
|
||||||
|
|
||||||
|
int execute() const;
|
||||||
|
|
||||||
|
#ifdef WITH_TESTS
|
||||||
|
bool test() const;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static QStringList findKey(const QVariantMap &map, const QString &key);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString m_file;
|
||||||
|
QStringList m_keys;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // FINDKEYOPERATION_H
|
||||||
135
src/tools/sdktool/findvalueoperation.cpp
Normal file
135
src/tools/sdktool/findvalueoperation.cpp
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#include "findvalueoperation.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
QString FindValueOperation::name() const
|
||||||
|
{
|
||||||
|
return QLatin1String("find");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString FindValueOperation::helpText() const
|
||||||
|
{
|
||||||
|
return QLatin1String("find a value in the settings of Qt Creator");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString FindValueOperation::argumentsHelpText() const
|
||||||
|
{
|
||||||
|
return QLatin1String("A file (profiles, qtversions or toolchains) followed by one or more type:value tupels to search for.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FindValueOperation::setArguments(const QStringList &args)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < args.count(); ++i) {
|
||||||
|
const QString current = args.at(i);
|
||||||
|
|
||||||
|
if (m_file.isNull()) {
|
||||||
|
m_file = current;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant v = Operation::valueFromString(current);
|
||||||
|
if (!v.isValid())
|
||||||
|
return false;
|
||||||
|
m_values << v;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (!m_file.isEmpty() && !m_values.isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
int FindValueOperation::execute() const
|
||||||
|
{
|
||||||
|
Q_ASSERT(!m_values.isEmpty());
|
||||||
|
QVariantMap map = load(m_file);
|
||||||
|
|
||||||
|
foreach (const QVariant &v, m_values) {
|
||||||
|
const QStringList result = findValues(map, v);
|
||||||
|
foreach (const QString &r, result)
|
||||||
|
std::cout << qPrintable(r) << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef WITH_TESTS
|
||||||
|
bool FindValueOperation::test() const
|
||||||
|
{
|
||||||
|
QVariantMap testMap;
|
||||||
|
QVariantMap subKeys;
|
||||||
|
QVariantMap cur;
|
||||||
|
cur.insert(QLatin1String("testint2"), 53);
|
||||||
|
subKeys.insert(QLatin1String("subsubkeys"), cur);
|
||||||
|
subKeys.insert(QLatin1String("testbool"), true);
|
||||||
|
subKeys.insert(QLatin1String("otherint"), 53);
|
||||||
|
testMap.insert(QLatin1String("subkeys"), subKeys);
|
||||||
|
subKeys.clear();
|
||||||
|
testMap.insert(QLatin1String("subkeys2"), subKeys);
|
||||||
|
testMap.insert(QLatin1String("testint"), 23);
|
||||||
|
|
||||||
|
QStringList result;
|
||||||
|
result = findValues(testMap, QVariant(23));
|
||||||
|
if (result.count() != 1
|
||||||
|
|| !result.contains(QLatin1String("testint")))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
result = findValues(testMap, QVariant(53));
|
||||||
|
if (result.count() != 2
|
||||||
|
|| !result.contains(QLatin1String("subkeys/subsubkeys/testint2"))
|
||||||
|
|| !result.contains(QLatin1String("subkeys/otherint")))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
result = findValues(testMap, QVariant(23456));
|
||||||
|
if (!result.isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QStringList FindValueOperation::findValues(const QVariantMap &map, const QVariant &value)
|
||||||
|
{
|
||||||
|
QStringList result;
|
||||||
|
if (!value.isValid())
|
||||||
|
return result;
|
||||||
|
|
||||||
|
for (QVariantMap::const_iterator i = map.begin(); i != map.end(); ++i) {
|
||||||
|
if (i.value() == value)
|
||||||
|
result << i.key();
|
||||||
|
if (i.value().type() == QVariant::Map) {
|
||||||
|
const QStringList subKeys = findValues(i.value().toMap(), value);
|
||||||
|
foreach (const QString &subKey, subKeys)
|
||||||
|
result << i.key() + QLatin1Char('/') + subKey;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
58
src/tools/sdktool/findvalueoperation.h
Normal file
58
src/tools/sdktool/findvalueoperation.h
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#ifndef FINDVALUEOPERATION_H
|
||||||
|
#define FINDVALUEOPERATION_H
|
||||||
|
|
||||||
|
#include "operation.h"
|
||||||
|
|
||||||
|
class FindValueOperation : public Operation
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QString name() const;
|
||||||
|
QString helpText() const;
|
||||||
|
QString argumentsHelpText() const;
|
||||||
|
|
||||||
|
bool setArguments(const QStringList &args);
|
||||||
|
|
||||||
|
int execute() const;
|
||||||
|
|
||||||
|
#ifdef WITH_TESTS
|
||||||
|
bool test() const;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static QStringList findValues(const QVariantMap &map, const QVariant &value);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString m_file;
|
||||||
|
QVariantList m_values;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // FINDVALUEOPERATION_H
|
||||||
126
src/tools/sdktool/getoperation.cpp
Normal file
126
src/tools/sdktool/getoperation.cpp
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#include "getoperation.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
QString GetOperation::name() const
|
||||||
|
{
|
||||||
|
return QLatin1String("get");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString GetOperation::helpText() const
|
||||||
|
{
|
||||||
|
return QLatin1String("get settings from Qt Creator configuration");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString GetOperation::argumentsHelpText() const
|
||||||
|
{
|
||||||
|
return QLatin1String("A file (profiles, qtversions or toolchains) followed by one or more keys to list.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GetOperation::setArguments(const QStringList &args)
|
||||||
|
{
|
||||||
|
if (args.count() < 2)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
m_keys = args;
|
||||||
|
m_file = m_keys.takeFirst();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int GetOperation::execute() const
|
||||||
|
{
|
||||||
|
Q_ASSERT(!m_keys.isEmpty());
|
||||||
|
QVariantMap map = load(m_file);
|
||||||
|
|
||||||
|
foreach (const QString &key, m_keys) {
|
||||||
|
const QVariant result = get(map, key);
|
||||||
|
if (result.isValid())
|
||||||
|
return -2;
|
||||||
|
std::cout << qPrintable(result.toString()) << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef WITH_TESTS
|
||||||
|
bool GetOperation::test() const
|
||||||
|
{
|
||||||
|
QVariantMap testMap;
|
||||||
|
QVariantMap subKeys;
|
||||||
|
QVariantMap cur;
|
||||||
|
cur.insert(QLatin1String("testint2"), 53);
|
||||||
|
subKeys.insert(QLatin1String("subsubkeys"), cur);
|
||||||
|
subKeys.insert(QLatin1String("testbool"), true);
|
||||||
|
testMap.insert(QLatin1String("subkeys"), subKeys);
|
||||||
|
subKeys.clear();
|
||||||
|
testMap.insert(QLatin1String("subkeys2"), subKeys);
|
||||||
|
testMap.insert(QLatin1String("testint"), 23);
|
||||||
|
|
||||||
|
QVariant result;
|
||||||
|
result = get(testMap, QLatin1String("testint"));
|
||||||
|
if (result.toString() != QLatin1String("23"))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
result = get(testMap, QLatin1String("subkeys/testbool"));
|
||||||
|
if (result.toString() != QLatin1String("true"))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
result = get(testMap, QLatin1String("subkeys/subsubkeys"));
|
||||||
|
if (result.type() != QVariant::Map)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
result = get(testMap, QLatin1String("nonexistant"));
|
||||||
|
if (result.isValid())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QVariant GetOperation::get(const QVariantMap &map, const QString &key)
|
||||||
|
{
|
||||||
|
if (key.isEmpty())
|
||||||
|
return QString();
|
||||||
|
|
||||||
|
const QStringList keys = key.split(QLatin1Char('/'));
|
||||||
|
|
||||||
|
QVariantMap subMap = map;
|
||||||
|
for (int i = 0; i < keys.count() - 1; ++i) {
|
||||||
|
const QString k = keys.at(i);
|
||||||
|
if (!subMap.contains(k))
|
||||||
|
return QString();
|
||||||
|
subMap = subMap.value(k).toMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
return subMap.value(keys.last());
|
||||||
|
}
|
||||||
58
src/tools/sdktool/getoperation.h
Normal file
58
src/tools/sdktool/getoperation.h
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#ifndef GETOPERATION_H
|
||||||
|
#define GETOPERATION_H
|
||||||
|
|
||||||
|
#include "operation.h"
|
||||||
|
|
||||||
|
class GetOperation : public Operation
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QString name() const;
|
||||||
|
QString helpText() const;
|
||||||
|
QString argumentsHelpText() const;
|
||||||
|
|
||||||
|
bool setArguments(const QStringList &args);
|
||||||
|
|
||||||
|
int execute() const;
|
||||||
|
|
||||||
|
#ifdef WITH_TESTS
|
||||||
|
bool test() const;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static QVariant get(const QVariantMap &map, const QString &key);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QStringList m_keys;
|
||||||
|
QString m_file;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // GETOPERATION_H
|
||||||
185
src/tools/sdktool/main.cpp
Normal file
185
src/tools/sdktool/main.cpp
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#include "settings.h"
|
||||||
|
|
||||||
|
#include "operation.h"
|
||||||
|
|
||||||
|
#include "addkeysoperation.h"
|
||||||
|
#include "addkitoperation.h"
|
||||||
|
#include "addqtoperation.h"
|
||||||
|
#include "addtoolchainoperation.h"
|
||||||
|
#include "findkeyoperation.h"
|
||||||
|
#include "findvalueoperation.h"
|
||||||
|
#include "getoperation.h"
|
||||||
|
#include "rmkeysoperation.h"
|
||||||
|
#include "rmkitoperation.h"
|
||||||
|
#include "rmqtoperation.h"
|
||||||
|
#include "rmtoolchainoperation.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include <QCoreApplication>
|
||||||
|
#include <QStringList>
|
||||||
|
|
||||||
|
void printHelp(const Operation *op)
|
||||||
|
{
|
||||||
|
std::cout << "Qt Creator SDK setup tool." << std::endl;
|
||||||
|
|
||||||
|
std::cout << "Help for operation " << qPrintable(op->name()) << std::endl;
|
||||||
|
std::cout << std::endl;
|
||||||
|
std::cout << qPrintable(op->argumentsHelpText());
|
||||||
|
std::cout << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void printHelp(const QList<Operation *> &operations)
|
||||||
|
{
|
||||||
|
std::cout << "Qt Creator SDK setup tool." << std::endl;
|
||||||
|
std::cout << " Usage:" << qPrintable(qApp->arguments().at(0))
|
||||||
|
<< " <ARGS> <OPERATION> <OPERATION_ARGS>" << std::endl << std::endl;
|
||||||
|
std::cout << "ARGS:" << std::endl;
|
||||||
|
std::cout << " --help|-h Print this help text" << std::endl;
|
||||||
|
std::cout << " --sdkpath=PATH|-s PATH Set the path to the SDK files" << std::endl << std::endl;
|
||||||
|
|
||||||
|
std::cout << "OPERATION:" << std::endl;
|
||||||
|
std::cout << " One of:" << std::endl;
|
||||||
|
foreach (const Operation *o, operations)
|
||||||
|
std::cout << " " << qPrintable(o->name()) << "\t\t" << qPrintable(o->helpText()) << std::endl;
|
||||||
|
std::cout << std::endl;
|
||||||
|
std::cout << "OPERATION_ARGS:" << std::endl;
|
||||||
|
std::cout << " use \"--help <OPERATION>\" to get help on the arguments required for an operation." << std::endl;
|
||||||
|
|
||||||
|
std::cout << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
int parseArguments(const QStringList &args, Settings *s, const QList<Operation *> &operations)
|
||||||
|
{
|
||||||
|
QStringList opArgs;
|
||||||
|
int argCount = args.count();
|
||||||
|
|
||||||
|
for (int i = 1; i < argCount; ++i) {
|
||||||
|
const QString current = args[i];
|
||||||
|
const QString next = (i + 1 < argCount) ? args[i + 1] : QString();
|
||||||
|
|
||||||
|
if (!s->operation) {
|
||||||
|
// help
|
||||||
|
if (current == QLatin1String("-h") || current == QLatin1String("--help")) {
|
||||||
|
if (!next.isEmpty()) {
|
||||||
|
foreach (Operation *o, operations) {
|
||||||
|
if (o->name() == next) {
|
||||||
|
printHelp(o);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printHelp(operations);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// sdkpath
|
||||||
|
if (current.startsWith(QLatin1String("--sdkpath="))) {
|
||||||
|
s->sdkPath = Utils::FileName::fromString(current.mid(10));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (current == QLatin1String("-s")) {
|
||||||
|
s->sdkPath = Utils::FileName::fromString(next);
|
||||||
|
++i; // skip next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// operation
|
||||||
|
foreach (Operation *o, operations) {
|
||||||
|
if (o->name() == current) {
|
||||||
|
s->operation = o;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s->operation)
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
opArgs << current;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cerr << "Unknown parameter given." << std::endl << std::endl;
|
||||||
|
printHelp(operations);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!s->operation) {
|
||||||
|
std::cerr << "No operation requested." << std::endl << std::endl;
|
||||||
|
printHelp(operations);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (!s->operation->setArguments(opArgs)) {
|
||||||
|
printHelp(s->operation);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
QCoreApplication a(argc, argv);
|
||||||
|
|
||||||
|
Settings settings;
|
||||||
|
|
||||||
|
QList<Operation *> operations;
|
||||||
|
operations << new AddKeysOperation
|
||||||
|
<< new AddKitOperation
|
||||||
|
<< new AddQtOperation
|
||||||
|
<< new AddToolChainOperation
|
||||||
|
<< new FindKeyOperation
|
||||||
|
<< new FindValueOperation
|
||||||
|
<< new GetOperation
|
||||||
|
<< new RmKeysOperation
|
||||||
|
<< new RmKitOperation
|
||||||
|
<< new RmQtOperation
|
||||||
|
<< new RmToolChainOperation;
|
||||||
|
|
||||||
|
#ifdef WITH_TESTS
|
||||||
|
std::cerr << std::endl << std::endl << "Starting tests..." << std::endl;
|
||||||
|
foreach (Operation *o, operations)
|
||||||
|
if (!o->test())
|
||||||
|
std::cerr << "!!!! Test failed for: " << qPrintable(o->name()) << " !!!!" << std::endl;
|
||||||
|
std::cerr << "Tests done." << std::endl << std::endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int result = parseArguments(a.arguments(), &settings, operations);
|
||||||
|
if (result <= 0)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
Q_ASSERT(settings.operation);
|
||||||
|
settings.operation->execute();
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
131
src/tools/sdktool/operation.cpp
Normal file
131
src/tools/sdktool/operation.cpp
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#include "operation.h"
|
||||||
|
|
||||||
|
#include "settings.h"
|
||||||
|
|
||||||
|
#include "utils/persistentsettings.h"
|
||||||
|
|
||||||
|
#include <QDir>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
QVariant Operation::valueFromString(const QString &v)
|
||||||
|
{
|
||||||
|
int pos = v.indexOf(QLatin1Char(':'));
|
||||||
|
if (pos <= 0)
|
||||||
|
return QVariant();
|
||||||
|
const QString type = v.left(pos);
|
||||||
|
const QString value = v.mid(pos + 1);
|
||||||
|
|
||||||
|
if (type == QLatin1String("int")) {
|
||||||
|
return QVariant(value.toInt());
|
||||||
|
} else if (type == QLatin1String("bool")) {
|
||||||
|
const QString tmp = value.toLower();
|
||||||
|
return QVariant(tmp == QLatin1String("true") || tmp == QLatin1String("yes")
|
||||||
|
|| tmp == QLatin1String("1") || tmp == QLatin1String("on"));
|
||||||
|
} else if (type == QLatin1String("QByteArray")) {
|
||||||
|
return QVariant(value.toLocal8Bit());
|
||||||
|
} else if (type == QLatin1String("QString")) {
|
||||||
|
return QVariant(value);
|
||||||
|
} else if (type == QLatin1String("QVariantList")) {
|
||||||
|
QVariantList list;
|
||||||
|
const QStringList elements = value.split(QLatin1Char(','));
|
||||||
|
foreach (const QString &e, elements)
|
||||||
|
list << QVariant(e);
|
||||||
|
return QVariant(list);
|
||||||
|
}
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Operation::makeUnique(const QString &name, const QStringList &inUse)
|
||||||
|
{
|
||||||
|
QString unique = name;
|
||||||
|
int i = 1;
|
||||||
|
while (inUse.contains(unique))
|
||||||
|
unique = name + QString::number(++i);
|
||||||
|
return unique;
|
||||||
|
}
|
||||||
|
|
||||||
|
Operation::KeyValuePair::KeyValuePair(const QString &k, const QString &v) :
|
||||||
|
value(valueFromString(v))
|
||||||
|
{
|
||||||
|
key = k.split(QLatin1Char('/'));
|
||||||
|
}
|
||||||
|
|
||||||
|
Operation::KeyValuePair::KeyValuePair(const QString &k, const QVariant &v) :
|
||||||
|
value(v)
|
||||||
|
{
|
||||||
|
key = k.split(QLatin1Char('/'));
|
||||||
|
}
|
||||||
|
|
||||||
|
Operation::KeyValuePair::KeyValuePair(const QStringList &k, const QString &v) :
|
||||||
|
key(k), value(valueFromString(v))
|
||||||
|
{ }
|
||||||
|
|
||||||
|
Operation::KeyValuePair::KeyValuePair(const QStringList &k, const QVariant &v) :
|
||||||
|
key(k), value(v)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
QVariantMap Operation::load(const QString &file) const
|
||||||
|
{
|
||||||
|
QVariantMap map;
|
||||||
|
|
||||||
|
// Read values from original file:
|
||||||
|
Utils::FileName path = Settings::instance()->getPath(file);
|
||||||
|
if (path.toFileInfo().exists()) {
|
||||||
|
Utils::PersistentSettingsReader reader;
|
||||||
|
if (!reader.load(path))
|
||||||
|
return QVariantMap();
|
||||||
|
map = reader.restoreValues();
|
||||||
|
} else {
|
||||||
|
std::cout << "No such file: " << qPrintable(path.toUserOutput()) << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Operation::save(const QVariantMap &map, const QString &file) const
|
||||||
|
{
|
||||||
|
Utils::FileName path = Settings::instance()->getPath(file);
|
||||||
|
|
||||||
|
if (path.isEmpty()) {
|
||||||
|
std::cerr << "Error: No path found for " << qPrintable(file) << "." << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Utils::FileName dir = path.parentDir();
|
||||||
|
if (!dir.toFileInfo().exists())
|
||||||
|
QDir(dir.toString()).mkpath(dir.toString());
|
||||||
|
|
||||||
|
Utils::PersistentSettingsWriter writer(path, QLatin1String("unknown"));
|
||||||
|
return writer.save(map, 0);
|
||||||
|
}
|
||||||
75
src/tools/sdktool/operation.h
Normal file
75
src/tools/sdktool/operation.h
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#ifndef OPERATION_H
|
||||||
|
#define OPERATION_H
|
||||||
|
|
||||||
|
#include <utils/fileutils.h>
|
||||||
|
|
||||||
|
#include <QStringList>
|
||||||
|
#include <QVariant>
|
||||||
|
|
||||||
|
class Operation
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
class KeyValuePair {
|
||||||
|
public:
|
||||||
|
KeyValuePair(const QString &k, const QString &v);
|
||||||
|
KeyValuePair(const QString &k, const QVariant &v);
|
||||||
|
KeyValuePair(const QStringList &k, const QString &v);
|
||||||
|
KeyValuePair(const QStringList &k, const QVariant &v);
|
||||||
|
|
||||||
|
QStringList key;
|
||||||
|
QVariant value;
|
||||||
|
};
|
||||||
|
typedef QList<KeyValuePair> KeyValuePairList;
|
||||||
|
|
||||||
|
virtual ~Operation() { }
|
||||||
|
|
||||||
|
virtual QString name() const = 0;
|
||||||
|
virtual QString helpText() const = 0;
|
||||||
|
virtual QString argumentsHelpText() const = 0;
|
||||||
|
|
||||||
|
virtual bool setArguments(const QStringList &args) = 0;
|
||||||
|
|
||||||
|
virtual int execute() const = 0;
|
||||||
|
|
||||||
|
#ifdef WITH_TESTS
|
||||||
|
virtual bool test() const = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QVariantMap load(const QString &file) const;
|
||||||
|
bool save(const QVariantMap &map, const QString &file) const;
|
||||||
|
|
||||||
|
static QVariant valueFromString(const QString &v);
|
||||||
|
static QString makeUnique(const QString &name, const QStringList &inUse);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // OPERATION_H
|
||||||
211
src/tools/sdktool/rmkeysoperation.cpp
Normal file
211
src/tools/sdktool/rmkeysoperation.cpp
Normal file
@@ -0,0 +1,211 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#include "rmkeysoperation.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
QString RmKeysOperation::name() const
|
||||||
|
{
|
||||||
|
return QLatin1String("rmKeys");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString RmKeysOperation::helpText() const
|
||||||
|
{
|
||||||
|
return QLatin1String("remove settings from Qt Creator configuration");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString RmKeysOperation::argumentsHelpText() const
|
||||||
|
{
|
||||||
|
return QLatin1String("A file (profiles, qtversions or toolchains) followed by one or more keys to remove.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RmKeysOperation::setArguments(const QStringList &args)
|
||||||
|
{
|
||||||
|
if (args.count() < 2)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
m_keys = args;
|
||||||
|
m_file = m_keys.takeFirst();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int RmKeysOperation::execute() const
|
||||||
|
{
|
||||||
|
Q_ASSERT(!m_keys.isEmpty());
|
||||||
|
QVariantMap map = load(m_file);
|
||||||
|
|
||||||
|
QVariantMap result = rmKeys(map, m_keys);
|
||||||
|
if (map == result)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
// Write data again:
|
||||||
|
return save(map, m_file) ? 0 : 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef WITH_TESTS
|
||||||
|
bool RmKeysOperation::test() const
|
||||||
|
{
|
||||||
|
QVariantMap testMap;
|
||||||
|
QVariantMap subKeys;
|
||||||
|
QVariantMap cur;
|
||||||
|
cur.insert(QLatin1String("testint2"), 53);
|
||||||
|
subKeys.insert(QLatin1String("subsubkeys"), cur);
|
||||||
|
subKeys.insert(QLatin1String("testbool"), true);
|
||||||
|
testMap.insert(QLatin1String("subkeys"), subKeys);
|
||||||
|
subKeys.clear();
|
||||||
|
testMap.insert(QLatin1String("subkeys2"), subKeys);
|
||||||
|
testMap.insert(QLatin1String("testint"), 23);
|
||||||
|
|
||||||
|
QStringList data;
|
||||||
|
|
||||||
|
QVariantMap result = rmKeys(testMap, data);
|
||||||
|
|
||||||
|
if (result != testMap)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
data.append(QLatin1String("testint"));
|
||||||
|
result = rmKeys(testMap, data);
|
||||||
|
|
||||||
|
if (result.count() != 2
|
||||||
|
|| !result.contains(QLatin1String("subkeys"))
|
||||||
|
|| !result.contains(QLatin1String("subkeys2")))
|
||||||
|
return false;
|
||||||
|
cur = result.value(QLatin1String("subkeys")).toMap();
|
||||||
|
if (cur.count() != 2
|
||||||
|
|| !cur.contains(QLatin1String("subsubkeys"))
|
||||||
|
|| !cur.contains(QLatin1String("testbool")))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
cur = cur.value(QLatin1String("subsubkeys")).toMap();
|
||||||
|
if (cur.count() != 1
|
||||||
|
|| !cur.contains(QLatin1String("testint2")))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
cur = result.value(QLatin1String("subkeys2")).toMap();
|
||||||
|
if (cur.count() != 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
data.clear();
|
||||||
|
data.append("subkeys/subsubkeys");
|
||||||
|
result = rmKeys(testMap, data);
|
||||||
|
|
||||||
|
if (result.count() != 3
|
||||||
|
|| !result.contains(QLatin1String("subkeys"))
|
||||||
|
|| !result.contains(QLatin1String("subkeys2"))
|
||||||
|
|| !result.contains(QLatin1String("testint")))
|
||||||
|
return false;
|
||||||
|
cur = result.value(QLatin1String("subkeys")).toMap();
|
||||||
|
if (cur.count() != 1
|
||||||
|
|| !cur.contains(QLatin1String("testbool")))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
cur = result.value(QLatin1String("subkeys2")).toMap();
|
||||||
|
if (cur.count() != 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
data.clear();
|
||||||
|
data.append("subkeys/testbool");
|
||||||
|
result = rmKeys(testMap, data);
|
||||||
|
|
||||||
|
if (result.count() != 3
|
||||||
|
|| !result.contains(QLatin1String("subkeys"))
|
||||||
|
|| !result.contains(QLatin1String("subkeys2"))
|
||||||
|
|| !result.contains(QLatin1String("testint")))
|
||||||
|
return false;
|
||||||
|
cur = result.value(QLatin1String("subkeys")).toMap();
|
||||||
|
if (cur.count() != 1
|
||||||
|
|| !cur.contains(QLatin1String("subsubkeys")))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
cur = cur.value(QLatin1String("subsubkeys")).toMap();
|
||||||
|
if (cur.count() != 1
|
||||||
|
|| !cur.contains(QLatin1String("testint2")))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
cur = result.value(QLatin1String("subkeys2")).toMap();
|
||||||
|
if (cur.count() != 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
cur = result.value(QLatin1String("subkeys2")).toMap();
|
||||||
|
if (cur.count() != 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QVariantMap RmKeysOperation::rmKeys(const QVariantMap &map, const QStringList &removals)
|
||||||
|
{
|
||||||
|
QVariantMap result = map;
|
||||||
|
|
||||||
|
foreach (const QString &r, removals) {
|
||||||
|
QList<QVariantMap> stack;
|
||||||
|
|
||||||
|
const QStringList keys = r.split(QLatin1Char('/'));
|
||||||
|
|
||||||
|
// Set up a stack of QVariantMaps along the path we take:
|
||||||
|
stack.append(result);
|
||||||
|
for (int i = 0; i < keys.count() - 1; ++i) {
|
||||||
|
QVariantMap subMap;
|
||||||
|
if (stack.last().contains(keys.at(i))) {
|
||||||
|
subMap = stack.last().value(keys.at(i)).toMap();
|
||||||
|
} else {
|
||||||
|
std::cerr << "Warning: Key " << qPrintable(r) << " not found." << std::endl;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
stack.append(subMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove
|
||||||
|
Q_ASSERT(stack.count() == keys.count());
|
||||||
|
if (!stack.last().contains(keys.last())) {
|
||||||
|
std::cerr << "Warning: Key " << qPrintable(r) << " not found." << std::endl;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
stack.last().remove(keys.last());
|
||||||
|
|
||||||
|
// Generate new resultset by folding maps back in:
|
||||||
|
QVariantMap foldBack = stack.takeLast();
|
||||||
|
for (int i = keys.count() - 2; i >= 0; --i) { // skip last key, that is already taken care of
|
||||||
|
const QString k = keys.at(i);
|
||||||
|
QVariantMap current = stack.takeLast();
|
||||||
|
current.insert(k, foldBack);
|
||||||
|
foldBack = current;
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_ASSERT(stack.count() == 0);
|
||||||
|
Q_ASSERT(foldBack != map);
|
||||||
|
|
||||||
|
result = foldBack;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
58
src/tools/sdktool/rmkeysoperation.h
Normal file
58
src/tools/sdktool/rmkeysoperation.h
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#ifndef RMKEYSOPERATION_H
|
||||||
|
#define RMKEYSOPERATION_H
|
||||||
|
|
||||||
|
#include "operation.h"
|
||||||
|
|
||||||
|
class RmKeysOperation : public Operation
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QString name() const;
|
||||||
|
QString helpText() const;
|
||||||
|
QString argumentsHelpText() const;
|
||||||
|
|
||||||
|
bool setArguments(const QStringList &args);
|
||||||
|
|
||||||
|
int execute() const;
|
||||||
|
|
||||||
|
#ifdef WITH_TESTS
|
||||||
|
bool test() const;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static QVariantMap rmKeys(const QVariantMap &map, const QStringList &removals);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QStringList m_keys;
|
||||||
|
QString m_file;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // RMKEYSOPERATION_H
|
||||||
209
src/tools/sdktool/rmkitoperation.cpp
Normal file
209
src/tools/sdktool/rmkitoperation.cpp
Normal file
@@ -0,0 +1,209 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#include "rmkitoperation.h"
|
||||||
|
|
||||||
|
#include "addkeysoperation.h"
|
||||||
|
#include "addkitoperation.h"
|
||||||
|
#include "findkeyoperation.h"
|
||||||
|
#include "findvalueoperation.h"
|
||||||
|
#include "getoperation.h"
|
||||||
|
#include "rmkeysoperation.h"
|
||||||
|
|
||||||
|
#include "settings.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
// Qt version file stuff:
|
||||||
|
static char PREFIX[] = "Profile.";
|
||||||
|
static char COUNT[] = "Profile.Count";
|
||||||
|
static char DEFAULT[] = "Profile.Default";
|
||||||
|
#ifdef WITH_TESTS
|
||||||
|
static char VERSION[] = "Version";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Kit:
|
||||||
|
static char ID[] = "PE.Profile.Id";
|
||||||
|
|
||||||
|
QString RmKitOperation::name() const
|
||||||
|
{
|
||||||
|
return QLatin1String("rmKit");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString RmKitOperation::helpText() const
|
||||||
|
{
|
||||||
|
return QLatin1String("remove a Kit from Qt Creator");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString RmKitOperation::argumentsHelpText() const
|
||||||
|
{
|
||||||
|
return QLatin1String(" --id <ID> id of the new kit.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RmKitOperation::setArguments(const QStringList &args)
|
||||||
|
{
|
||||||
|
if (args.count() != 2)
|
||||||
|
return false;
|
||||||
|
if (args.at(0) != QLatin1String("--id"))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
m_id = args.at(1);
|
||||||
|
|
||||||
|
return !m_id.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
int RmKitOperation::execute() const
|
||||||
|
{
|
||||||
|
QVariantMap map = load(QLatin1String("profiles"));
|
||||||
|
if (map.isEmpty())
|
||||||
|
map = AddKitOperation::initializeKits();
|
||||||
|
|
||||||
|
map = rmKit(map, m_id);
|
||||||
|
|
||||||
|
if (map.isEmpty())
|
||||||
|
return -2;
|
||||||
|
|
||||||
|
return save(map, QLatin1String("profiles")) ? 0 : -3;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef WITH_TESTS
|
||||||
|
bool RmKitOperation::test() const
|
||||||
|
{
|
||||||
|
QVariantMap map =
|
||||||
|
AddKitOperation::addKit(AddKitOperation::initializeKits(),
|
||||||
|
QLatin1String("testId"), QLatin1String("Test Qt Version"),
|
||||||
|
QLatin1String("/tmp/icon.png"),
|
||||||
|
1, QLatin1String("/usr/bin/gdb-test"),
|
||||||
|
QLatin1String("Desktop"), QString(),
|
||||||
|
QLatin1String("{some-tc-id}"), QLatin1String("{some-qt-id}"),
|
||||||
|
QLatin1String("unsupported/mkspec"),
|
||||||
|
KeyValuePairList() << KeyValuePair(QLatin1String("PE.Profile.Data/extraData"), QVariant(QLatin1String("extraValue"))));
|
||||||
|
map =
|
||||||
|
AddKitOperation::addKit(map, QLatin1String("testId2"), QLatin1String("Test Qt Version"),
|
||||||
|
QLatin1String("/tmp/icon2.png"),
|
||||||
|
1, QLatin1String("/usr/bin/gdb-test2"),
|
||||||
|
QLatin1String("Desktop"), QString(),
|
||||||
|
QLatin1String("{some-tc-id2}"), QLatin1String("{some-qt-id2}"),
|
||||||
|
QLatin1String("unsupported/mkspec2"),
|
||||||
|
KeyValuePairList() << KeyValuePair(QLatin1String("PE.Profile.Data/extraData"), QVariant(QLatin1String("extraValue2"))));
|
||||||
|
|
||||||
|
QVariantMap result = rmKit(map, QLatin1String("testId"));
|
||||||
|
if (result.count() != 4
|
||||||
|
|| !result.contains("Profile.0")
|
||||||
|
|| !result.contains(QLatin1String(COUNT))
|
||||||
|
|| result.value(QLatin1String(COUNT)).toInt() != 1
|
||||||
|
|| !result.contains(QLatin1String(DEFAULT))
|
||||||
|
|| result.value(QLatin1String(DEFAULT)).toInt() != 0
|
||||||
|
|| !result.contains(QLatin1String(VERSION))
|
||||||
|
|| result.value(QLatin1String(VERSION)).toInt() != 1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
result = rmKit(map, QLatin1String("unknown"));
|
||||||
|
if (result != map)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
result = rmKit(map, QLatin1String("testId2"));
|
||||||
|
if (result.count() != 4
|
||||||
|
|| !result.contains("Profile.0")
|
||||||
|
|| !result.contains(QLatin1String(COUNT))
|
||||||
|
|| result.value(QLatin1String(COUNT)).toInt() != 1
|
||||||
|
|| !result.contains(QLatin1String(DEFAULT))
|
||||||
|
|| result.value(QLatin1String(DEFAULT)).toInt() != 0
|
||||||
|
|| !result.contains(QLatin1String(VERSION))
|
||||||
|
|| result.value(QLatin1String(VERSION)).toInt() != 1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
result = rmKit(result, QLatin1String("testId"));
|
||||||
|
if (result.count() != 3
|
||||||
|
|| !result.contains(QLatin1String(COUNT))
|
||||||
|
|| result.value(QLatin1String(COUNT)).toInt() != 0
|
||||||
|
|| !result.contains(QLatin1String(DEFAULT))
|
||||||
|
|| result.value(QLatin1String(DEFAULT)).toInt() != -1
|
||||||
|
|| !result.contains(QLatin1String(VERSION))
|
||||||
|
|| result.value(QLatin1String(VERSION)).toInt() != 1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QVariantMap RmKitOperation::rmKit(const QVariantMap &map, const QString &id)
|
||||||
|
{
|
||||||
|
QVariantMap result = AddKitOperation::initializeKits();
|
||||||
|
|
||||||
|
QVariantList profileList;
|
||||||
|
bool ok;
|
||||||
|
int count = GetOperation::get(map, QLatin1String(COUNT)).toInt(&ok);
|
||||||
|
if (!ok) {
|
||||||
|
std::cerr << "Error: The count found in map is not an integer.";
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
int kitPos = -1;
|
||||||
|
for (int i = 0; i < count; ++i) {
|
||||||
|
const QString key = QString::fromLatin1(PREFIX) + QString::number(i);
|
||||||
|
QVariantMap profile = map.value(key).toMap();
|
||||||
|
if (profile.value(QLatin1String(ID)).toString() == id) {
|
||||||
|
kitPos = i;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
profileList << profile;
|
||||||
|
}
|
||||||
|
if (profileList.count() == map.count() - 3) {
|
||||||
|
std::cerr << "Error: Id was not found.";
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
int defaultKit = GetOperation::get(map, QLatin1String(DEFAULT)).toInt(&ok);
|
||||||
|
if (!ok) {
|
||||||
|
std::cerr << "Error: Could not find the default kit.";
|
||||||
|
defaultKit = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (defaultKit == kitPos || defaultKit < 0)
|
||||||
|
defaultKit = (count > 1) ? 0 : -1;
|
||||||
|
|
||||||
|
// remove data:
|
||||||
|
QStringList toRemove;
|
||||||
|
toRemove << QLatin1String(COUNT) << QLatin1String(DEFAULT);
|
||||||
|
result = RmKeysOperation::rmKeys(result, toRemove);
|
||||||
|
|
||||||
|
// insert data:
|
||||||
|
KeyValuePairList data;
|
||||||
|
data << KeyValuePair(QStringList() << QLatin1String(DEFAULT), QVariant(defaultKit));
|
||||||
|
data << KeyValuePair(QStringList() << QLatin1String(COUNT), QVariant(count - 1));
|
||||||
|
|
||||||
|
for (int i = 0; i < profileList.count(); ++i)
|
||||||
|
data << KeyValuePair(QStringList() << QString::fromLatin1(PREFIX) + QString::number(i),
|
||||||
|
profileList.at(i));
|
||||||
|
|
||||||
|
return AddKeysOperation::addKeys(result, data);
|
||||||
|
}
|
||||||
|
|
||||||
59
src/tools/sdktool/rmkitoperation.h
Normal file
59
src/tools/sdktool/rmkitoperation.h
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#ifndef RMKITOPERATION_H
|
||||||
|
#define RMKITOPERATION_H
|
||||||
|
|
||||||
|
#include "operation.h"
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
class RmKitOperation : public Operation
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QString name() const;
|
||||||
|
QString helpText() const;
|
||||||
|
QString argumentsHelpText() const;
|
||||||
|
|
||||||
|
bool setArguments(const QStringList &args);
|
||||||
|
|
||||||
|
int execute() const;
|
||||||
|
|
||||||
|
#ifdef WITH_TESTS
|
||||||
|
bool test() const;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static QVariantMap rmKit(const QVariantMap &map, const QString &id);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString m_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // RMKITOPERATION_H
|
||||||
152
src/tools/sdktool/rmqtoperation.cpp
Normal file
152
src/tools/sdktool/rmqtoperation.cpp
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#include "rmqtoperation.h"
|
||||||
|
|
||||||
|
#include "addkeysoperation.h"
|
||||||
|
#include "addqtoperation.h"
|
||||||
|
#include "findkeyoperation.h"
|
||||||
|
#include "findvalueoperation.h"
|
||||||
|
#include "getoperation.h"
|
||||||
|
#include "rmkeysoperation.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
// ToolChain file stuff:
|
||||||
|
static char PREFIX[] = "QtVersion.";
|
||||||
|
|
||||||
|
// ToolChain:
|
||||||
|
static char AUTODETECTION_SOURCE[] = "autodetectionSource";
|
||||||
|
|
||||||
|
QString RmQtOperation::name() const
|
||||||
|
{
|
||||||
|
return QLatin1String("rmQt");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString RmQtOperation::helpText() const
|
||||||
|
{
|
||||||
|
return QLatin1String("remove a Qt version from Qt Creator");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString RmQtOperation::argumentsHelpText() const
|
||||||
|
{
|
||||||
|
return QLatin1String(" --id <ID> The id of the qt version to remove.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RmQtOperation::setArguments(const QStringList &args)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < args.count(); ++i) {
|
||||||
|
const QString current = args.at(i);
|
||||||
|
const QString next = ((i + 1) < args.count()) ? args.at(i + 1) : QString();
|
||||||
|
|
||||||
|
if (current == QLatin1String("--id")) {
|
||||||
|
if (next.isNull())
|
||||||
|
return false;
|
||||||
|
++i; // skip next;
|
||||||
|
m_id = next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return !m_id.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
int RmQtOperation::execute() const
|
||||||
|
{
|
||||||
|
QVariantMap map = load(QLatin1String("qtversion"));
|
||||||
|
if (map.isEmpty())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
QVariantMap result = rmQt(map, m_id);
|
||||||
|
if (result == map)
|
||||||
|
return -2;
|
||||||
|
|
||||||
|
return save(map, QLatin1String("qtversion")) ? 0 : -3;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef WITH_TESTS
|
||||||
|
bool RmQtOperation::test() const
|
||||||
|
{
|
||||||
|
// Add toolchain:
|
||||||
|
QVariantMap map = AddQtOperation::initializeQtVersions();
|
||||||
|
|
||||||
|
QVariantMap result = rmQt(QVariantMap(), QLatin1String("nonexistant"));
|
||||||
|
if (result != map)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
map = AddQtOperation::addQt(map, QLatin1String("testId"), QLatin1String("name"), QLatin1String("type"),
|
||||||
|
QLatin1String("/tmp/test"),
|
||||||
|
KeyValuePairList() << KeyValuePair(QLatin1String("ExtraKey"), QVariant(QLatin1String("ExtraValue"))));
|
||||||
|
map = AddQtOperation::addQt(map, QLatin1String("testId2"), QLatin1String("other name"), QLatin1String("type"),
|
||||||
|
QLatin1String("/tmp/test2"),
|
||||||
|
KeyValuePairList());
|
||||||
|
|
||||||
|
result = rmQt(map, QLatin1String("nonexistant"));
|
||||||
|
if (result != map)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
result = rmQt(map, QLatin1String("testId2"));
|
||||||
|
if (result == map
|
||||||
|
|| !result.contains(QLatin1String("QtVersion.0"))
|
||||||
|
|| result.value(QLatin1String("QtVersion.0")) != map.value(QLatin1String("QtVersion.0")))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
result = rmQt(map, QLatin1String("testId"));
|
||||||
|
if (result == map
|
||||||
|
|| !result.contains(QLatin1String("QtVersion.0"))
|
||||||
|
|| result.value(QLatin1String("QtVersion.0")) != map.value(QLatin1String("QtVersion.1")))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
result = rmQt(result, QLatin1String("testId2"));
|
||||||
|
if (result == map)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QVariantMap RmQtOperation::rmQt(const QVariantMap &map, const QString &id)
|
||||||
|
{
|
||||||
|
QVariantList qtList;
|
||||||
|
for (QVariantMap::const_iterator i = map.begin(); i != map.end(); ++i) {
|
||||||
|
if (!i.key().startsWith(QLatin1String(PREFIX)))
|
||||||
|
continue;
|
||||||
|
QVariantMap qtData = i.value().toMap();
|
||||||
|
if (qtData.value(QLatin1String(AUTODETECTION_SOURCE)).toString() != id)
|
||||||
|
qtList.append(qtData);
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariantMap newMap = AddQtOperation::initializeQtVersions();
|
||||||
|
for (int i = 0; i < qtList.count(); ++i)
|
||||||
|
newMap.insert(QString::fromLatin1(PREFIX) + QString::number(i), qtList.at(i));
|
||||||
|
|
||||||
|
return newMap;
|
||||||
|
}
|
||||||
|
|
||||||
59
src/tools/sdktool/rmqtoperation.h
Normal file
59
src/tools/sdktool/rmqtoperation.h
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#ifndef RMQTOPERATION_H
|
||||||
|
#define RMQTOPERATION_H
|
||||||
|
|
||||||
|
#include "operation.h"
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
class RmQtOperation : public Operation
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QString name() const;
|
||||||
|
QString helpText() const;
|
||||||
|
QString argumentsHelpText() const;
|
||||||
|
|
||||||
|
bool setArguments(const QStringList &args);
|
||||||
|
|
||||||
|
int execute() const;
|
||||||
|
|
||||||
|
#ifdef WITH_TESTS
|
||||||
|
bool test() const;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static QVariantMap rmQt(const QVariantMap &map, const QString &id);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString m_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // RMQTOPERATION_H
|
||||||
162
src/tools/sdktool/rmtoolchainoperation.cpp
Normal file
162
src/tools/sdktool/rmtoolchainoperation.cpp
Normal file
@@ -0,0 +1,162 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#include "rmtoolchainoperation.h"
|
||||||
|
|
||||||
|
#include "addkeysoperation.h"
|
||||||
|
#include "addtoolchainoperation.h"
|
||||||
|
#include "findkeyoperation.h"
|
||||||
|
#include "findvalueoperation.h"
|
||||||
|
#include "getoperation.h"
|
||||||
|
#include "rmkeysoperation.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
// ToolChain file stuff:
|
||||||
|
static char COUNT[] = "ToolChain.Count";
|
||||||
|
static char PREFIX[] = "ToolChain.";
|
||||||
|
|
||||||
|
// ToolChain:
|
||||||
|
static char ID[] = "ProjectExplorer.ToolChain.Id";
|
||||||
|
|
||||||
|
QString RmToolChainOperation::name() const
|
||||||
|
{
|
||||||
|
return QLatin1String("rmTC");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString RmToolChainOperation::helpText() const
|
||||||
|
{
|
||||||
|
return QLatin1String("remove a tool chain from Qt Creator");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString RmToolChainOperation::argumentsHelpText() const
|
||||||
|
{
|
||||||
|
return QLatin1String(" --id <ID> The id of the tool chain to remove.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RmToolChainOperation::setArguments(const QStringList &args)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < args.count(); ++i) {
|
||||||
|
const QString current = args.at(i);
|
||||||
|
const QString next = ((i + 1) < args.count()) ? args.at(i + 1) : QString();
|
||||||
|
|
||||||
|
if (current == QLatin1String("--id")) {
|
||||||
|
if (next.isNull())
|
||||||
|
return false;
|
||||||
|
++i; // skip next;
|
||||||
|
m_id = next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return !m_id.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
int RmToolChainOperation::execute() const
|
||||||
|
{
|
||||||
|
QVariantMap map = load(QLatin1String("toolchains"));
|
||||||
|
if (map.isEmpty())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
QVariantMap result = rmToolChain(map, m_id);
|
||||||
|
if (result == map)
|
||||||
|
return -2;
|
||||||
|
|
||||||
|
return save(map, QLatin1String("toolchains")) ? 0 : -3;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef WITH_TESTS
|
||||||
|
bool RmToolChainOperation::test() const
|
||||||
|
{
|
||||||
|
// Add toolchain:
|
||||||
|
QVariantMap map = AddToolChainOperation::initializeToolChains();
|
||||||
|
map = AddToolChainOperation::addToolChain(map, QLatin1String("testId"), QLatin1String("name"), QLatin1String("/tmp/test"),
|
||||||
|
QLatin1String("test-abi"), QLatin1String("test-abi,test-abi2"),
|
||||||
|
KeyValuePairList() << KeyValuePair(QLatin1String("ExtraKey"), QVariant(QLatin1String("ExtraValue"))));
|
||||||
|
map = AddToolChainOperation::addToolChain(map, QLatin1String("testId2"), QLatin1String("other name"), QLatin1String("/tmp/test2"),
|
||||||
|
QLatin1String("test-abi"), QLatin1String("test-abi,test-abi2"),
|
||||||
|
KeyValuePairList());
|
||||||
|
|
||||||
|
QVariantMap result = rmToolChain(QVariantMap(), QLatin1String("nonexistant"));
|
||||||
|
if (!result.isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
result = rmToolChain(map, QLatin1String("nonexistant"));
|
||||||
|
if (result != map)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
result = rmToolChain(map, QLatin1String("testId2"));
|
||||||
|
if (result == map
|
||||||
|
|| result.value(QLatin1String(COUNT), 0).toInt() != 1
|
||||||
|
|| !result.contains(QLatin1String("ToolChain.0"))
|
||||||
|
|| result.value(QLatin1String("ToolChain.0")) != map.value(QLatin1String("ToolChain.0")))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
result = rmToolChain(map, QLatin1String("testId"));
|
||||||
|
if (result == map
|
||||||
|
|| result.value(QLatin1String(COUNT), 0).toInt() != 1
|
||||||
|
|| !result.contains(QLatin1String("ToolChain.0"))
|
||||||
|
|| result.value(QLatin1String("ToolChain.0")) != map.value(QLatin1String("ToolChain.1")))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
result = rmToolChain(result, QLatin1String("testId2"));
|
||||||
|
if (result == map
|
||||||
|
|| result.value(QLatin1String(COUNT), 0).toInt() != 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QVariantMap RmToolChainOperation::rmToolChain(const QVariantMap &map, const QString &id)
|
||||||
|
{
|
||||||
|
// Find count of tool chains:
|
||||||
|
bool ok;
|
||||||
|
int count = GetOperation::get(map, QLatin1String(COUNT)).toInt(&ok);
|
||||||
|
if (!ok || count < 0) {
|
||||||
|
std::cerr << "Error: Count found in toolchains file seems wrong." << std::endl;
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariantList tcList;
|
||||||
|
for (int i = 0; i < count; ++i) {
|
||||||
|
QVariantMap tcData = GetOperation::get(map, QString::fromLatin1(PREFIX) + QString::number(i)).toMap();
|
||||||
|
if (tcData.value(QLatin1String(ID)).toString() != id)
|
||||||
|
tcList.append(tcData);
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariantMap newMap = AddToolChainOperation::initializeToolChains();
|
||||||
|
for (int i = 0; i < tcList.count(); ++i)
|
||||||
|
newMap.insert(QString::fromLatin1(PREFIX) + QString::number(i), tcList.at(i));
|
||||||
|
newMap.insert(QLatin1String(COUNT), tcList.count());
|
||||||
|
|
||||||
|
return newMap;
|
||||||
|
}
|
||||||
|
|
||||||
59
src/tools/sdktool/rmtoolchainoperation.h
Normal file
59
src/tools/sdktool/rmtoolchainoperation.h
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#ifndef RMTOOLCHAINOPERATION_H
|
||||||
|
#define RMTOOLCHAINOPERATION_H
|
||||||
|
|
||||||
|
#include "operation.h"
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
class RmToolChainOperation : public Operation
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QString name() const;
|
||||||
|
QString helpText() const;
|
||||||
|
QString argumentsHelpText() const;
|
||||||
|
|
||||||
|
bool setArguments(const QStringList &args);
|
||||||
|
|
||||||
|
int execute() const;
|
||||||
|
|
||||||
|
#ifdef WITH_TESTS
|
||||||
|
bool test() const;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static QVariantMap rmToolChain(const QVariantMap &map, const QString &id);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString m_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // RMTOOLCHAINOPERATION_H
|
||||||
44
src/tools/sdktool/sdktool.pro
Normal file
44
src/tools/sdktool/sdktool.pro
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
include(../../../qtcreator.pri)
|
||||||
|
include(../../libs/utils/utils.pri)
|
||||||
|
|
||||||
|
CONFIG += console
|
||||||
|
|
||||||
|
QT -= gui test
|
||||||
|
|
||||||
|
SOURCES += \
|
||||||
|
main.cpp \
|
||||||
|
addkeysoperation.cpp \
|
||||||
|
addkitoperation.cpp \
|
||||||
|
addqtoperation.cpp \
|
||||||
|
addtoolchainoperation.cpp \
|
||||||
|
findkeyoperation.cpp \
|
||||||
|
findvalueoperation.cpp \
|
||||||
|
getoperation.cpp \
|
||||||
|
operation.cpp \
|
||||||
|
rmkeysoperation.cpp \
|
||||||
|
rmkitoperation.cpp \
|
||||||
|
rmqtoperation.cpp \
|
||||||
|
rmtoolchainoperation.cpp \
|
||||||
|
settings.cpp \
|
||||||
|
|
||||||
|
HEADERS += \
|
||||||
|
addkeysoperation.h \
|
||||||
|
addkitoperation.h \
|
||||||
|
addqtoperation.h \
|
||||||
|
addtoolchainoperation.h \
|
||||||
|
findkeyoperation.h \
|
||||||
|
findvalueoperation.h \
|
||||||
|
getoperation.h \
|
||||||
|
operation.h \
|
||||||
|
rmkeysoperation.h \
|
||||||
|
rmkitoperation.h \
|
||||||
|
rmqtoperation.h \
|
||||||
|
rmtoolchainoperation.h \
|
||||||
|
settings.h \
|
||||||
|
|
||||||
|
INCLUDEPATH += \
|
||||||
|
$$PWD/../../plugins \
|
||||||
|
$$PWD/../../libs
|
||||||
|
|
||||||
|
DESTDIR=$$IDE_APP_PATH
|
||||||
|
|
||||||
40
src/tools/sdktool/sdktool.qbs
Normal file
40
src/tools/sdktool/sdktool.qbs
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
import qbs.base 1.0
|
||||||
|
import "../QtcTool.qbs" as QtcTool
|
||||||
|
|
||||||
|
QtcTool {
|
||||||
|
name: "sdktool"
|
||||||
|
|
||||||
|
Depends { name: "cpp" }
|
||||||
|
Depends { name: "Qt.core" }
|
||||||
|
Depends { name: "Utils" }
|
||||||
|
|
||||||
|
files: [
|
||||||
|
"main.cpp",
|
||||||
|
"addkeysoperation.cpp",
|
||||||
|
"addkeysoperation.h",
|
||||||
|
"addkitoperation.cpp",
|
||||||
|
"addkitoperation.h",
|
||||||
|
"addqtoperation.cpp",
|
||||||
|
"addqtoperation.h",
|
||||||
|
"addtoolchainoperation.cpp",
|
||||||
|
"addtoolchainoperation.h",
|
||||||
|
"findkeyoperation.cpp",
|
||||||
|
"findkeyoperation.h",
|
||||||
|
"findvalueoperation.cpp",
|
||||||
|
"findvalueoperation.h",
|
||||||
|
"getoperation.cpp",
|
||||||
|
"getoperation.h",
|
||||||
|
"operation.h",
|
||||||
|
"operation.cpp",
|
||||||
|
"rmkeysoperation.cpp",
|
||||||
|
"rmkeysoperation.h",
|
||||||
|
"rmkitoperation.cpp",
|
||||||
|
"rmkitoperation.h",
|
||||||
|
"rmqtoperation.cpp",
|
||||||
|
"rmqtoperation.h",
|
||||||
|
"rmtoolchainoperation.cpp",
|
||||||
|
"rmtoolchainoperation.h",
|
||||||
|
"settings.cpp",
|
||||||
|
"settings.h"
|
||||||
|
]
|
||||||
|
}
|
||||||
100
src/tools/sdktool/settings.cpp
Normal file
100
src/tools/sdktool/settings.cpp
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#include "settings.h"
|
||||||
|
#include "operation.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include <QCoreApplication>
|
||||||
|
#include <QFileInfo>
|
||||||
|
|
||||||
|
Settings *Settings::m_instance = 0;
|
||||||
|
|
||||||
|
Settings *Settings::instance()
|
||||||
|
{
|
||||||
|
return m_instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
Settings::Settings() :
|
||||||
|
operation(0)
|
||||||
|
{
|
||||||
|
Q_ASSERT(!m_instance);
|
||||||
|
m_instance = this;
|
||||||
|
|
||||||
|
// autodetect sdk dir:
|
||||||
|
Utils::FileName sdk = Utils::FileName::fromString(QCoreApplication::applicationDirPath());
|
||||||
|
Utils::FileName qtc = sdk;
|
||||||
|
qtc.appendPath(QLatin1String("qtcreator"));
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
qtc.append(".exe");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QFileInfo qtcFi = qtc.toFileInfo();
|
||||||
|
if (!qtcFi.exists() || !qtcFi.isFile() || !qtcFi.isExecutable()) {
|
||||||
|
// we are in src/tools/sdktool (or lib/qtcreator/bin):
|
||||||
|
qtc = sdk;
|
||||||
|
qtc.appendPath(QLatin1String("../../../bin/qtcreator"));
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
qtc.append(".exe");
|
||||||
|
#endif
|
||||||
|
qtcFi = qtc.toFileInfo();
|
||||||
|
if (!qtcFi.exists() || !qtcFi.isFile() || !qtcFi.isExecutable())
|
||||||
|
qtc.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!qtc.isEmpty()) {
|
||||||
|
sdk = qtc.parentDir();
|
||||||
|
sdk = sdk.parentDir();
|
||||||
|
sdk.appendPath(QLatin1String("share/qtcreator/Nokia/qtcreator"));
|
||||||
|
sdkPath = sdk;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Utils::FileName Settings::getPath(const QString &file)
|
||||||
|
{
|
||||||
|
Utils::FileName result = sdkPath;
|
||||||
|
if (file == QLatin1String("profiles") || file == QLatin1String("kits"))
|
||||||
|
result.appendPath(QLatin1String("profiles"));
|
||||||
|
else if (file == QLatin1String("qtversions") || file == QLatin1String("qtversion"))
|
||||||
|
result.appendPath(QLatin1String("qtversion"));
|
||||||
|
else if (file == QLatin1String("toolchains") || file == QLatin1String("toolChains"))
|
||||||
|
result.appendPath(QLatin1String("toolchains"));
|
||||||
|
else if (file == QLatin1String("toolchains") || file == QLatin1String("toolChains"))
|
||||||
|
result.appendPath(QLatin1String("toolchains"));
|
||||||
|
else if (file == QLatin1String("devices"))
|
||||||
|
result.appendPath(QLatin1String("devices"));
|
||||||
|
else if (file == QLatin1String("android"))
|
||||||
|
result.appendPath(QLatin1String("android"));
|
||||||
|
else
|
||||||
|
return Utils::FileName();
|
||||||
|
result.append(QLatin1String(".xml"));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
56
src/tools/sdktool/settings.h
Normal file
56
src/tools/sdktool/settings.h
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#ifndef SETTINGS_H
|
||||||
|
#define SETTINGS_H
|
||||||
|
|
||||||
|
#include <utils/fileutils.h>
|
||||||
|
|
||||||
|
#include <QStringList>
|
||||||
|
|
||||||
|
class Operation;
|
||||||
|
|
||||||
|
class Settings
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Settings();
|
||||||
|
static Settings *instance();
|
||||||
|
|
||||||
|
Utils::FileName sdkPath;
|
||||||
|
|
||||||
|
Operation *operation;
|
||||||
|
|
||||||
|
Utils::FileName getPath(const QString &file);
|
||||||
|
|
||||||
|
private:
|
||||||
|
static Settings *m_instance;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // SETTINGS_H
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
TEMPLATE = subdirs
|
TEMPLATE = subdirs
|
||||||
|
|
||||||
SUBDIRS = qtpromaker \
|
SUBDIRS = qtpromaker \
|
||||||
qmlpuppet
|
qmlpuppet \
|
||||||
|
sdktool
|
||||||
|
|
||||||
win32 {
|
win32 {
|
||||||
SUBDIRS += qtcdebugger
|
SUBDIRS += qtcdebugger
|
||||||
|
|||||||
Reference in New Issue
Block a user