diff --git a/src/libs/installer/macrelocateqt.cpp b/src/libs/installer/macrelocateqt.cpp index 98f8153..6fc6eb3 100644 --- a/src/libs/installer/macrelocateqt.cpp +++ b/src/libs/installer/macrelocateqt.cpp @@ -78,13 +78,15 @@ bool Relocator::apply(const QString &qtInstallDir, const QString &targetDir) MacReplaceInstallNamesOperation operation; + operation.setComponentRootPath(qtInstallDir); QStringList arguments; arguments << indicator << replacement - << qtInstallDir + QLatin1String("/plugins") - << qtInstallDir + QLatin1String("/lib") - << qtInstallDir + QLatin1String("/imports") - << qtInstallDir + QLatin1String("/bin"); +// << qtInstallDir + QLatin1String("/plugins") +// << qtInstallDir + QLatin1String("/lib") +// << qtInstallDir + QLatin1String("/imports") +// << qtInstallDir + QLatin1String("/bin"); + << qtInstallDir; operation.setArguments(arguments); operation.performOperation(); diff --git a/src/libs/installer/macreplaceinstallnamesoperation.cpp b/src/libs/installer/macreplaceinstallnamesoperation.cpp index 06ef9f6..9167c56 100644 --- a/src/libs/installer/macreplaceinstallnamesoperation.cpp +++ b/src/libs/installer/macreplaceinstallnamesoperation.cpp @@ -42,6 +42,9 @@ using namespace QInstaller; MacReplaceInstallNamesOperation::MacReplaceInstallNamesOperation() + : m_indicator(), + m_installationDir(), + m_componentRootPath() { setName(QLatin1String("ReplaceInstallNames")); } @@ -134,6 +137,11 @@ bool MacReplaceInstallNamesOperation::apply(const QString &indicator, const QStr return error() == NoError; } +void MacReplaceInstallNamesOperation::setComponentRootPath(const QString &path) +{ + m_componentRootPath = path; +} + void MacReplaceInstallNamesOperation::extractExecutableInfo(const QString &fileName, QString &frameworkId, QStringList &frameworks, QString &originalBuildDir) { @@ -206,21 +214,47 @@ void MacReplaceInstallNamesOperation::relocateBinary(const QString &fileName) "orginalBuildDir: %4)").arg(fileName, frameworkId, frameworks.join(QLatin1String("|")), originalBuildDir); QStringList args; - if (frameworkId.contains(m_indicator) || QFileInfo(frameworkId).fileName() == frameworkId) { + + // Use regexp to find matches from frameworks and static libs + QRegExp frameworkRegexp(QLatin1String("Qt[3a-zA-Z]*\\.framework/")); + QRegExp dylibRegexp(QLatin1String("libQt.*\\.dylib")); + +// if (frameworkId.contains(m_indicator) || QFileInfo(frameworkId).fileName() == frameworkId) { + + // change framework ID only if Qt library reference + if (frameworkId.indexOf(frameworkRegexp) >= 0) { args << QLatin1String("-id") << fileName << fileName; if (!execCommand(QLatin1String("install_name_tool"), args)) return; } + // calculate path prefix which is the full installation path and + // /lib/ added so that it points to Qt installations libraries + QString prefix = m_componentRootPath + QLatin1String("/lib/"); + // calculate path prefix which is the full installation path and + // /lib/ added so that it points to Qt installations libraries foreach (const QString &fw, frameworks) { - if (originalBuildDir.isEmpty() && fw.contains(m_indicator)) { - originalBuildDir = fw.left(fw.indexOf(m_indicator)); - } - if (originalBuildDir.isEmpty() || !fw.contains(originalBuildDir)) +// if (originalBuildDir.isEmpty() && fw.contains(m_indicator)) { +// originalBuildDir = fw.left(fw.indexOf(m_indicator)); +// } +// if (originalBuildDir.isEmpty() || !fw.contains(originalBuildDir)) + + int fraIndex = fw.indexOf(frameworkRegexp); + int dyIndex = fw.indexOf(dylibRegexp); + + QString newPath; + if (fraIndex >= 0) + newPath = fw.mid(fraIndex); + else if (dyIndex >= 0) + newPath = fw.mid(dyIndex); + else continue; - QString newPath = fw; - newPath.replace(originalBuildDir, m_installationDir); + +// QString newPath = fw; +// newPath.replace(originalBuildDir, m_installationDir); + + newPath = prefix + newPath; args.clear(); args << QLatin1String("-change") << fw << newPath << fileName; diff --git a/src/libs/installer/macreplaceinstallnamesoperation.h b/src/libs/installer/macreplaceinstallnamesoperation.h index 29f226d..cad5563 100644 --- a/src/libs/installer/macreplaceinstallnamesoperation.h +++ b/src/libs/installer/macreplaceinstallnamesoperation.h @@ -49,6 +49,7 @@ public: Operation *clone() const; bool apply(const QString &oldString, const QString &newString, const QString &frameworkDir); + void setComponentRootPath(const QString &path); private: void extractExecutableInfo(const QString &fileName, QString &frameworkId, QStringList &frameworks, @@ -60,6 +61,7 @@ private: private: QString m_indicator; QString m_installationDir; + QString m_componentRootPath; }; } // namespace QInstaller diff --git a/src/libs/installer/resources/files-to-patch-linux b/src/libs/installer/resources/files-to-patch-linux index 9c7b39f..59aeb36 100644 --- a/src/libs/installer/resources/files-to-patch-linux +++ b/src/libs/installer/resources/files-to-patch-linux @@ -70,3 +70,4 @@ lib/pkgconfig/QtWebKit.pc lib/pkgconfig/QtXmlPatterns.pc lib/pkgconfig/QtXml.pc mkspecs/qconfig.pri +mkspecs/qmodule.pri diff --git a/src/libs/installer/resources/files-to-patch-macx b/src/libs/installer/resources/files-to-patch-macx index 7f8deda..36db4c9 100644 --- a/src/libs/installer/resources/files-to-patch-macx +++ b/src/libs/installer/resources/files-to-patch-macx @@ -59,3 +59,4 @@ lib/pkgconfig/QtWebKit.pc lib/pkgconfig/QtXmlPatterns.pc lib/pkgconfig/QtXml.pc mkspecs/qconfig.pri +mkspecs/qmodule.pri