diff --git a/src/plugins/cmakeprojectmanager/builddirparameters.cpp b/src/plugins/cmakeprojectmanager/builddirparameters.cpp index 47af2ff68af..023de6b0717 100644 --- a/src/plugins/cmakeprojectmanager/builddirparameters.cpp +++ b/src/plugins/cmakeprojectmanager/builddirparameters.cpp @@ -53,10 +53,12 @@ BuildDirParameters::BuildDirParameters(CMakeBuildConfiguration *bc) const Utils::MacroExpander *expander = bc->macroExpander(); - initialCMakeArguments = Utils::transform(bc->initialCMakeArguments(), - [expander](const QString &s) { - return expander->expand(s); - }); + const QStringList expandedArguments = Utils::transform(bc->initialCMakeArguments(), + [expander](const QString &s) { + return expander->expand(s); + }); + initialCMakeArguments = Utils::filtered(expandedArguments, + [](const QString &s) { return !s.isEmpty(); }); extraCMakeArguments = Utils::transform(bc->extraCMakeArguments(), [expander](const QString &s) { return expander->expand(s); diff --git a/src/plugins/cmakeprojectmanager/builddirparameters.h b/src/plugins/cmakeprojectmanager/builddirparameters.h index 375562d8ea2..fa63b91bd53 100644 --- a/src/plugins/cmakeprojectmanager/builddirparameters.h +++ b/src/plugins/cmakeprojectmanager/builddirparameters.h @@ -35,10 +35,11 @@ #include namespace CMakeProjectManager { -namespace Internal { class CMakeBuildConfiguration; +namespace Internal { + class BuildDirParameters { public: BuildDirParameters(); diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index db62a8439ee..42457c6a775 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -77,13 +77,17 @@ using namespace ProjectExplorer; using namespace Utils; +using namespace CMakeProjectManager::Internal; namespace CMakeProjectManager { -namespace Internal { static Q_LOGGING_CATEGORY(cmakeBuildConfigurationLog, "qtc.cmake.bc", QtWarningMsg); const char CONFIGURATION_KEY[] = "CMake.Configuration"; +const char DEVELOPMENT_TEAM_FLAG[] = "Ios:DevelopmentTeam:Flag"; +const char PROVISIONING_PROFILE_FLAG[] = "Ios:ProvisioningProfile:Flag"; + +namespace Internal { class CMakeBuildSettingsWidget : public NamedWidget { @@ -98,6 +102,7 @@ private: void updateAdvancedCheckBox(); void updateFromKit(); CMakeProjectManager::CMakeConfig getQmlDebugCxxFlags(); + CMakeProjectManager::CMakeConfig getSigningFlagsChanges(); void updateSelection(); void setVariableUnsetFlag(bool unsetFlag); @@ -339,6 +344,11 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) connect(m_configModel, &QAbstractItemModel::modelReset, this, &CMakeBuildSettingsWidget::updateButtonState); + connect(m_buildConfiguration, + &CMakeBuildConfiguration::signingFlagsChanged, + this, + &CMakeBuildSettingsWidget::updateButtonState); + connect(m_showAdvancedCheckBox, &QCheckBox::stateChanged, this, &CMakeBuildSettingsWidget::updateAdvancedCheckBox); @@ -426,35 +436,36 @@ void CMakeBuildSettingsWidget::updateButtonState() const QList changes = m_configModel->configurationForCMake(); const CMakeConfig configChanges - = getQmlDebugCxxFlags() + Utils::transform(changes, [](const ConfigModel::DataItem &i) { - CMakeConfigItem ni; - ni.key = i.key.toUtf8(); - ni.value = i.value.toUtf8(); - ni.documentation = i.description.toUtf8(); - ni.isAdvanced = i.isAdvanced; - ni.isUnset = i.isUnset; - ni.inCMakeCache = i.inCMakeCache; - ni.values = i.values; - switch (i.type) { - case CMakeProjectManager::ConfigModel::DataItem::BOOLEAN: - ni.type = CMakeConfigItem::BOOL; - break; - case CMakeProjectManager::ConfigModel::DataItem::FILE: - ni.type = CMakeConfigItem::FILEPATH; - break; - case CMakeProjectManager::ConfigModel::DataItem::DIRECTORY: - ni.type = CMakeConfigItem::PATH; - break; - case CMakeProjectManager::ConfigModel::DataItem::STRING: - ni.type = CMakeConfigItem::STRING; - break; - case CMakeProjectManager::ConfigModel::DataItem::UNKNOWN: - default: - ni.type = CMakeConfigItem::INTERNAL; - break; - } - return ni; - }); + = getQmlDebugCxxFlags() + getSigningFlagsChanges() + + Utils::transform(changes, [](const ConfigModel::DataItem &i) { + CMakeConfigItem ni; + ni.key = i.key.toUtf8(); + ni.value = i.value.toUtf8(); + ni.documentation = i.description.toUtf8(); + ni.isAdvanced = i.isAdvanced; + ni.isUnset = i.isUnset; + ni.inCMakeCache = i.inCMakeCache; + ni.values = i.values; + switch (i.type) { + case CMakeProjectManager::ConfigModel::DataItem::BOOLEAN: + ni.type = CMakeConfigItem::BOOL; + break; + case CMakeProjectManager::ConfigModel::DataItem::FILE: + ni.type = CMakeConfigItem::FILEPATH; + break; + case CMakeProjectManager::ConfigModel::DataItem::DIRECTORY: + ni.type = CMakeConfigItem::PATH; + break; + case CMakeProjectManager::ConfigModel::DataItem::STRING: + ni.type = CMakeConfigItem::STRING; + break; + case CMakeProjectManager::ConfigModel::DataItem::UNKNOWN: + default: + ni.type = CMakeConfigItem::INTERNAL; + break; + } + return ni; + }); m_resetButton->setEnabled(m_configModel->hasChanges() && !isParsing); m_reconfigureButton->setEnabled((!configChanges.isEmpty() || m_configModel->hasCMakeChanges()) @@ -525,6 +536,28 @@ CMakeConfig CMakeBuildSettingsWidget::getQmlDebugCxxFlags() return changedConfig; } +CMakeConfig CMakeBuildSettingsWidget::getSigningFlagsChanges() +{ + const CMakeConfig flags = m_buildConfiguration->signingFlags(); + if (flags.isEmpty()) + return {}; + const CMakeConfig configList = m_buildConfiguration->configurationFromCMake(); + if (configList.isEmpty()) { + // we don't have any configuration --> initial configuration takes care of this itself + return {}; + } + CMakeConfig changedConfig; + for (const CMakeConfigItem &signingFlag : flags) { + const CMakeConfigItem existingFlag = Utils::findOrDefault(configList, + Utils::equal(&CMakeConfigItem::key, + signingFlag.key)); + const bool notInConfig = existingFlag.key.isEmpty(); + if (notInConfig != signingFlag.isUnset || existingFlag.value != signingFlag.value) + changedConfig.append(signingFlag); + } + return changedConfig; +} + void CMakeBuildSettingsWidget::updateSelection() { const QModelIndexList selectedIndexes = m_configView->selectionModel()->selectedIndexes(); @@ -662,6 +695,8 @@ static QStringList defaultInitialCMakeArguments(const Kit *k, const QString buil return initialArgs; } +} // namespace Internal + // ----------------------------------------------------------------------------- // CMakeBuildConfiguration: // ----------------------------------------------------------------------------- @@ -696,6 +731,23 @@ CMakeBuildConfiguration::CMakeBuildConfiguration(Target *target, Id id) auto initialCMakeArgumentsAspect = addAspect(); initialCMakeArgumentsAspect->setMacroExpanderProvider([this]{ return macroExpander(); }); + macroExpander()->registerVariable(DEVELOPMENT_TEAM_FLAG, + tr("The CMake flag for the development team"), + [this] { + const CMakeConfig flags = signingFlags(); + if (!flags.isEmpty()) + return flags.first().toArgument(); + return QString(); + }); + macroExpander()->registerVariable(PROVISIONING_PROFILE_FLAG, + tr("The CMake flag for the provisioning profile"), + [this] { + const CMakeConfig flags = signingFlags(); + if (flags.size() > 1 && !flags.at(1).isUnset) { + return flags.at(1).toArgument(); + } + return QString(); + }); addAspect(); addAspect(); @@ -774,6 +826,8 @@ CMakeBuildConfiguration::CMakeBuildConfiguration(Target *target, Id id) "Qt6/qt.toolchain.cmake"); initialArgs.append("-DCMAKE_OSX_ARCHITECTURES:STRING=" + architecture); initialArgs.append("-DCMAKE_OSX_SYSROOT:STRING=" + sysroot); + initialArgs.append("%{" + QLatin1String(DEVELOPMENT_TEAM_FLAG) + "}"); + initialArgs.append("%{" + QLatin1String(PROVISIONING_PROFILE_FLAG) + "}"); } } @@ -972,14 +1026,18 @@ NamedWidget *CMakeBuildConfiguration::createConfigWidget() return new CMakeBuildSettingsWidget(this); } +CMakeConfig CMakeBuildConfiguration::signingFlags() const +{ + return {}; +} + /*! \class CMakeBuildConfigurationFactory */ CMakeBuildConfigurationFactory::CMakeBuildConfigurationFactory() { - registerBuildConfiguration( - "CMakeProjectManager.CMakeBuildConfiguration"); + registerBuildConfiguration(Constants::CMAKE_BUILDCONFIGURATION_ID); setSupportedProjectType(CMakeProjectManager::Constants::CMAKE_PROJECT_ID); setSupportedProjectMimeTypeName(Constants::CMAKE_PROJECT_MIMETYPE); @@ -1114,6 +1172,8 @@ void CMakeBuildConfiguration::setCMakeBuildType(const QString &cmakeBuildType) aspect()->setValue(cmakeBuildType); } +namespace Internal { + // ---------------------------------------------------------------------- // - InitialCMakeParametersAspect: // ---------------------------------------------------------------------- diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h index 6db6610da1c..b9bf2530919 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h @@ -25,6 +25,7 @@ #pragma once +#include "cmake_global.h" #include "cmakeconfigitem.h" #include "configmodel.h" @@ -38,16 +39,18 @@ namespace Internal { class CMakeBuildSystem; class CMakeBuildSettingsWidget; +class CMakeProjectImporter; -class CMakeBuildConfiguration final : public ProjectExplorer::BuildConfiguration +} // namespace Internal + +class CMAKE_EXPORT CMakeBuildConfiguration : public ProjectExplorer::BuildConfiguration { Q_OBJECT - friend class ProjectExplorer::BuildConfigurationFactory; - CMakeBuildConfiguration(ProjectExplorer::Target *target, Utils::Id id); - ~CMakeBuildConfiguration() final; - public: + CMakeBuildConfiguration(ProjectExplorer::Target *target, Utils::Id id); + ~CMakeBuildConfiguration() override; + CMakeConfig configurationFromCMake() const; QStringList extraCMakeArguments() const; @@ -76,6 +79,10 @@ public: signals: void errorOccurred(const QString &message); void warningOccurred(const QString &message); + void signingFlagsChanged(); + +protected: + bool fromMap(const QVariantMap &map) override; private: QVariantMap toMap() const override; @@ -83,7 +90,7 @@ private: ProjectExplorer::NamedWidget *createConfigWidget() override; - bool fromMap(const QVariantMap &map) override; + virtual CMakeConfig signingFlags() const; enum ForceEnabledChanged { False, True }; void clearError(ForceEnabledChanged fec = ForceEnabledChanged::False); @@ -101,17 +108,16 @@ private: QString m_warning; CMakeConfig m_configurationFromCMake; - CMakeBuildSystem *m_buildSystem = nullptr; + Internal::CMakeBuildSystem *m_buildSystem = nullptr; QStringList m_extraCMakeArguments; - friend class CMakeBuildSettingsWidget; - friend class CMakeBuildSystem; + friend class Internal::CMakeBuildSettingsWidget; + friend class Internal::CMakeBuildSystem; }; -class CMakeProjectImporter; - -class CMakeBuildConfigurationFactory final : public ProjectExplorer::BuildConfigurationFactory +class CMAKE_EXPORT CMakeBuildConfigurationFactory + : public ProjectExplorer::BuildConfigurationFactory { public: CMakeBuildConfigurationFactory(); @@ -128,9 +134,11 @@ public: private: static ProjectExplorer::BuildInfo createBuildInfo(BuildType buildType); - friend class CMakeProjectImporter; + friend class Internal::CMakeProjectImporter; }; +namespace Internal { + class InitialCMakeArgumentsAspect final : public Utils::StringAspect { Q_OBJECT @@ -155,6 +163,5 @@ public: BuildTypeAspect(); }; - } // namespace Internal } // namespace CMakeProjectManager diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.h b/src/plugins/cmakeprojectmanager/cmakebuildsystem.h index 47e2a7a822c..b69d675be06 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.h @@ -43,10 +43,11 @@ class CppProjectUpdater; } // namespace CppTools namespace CMakeProjectManager { -namespace Internal { class CMakeBuildConfiguration; +namespace Internal { + // -------------------------------------------------------------------- // CMakeBuildSystem: // -------------------------------------------------------------------- diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectconstants.h b/src/plugins/cmakeprojectmanager/cmakeprojectconstants.h index b7d46e8dafc..2e689f6b5ad 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectconstants.h +++ b/src/plugins/cmakeprojectmanager/cmakeprojectconstants.h @@ -42,6 +42,8 @@ const char CMAKE_HOME_DIR[] = "CMakeProject.HomeDirectory"; // Project const char CMAKE_PROJECT_ID[] = "CMakeProjectManager.CMakeProject"; +const char CMAKE_BUILDCONFIGURATION_ID[] = "CMakeProjectManager.CMakeBuildConfiguration"; + // Menu const char M_CONTEXT[] = "CMakeEditor.ContextMenu"; diff --git a/src/plugins/ios/CMakeLists.txt b/src/plugins/ios/CMakeLists.txt index 0d12422a760..800a5abde46 100644 --- a/src/plugins/ios/CMakeLists.txt +++ b/src/plugins/ios/CMakeLists.txt @@ -1,6 +1,6 @@ add_qtc_plugin(Ios DEPENDS QmlDebug Qt5::Xml - PLUGIN_DEPENDS Core Debugger ProjectExplorer QmakeProjectManager + PLUGIN_DEPENDS Core Debugger ProjectExplorer QmakeProjectManager CMakeProjectManager SOURCES createsimulatordialog.cpp createsimulatordialog.h createsimulatordialog.ui ios.qrc diff --git a/src/plugins/ios/ios.qbs b/src/plugins/ios/ios.qbs index cb5936237cc..2e830e66c79 100644 --- a/src/plugins/ios/ios.qbs +++ b/src/plugins/ios/ios.qbs @@ -6,6 +6,7 @@ QtcPlugin { Depends { name: "Core" } Depends { name: "ProjectExplorer" } Depends { name: "QmakeProjectManager" } + Depends { name: "CMakeProjectManager" } Depends { name: "Debugger" } Depends { name: "QtSupport" } Depends { name: "QmlDebug" } diff --git a/src/plugins/ios/ios_dependencies.pri b/src/plugins/ios/ios_dependencies.pri index 04ec7b6af0f..e8afc154e74 100644 --- a/src/plugins/ios/ios_dependencies.pri +++ b/src/plugins/ios/ios_dependencies.pri @@ -6,4 +6,5 @@ QTC_PLUGIN_DEPENDS += \ coreplugin \ debugger \ projectexplorer \ - qmakeprojectmanager + qmakeprojectmanager \ + cmakeprojectmanager diff --git a/src/plugins/ios/iosbuildconfiguration.cpp b/src/plugins/ios/iosbuildconfiguration.cpp index 74a25bd406d..9cc00960e51 100644 --- a/src/plugins/ios/iosbuildconfiguration.cpp +++ b/src/plugins/ios/iosbuildconfiguration.cpp @@ -32,6 +32,8 @@ #include #include +#include + #include #include @@ -46,6 +48,7 @@ #include using namespace QmakeProjectManager; +using namespace CMakeProjectManager; using namespace ProjectExplorer; using namespace Utils; @@ -101,7 +104,7 @@ private: IosSigningSettingsWidget::IosSigningSettingsWidget(BuildConfiguration *buildConfiguration, BoolAspect *autoManagedSigning, StringAspect *signingIdentifier) - : NamedWidget(IosBuildConfiguration::tr("iOS Settings")) + : NamedWidget(IosQmakeBuildConfiguration::tr("iOS Settings")) , m_autoManagedSigning(autoManagedSigning) , m_signingIdentifier(signingIdentifier) , m_isDevice(DeviceTypeKitAspect::deviceTypeId(buildConfiguration->kit()) @@ -115,7 +118,7 @@ IosSigningSettingsWidget::IosSigningSettingsWidget(BuildConfiguration *buildConf sizePolicy.setHorizontalStretch(0); sizePolicy.setVerticalStretch(0); m_qmakeDefaults->setSizePolicy(sizePolicy); - m_qmakeDefaults->setText(IosBuildConfiguration::tr("Reset")); + m_qmakeDefaults->setText(IosQmakeBuildConfiguration::tr("Reset")); m_qmakeDefaults->setEnabled(m_isDevice); m_signEntityCombo = new QComboBox(container); @@ -130,7 +133,7 @@ IosSigningSettingsWidget::IosSigningSettingsWidget(BuildConfiguration *buildConf sizePolicy2.setVerticalStretch(0); m_autoSignCheckbox->setSizePolicy(sizePolicy2); m_autoSignCheckbox->setChecked(true); - m_autoSignCheckbox->setText(IosBuildConfiguration::tr("Automatically manage signing")); + m_autoSignCheckbox->setText(IosQmakeBuildConfiguration::tr("Automatically manage signing")); m_autoSignCheckbox->setChecked(m_autoManagedSigning->value()); m_autoSignCheckbox->setEnabled(m_isDevice); @@ -140,7 +143,7 @@ IosSigningSettingsWidget::IosSigningSettingsWidget(BuildConfiguration *buildConf m_warningLabel = new Utils::InfoLabel({}, Utils::InfoLabel::Warning, container); - m_signEntityLabel->setText(IosBuildConfiguration::tr("Development team:")); + m_signEntityLabel->setText(IosQmakeBuildConfiguration::tr("Development team:")); connect(m_qmakeDefaults, &QPushButton::clicked, this, &IosSigningSettingsWidget::onReset); @@ -240,8 +243,9 @@ void IosSigningSettingsWidget::onReset() void IosSigningSettingsWidget::configureSigningUi(bool autoManageSigning) { - m_signEntityLabel->setText(autoManageSigning ? IosBuildConfiguration::tr("Development team:") - : IosBuildConfiguration::tr("Provisioning profile:")); + m_signEntityLabel->setText(autoManageSigning + ? IosQmakeBuildConfiguration::tr("Development team:") + : IosQmakeBuildConfiguration::tr("Provisioning profile:")); if (autoManageSigning) populateDevelopmentTeams(); else @@ -266,7 +270,7 @@ void IosSigningSettingsWidget::populateDevelopmentTeams() QSignalBlocker blocker(m_signEntityCombo); // Populate Team id's m_signEntityCombo->clear(); - m_signEntityCombo->addItem(IosBuildConfiguration::tr("Default")); + m_signEntityCombo->addItem(IosQmakeBuildConfiguration::tr("Default")); foreach (auto team, IosConfigurations::developmentTeams()) { m_signEntityCombo->addItem(team->displayName()); const int index = m_signEntityCombo->count() - 1; @@ -294,7 +298,7 @@ void IosSigningSettingsWidget::populateProvisioningProfiles() m_signEntityCombo->setItemData(index, profile->details(), Qt::ToolTipRole); } } else { - m_signEntityCombo->addItem(IosBuildConfiguration::tr("None")); + m_signEntityCombo->addItem(IosQmakeBuildConfiguration::tr("None")); } } // Maintain previous selection. @@ -325,11 +329,12 @@ void IosSigningSettingsWidget::updateInfoText() if (identifier.isEmpty()) { // No signing entity selection. if (configuringTeams) - addMessage(IosBuildConfiguration::tr("Development team is not selected.")); + addMessage(IosQmakeBuildConfiguration::tr("Development team is not selected.")); else - addMessage(IosBuildConfiguration::tr("Provisioning profile is not selected.")); + addMessage(IosQmakeBuildConfiguration::tr("Provisioning profile is not selected.")); - addMessage(IosBuildConfiguration::tr("Using default development team and provisioning profile.")); + addMessage(IosQmakeBuildConfiguration::tr( + "Using default development team and provisioning profile.")); } else { if (!configuringTeams) { ProvisioningProfilePtr profile = IosConfigurations::provisioningProfile(identifier); @@ -337,14 +342,17 @@ void IosSigningSettingsWidget::updateInfoText() auto team = profile->developmentTeam(); if (team) { // Display corresponding team information. - addMessage(IosBuildConfiguration::tr("Development team: %1 (%2)").arg(team->displayName()) - .arg(team->identifier())); - addMessage(IosBuildConfiguration::tr("Settings defined here override the QMake environment.")); + addMessage(IosQmakeBuildConfiguration::tr("Development team: %1 (%2)") + .arg(team->displayName()) + .arg(team->identifier())); + addMessage(IosQmakeBuildConfiguration::tr( + "Settings defined here override the QMake environment.")); } else { qCDebug(iosSettingsLog) << "Development team not found for profile" << profile; } } else { - addMessage(IosBuildConfiguration::tr("Settings defined here override the QMake environment.")); + addMessage(IosQmakeBuildConfiguration::tr( + "Settings defined here override the QMake environment.")); } } @@ -360,23 +368,27 @@ void IosSigningSettingsWidget::updateWarningText() QString warningText; bool configuringTeams = m_autoSignCheckbox->isChecked(); if (m_signEntityCombo->count() < 2) { - warningText = IosBuildConfiguration::tr("%1 not configured. Use Xcode and Apple " - "developer account to configure the " - "provisioning profiles and teams.") - .arg(configuringTeams ? IosBuildConfiguration::tr("Development teams") - : IosBuildConfiguration::tr("Provisioning profiles")); + warningText = IosQmakeBuildConfiguration::tr("%1 not configured. Use Xcode and Apple " + "developer account to configure the " + "provisioning profiles and teams.") + .arg(configuringTeams + ? IosQmakeBuildConfiguration::tr("Development teams") + : IosQmakeBuildConfiguration::tr("Provisioning profiles")); } else { QString identifier = selectedIdentifier(); if (configuringTeams) { auto team = IosConfigurations::developmentTeam(identifier); if (team && !team->hasProvisioningProfile()) - warningText = IosBuildConfiguration::tr("No provisioning profile found for the selected team."); + warningText = IosQmakeBuildConfiguration::tr( + "No provisioning profile found for the selected team."); } else { auto profile = IosConfigurations::provisioningProfile(identifier); if (profile && QDateTime::currentDateTimeUtc() > profile->expirationDate()) { - warningText = IosBuildConfiguration::tr("Provisioning profile expired. Expiration date: %1") - .arg(QLocale::system().toString(profile->expirationDate().toLocalTime(), - QLocale::LongFormat)); + warningText + = IosQmakeBuildConfiguration::tr( + "Provisioning profile expired. Expiration date: %1") + .arg(QLocale::system().toString(profile->expirationDate().toLocalTime(), + QLocale::LongFormat)); } } } @@ -388,7 +400,7 @@ void IosSigningSettingsWidget::updateWarningText() // IosBuildConfiguration -IosBuildConfiguration::IosBuildConfiguration(Target *target, Utils::Id id) +IosQmakeBuildConfiguration::IosQmakeBuildConfiguration(Target *target, Utils::Id id) : QmakeBuildConfiguration(target, id) { m_signingIdentifier = addAspect(); @@ -401,14 +413,14 @@ IosBuildConfiguration::IosBuildConfiguration(Target *target, Utils::Id id) connect(m_signingIdentifier, &BaseAspect::changed, this, - &IosBuildConfiguration::updateQmakeCommand); + &IosQmakeBuildConfiguration::updateQmakeCommand); connect(m_autoManagedSigning, &BaseAspect::changed, this, - &IosBuildConfiguration::updateQmakeCommand); + &IosQmakeBuildConfiguration::updateQmakeCommand); } -QList IosBuildConfiguration::createSubConfigWidgets() +QList IosQmakeBuildConfiguration::createSubConfigWidgets() { auto subConfigWidgets = QmakeBuildConfiguration::createSubConfigWidgets(); @@ -420,7 +432,7 @@ QList IosBuildConfiguration::createSubConfigWidgets() return subConfigWidgets; } -bool IosBuildConfiguration::fromMap(const QVariantMap &map) +bool IosQmakeBuildConfiguration::fromMap(const QVariantMap &map) { if (!QmakeBuildConfiguration::fromMap(map)) return false; @@ -428,7 +440,22 @@ bool IosBuildConfiguration::fromMap(const QVariantMap &map) return true; } -void IosBuildConfiguration::updateQmakeCommand() +static QString teamIdForProvisioningProfile(const QString &id) +{ + // Get the team id from provisioning profile + ProvisioningProfilePtr profile = IosConfigurations::provisioningProfile(id); + QString teamId; + if (profile) + teamId = profile->developmentTeam()->identifier(); + else + qCDebug(iosLog) << "No provisioing profile found for id:" << id; + + if (teamId.isEmpty()) + qCDebug(iosLog) << "Development team unavailable for profile:" << profile; + return teamId; +} + +void IosQmakeBuildConfiguration::updateQmakeCommand() { QMakeStep *qmakeStepInstance = qmakeStep(); const QString forceOverrideArg("-after"); @@ -451,20 +478,10 @@ void IosBuildConfiguration::updateQmakeCommand() if (m_autoManagedSigning->value()) { extraArgs << qmakeIosTeamSettings + signingIdentifier; } else { - // Get the team id from provisioning profile - ProvisioningProfilePtr profile = - IosConfigurations::provisioningProfile(signingIdentifier); - QString teamId; - if (profile) - teamId = profile->developmentTeam()->identifier(); - else - qCDebug(iosLog) << "No provisioing profile found for id:" << signingIdentifier; - + const QString teamId = teamIdForProvisioningProfile(signingIdentifier); if (!teamId.isEmpty()) { extraArgs << qmakeProvisioningProfileSettings + signingIdentifier; extraArgs << qmakeIosTeamSettings + teamId; - } else { - qCDebug(iosLog) << "Development team unavailable for profile:" << profile; } } } @@ -473,9 +490,80 @@ void IosBuildConfiguration::updateQmakeCommand() } } -IosBuildConfigurationFactory::IosBuildConfigurationFactory() +IosQmakeBuildConfigurationFactory::IosQmakeBuildConfigurationFactory() { - registerBuildConfiguration(QmakeProjectManager::Constants::QMAKE_BC_ID); + registerBuildConfiguration( + QmakeProjectManager::Constants::QMAKE_BC_ID); + addSupportedTargetDeviceType(Constants::IOS_DEVICE_TYPE); + addSupportedTargetDeviceType(Constants::IOS_SIMULATOR_TYPE); +} + +IosCMakeBuildConfiguration::IosCMakeBuildConfiguration(Target *target, Id id) + : CMakeBuildConfiguration(target, id) +{ + m_signingIdentifier = addAspect(); + m_signingIdentifier->setSettingsKey(signingIdentifierKey); + + m_autoManagedSigning = addAspect(); + m_autoManagedSigning->setDefaultValue(true); + m_autoManagedSigning->setSettingsKey(autoManagedSigningKey); + + connect(m_signingIdentifier, + &BaseAspect::changed, + this, + &IosCMakeBuildConfiguration::signingFlagsChanged); + connect(m_autoManagedSigning, + &BaseAspect::changed, + this, + &IosCMakeBuildConfiguration::signingFlagsChanged); +} + +QList IosCMakeBuildConfiguration::createSubConfigWidgets() +{ + auto subConfigWidgets = CMakeBuildConfiguration::createSubConfigWidgets(); + + // Ownership of this widget is with BuildSettingsWidget + auto buildSettingsWidget = new IosSigningSettingsWidget(this, + m_autoManagedSigning, + m_signingIdentifier); + subConfigWidgets.prepend(buildSettingsWidget); + return subConfigWidgets; +} + +bool IosCMakeBuildConfiguration::fromMap(const QVariantMap &map) +{ + if (!CMakeBuildConfiguration::fromMap(map)) + return false; + return true; +} + +CMakeConfig IosCMakeBuildConfiguration::signingFlags() const +{ + if (DeviceTypeKitAspect::deviceTypeId(kit()) != Constants::IOS_DEVICE_TYPE) + return {}; + const QString signingIdentifier = m_signingIdentifier->value(); + if (m_autoManagedSigning->value()) { + const DevelopmentTeams teams = IosConfigurations::developmentTeams(); + const QString teamId = signingIdentifier.isEmpty() && !teams.isEmpty() + ? teams.first()->identifier() + : signingIdentifier; + CMakeConfigItem provisioningConfig("CMAKE_XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER", + ""); + provisioningConfig.isUnset = true; + return {{"CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM", teamId.toUtf8()}, provisioningConfig}; + } + const QString teamId = teamIdForProvisioningProfile(signingIdentifier); + if (!teamId.isEmpty()) + return {{"CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM", teamId.toUtf8()}, + {"CMAKE_XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER", + signingIdentifier.toUtf8()}}; + return {}; +} + +IosCMakeBuildConfigurationFactory::IosCMakeBuildConfigurationFactory() +{ + registerBuildConfiguration( + CMakeProjectManager::Constants::CMAKE_BUILDCONFIGURATION_ID); addSupportedTargetDeviceType(Constants::IOS_DEVICE_TYPE); addSupportedTargetDeviceType(Constants::IOS_SIMULATOR_TYPE); } diff --git a/src/plugins/ios/iosbuildconfiguration.h b/src/plugins/ios/iosbuildconfiguration.h index f07382f2757..b183b84e73d 100644 --- a/src/plugins/ios/iosbuildconfiguration.h +++ b/src/plugins/ios/iosbuildconfiguration.h @@ -25,18 +25,18 @@ #pragma once #include "qmakeprojectmanager/qmakebuildconfiguration.h" - +#include #include namespace Ios { namespace Internal { -class IosBuildConfiguration : public QmakeProjectManager::QmakeBuildConfiguration +class IosQmakeBuildConfiguration : public QmakeProjectManager::QmakeBuildConfiguration { Q_OBJECT public: - IosBuildConfiguration(ProjectExplorer::Target *target, Utils::Id id); + IosQmakeBuildConfiguration(ProjectExplorer::Target *target, Utils::Id id); private: QList createSubConfigWidgets() override; @@ -48,10 +48,33 @@ private: Utils::BoolAspect *m_autoManagedSigning = nullptr; }; -class IosBuildConfigurationFactory : public QmakeProjectManager::QmakeBuildConfigurationFactory +class IosQmakeBuildConfigurationFactory : public QmakeProjectManager::QmakeBuildConfigurationFactory { public: - IosBuildConfigurationFactory(); + IosQmakeBuildConfigurationFactory(); +}; + +class IosCMakeBuildConfiguration : public CMakeProjectManager::CMakeBuildConfiguration +{ + Q_OBJECT + +public: + IosCMakeBuildConfiguration(ProjectExplorer::Target *target, Utils::Id id); + +private: + QList createSubConfigWidgets() override; + bool fromMap(const QVariantMap &map) override; + + CMakeProjectManager::CMakeConfig signingFlags() const final; + + Utils::StringAspect *m_signingIdentifier = nullptr; + Utils::BoolAspect *m_autoManagedSigning = nullptr; +}; + +class IosCMakeBuildConfigurationFactory : public CMakeProjectManager::CMakeBuildConfigurationFactory +{ +public: + IosCMakeBuildConfigurationFactory(); }; } // namespace Internal diff --git a/src/plugins/ios/iosplugin.cpp b/src/plugins/ios/iosplugin.cpp index 5c773b579d3..4c85d2f92ee 100644 --- a/src/plugins/ios/iosplugin.cpp +++ b/src/plugins/ios/iosplugin.cpp @@ -69,7 +69,8 @@ public: class IosPluginPrivate { public: - IosBuildConfigurationFactory buildConfigurationFactory; + IosQmakeBuildConfigurationFactory qmakeBuildConfigurationFactory; + IosCMakeBuildConfigurationFactory cmakeBuildConfigurationFactory; IosToolChainFactory toolChainFactory; IosRunConfigurationFactory runConfigurationFactory; IosSettingsPage settingsPage;