summaryrefslogtreecommitdiffstats
path: root/tools/binarycreator/binarycreator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/binarycreator/binarycreator.cpp')
-rw-r--r--tools/binarycreator/binarycreator.cpp196
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;
}