From a18ab6b11ff6561b6bf752fddf9b1369a60e7437 Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Wed, 8 Feb 2023 17:38:52 +0100 Subject: [PATCH] QtSupport: allow relative paths for the qmake command This change makes it possible to bake in settings for bundled/shipped Qt versions like we have in the QtDesignStudio.app package. The result is that the installer does not need to write absolute paths to the settings anymore, so it stays like it was signed. A signed package on macOS is more and more necessary and recommended for a while. Especially If the application will touch files in special folders like Download, Documents, or Desktop. Change-Id: I3153ffd4229b34a59bdfe740937c21ee93de3e9b Reviewed-by: Eike Ziller Reviewed-by: Qt CI Bot --- src/libs/utils/persistentsettings.cpp | 6 ++++++ src/libs/utils/persistentsettings.h | 2 ++ src/plugins/qnx/qnxqtversion.cpp | 2 +- src/plugins/qnx/qnxqtversion.h | 2 +- src/plugins/qtsupport/baseqtversion.cpp | 7 ++++--- src/plugins/qtsupport/baseqtversion.h | 2 +- src/plugins/qtsupport/qtversionfactory.h | 2 +- src/plugins/qtsupport/qtversionmanager.cpp | 6 +++--- 8 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/libs/utils/persistentsettings.cpp b/src/libs/utils/persistentsettings.cpp index 0e820e6030e..0776e69b860 100644 --- a/src/libs/utils/persistentsettings.cpp +++ b/src/libs/utils/persistentsettings.cpp @@ -336,11 +336,17 @@ bool PersistentSettingsReader::load(const FilePath &fileName) if (fileName.fileSize() == 0) // skip empty files return false; + m_filePath = fileName.parentDir(); ParseContext ctx; m_valueMap = ctx.parse(fileName); return true; } +FilePath PersistentSettingsReader::filePath() +{ + return m_filePath; +} + /*! \class Utils::PersistentSettingsWriter diff --git a/src/libs/utils/persistentsettings.h b/src/libs/utils/persistentsettings.h index 8f397b4c386..d2c6d8b51fe 100644 --- a/src/libs/utils/persistentsettings.h +++ b/src/libs/utils/persistentsettings.h @@ -22,9 +22,11 @@ public: QVariant restoreValue(const QString &variable, const QVariant &defaultValue = QVariant()) const; QVariantMap restoreValues() const; bool load(const FilePath &fileName); + FilePath filePath(); private: QMap m_valueMap; + FilePath m_filePath; }; class QTCREATOR_UTILS_EXPORT PersistentSettingsWriter diff --git a/src/plugins/qnx/qnxqtversion.cpp b/src/plugins/qnx/qnxqtversion.cpp index d68c667a792..095a81c5cbe 100644 --- a/src/plugins/qnx/qnxqtversion.cpp +++ b/src/plugins/qnx/qnxqtversion.cpp @@ -116,7 +116,7 @@ QVariantMap QnxQtVersion::toMap() const return result; } -void QnxQtVersion::fromMap(const QVariantMap &map) +void QnxQtVersion::fromMap(const QVariantMap &map, const Utils::FilePath &) { QtVersion::fromMap(map); setSdpPath(FilePath::fromVariant(map.value(SDP_PATH_KEY))); diff --git a/src/plugins/qnx/qnxqtversion.h b/src/plugins/qnx/qnxqtversion.h index 02f5eb15b60..bf78b7b1ddf 100644 --- a/src/plugins/qnx/qnxqtversion.h +++ b/src/plugins/qnx/qnxqtversion.h @@ -28,7 +28,7 @@ public: QString cpuDir() const; QVariantMap toMap() const override; - void fromMap(const QVariantMap &map) override; + void fromMap(const QVariantMap &map, const Utils::FilePath &filePath) override; ProjectExplorer::Abis detectQtAbis() const override; diff --git a/src/plugins/qtsupport/baseqtversion.cpp b/src/plugins/qtsupport/baseqtversion.cpp index c13c257b5be..d954ee14089 100644 --- a/src/plugins/qtsupport/baseqtversion.cpp +++ b/src/plugins/qtsupport/baseqtversion.cpp @@ -635,7 +635,7 @@ bool QtVersion::hasReleaseBuild() const return !d->m_defaultConfigIsDebug || d->m_defaultConfigIsDebugAndRelease; } -void QtVersion::fromMap(const QVariantMap &map) +void QtVersion::fromMap(const QVariantMap &map, const FilePath &filePath) { d->m_id = map.value(Constants::QTVERSIONID).toInt(); if (d->m_id == -1) // this happens on adding from installer, see updateFromInstaller => get a new unique id @@ -660,6 +660,7 @@ void QtVersion::fromMap(const QVariantMap &map) d->m_qmakeCommand = BuildableHelperLibrary::qtChooserToQmakePath(qmake); } } + d->m_qmakeCommand = filePath.resolvePath(d->m_qmakeCommand); d->m_data.qtSources = FilePath::fromVariant(map.value(QTVERSIONSOURCEPATH)); @@ -2325,12 +2326,12 @@ bool QtVersionFactory::canRestore(const QString &type) return type == m_supportedType; } -QtVersion *QtVersionFactory::restore(const QString &type, const QVariantMap &data) +QtVersion *QtVersionFactory::restore(const QString &type, const QVariantMap &data, const FilePath &filePath) { QTC_ASSERT(canRestore(type), return nullptr); QTC_ASSERT(m_creator, return nullptr); QtVersion *version = create(); - version->fromMap(data); + version->fromMap(data, filePath); return version; } diff --git a/src/plugins/qtsupport/baseqtversion.h b/src/plugins/qtsupport/baseqtversion.h index 03c34885468..fe1f8074096 100644 --- a/src/plugins/qtsupport/baseqtversion.h +++ b/src/plugins/qtsupport/baseqtversion.h @@ -49,7 +49,7 @@ public: virtual ~QtVersion(); - virtual void fromMap(const QVariantMap &map); + virtual void fromMap(const QVariantMap &map, const Utils::FilePath &filePath = {}); virtual bool equals(QtVersion *other); bool isAutodetected() const; diff --git a/src/plugins/qtsupport/qtversionfactory.h b/src/plugins/qtsupport/qtversionfactory.h index 8ab7a8f08a1..8fa218b6447 100644 --- a/src/plugins/qtsupport/qtversionfactory.h +++ b/src/plugins/qtsupport/qtversionfactory.h @@ -22,7 +22,7 @@ public: static const QList allQtVersionFactories(); bool canRestore(const QString &type); - QtVersion *restore(const QString &type, const QVariantMap &data); + QtVersion *restore(const QString &type, const QVariantMap &data, const Utils::FilePath &workingDirectory); /// factories with higher priority are asked first to identify /// a qtversion, the priority of the desktop factory is 0 and diff --git a/src/plugins/qtsupport/qtversionmanager.cpp b/src/plugins/qtsupport/qtversionmanager.cpp index 117adebad9a..cc9ad46ceca 100644 --- a/src/plugins/qtsupport/qtversionmanager.cpp +++ b/src/plugins/qtsupport/qtversionmanager.cpp @@ -195,7 +195,7 @@ static bool restoreQtVersions() bool restored = false; for (QtVersionFactory *f : factories) { if (f->canRestore(type)) { - if (QtVersion *qtv = f->restore(type, qtversionMap)) { + if (QtVersion *qtv = f->restore(type, qtversionMap, reader.filePath())) { if (m_versions.contains(qtv->uniqueId())) { // This shouldn't happen, we are restoring the same id multiple times? qWarning() << "A Qt version with id"<uniqueId()<<"already exists"; @@ -289,7 +289,7 @@ void QtVersionManager::updateFromInstaller(bool emitSignal) qtversionMap[Constants::QTVERSIONNAME] = v->unexpandedDisplayName(); delete v; - if (QtVersion *qtv = factory->restore(type, qtversionMap)) { + if (QtVersion *qtv = factory->restore(type, qtversionMap, reader.filePath())) { Q_ASSERT(qtv->isAutodetected()); m_versions.insert(id, qtv); restored = true; @@ -303,7 +303,7 @@ void QtVersionManager::updateFromInstaller(bool emitSignal) // Create a new qtversion if (!restored) { // didn't replace any existing versions qCDebug(log) << " No Qt version found matching" << autoDetectionSource << " => Creating new version"; - if (QtVersion *qtv = factory->restore(type, qtversionMap)) { + if (QtVersion *qtv = factory->restore(type, qtversionMap, reader.filePath())) { Q_ASSERT(qtv->isAutodetected()); m_versions.insert(qtv->uniqueId(), qtv); added << qtv->uniqueId();