diff options
Diffstat (limited to 'tools/binarycreator/binarycreator.cpp')
-rw-r--r-- | tools/binarycreator/binarycreator.cpp | 196 |
1 files changed, 93 insertions, 103 deletions
diff --git a/tools/binarycreator/binarycreator.cpp b/tools/binarycreator/binarycreator.cpp index 594686e61..80c083208 100644 --- a/tools/binarycreator/binarycreator.cpp +++ b/tools/binarycreator/binarycreator.cpp @@ -46,6 +46,7 @@ #include <errors.h> #include <fileutils.h> #include <init.h> +#include <repository.h> #include <settings.h> #include <utils.h> @@ -113,15 +114,8 @@ static void chmod755(const QString &absolutFilePath) } #endif -static int assemble(Input input, const QString &configFile) +static int assemble(Input input, const QInstaller::Settings &settings) { - const QString configDir = QFileInfo(configFile).canonicalPath(); - const QInstaller::Settings &settings = QInstaller::Settings::fromFileAndPrefix(configFile, configDir); - -#ifdef Q_OS_LINUX -Q_UNUSED(settings) -#endif - #ifdef Q_OS_MAC if (QFileInfo(input.installerExePath).isBundle()) { const QString bundle = input.installerExePath; @@ -154,8 +148,14 @@ Q_UNUSED(settings) pkgInfoStream << QLatin1String("APPL????") << endl; } - const QString iconFile = QFile::exists(settings.icon()) ? settings.icon() - : QString::fromLatin1(":/resources/default_icon_mac.icns"); + QString iconFile; + if (QFile::exists(settings.installerApplicationIcon())) { + iconFile = settings.installerApplicationIcon(); + } else { + iconFile = QFile::exists(settings.icon()) ? settings.icon() + : QString::fromLatin1(":/resources/default_icon_mac.icns"); + } + const QString iconTargetFile = fi.completeBaseName() + QLatin1String(".icns"); QFile::copy(iconFile, fi.filePath() + QLatin1String("/Contents/Resources/") + iconTargetFile); @@ -175,7 +175,10 @@ Q_UNUSED(settings) plistStream << QLatin1String(" <key>CFBundleGetInfoString</key>") << endl; #define QUOTE_(x) #x #define QUOTE(x) QUOTE_(x) - plistStream << QLatin1String(" <string>") << QLatin1String(QUOTE(IFW_VERSION)) << ("</string>") << endl; + plistStream << QLatin1String(" <string>") << QLatin1String(QUOTE(IFW_VERSION)) << ("</string>") + << endl; +#undef QUOTE +#undef QUOTE_ plistStream << QLatin1String(" <key>CFBundleSignature</key>") << endl; plistStream << QLatin1String(" <string> ???? </string>") << endl; plistStream << QLatin1String(" <key>CFBundleExecutable</key>") << endl; @@ -192,6 +195,8 @@ Q_UNUSED(settings) input.outputPath = QString::fromLatin1("%1/Contents/MacOS/%2").arg(input.outputPath) .arg(fi.completeBaseName()); } +#elif defined(Q_OS_LINUX) + Q_UNUSED(settings) #endif QTemporaryFile file(input.outputPath); @@ -218,9 +223,13 @@ Q_UNUSED(settings) #if defined(Q_OS_WIN) // setting the windows icon must happen before we append our binary data - otherwise they get lost :-/ - if (QFile::exists(settings.icon())) { + if (QFile::exists(settings.installerApplicationIcon())) { // no error handling as this is not fatal - setApplicationIcon(tempFile, settings.icon()); + setApplicationIcon(tempFile, settings.installerApplicationIcon()); + } else { + if (QFile::exists(settings.icon())) { + setApplicationIcon(tempFile, settings.icon()); + } } #elif defined(Q_OS_MAC) if (isBundle) { @@ -311,14 +320,14 @@ Q_UNUSED(settings) } catch (const Error &e) { qCritical("Error occurred while assembling the installer: %s", qPrintable(e.message())); QFile::remove(tempFile); - return 1; + return EXIT_FAILURE; } if (!out.commit(KDSaveFile::OverwriteExistingFile)) { qCritical("Could not write installer to %s: %s", qPrintable(out.fileName()), qPrintable(out.errorString())); QFile::remove(tempFile); - return 1; + return EXIT_FAILURE; } #ifndef Q_OS_WIN chmod755(out.fileName()); @@ -342,7 +351,7 @@ Q_UNUSED(settings) qDebug() << "done." << mkdmgscript; } #endif - return 0; + return EXIT_SUCCESS; } QT_BEGIN_NAMESPACE @@ -469,90 +478,67 @@ static void printUsage() std::cout << std::endl; } -static QString createMetaDataDirectory(const QInstallerTools::PackageInfoVector &packages, - const QString &packagesDir, const QString &configFile) +void copyConfigData(const QString &configFile, const QString &targetDir) { - const QInstaller::Settings &settings = QInstaller::Settings::fromFileAndPrefix(configFile, QString()); + qDebug() << "Begin to copy configuration file and data."; - const QString metapath = createTemporaryDirectory(); - generateMetaDataDirectory(metapath, packagesDir, packages, settings.applicationName(), - settings.applicationVersion()); + const QString sourceConfigFile = QFileInfo(configFile).absoluteFilePath(); + const QString targetConfigFile = targetDir + QLatin1String("/config.xml"); + QInstallerTools::copyWithException(sourceConfigFile, targetConfigFile, QLatin1String("configuration")); - const QString configCopy = metapath + QLatin1String("/installer-config"); - QInstaller::mkdir(configCopy); - QString absoluteConfigPath = QFileInfo(configFile).absolutePath(); + QFile configXml(targetConfigFile); + QInstaller::openForRead(&configXml, configXml.fileName()); - QDirIterator it(absoluteConfigPath, QDir::Files | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); - while (it.hasNext()) { - const QString next = it.next(); - if (next.contains(QLatin1String("/."))) // skip files that are in directories starting with a point + QDomDocument dom; + dom.setContent(&configXml); + configXml.close(); + + // iterate over all child elements, searching for relative file names + const QDomNodeList children = dom.documentElement().childNodes(); + const QString sourceConfigFilePath = QFileInfo(sourceConfigFile).absolutePath(); + for (int i = 0; i < children.count(); ++i) { + QDomElement domElement = children.at(i).toElement(); + if (domElement.isNull()) continue; - qDebug() << "\tFound configuration file: " << next; - const QFileInfo sourceFileInfo(next); - const QString source = sourceFileInfo.absoluteFilePath(); - QFileInfo targetFileInfo(configCopy, QFileInfo(next).fileName()); - - if (QFileInfo(next).fileName() == QFileInfo(configFile).fileName()) - targetFileInfo.setFile(configCopy, QLatin1String("config.xml")); - - const QDir targetDir = targetFileInfo.dir(); - if (!targetDir.exists()) - QInstaller::mkpath(targetFileInfo.absolutePath()); - const QString target = targetFileInfo.absoluteFilePath(); - - if (!QFile::copy(source, target)) - throw Error(QString::fromLatin1("Could not copy %1.").arg(source)); - - if (sourceFileInfo.fileName() == QFileInfo(configFile).fileName()) { - QFile configXml(targetDir.filePath(QLatin1String("config.xml"))); - configXml.open(QIODevice::ReadOnly); - QDomDocument dom; - dom.setContent(&configXml); - configXml.close(); - - // iterate over all child elements, searching for relative file names - const QDomNodeList children = dom.documentElement().childNodes(); - for (int i = 0; i < children.count(); ++i) { - QDomElement el = children.at(i).toElement(); - if (el.isNull()) - continue; - - QFileInfo fi(absoluteConfigPath, el.text()); + const QString tagName = domElement.tagName(); + const QString elementText = domElement.text(); + qDebug() << QString::fromLatin1("Read dom element: <%1>%2</%1>.").arg(tagName, elementText); + + QString newName = domElement.text().replace(QRegExp(QLatin1String("\\\\|/|\\.|:")), + QLatin1String("_")); + + QString targetFile; + QFileInfo elementFileInfo; + if (tagName == QLatin1String("Icon") || tagName == QLatin1String("InstallerApplicationIcon")) { #if defined(Q_OS_MAC) - const QFileInfo fiIcon(absoluteConfigPath, el.text() + QLatin1String(".icns")); + const QString suffix = QLatin1String(".icns"); #elif defined(Q_OS_WIN) - const QFileInfo fiIcon(absoluteConfigPath, el.text() + QLatin1String(".ico")); + const QString suffix = QLatin1String(".ico"); #else - const QFileInfo fiIcon(absoluteConfigPath, el.text() + QLatin1String(".png")); + const QString suffix = QLatin1String(".png"); #endif - if (!fi.exists() && fiIcon.exists()) - fi = fiIcon; - - if (!fi.exists() || fi.absolutePath() == QFileInfo(configFile).dir().absolutePath()) - continue; - - if (fi.isDir()) - continue; + elementFileInfo = QFileInfo(sourceConfigFilePath, elementText + suffix); + targetFile = targetDir + QLatin1Char('/') + newName + suffix; + } else { + elementFileInfo = QFileInfo(sourceConfigFilePath, elementText); + const QString suffix = elementFileInfo.completeSuffix(); + if (!suffix.isEmpty()) + newName.append(QLatin1Char('.') + suffix); + targetFile = targetDir + QLatin1Char('/') + newName; + } + if (!elementFileInfo.exists() || elementFileInfo.isDir()) + continue; - const QString newName = el.text().replace(QRegExp(QLatin1String("\\\\|/|\\.")), - QLatin1String("_")); + domElement.replaceChild(dom.createTextNode(newName), domElement.firstChild()); + QInstallerTools::copyWithException(elementFileInfo.absoluteFilePath(), targetFile, tagName); + } - if (!QFile::exists(targetDir.absoluteFilePath(newName))) { - if (!QFile::copy(fi.absoluteFilePath(), targetDir.absoluteFilePath(newName))) - throw Error(QString::fromLatin1("Could not copy %1.").arg(el.text())); - } - el.removeChild(el.firstChild()); - el.appendChild(dom.createTextNode(newName)); - } + QInstaller::openForWrite(&configXml, configXml.fileName()); + QTextStream stream(&configXml); + dom.save(stream, 4); - openForWrite(&configXml, configXml.fileName()); - QTextStream stream(&configXml); - dom.save(stream, 4); - qDebug() << "\tdone."; - } - } - return metapath; + qDebug() << "done.\n"; } static int printErrorAndUsageAndExit(const QString &err) @@ -706,31 +692,37 @@ int main(int argc, char **argv) qDebug() << "Parsed arguments, ok."; + int exitCode = EXIT_FAILURE; + const QString tmpMetaDir = QInstaller::createTemporaryDirectory(); try { - QInstallerTools::PackageInfoVector packages = createListOfPackages(packagesDirectory, + const Settings settings = Settings::fromFileAndPrefix(configFile, QFileInfo(configFile).absolutePath()); + QInstallerTools::PackageInfoVector packages = QInstallerTools::createListOfPackages(packagesDirectory, filteredPackages, ftype); - const QString metaDir = createMetaDataDirectory(packages, packagesDirectory, configFile); + QInstallerTools::copyMetaData(tmpMetaDir, packagesDirectory, packages, settings.applicationName(), + settings.applicationVersion()); + + copyConfigData(configFile, tmpMetaDir + QLatin1String("/installer-config")); { - QSettings confInternal(metaDir + QLatin1String("/config/config-internal.ini") + QSettings confInternal(tmpMetaDir + QLatin1String("/config/config-internal.ini") , QSettings::IniFormat); + // assume offline installer if there are no repositories + offlineOnly |= settings.repositories().isEmpty(); confInternal.setValue(QLatin1String("offlineOnly"), offlineOnly); } #if defined(Q_OS_MAC) // on mac, we enforce building a bundle - if (!target.endsWith(QLatin1String(".app")) && !target.endsWith(QLatin1String(".dmg"))) { + if (!target.endsWith(QLatin1String(".app")) && !target.endsWith(QLatin1String(".dmg"))) target += QLatin1String(".app"); - } #endif - int result = EXIT_FAILURE; { Input input; input.outputPath = target; input.installerExePath = templateBinary; - input.binaryResourcePath = createBinaryResourceFile(metaDir); + input.binaryResourcePath = createBinaryResourceFile(tmpMetaDir); input.binaryResources = createBinaryResourceFiles(resources); - QInstallerTools::copyComponentData(packagesDirectory, metaDir, packages); + QInstallerTools::copyComponentData(packagesDirectory, tmpMetaDir, &packages); // now put the packages into the components section of the binary foreach (const QInstallerTools::PackageInfo &info, packages) { @@ -740,7 +732,7 @@ int main(int argc, char **argv) qDebug() << "Creating component info for" << info.name; foreach (const QString &archive, info.copiedArchives) { const QSharedPointer<Archive> arch(new Archive(archive)); - qDebug() << QString::fromLatin1("\tAppending %1 (%2)").arg(archive, + qDebug() << QString::fromLatin1("Appending %1 (%2)").arg(archive, humanReadableSize(arch->size())); comp.appendArchive(arch); } @@ -748,7 +740,7 @@ int main(int argc, char **argv) } qDebug() << "Creating the binary"; - result = assemble(input, configFile); + exitCode = assemble(input, settings); // cleanup qDebug() << "Cleaning up..."; @@ -756,14 +748,12 @@ int main(int argc, char **argv) foreach (const QString &resource, input.binaryResources) QFile::remove(resource); } - removeDirectory(metaDir, true); - return result; } catch (const Error &e) { - std::cerr << "caught exception: " << e.message() << std::endl; - return EXIT_FAILURE; + std::cerr << "Caught exception: " << e.message() << std::endl; } catch (...) { std::cerr << "Unknown exception caught" << std::endl; - return EXIT_FAILURE; } - return EXIT_FAILURE; + + QInstaller::removeDirectory(tmpMetaDir, true); + return exitCode; } |