diff --git a/src/plugins/ios/iosconfigurations.cpp b/src/plugins/ios/iosconfigurations.cpp index 0a8f45f2db5..864a46a212c 100644 --- a/src/plugins/ios/iosconfigurations.cpp +++ b/src/plugins/ios/iosconfigurations.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -48,6 +49,7 @@ #include #include +#include #include #include #include @@ -62,6 +64,7 @@ using namespace Debugger; namespace { Q_LOGGING_CATEGORY(kitSetupLog, "qtc.ios.kitSetup") +Q_LOGGING_CATEGORY(iosCommonLog, "qtc.ios.common") } using ToolChainPair = std::pair; @@ -207,6 +210,33 @@ static void setupKit(Kit *kit, Core::Id pDeviceType, const ToolChainPair& toolCh SysRootKitInformation::setSysRoot(kit, sdkPath); } +static QVersionNumber findXcodeVersion() +{ + Utils::SynchronousProcess pkgUtilProcess; + Utils::SynchronousProcessResponse resp = + pkgUtilProcess.runBlocking("pkgutil", QStringList("--pkg-info-plist=com.apple.pkg.Xcode")); + if (resp.result == Utils::SynchronousProcessResponse::Finished) { + QDomDocument xcodeVersionDoc; + if (xcodeVersionDoc.setContent(resp.allRawOutput())) { + QDomNodeList nodes = xcodeVersionDoc.elementsByTagName(QStringLiteral("key")); + for (int i = 0; i < nodes.count(); ++i) { + QDomElement elem = nodes.at(i).toElement(); + if (elem.text().compare(QStringLiteral("pkg-version")) == 0) { + QString versionStr = elem.nextSiblingElement().text(); + return QVersionNumber::fromString(versionStr); + } + } + } else { + qCDebug(iosCommonLog) << "Error finding Xcode version. Cannot parse xml output from pkgutil."; + } + } else { + qCDebug(iosCommonLog) << "Error finding Xcode version. pkgutil command failed."; + } + + qCDebug(iosCommonLog) << "Error finding Xcode version. Unknow error."; + return QVersionNumber(); +} + void IosConfigurations::updateAutomaticKitList() { const QList platforms = handledPlatforms(); @@ -312,6 +342,11 @@ FileName IosConfigurations::developerPath() return m_instance->m_developerPath; } +QVersionNumber IosConfigurations::xcodeVersion() +{ + return m_instance->m_xcodeVersion; +} + void IosConfigurations::save() { QSettings *settings = Core::ICore::settings(); @@ -358,6 +393,9 @@ void IosConfigurations::setDeveloperPath(const FileName &devPath) QTimer::singleShot(1000, IosDeviceManager::instance(), &IosDeviceManager::monitorAvailableDevices); m_instance->updateSimulators(); + + // Find xcode version. + m_instance->m_xcodeVersion = findXcodeVersion(); } } } diff --git a/src/plugins/ios/iosconfigurations.h b/src/plugins/ios/iosconfigurations.h index 9bcc5f1bc35..58bab02654e 100644 --- a/src/plugins/ios/iosconfigurations.h +++ b/src/plugins/ios/iosconfigurations.h @@ -32,6 +32,7 @@ #include #include #include +#include QT_BEGIN_NAMESPACE class QSettings; @@ -60,6 +61,7 @@ public: static bool ignoreAllDevices(); static void setIgnoreAllDevices(bool ignoreDevices); static Utils::FileName developerPath(); + static QVersionNumber xcodeVersion(); static Utils::FileName lldbPath(); static void updateAutomaticKitList(); @@ -71,6 +73,7 @@ private: static void setDeveloperPath(const Utils::FileName &devPath); Utils::FileName m_developerPath; + QVersionNumber m_xcodeVersion; bool m_ignoreAllDevices; };