summaryrefslogtreecommitdiffstats
path: root/tools/maddehelper
diff options
context:
space:
mode:
authorTim Jenssen <tim.jenssen@nokia.com>2011-03-08 20:46:27 +0100
committerTim Jenssen <tim.jenssen@nokia.com>2011-03-09 11:05:24 +0100
commit64391c88c7e1421dd146b528c4395c68049c4adb (patch)
treea9aca3608c546b134ad6d7d2ea8d164d0b008af0 /tools/maddehelper
parent76122d63eced0b083e3c2e701c069aa2a8db360f (diff)
moved some directories and adjusted the README
- also removed some unused projects under examples(updater, updaterplugin) - adjusted pro files to the new structure
Diffstat (limited to 'tools/maddehelper')
-rw-r--r--tools/maddehelper/maddehelper.pro12
-rw-r--r--tools/maddehelper/main.cpp306
2 files changed, 318 insertions, 0 deletions
diff --git a/tools/maddehelper/maddehelper.pro b/tools/maddehelper/maddehelper.pro
new file mode 100644
index 000000000..df9954eba
--- /dev/null
+++ b/tools/maddehelper/maddehelper.pro
@@ -0,0 +1,12 @@
+QT += core
+
+QT -= gui
+
+TARGET = maddehelper
+CONFIG += console
+CONFIG -= app_bundle
+
+TEMPLATE = app
+
+
+SOURCES += main.cpp
diff --git a/tools/maddehelper/main.cpp b/tools/maddehelper/main.cpp
new file mode 100644
index 000000000..1f4ed555b
--- /dev/null
+++ b/tools/maddehelper/main.cpp
@@ -0,0 +1,306 @@
+#include <QCoreApplication>
+#include <QProcess>
+#include <QDebug>
+#include <QDirIterator>
+#include <QDateTime>
+#include <iostream>
+
+//rebase to adress 0x20000000 results in crashing tools like perl on win7/64bit
+//which I used for testing
+bool rebaseDlls(const QString &maddeBinLocation,
+ const QString &rebaseBinaryLocation,
+ const QString &adressValue = "0x50000000",
+ const QString &dllFilter = "msys*.dll")
+{
+ QStringList dllStringList = QDir(maddeBinLocation).entryList(QStringList(dllFilter), QDir::Files, QDir::Size | QDir::Reversed);
+ QString dlls;
+ QString dllsEnd; //of an unknown issue msys-1.0.dll should be the last on my system
+ foreach (QString dll, dllStringList) {
+ dll.prepend(maddeBinLocation + "/");
+ if (dll.contains("msys-1")) {
+ dllsEnd.append(dll + " ");
+ } else {
+ dlls.append(dll + " ");
+ }
+ }
+ dlls = dlls.append(dllsEnd);
+
+ QProcess process;
+ process.setEnvironment(QStringList("EMPTY_ENVIRONMENT=true"));
+ QProcess::ProcessError initError(process.error());
+ process.setProcessChannelMode(QProcess::MergedChannels);
+ process.setNativeArguments(QString("-b %1 -o 0x10000 -v %2").arg(adressValue, dlls));
+ process.start(rebaseBinaryLocation);
+ process.waitForFinished();
+ if (process.exitCode() != 0 ||
+ initError != process.error() ||
+ process.exitStatus() == QProcess::CrashExit)
+ {
+ qWarning() << rebaseBinaryLocation + " " + process.nativeArguments();
+ qWarning() << QString("\t Adress rebasing failed! Maybe a process(bash.exe, ssh, ...) is using some of the dlls(%1).").arg(dllStringList.join(", "));
+ qWarning() << "\t Output: \n" << process.readAll();
+ if (initError != process.error()) {
+ qDebug() << QString("\tError(%1): ").arg(process.error()) << process.errorString();
+ }
+
+ if (process.exitStatus() == QProcess::CrashExit) {
+ qDebug() << "\tcrashed!!!";
+ }
+ return false;
+ }
+ qWarning() << rebaseBinaryLocation + " " + process.nativeArguments();
+ //qWarning() << "\t Output: \n" << process.readAll();
+ return true;
+}
+
+bool checkTools(const QString &maddeBinLocation, const QStringList &binaryCheckList)
+{
+ QDirIterator it( maddeBinLocation, binaryCheckList, QDir::Files );
+ while (it.hasNext()) {
+ QString processPath(it.next());
+ if (!QFileInfo(processPath).exists()) {
+ qDebug() << processPath << " is missing - so we don't need to check it";
+ continue;
+ }
+ bool testedToolState = true;
+ QProcess process;
+ process.setEnvironment(QStringList("EMPTY_ENVIRONMENT=true"));
+ QProcess::ProcessError initError(process.error());
+ process.setProcessChannelMode(QProcess::MergedChannels);
+ process.start(processPath, QStringList("--version"));
+ process.waitForFinished(1000);
+ QString processOutput = process.readAll();
+
+ //check for the unpossible load dll error
+ if (processOutput.contains("VirtualAlloc pointer is null") ||
+ processOutput.contains("Couldn't reserve space for") ||
+ process.exitStatus() == QProcess::CrashExit)
+ {
+ qWarning() << QString("found dll loading problem with(ExitCode: %1): ").arg(QString::number(process.exitCode())) << processPath;
+ qWarning() << processOutput;
+ testedToolState = false;
+ if (initError != process.error()) {
+ qWarning() << QString("\tError(%1): ").arg(process.error()) << process.errorString();
+ }
+
+ if (process.exitStatus() == QProcess::CrashExit) {
+ qWarning() << "\tcrashed!!!";
+ }
+ }
+ if ( process.state() == QProcess::Running )
+ process.terminate();
+ //again wait some time
+ if ( !process.waitForFinished( 1000 ) ) {
+ process.kill();
+ process.waitForFinished( 1000 ); //some more waittime
+ }
+ if (testedToolState == false) {
+ return false;
+ }
+ }
+ return true;
+}
+
+bool removeDirectory( const QString& path )
+{
+ if ( !QFileInfo(path).exists() )
+ return true;
+ if ( path.isEmpty() ) // QDir( "" ) points to the working directory! We never want to remove that one.
+ return true;
+
+ QDirIterator it(path, QDir::NoDotAndDotDot | QDir::AllEntries | QDir::Hidden | QDir::System);
+ while ( it.hasNext() )
+ {
+ it.next();
+ const QFileInfo currentFileInfo = it.fileInfo();
+
+ if ( currentFileInfo.isDir() && !currentFileInfo.isSymLink() )
+ {
+ removeDirectory( currentFileInfo.filePath() );
+ }
+ else
+ {
+ QFile f( currentFileInfo.filePath() );
+ if( !f.remove() )
+ qWarning() << "Can't remove: " << currentFileInfo.absoluteFilePath();
+ }
+ }
+
+ if ( !QDir().rmdir(path))
+ return QDir().rename(path, path + "_" + QDateTime::currentDateTime().toString());
+ return true;
+}
+
+bool cleanUpSubDirectories(const QString &maddeLocation, const QStringList &subDirectoryList, const QStringList &extraFiles)
+{
+ if (maddeLocation.isEmpty()) {
+ qWarning() << "Remove nothing could be result in a broken system ;)";
+ return false;
+ }
+ if (!QFileInfo(maddeLocation).exists()) {
+ qWarning() << QString("Ups, location '%1' is not existing.").arg(maddeLocation);
+ return false;
+ }
+
+ foreach (const QString &subDirectory, subDirectoryList) {
+ bool removed = removeDirectory(maddeLocation + "/" + subDirectory);
+ if (!removed) {
+ qWarning() << "Can't remove " << subDirectory <<" for a clean up step";
+ return false;
+ }
+ }
+ foreach (const QString &fileName, extraFiles) {
+ QFile file(fileName);
+ if (file.exists()) {
+ bool removed = QFile(fileName).remove();
+ if (!removed) {
+ qWarning() << "Can't remove " << extraFiles <<" for a clean up step";
+ }
+ }
+ }
+
+ return true;
+}
+
+bool runInstall(const QString &postinstallCommand, const QString &checkFileForAnOkInstallation)
+{
+ QProcess process;
+ process.setEnvironment(QStringList("EMPTY_ENVIRONMENT=true"));
+ QProcess::ProcessError initError(process.error());
+ process.setProcessChannelMode(QProcess::ForwardedChannels);
+ process.setNativeArguments(postinstallCommand);
+ process.start(QString(), QStringList());
+
+ process.waitForFinished(-1);
+ if (process.exitCode() != 0 ||
+ initError != process.error() ||
+ process.exitStatus() == QProcess::CrashExit)
+ {
+ qWarning() << QString("runInstall(ExitCode: %1) went wrong \n'%2'").arg(QString::number(process.exitCode()), postinstallCommand);
+ if (initError != process.error()) {
+ qDebug() << QString("\tError(%1): ").arg(process.error()) << process.errorString();
+ }
+
+ if (process.exitStatus() == QProcess::CrashExit) {
+ qDebug() << "\tcrashed!!!";
+ }
+ }
+ if ( process.state() == QProcess::Running )
+ process.terminate();
+ //again wait some time
+ if ( !process.waitForFinished( 1000 ) )
+ process.kill();
+
+ return QFileInfo(checkFileForAnOkInstallation).exists();
+}
+
+
+static void printUsage()
+{
+ const QString appName = QFileInfo( QCoreApplication::applicationFilePath() ).fileName();
+ std::cout << "Usage: " << qPrintable(appName) << " -r <rebase_binary> -m <MADDE_directory>" << std::endl;
+ std::cout << "Example:" << std::endl;
+ std::cout << " " << qPrintable(appName) << " -r D:/msysgit_rebase.exe -m D:/Maemo/4.6.2" << std::endl;
+}
+
+
+int main(int argc, char *argv[])
+{
+ QCoreApplication app(argc, argv);
+
+ if ( app.arguments().count() != 5 ) //5. is app name
+ {
+ printUsage();
+ return 6;
+ }
+
+ QString rebaseBinaryLocation;
+ QString maddeLocation;
+ for ( int i = 1; i < app.arguments().size(); ++i ) {
+ if ( app.arguments().at( i ) == QLatin1String( "" ) )
+ continue;
+ if (app.arguments().at(i) == "-r") {
+ i++;
+ rebaseBinaryLocation = app.arguments().at(i);
+ }
+ if (app.arguments().at(i) == "-m") {
+ i++;
+ maddeLocation = app.arguments().at(i);
+ }
+ }
+ if (!QFileInfo(maddeLocation).isDir()) {
+ qDebug() << "MADDE location is not existing.";
+ return 4;
+ }
+ if (!QFileInfo(maddeLocation + "/bin").isDir()) {
+ qDebug() << "It seems that the madde location don't have a 'bin'' directory.";
+ return 5;
+ }
+ QString maddeBinLocation = maddeLocation + "/bin";
+
+ //from qs
+// var envExecutable = installer.value("TargetDir") + "/" + winMaddeSubPath + "/bin/env.exe";
+// var postShell = installer.value("TargetDir") + "/" + winMaddeSubPath + "/postinstall/postinstall.sh";
+// component.addOperation("Execute", "{0,1}", envExecutable, "-i" , "/bin/sh", "--login", postShell, "--nosleepontrap", "showStandardError");
+
+ QString postinstallShell = maddeLocation + "/postinstall/postinstall.sh";
+ //"--nosleepontrap" is not used in our Madde, but later maybe it is there again
+ QString postinstallCommand = maddeBinLocation + QString("/env.exe -i /bin/sh --login %1").arg(postinstallShell + " --nosleepontrap");
+ QString successFileCheck = maddeLocation + "/madbin/mad.cmd";
+ QString directoriesForCleanUpArgument = "sysroots, toolchains, targets, runtimes, wbin";
+ directoriesForCleanUpArgument.remove(" ");
+ QStringList directoriesForCleanUp(directoriesForCleanUpArgument.split(","));
+
+ //this was used for testings
+ //cleanUpSubDirectories(maddeLocation, directoriesForCleanUp, QStringList(successFileCheck));
+
+ bool installationWentFine = runInstall(postinstallCommand, successFileCheck);
+
+ if (installationWentFine)
+ return 0;
+
+
+ QString binaryCheckArgument = ("a2p.exe, basename.exe, bash.exe, bzip2.exe, cat.exe, chmod.exe, cmp.exe, comm.exe, cp.exe, cut.exe, " \
+ "date.exe, diff.exe, diff3.exe, dirname.exe, du.exe, env.exe, expr.exe, find.exe, fold.exe, gawk.exe, " \
+ "grep.exe, gzip.exe, head.exe, id.exe, install.exe, join.exe, less.exe, ln.exe, ls.exe, lzma.exe, m4.exe, " \
+ "make.exe, md5sum.exe, mkdir.exe, mv.exe, od.exe, paste.exe, patch.exe, perl.exe, perl5.6.1.exe, ps.exe, " \
+ "rm.exe, rmdir.exe, sed.exe, sh.exe, sleep.exe, sort.exe, split.exe, ssh-agent.exe, ssh-keygen.exe, " \
+ "stty.exe, tail.exe, tar.exe, tee.exe, touch.exe, tr.exe, true.exe, uname.exe, uniq.exe, vim.exe, wc.exe, xargs.exe");
+ binaryCheckArgument.remove(" ");
+ QStringList binaryCheckList(binaryCheckArgument.split(","));
+
+ QStringList possibleRebaseAdresses;
+ possibleRebaseAdresses << "0x5200000"; //this uses perl
+ possibleRebaseAdresses << "0x30000000";
+ possibleRebaseAdresses << "0x35000000";
+ possibleRebaseAdresses << "0x40000000";
+ possibleRebaseAdresses << "0x60000000";
+ possibleRebaseAdresses << "0x60800000";
+ possibleRebaseAdresses << "0x68000000"; //this uses git
+
+ foreach (const QString &newAdress, possibleRebaseAdresses) {
+ bool rebased = rebaseDlls(maddeBinLocation, rebaseBinaryLocation, newAdress);
+ if (!rebased) {
+ //rebasing is not working
+ return 2;
+ }
+ bool reseted = cleanUpSubDirectories(maddeLocation, directoriesForCleanUp, QStringList(successFileCheck));
+ if (!reseted) {
+ //Madde couldn't reseted to the starting position
+ return 3;
+ }
+ if (!checkTools(maddeBinLocation, binaryCheckList)) {
+ //we need another adress
+ continue;
+ }
+ bool installationWentFine = runInstall(postinstallCommand, successFileCheck);
+
+ if (installationWentFine) {
+ qDebug() << "Rebasing dlls to " << newAdress <<" helped to install MADDE";
+ return 0;
+ }
+ }
+
+ //means rebasing was not helping
+ return 1;
+}