diff options
174 files changed, 1879 insertions, 4542 deletions
diff --git a/src/plugins/android/androidbuildapkstep.cpp b/src/plugins/android/androidbuildapkstep.cpp index 6f44d87ad8..9cf5aa76e0 100644 --- a/src/plugins/android/androidbuildapkstep.cpp +++ b/src/plugins/android/androidbuildapkstep.cpp @@ -95,7 +95,7 @@ private: this); }; -AndroidBuildApkStep::AndroidBuildApkStep(ProjectExplorer::BuildStepList *parent, const Core::Id id) +AndroidBuildApkStep::AndroidBuildApkStep(ProjectExplorer::BuildStepList *parent, Core::Id id) : ProjectExplorer::AbstractProcessStep(parent, id), m_buildTargetSdk(AndroidConfig::apiLevelNameFor(AndroidConfigurations:: sdkManager()->latestAndroidSdkPlatform())) @@ -104,18 +104,6 @@ AndroidBuildApkStep::AndroidBuildApkStep(ProjectExplorer::BuildStepList *parent, setDefaultDisplayName(tr("Build Android APK")); } -AndroidBuildApkStep::AndroidBuildApkStep(ProjectExplorer::BuildStepList *parent, - AndroidBuildApkStep *other) - : ProjectExplorer::AbstractProcessStep(parent, other), - m_signPackage(other->signPackage()), - m_verbose(other->m_verbose), - m_useMinistro(other->useMinistro()), - m_openPackageLocation(other->m_openPackageLocation), - // leave m_openPackageLocationForRun at false - m_buildTargetSdk(other->m_buildTargetSdk) -{ -} - bool AndroidBuildApkStep::init(QList<const BuildStep *> &earlierSteps) { ProjectExplorer::BuildConfiguration *bc = buildConfiguration(); diff --git a/src/plugins/android/androidbuildapkstep.h b/src/plugins/android/androidbuildapkstep.h index c5ef1a1e9f..022c4b8bc2 100644 --- a/src/plugins/android/androidbuildapkstep.h +++ b/src/plugins/android/androidbuildapkstep.h @@ -38,9 +38,11 @@ namespace Android { class ANDROID_EXPORT AndroidBuildApkStep : public ProjectExplorer::AbstractProcessStep { Q_OBJECT -public: - AndroidBuildApkStep(ProjectExplorer::BuildStepList *bc, const Core::Id id); +protected: + AndroidBuildApkStep(ProjectExplorer::BuildStepList *bc, Core::Id id); + +public: bool fromMap(const QVariantMap &map) override; QVariantMap toMap() const override; @@ -75,9 +77,6 @@ public: protected: Q_INVOKABLE void showInGraphicalShell(); - AndroidBuildApkStep(ProjectExplorer::BuildStepList *bc, - AndroidBuildApkStep *other); - bool init(QList<const BuildStep *> &earlierSteps) override; ProjectExplorer::BuildStepConfigWidget *createConfigWidget() override; bool immutable() const override { return true; } diff --git a/src/plugins/android/androiddeployconfiguration.cpp b/src/plugins/android/androiddeployconfiguration.cpp index 85d191524c..a323fc72aa 100644 --- a/src/plugins/android/androiddeployconfiguration.cpp +++ b/src/plugins/android/androiddeployconfiguration.cpp @@ -24,6 +24,7 @@ ****************************************************************************/ #include "androiddeployconfiguration.h" + #include "androidconstants.h" #include "androiddeployqtstep.h" #include "androidmanager.h" @@ -46,92 +47,40 @@ namespace Internal { // Qt 5.2 has a new form of deployment const char ANDROID_DEPLOYCONFIGURATION_ID[] = "Qt4ProjectManager.AndroidDeployConfiguration2"; -AndroidDeployConfiguration::AndroidDeployConfiguration(Target *parent, Core::Id id) - : DeployConfiguration(parent, id) -{ - setDisplayName(tr("Deploy to Android device")); - setDefaultDisplayName(displayName()); -} - -AndroidDeployConfiguration::AndroidDeployConfiguration(Target *parent, DeployConfiguration *source) - : DeployConfiguration(parent, source) -{ - cloneSteps(source); -} - -AndroidDeployConfigurationFactory::AndroidDeployConfigurationFactory(QObject *parent) - : DeployConfigurationFactory(parent) -{ - setObjectName(QLatin1String("AndroidDeployConfigurationFactory")); -} - -bool AndroidDeployConfigurationFactory::canCreate(Target *parent, Core::Id id) const -{ - return availableCreationIds(parent).contains(id); -} - -DeployConfiguration *AndroidDeployConfigurationFactory::create(Target *parent, Core::Id id) -{ - AndroidDeployConfiguration *dc = new AndroidDeployConfiguration(parent, id); - dc->stepList()->insertStep(0, new AndroidDeployQtStep(dc->stepList())); - return dc; -} - -bool AndroidDeployConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const -{ - return canCreate(parent, idFromMap(map)); -} - -DeployConfiguration *AndroidDeployConfigurationFactory::restore(Target *parent, const QVariantMap &map) -{ - if (!canRestore(parent, map)) - return 0; - - AndroidDeployConfiguration *dc = new AndroidDeployConfiguration(parent, idFromMap(map)); - if (dc->fromMap(map)) - return dc; +AndroidDeployConfiguration::AndroidDeployConfiguration(Target *parent) + : DeployConfiguration(parent, ANDROID_DEPLOYCONFIGURATION_ID) +{} - delete dc; - return 0; -} - -bool AndroidDeployConfigurationFactory::canClone(Target *parent, DeployConfiguration *source) const +void AndroidDeployConfiguration::initialize() { - if (!AndroidManager::supportsAndroid(parent)) - return false; - return canCreate(parent, source->id()); + stepList()->insertStep(0, new AndroidDeployQtStep(stepList())); } -DeployConfiguration *AndroidDeployConfigurationFactory::clone(Target *parent, DeployConfiguration *source) +AndroidDeployConfigurationFactory::AndroidDeployConfigurationFactory() { - if (!canClone(parent, source)) - return 0; - return new AndroidDeployConfiguration(parent, source); + setObjectName("AndroidDeployConfigurationFactory"); + registerDeployConfiguration<AndroidDeployConfiguration>(ANDROID_DEPLOYCONFIGURATION_ID); + setSupportedTargetDeviceTypes({Constants::ANDROID_DEVICE_TYPE}); + setDefaultDisplayName(AndroidDeployConfiguration::tr("Deploy to Android device")); } -QList<Core::Id> AndroidDeployConfigurationFactory::availableCreationIds(Target *parent) const +QList<QString> AndroidDeployConfigurationFactory::availableBuildTargets(Target *parent) const { - QList<Core::Id> ids; - if (!parent->project()->supportsKit(parent->kit())) - return ids; - ToolChain *tc = ToolChainKitInformation::toolChain(parent->kit(), ProjectExplorer::Constants::CXX_LANGUAGE_ID); if (!tc || tc->targetAbi().osFlavor() != Abi::AndroidLinuxFlavor) - return ids; + return {}; QtSupport::BaseQtVersion *qt = QtSupport::QtKitInformation::qtVersion(parent->kit()); - if (!qt || qt->type() != QLatin1String(Constants::ANDROIDQT)) - return ids; - ids << Core::Id(ANDROID_DEPLOYCONFIGURATION_ID); - return ids; + if (!qt || qt->type() != Constants::ANDROIDQT) + return {}; + return {QString()}; } -QString AndroidDeployConfigurationFactory::displayNameForId(Core::Id id) const +bool AndroidDeployConfigurationFactory::canHandle(Target *parent) const { - if (id == Core::Id(ANDROID_DEPLOYCONFIGURATION_ID)) - return tr("Deploy on Android"); - return QString(); + return DeployConfigurationFactory::canHandle(parent) + && AndroidManager::supportsAndroid(parent->kit()); } } // namespace Internal diff --git a/src/plugins/android/androiddeployconfiguration.h b/src/plugins/android/androiddeployconfiguration.h index 8ce9191e6d..fb1f5f5066 100644 --- a/src/plugins/android/androiddeployconfiguration.h +++ b/src/plugins/android/androiddeployconfiguration.h @@ -33,14 +33,10 @@ namespace Internal { class AndroidDeployConfiguration : public ProjectExplorer::DeployConfiguration { Q_OBJECT - friend class AndroidDeployConfigurationFactory; public: - AndroidDeployConfiguration(ProjectExplorer::Target *parent, Core::Id id); - -protected: - AndroidDeployConfiguration(ProjectExplorer::Target *parent, ProjectExplorer::DeployConfiguration *source); - + explicit AndroidDeployConfiguration(ProjectExplorer::Target *parent); + void initialize() override; }; class AndroidDeployConfigurationFactory : public ProjectExplorer::DeployConfigurationFactory @@ -48,18 +44,10 @@ class AndroidDeployConfigurationFactory : public ProjectExplorer::DeployConfigur Q_OBJECT public: - explicit AndroidDeployConfigurationFactory(QObject *parent = 0); - - bool canCreate(ProjectExplorer::Target *parent, Core::Id id) const override; - ProjectExplorer::DeployConfiguration *create(ProjectExplorer::Target *parent, Core::Id id) override; - bool canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const override; - ProjectExplorer::DeployConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map) override; - bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::DeployConfiguration *source) const override; - ProjectExplorer::DeployConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::DeployConfiguration *source) override; + AndroidDeployConfigurationFactory(); - QList<Core::Id> availableCreationIds(ProjectExplorer::Target *parent) const override; - // used to translate the ids to names to display to the user - QString displayNameForId(Core::Id id) const override; + bool canHandle(ProjectExplorer::Target *target) const override; + QList<QString> availableBuildTargets(ProjectExplorer::Target *parent) const override; }; } // namespace Internal diff --git a/src/plugins/android/androiddeployqtstep.cpp b/src/plugins/android/androiddeployqtstep.cpp index 4428eb7039..ca10a6d32c 100644 --- a/src/plugins/android/androiddeployqtstep.cpp +++ b/src/plugins/android/androiddeployqtstep.cpp @@ -68,56 +68,29 @@ const QLatin1String InstallFailedPermissionModelDowngrade("INSTALL_FAILED_PERMIS const QLatin1String InstallFailedVersionDowngrade("INSTALL_FAILED_VERSION_DOWNGRADE"); const Core::Id AndroidDeployQtStep::Id("Qt4ProjectManager.AndroidDeployQtStep"); -////////////////// -// AndroidDeployQtStepFactory -///////////////// - -AndroidDeployQtStepFactory::AndroidDeployQtStepFactory(QObject *parent) - : IBuildStepFactory(parent) -{ -} +// AndroidDeployQtStepFactory -QList<BuildStepInfo> AndroidDeployQtStepFactory::availableSteps(BuildStepList *parent) const +AndroidDeployQtStepFactory::AndroidDeployQtStepFactory() { - if (parent->id() != ProjectExplorer::Constants::BUILDSTEPS_DEPLOY - || !AndroidManager::supportsAndroid(parent->target()) - || parent->contains(AndroidDeployQtStep::Id)) - return {}; - - return {{AndroidDeployQtStep::Id, tr("Deploy to Android device or emulator")}}; + registerStep<AndroidDeployQtStep>(AndroidDeployQtStep::Id); + setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY); + setRepeatable(false); + setDisplayName(tr("Deploy to Android device or emulator")); } -ProjectExplorer::BuildStep *AndroidDeployQtStepFactory::create(ProjectExplorer::BuildStepList *parent, Core::Id id) +bool AndroidDeployQtStepFactory::canHandle(BuildStepList *parent) const { - Q_UNUSED(id); - return new AndroidDeployQtStep(parent); + return BuildStepFactory::canHandle(parent) + && AndroidManager::supportsAndroid(parent->target()); } -ProjectExplorer::BuildStep *AndroidDeployQtStepFactory::clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *product) -{ - return new AndroidDeployQtStep(parent, static_cast<AndroidDeployQtStep *>(product)); -} -////////////////// // AndroidDeployQtStep -///////////////// AndroidDeployQtStep::AndroidDeployQtStep(ProjectExplorer::BuildStepList *parent) : ProjectExplorer::BuildStep(parent, Id) { - ctor(); -} - -AndroidDeployQtStep::AndroidDeployQtStep(ProjectExplorer::BuildStepList *parent, - AndroidDeployQtStep *other) - : ProjectExplorer::BuildStep(parent, other) -{ - ctor(); -} - -void AndroidDeployQtStep::ctor() -{ m_uninstallPreviousPackage = QtSupport::QtKitInformation::qtVersion(target()->kit())->qtVersion() < QtSupport::QtVersionNumber(5, 4, 0); m_uninstallPreviousPackageRun = false; diff --git a/src/plugins/android/androiddeployqtstep.h b/src/plugins/android/androiddeployqtstep.h index 734fc80545..d71cead2bd 100644 --- a/src/plugins/android/androiddeployqtstep.h +++ b/src/plugins/android/androiddeployqtstep.h @@ -41,18 +41,12 @@ QT_END_NAMESPACE namespace Android { namespace Internal { -class AndroidDeployQtStepFactory : public ProjectExplorer::IBuildStepFactory +class AndroidDeployQtStepFactory : public ProjectExplorer::BuildStepFactory { Q_OBJECT public: - explicit AndroidDeployQtStepFactory(QObject *parent = 0); - - QList<ProjectExplorer::BuildStepInfo> - availableSteps(ProjectExplorer::BuildStepList *parent) const override; - - ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, Core::Id id) override; - ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, - ProjectExplorer::BuildStep *product) override; + AndroidDeployQtStepFactory(); + bool canHandle(ProjectExplorer::BuildStepList *bsl) const; }; class AndroidDeployQtStep : public ProjectExplorer::BuildStep @@ -95,8 +89,6 @@ signals: void setSerialNumber(const QString &serialNumber); private: - AndroidDeployQtStep(ProjectExplorer::BuildStepList *bc, AndroidDeployQtStep *other); - void ctor(); void runCommand(const QString &program, const QStringList &arguments); bool init(QList<const BuildStep *> &earlierSteps) override; diff --git a/src/plugins/android/androidrunconfiguration.cpp b/src/plugins/android/androidrunconfiguration.cpp index f6a1e858a4..e0b86db12f 100644 --- a/src/plugins/android/androidrunconfiguration.cpp +++ b/src/plugins/android/androidrunconfiguration.cpp @@ -45,8 +45,8 @@ const char amStartArgsKey[] = "Android.AmStartArgsKey"; const char preStartShellCmdsKey[] = "Android.PreStartShellCmdListKey"; const char postFinishShellCmdsKey[] = "Android.PostFinishShellCmdListKey"; -AndroidRunConfiguration::AndroidRunConfiguration(Target *target) - : RunConfiguration(target) +AndroidRunConfiguration::AndroidRunConfiguration(Target *target, Core::Id id) + : RunConfiguration(target, id) { } @@ -87,10 +87,12 @@ Utils::OutputFormatter *AndroidRunConfiguration::createOutputFormatter() const bool AndroidRunConfiguration::fromMap(const QVariantMap &map) { + if (!RunConfiguration::fromMap(map)) + return false; m_preStartShellCommands = map.value(preStartShellCmdsKey).toStringList(); m_postFinishShellCommands = map.value(postFinishShellCmdsKey).toStringList(); m_amStartExtraArgs = map.value(amStartArgsKey).toStringList(); - return RunConfiguration::fromMap(map); + return true; } QVariantMap AndroidRunConfiguration::toMap() const diff --git a/src/plugins/android/androidrunconfiguration.h b/src/plugins/android/androidrunconfiguration.h index 358871dc19..f012dc0805 100644 --- a/src/plugins/android/androidrunconfiguration.h +++ b/src/plugins/android/androidrunconfiguration.h @@ -35,7 +35,7 @@ class ANDROID_EXPORT AndroidRunConfiguration : public ProjectExplorer::RunConfig { Q_OBJECT public: - explicit AndroidRunConfiguration(ProjectExplorer::Target *target); + explicit AndroidRunConfiguration(ProjectExplorer::Target *target, Core::Id id); QWidget *createConfigurationWidget() override; Utils::OutputFormatter *createOutputFormatter() const override; diff --git a/src/plugins/autotest/testrunconfiguration.h b/src/plugins/autotest/testrunconfiguration.h index 34ba6b8363..4868ef7b5a 100644 --- a/src/plugins/autotest/testrunconfiguration.h +++ b/src/plugins/autotest/testrunconfiguration.h @@ -47,9 +47,8 @@ class TestRunConfiguration : public ProjectExplorer::RunConfiguration public: TestRunConfiguration(ProjectExplorer::Target *parent, TestConfiguration *config) - : ProjectExplorer::RunConfiguration(parent) + : ProjectExplorer::RunConfiguration(parent, "AutoTest.TestRunConfig") { - initialize("AutoTest.TestRunConfig"); setDefaultDisplayName(tr("AutoTest Debug")); bool enableQuick = false; diff --git a/src/plugins/autotoolsprojectmanager/autogenstep.cpp b/src/plugins/autotoolsprojectmanager/autogenstep.cpp index 6f62126e9b..0106a435b8 100644 --- a/src/plugins/autotoolsprojectmanager/autogenstep.cpp +++ b/src/plugins/autotoolsprojectmanager/autogenstep.cpp @@ -50,53 +50,21 @@ using namespace ProjectExplorer; const char AUTOGEN_ADDITIONAL_ARGUMENTS_KEY[] = "AutotoolsProjectManager.AutogenStep.AdditionalArguments"; const char AUTOGEN_STEP_ID[] = "AutotoolsProjectManager.AutogenStep"; -///////////////////////////// -// AutogenStepFactory class -///////////////////////////// -AutogenStepFactory::AutogenStepFactory(QObject *parent) : IBuildStepFactory(parent) -{ } -QList<BuildStepInfo> AutogenStepFactory::availableSteps(BuildStepList *parent) const -{ - if (parent->target()->project()->id() != Constants::AUTOTOOLS_PROJECT_ID - || parent->id() != ProjectExplorer::Constants::BUILDSTEPS_BUILD) - return {}; - - QString display = tr("Autogen", "Display name for AutotoolsProjectManager::AutogenStep id."); - return {{AUTOGEN_STEP_ID, display}}; -} +// AutogenStepFactory -BuildStep *AutogenStepFactory::create(BuildStepList *parent, Core::Id id) +AutogenStepFactory::AutogenStepFactory() { - Q_UNUSED(id) - return new AutogenStep(parent); + registerStep<AutogenStep>(AUTOGEN_STEP_ID); + setDisplayName(tr("Autogen", "Display name for AutotoolsProjectManager::AutogenStep id.")); + setSupportedProjectType(Constants::AUTOTOOLS_PROJECT_ID); + setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); } -BuildStep *AutogenStepFactory::clone(BuildStepList *parent, BuildStep *source) -{ - return new AutogenStep(parent, static_cast<AutogenStep *>(source)); -} -//////////////////////// -// AutogenStep class -//////////////////////// -AutogenStep::AutogenStep(BuildStepList *bsl) : AbstractProcessStep(bsl, Core::Id(AUTOGEN_STEP_ID)) -{ - ctor(); -} - -AutogenStep::AutogenStep(BuildStepList *bsl, Core::Id id) : AbstractProcessStep(bsl, id) -{ - ctor(); -} - -AutogenStep::AutogenStep(BuildStepList *bsl, AutogenStep *bs) : AbstractProcessStep(bsl, bs), - m_additionalArguments(bs->additionalArguments()) -{ - ctor(); -} +// AutogenStep -void AutogenStep::ctor() +AutogenStep::AutogenStep(BuildStepList *bsl) : AbstractProcessStep(bsl, AUTOGEN_STEP_ID) { setDefaultDisplayName(tr("Autogen")); } diff --git a/src/plugins/autotoolsprojectmanager/autogenstep.h b/src/plugins/autotoolsprojectmanager/autogenstep.h index 010a0cbbec..320c0bacaf 100644 --- a/src/plugins/autotoolsprojectmanager/autogenstep.h +++ b/src/plugins/autotoolsprojectmanager/autogenstep.h @@ -48,18 +48,12 @@ class AutogenStepConfigWidget; * * This factory is used to create instances of AutogenStep. */ -class AutogenStepFactory : public ProjectExplorer::IBuildStepFactory +class AutogenStepFactory : public ProjectExplorer::BuildStepFactory { Q_OBJECT public: - AutogenStepFactory(QObject *parent = 0); - - QList<ProjectExplorer::BuildStepInfo> - availableSteps(ProjectExplorer::BuildStepList *parent) const override; - - ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, Core::Id id) override; - ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source) override; + AutogenStepFactory(); }; /////////////////////// @@ -97,14 +91,8 @@ public: signals: void additionalArgumentsChanged(const QString &); -protected: - AutogenStep(ProjectExplorer::BuildStepList *bsl, AutogenStep *bs); - AutogenStep(ProjectExplorer::BuildStepList *bsl, Core::Id id); - - bool fromMap(const QVariantMap &map) override; - private: - void ctor(); + bool fromMap(const QVariantMap &map) override; QString m_additionalArguments; bool m_runAutogen = false; diff --git a/src/plugins/autotoolsprojectmanager/autoreconfstep.cpp b/src/plugins/autotoolsprojectmanager/autoreconfstep.cpp index 0277ca91c9..473e587d78 100644 --- a/src/plugins/autotoolsprojectmanager/autoreconfstep.cpp +++ b/src/plugins/autotoolsprojectmanager/autoreconfstep.cpp @@ -49,55 +49,21 @@ using namespace ProjectExplorer; const char AUTORECONF_STEP_ID[] = "AutotoolsProjectManager.AutoreconfStep"; const char AUTORECONF_ADDITIONAL_ARGUMENTS_KEY[] = "AutotoolsProjectManager.AutoreconfStep.AdditionalArguments"; -//////////////////////////////// -// AutoreconfStepFactory class -//////////////////////////////// -AutoreconfStepFactory::AutoreconfStepFactory(QObject *parent) : IBuildStepFactory(parent) -{ } - -QList<BuildStepInfo> AutoreconfStepFactory::availableSteps(BuildStepList *parent) const -{ - if (parent->target()->project()->id() != Constants::AUTOTOOLS_PROJECT_ID - || parent->id() != ProjectExplorer::Constants::BUILDSTEPS_BUILD) - return {}; - QString display = tr("Autoreconf", "Display name for AutotoolsProjectManager::AutoreconfStep id."); - return {{AUTORECONF_STEP_ID, display}}; -} +// AutoreconfStepFactory class -BuildStep *AutoreconfStepFactory::create(BuildStepList *parent, Core::Id id) +AutoreconfStepFactory::AutoreconfStepFactory() { - Q_UNUSED(id); - return new AutoreconfStep(parent); + registerStep<AutoreconfStep>(AUTORECONF_STEP_ID); + setDisplayName(tr("Autoreconf", "Display name for AutotoolsProjectManager::AutoreconfStep id.")); + setSupportedProjectType(Constants::AUTOTOOLS_PROJECT_ID); + setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); } -BuildStep *AutoreconfStepFactory::clone(BuildStepList *parent, BuildStep *source) -{ - return new AutoreconfStep(parent, static_cast<AutoreconfStep *>(source)); -} -///////////////////////// // AutoreconfStep class -///////////////////////// -AutoreconfStep::AutoreconfStep(BuildStepList *bsl) : - AbstractProcessStep(bsl, Core::Id(AUTORECONF_STEP_ID)) -{ - ctor(); -} - -AutoreconfStep::AutoreconfStep(BuildStepList *bsl, Core::Id id) : AbstractProcessStep(bsl, id) -{ - ctor(); -} - -AutoreconfStep::AutoreconfStep(BuildStepList *bsl, AutoreconfStep *bs) : - AbstractProcessStep(bsl, bs), - m_additionalArguments(bs->additionalArguments()) -{ - ctor(); -} -void AutoreconfStep::ctor() +AutoreconfStep::AutoreconfStep(BuildStepList *bsl) : AbstractProcessStep(bsl, AUTORECONF_STEP_ID) { setDefaultDisplayName(tr("Autoreconf")); } diff --git a/src/plugins/autotoolsprojectmanager/autoreconfstep.h b/src/plugins/autotoolsprojectmanager/autoreconfstep.h index ab6fb705ed..160f6fc5c1 100644 --- a/src/plugins/autotoolsprojectmanager/autoreconfstep.h +++ b/src/plugins/autotoolsprojectmanager/autoreconfstep.h @@ -47,18 +47,12 @@ class AutoreconfStep; * * The factory is used to create instances of AutoreconfStep. */ -class AutoreconfStepFactory : public ProjectExplorer::IBuildStepFactory +class AutoreconfStepFactory : public ProjectExplorer::BuildStepFactory { Q_OBJECT public: - AutoreconfStepFactory(QObject *parent = 0); - - QList<ProjectExplorer::BuildStepInfo> - availableSteps(ProjectExplorer::BuildStepList *parent) const override; - - ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, Core::Id id) override; - ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source) override; + AutoreconfStepFactory(); }; ///////////////////////// @@ -96,14 +90,8 @@ public: signals: void additionalArgumentsChanged(const QString &); -protected: - AutoreconfStep(ProjectExplorer::BuildStepList *bsl, AutoreconfStep *bs); - AutoreconfStep(ProjectExplorer::BuildStepList *bsl, Core::Id id); - - bool fromMap(const QVariantMap &map) override; - private: - void ctor(); + bool fromMap(const QVariantMap &map) override; QString m_additionalArguments; bool m_runAutoreconf = false; diff --git a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp index 82db5188d1..02d9b483dc 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp +++ b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp @@ -53,11 +53,11 @@ using namespace Internal; using namespace ProjectExplorer; using namespace ProjectExplorer::Constants; -////////////////////////////////////// -// AutotoolsBuildConfiguration class -////////////////////////////////////// -AutotoolsBuildConfiguration::AutotoolsBuildConfiguration(Target *parent) : - BuildConfiguration(parent, Core::Id(AUTOTOOLS_BC_ID)) + +// AutotoolsBuildConfiguration + +AutotoolsBuildConfiguration::AutotoolsBuildConfiguration(Target *parent) + : BuildConfiguration(parent, Constants::AUTOTOOLS_BC_ID) { // /<foobar> is used so the un-changed check in setBuildDirectory() works correctly. // The leading / is to avoid the relative the path expansion in BuildConfiguration::buildDirectory. @@ -69,82 +69,21 @@ AutotoolsBuildConfiguration::AutotoolsBuildConfiguration(Target *parent) : }); } -NamedWidget *AutotoolsBuildConfiguration::createConfigWidget() -{ - return new AutotoolsBuildSettingsWidget(this); -} - -AutotoolsBuildConfiguration::AutotoolsBuildConfiguration(Target *parent, Core::Id id) : - BuildConfiguration(parent, id) -{ } - -AutotoolsBuildConfiguration::AutotoolsBuildConfiguration(Target *parent, - AutotoolsBuildConfiguration *source) : - BuildConfiguration(parent, source) -{ - cloneSteps(source); -} - -////////////////////////////////////// -// AutotoolsBuildConfiguration class -////////////////////////////////////// -AutotoolsBuildConfigurationFactory::AutotoolsBuildConfigurationFactory(QObject *parent) : - IBuildConfigurationFactory(parent) -{ } - -int AutotoolsBuildConfigurationFactory::priority(const Target *parent) const -{ - return canHandle(parent) ? 0 : -1; -} - -QList<BuildInfo *> AutotoolsBuildConfigurationFactory::availableBuilds(const Target *parent) const -{ - QList<BuildInfo *> result; - result << createBuildInfo(parent->kit(), parent->project()->projectDirectory()); - return result; -} - -int AutotoolsBuildConfigurationFactory::priority(const Kit *k, const QString &projectPath) const -{ - if (k && Utils::mimeTypeForFile(projectPath).matchesName(QLatin1String(Constants::MAKEFILE_MIMETYPE))) - return 0; - return -1; -} - -QList<BuildInfo *> AutotoolsBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const -{ - QList<BuildInfo *> result; - BuildInfo *info = createBuildInfo(k, - Utils::FileName::fromString(AutotoolsProject::defaultBuildDirectory(projectPath))); - //: The name of the build configuration created by default for a autotools project. - info->displayName = tr("Default"); - result << info; - return result; -} - -BuildConfiguration *AutotoolsBuildConfigurationFactory::create(Target *parent, const BuildInfo *info) const +void AutotoolsBuildConfiguration::initialize(const BuildInfo *info) { - QTC_ASSERT(parent, return 0); - QTC_ASSERT(info->factory() == this, return 0); - QTC_ASSERT(info->kitId == parent->kit()->id(), return 0); - QTC_ASSERT(!info->displayName.isEmpty(), return 0); - - AutotoolsBuildConfiguration *bc = new AutotoolsBuildConfiguration(parent); - bc->setDisplayName(info->displayName); - bc->setDefaultDisplayName(info->displayName); - bc->setBuildDirectory(info->buildDirectory); + BuildConfiguration::initialize(info); - BuildStepList *buildSteps = bc->stepList(Core::Id(BUILDSTEPS_BUILD)); + BuildStepList *buildSteps = stepList(BUILDSTEPS_BUILD); // ### Build Steps Build ### // autogen.sh or autoreconf - QFile autogenFile(parent->project()->projectDirectory().toString() + QLatin1String("/autogen.sh")); + QFile autogenFile(target()->project()->projectDirectory().toString() + "/autogen.sh"); if (autogenFile.exists()) { AutogenStep *autogenStep = new AutogenStep(buildSteps); buildSteps->insertStep(0, autogenStep); } else { AutoreconfStep *autoreconfStep = new AutoreconfStep(buildSteps); - autoreconfStep->setAdditionalArguments(QLatin1String("--force --install")); + autoreconfStep->setAdditionalArguments("--force --install"); buildSteps->insertStep(0, autoreconfStep); } @@ -158,67 +97,53 @@ BuildConfiguration *AutotoolsBuildConfigurationFactory::create(Target *parent, c makeStep->setBuildTarget(QLatin1String("all"), /*on =*/ true); // ### Build Steps Clean ### - BuildStepList *cleanSteps = bc->stepList(Core::Id(BUILDSTEPS_CLEAN)); + BuildStepList *cleanSteps = stepList(BUILDSTEPS_CLEAN); MakeStep *cleanMakeStep = new MakeStep(cleanSteps); - cleanMakeStep->setAdditionalArguments(QLatin1String("clean")); + cleanMakeStep->setAdditionalArguments("clean"); cleanMakeStep->setClean(true); cleanSteps->insertStep(0, cleanMakeStep); - - return bc; } -bool AutotoolsBuildConfigurationFactory::canHandle(const Target *t) const +NamedWidget *AutotoolsBuildConfiguration::createConfigWidget() { - QTC_ASSERT(t, return false); - - if (!t->project()->supportsKit(t->kit())) - return false; - return t->project()->id() == Constants::AUTOTOOLS_PROJECT_ID; + return new AutotoolsBuildSettingsWidget(this); } -BuildInfo *AutotoolsBuildConfigurationFactory::createBuildInfo(const Kit *k, - const Utils::FileName &buildDir) const -{ - BuildInfo *info = new BuildInfo(this); - info->typeName = tr("Build"); - info->buildDirectory = buildDir; - info->kitId = k->id(); - return info; -} +// AutotoolsBuildConfiguration class -bool AutotoolsBuildConfigurationFactory::canClone(const Target *parent, BuildConfiguration *source) const +AutotoolsBuildConfigurationFactory::AutotoolsBuildConfigurationFactory() { - if (!canHandle(parent)) - return false; - return source->id() == AUTOTOOLS_BC_ID; + registerBuildConfiguration<AutotoolsBuildConfiguration>(AUTOTOOLS_BC_ID); + setSupportedProjectType(Constants::AUTOTOOLS_PROJECT_ID); + setSupportedProjectMimeTypeName(Constants::MAKEFILE_MIMETYPE); } -AutotoolsBuildConfiguration *AutotoolsBuildConfigurationFactory::clone(Target *parent, BuildConfiguration *source) +QList<BuildInfo *> AutotoolsBuildConfigurationFactory::availableBuilds(const Target *parent) const { - if (!canClone(parent, source)) - return 0; - - AutotoolsBuildConfiguration *origin = static_cast<AutotoolsBuildConfiguration *>(source); - return new AutotoolsBuildConfiguration(parent, origin); + return {createBuildInfo(parent->kit(), parent->project()->projectDirectory())}; } -bool AutotoolsBuildConfigurationFactory::canRestore(const Target *parent, const QVariantMap &map) const +QList<BuildInfo *> AutotoolsBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const { - if (!canHandle(parent)) - return false; - return idFromMap(map) == AUTOTOOLS_BC_ID; + QList<BuildInfo *> result; + BuildInfo *info = createBuildInfo(k, + Utils::FileName::fromString(AutotoolsProject::defaultBuildDirectory(projectPath))); + //: The name of the build configuration created by default for a autotools project. + info->displayName = tr("Default"); + result << info; + return result; } -AutotoolsBuildConfiguration *AutotoolsBuildConfigurationFactory::restore(Target *parent, const QVariantMap &map) +BuildInfo *AutotoolsBuildConfigurationFactory::createBuildInfo(const Kit *k, + const Utils::FileName &buildDir) const { - if (!canRestore(parent, map)) - return 0; - AutotoolsBuildConfiguration *bc = new AutotoolsBuildConfiguration(parent); - if (bc->fromMap(map)) - return bc; - delete bc; - return 0; + BuildInfo *info = new BuildInfo(this); + info->typeName = tr("Build"); + info->buildDirectory = buildDir; + info->kitId = k->id(); + + return info; } BuildConfiguration::BuildType AutotoolsBuildConfiguration::buildType() const diff --git a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h index 3d7f170f5b..f2bafd3624 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h +++ b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h @@ -34,24 +34,16 @@ namespace Utils { class FileName; } namespace AutotoolsProjectManager { namespace Internal { -class AutotoolsTarget; -class AutotoolsBuildConfigurationFactory; - class AutotoolsBuildConfiguration : public ProjectExplorer::BuildConfiguration { Q_OBJECT - friend class AutotoolsBuildConfigurationFactory; -public: + friend class ProjectExplorer::IBuildConfigurationFactory; explicit AutotoolsBuildConfiguration(ProjectExplorer::Target *parent); + void initialize(const ProjectExplorer::BuildInfo *info) override; ProjectExplorer::NamedWidget *createConfigWidget() override; - BuildType buildType() const override; - -protected: - AutotoolsBuildConfiguration(ProjectExplorer::Target *parent, Core::Id id); - AutotoolsBuildConfiguration(ProjectExplorer::Target *parent, AutotoolsBuildConfiguration *source); }; class AutotoolsBuildConfigurationFactory : public ProjectExplorer::IBuildConfigurationFactory @@ -59,23 +51,13 @@ class AutotoolsBuildConfigurationFactory : public ProjectExplorer::IBuildConfigu Q_OBJECT public: - explicit AutotoolsBuildConfigurationFactory(QObject *parent = 0); + AutotoolsBuildConfigurationFactory(); - int priority(const ProjectExplorer::Target *parent) const override; +private: QList<ProjectExplorer::BuildInfo *> availableBuilds(const ProjectExplorer::Target *parent) const override; - int priority(const ProjectExplorer::Kit *k, const QString &projectPath) const override; QList<ProjectExplorer::BuildInfo *> availableSetups(const ProjectExplorer::Kit *k, const QString &projectPath) const override; - ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, - const ProjectExplorer::BuildInfo *info) const override; - - bool canClone(const ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const override; - AutotoolsBuildConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) override; - bool canRestore(const ProjectExplorer::Target *parent, const QVariantMap &map) const override; - AutotoolsBuildConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map) override; -private: - bool canHandle(const ProjectExplorer::Target *t) const; ProjectExplorer::BuildInfo *createBuildInfo(const ProjectExplorer::Kit *k, const Utils::FileName &buildDir) const; }; diff --git a/src/plugins/autotoolsprojectmanager/configurestep.cpp b/src/plugins/autotoolsprojectmanager/configurestep.cpp index 8fdb2c6728..7d370e2ded 100644 --- a/src/plugins/autotoolsprojectmanager/configurestep.cpp +++ b/src/plugins/autotoolsprojectmanager/configurestep.cpp @@ -64,55 +64,21 @@ static QString projectDirRelativeToBuildDir(BuildConfiguration *bc) { return projDirToBuildDir; } -//////////////////////////////// -// ConfigureStepFactory Class -//////////////////////////////// -ConfigureStepFactory::ConfigureStepFactory(QObject *parent) : IBuildStepFactory(parent) -{ } -QList<BuildStepInfo> ConfigureStepFactory::availableSteps(BuildStepList *parent) const -{ - if (parent->target()->project()->id() != Constants::AUTOTOOLS_PROJECT_ID - || parent->id() != ProjectExplorer::Constants::BUILDSTEPS_BUILD) - return {}; - - QString display = tr("Configure", "Display name for AutotoolsProjectManager::ConfigureStep id."); - return {{CONFIGURE_STEP_ID, display}}; -} - -BuildStep *ConfigureStepFactory::create(BuildStepList *parent, Core::Id id) -{ - Q_UNUSED(id) - return new ConfigureStep(parent); -} - -BuildStep *ConfigureStepFactory::clone(BuildStepList *parent, BuildStep *source) -{ - return new ConfigureStep(parent, static_cast<ConfigureStep *>(source)); -} +// ConfigureStepFactory - -//////////////////////// -// ConfigureStep class -//////////////////////// -ConfigureStep::ConfigureStep(BuildStepList* bsl) : - AbstractProcessStep(bsl, Core::Id(CONFIGURE_STEP_ID)) +ConfigureStepFactory::ConfigureStepFactory() { - ctor(); + registerStep<ConfigureStep>(CONFIGURE_STEP_ID); + setDisplayName(tr("Configure", "Display name for AutotoolsProjectManager::ConfigureStep id.")); + setSupportedProjectType(Constants::AUTOTOOLS_PROJECT_ID); + setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); } -ConfigureStep::ConfigureStep(BuildStepList *bsl, Core::Id id) : AbstractProcessStep(bsl, id) -{ - ctor(); -} -ConfigureStep::ConfigureStep(BuildStepList *bsl, ConfigureStep *bs) : AbstractProcessStep(bsl, bs), - m_additionalArguments(bs->additionalArguments()) -{ - ctor(); -} +// ConfigureStep -void ConfigureStep::ctor() +ConfigureStep::ConfigureStep(BuildStepList *bsl) : AbstractProcessStep(bsl, CONFIGURE_STEP_ID) { setDefaultDisplayName(tr("Configure")); } diff --git a/src/plugins/autotoolsprojectmanager/configurestep.h b/src/plugins/autotoolsprojectmanager/configurestep.h index a809e0a63e..2f5ce3e65e 100644 --- a/src/plugins/autotoolsprojectmanager/configurestep.h +++ b/src/plugins/autotoolsprojectmanager/configurestep.h @@ -47,18 +47,12 @@ class ConfigureStepConfigWidget; * * The factory is used to create instances of ConfigureStep. */ -class ConfigureStepFactory : public ProjectExplorer::IBuildStepFactory +class ConfigureStepFactory : public ProjectExplorer::BuildStepFactory { Q_OBJECT public: - ConfigureStepFactory(QObject *parent = 0); - - QList<ProjectExplorer::BuildStepInfo> - availableSteps(ProjectExplorer::BuildStepList *parent) const override; - - ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, Core::Id id) override; - ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source) override; + ConfigureStepFactory(); }; ////////////////////////// @@ -97,14 +91,8 @@ signals: void additionalArgumentsChanged(const QString &); void buildDirectoryChanged(); -protected: - ConfigureStep(ProjectExplorer::BuildStepList *bsl, ConfigureStep *bs); - ConfigureStep(ProjectExplorer::BuildStepList *bsl, Core::Id id); - - bool fromMap(const QVariantMap &map) override; - private: - void ctor(); + bool fromMap(const QVariantMap &map) override; QString m_additionalArguments; bool m_runConfigure = false; diff --git a/src/plugins/autotoolsprojectmanager/makestep.cpp b/src/plugins/autotoolsprojectmanager/makestep.cpp index 3fb0ec4105..596c2a025b 100644 --- a/src/plugins/autotoolsprojectmanager/makestep.cpp +++ b/src/plugins/autotoolsprojectmanager/makestep.cpp @@ -56,53 +56,23 @@ const char CLEAN_KEY[] = "AutotoolsProjectManager.MakeStep.Clean"; const char BUILD_TARGETS_KEY[] = "AutotoolsProjectManager.MakeStep.BuildTargets"; const char MAKE_STEP_ADDITIONAL_ARGUMENTS_KEY[] = "AutotoolsProjectManager.MakeStep.AdditionalArguments"; -////////////////////////// -// MakeStepFactory class -////////////////////////// -MakeStepFactory::MakeStepFactory(QObject *parent) : IBuildStepFactory(parent) -{ setObjectName("Autotools::MakeStepFactory"); } -QList<BuildStepInfo> MakeStepFactory::availableSteps(BuildStepList *parent) const -{ - if (parent->target()->project()->id() != AUTOTOOLS_PROJECT_ID) - return {}; - - return {{MAKE_STEP_ID, tr("Make", "Display name for AutotoolsProjectManager::MakeStep id.")}}; -} - -BuildStep *MakeStepFactory::create(BuildStepList *parent, Core::Id id) -{ - Q_UNUSED(id) - return new MakeStep(parent); -} - -BuildStep *MakeStepFactory::clone(BuildStepList *parent, BuildStep *source) -{ - return new MakeStep(parent, static_cast<MakeStep *>(source)); -} +// MakeStepFactory -///////////////////// -// MakeStep class -///////////////////// -MakeStep::MakeStep(BuildStepList* bsl) : AbstractProcessStep(bsl, Core::Id(MAKE_STEP_ID)) +MakeStepFactory::MakeStepFactory() { - ctor(); + setObjectName("Autotools::MakeStepFactory"); + registerStep<MakeStep>(MAKE_STEP_ID); + setDisplayName(tr("Make", "Display name for AutotoolsProjectManager::MakeStep id.")); + setSupportedProjectType(AUTOTOOLS_PROJECT_ID); + setSupportedStepLists({ProjectExplorer::Constants::BUILDSTEPS_BUILD, + ProjectExplorer::Constants::BUILDSTEPS_CLEAN, + ProjectExplorer::Constants::BUILDSTEPS_DEPLOY}); } -MakeStep::MakeStep(BuildStepList *bsl, Core::Id id) : AbstractProcessStep(bsl, id) -{ - ctor(); -} - -MakeStep::MakeStep(BuildStepList *bsl, MakeStep *bs) : AbstractProcessStep(bsl, bs), - m_buildTargets(bs->m_buildTargets), - m_additionalArguments(bs->additionalArguments()), - m_clean(bs->m_clean) -{ - ctor(); -} +// MakeStep -void MakeStep::ctor() +MakeStep::MakeStep(BuildStepList *bsl) : AbstractProcessStep(bsl, MAKE_STEP_ID) { setDefaultDisplayName(tr("Make")); } diff --git a/src/plugins/autotoolsprojectmanager/makestep.h b/src/plugins/autotoolsprojectmanager/makestep.h index fdbbdfd4ce..1ded149366 100644 --- a/src/plugins/autotoolsprojectmanager/makestep.h +++ b/src/plugins/autotoolsprojectmanager/makestep.h @@ -48,18 +48,12 @@ class MakeStep; * * The factory is used to create instances of MakeStep. */ -class MakeStepFactory : public ProjectExplorer::IBuildStepFactory +class MakeStepFactory : public ProjectExplorer::BuildStepFactory { Q_OBJECT public: - MakeStepFactory(QObject *parent = 0); - - QList<ProjectExplorer::BuildStepInfo> - availableSteps(ProjectExplorer::BuildStepList *parent) const override; - - ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, Core::Id id) override; - ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source) override; + MakeStepFactory(); }; ///////////////////// @@ -98,14 +92,8 @@ public: signals: void additionalArgumentsChanged(const QString &); -protected: - MakeStep(ProjectExplorer::BuildStepList *bsl, MakeStep *bs); - MakeStep(ProjectExplorer::BuildStepList *bsl, Core::Id id); - - bool fromMap(const QVariantMap &map) override; - private: - void ctor(); + bool fromMap(const QVariantMap &map) override; QStringList m_buildTargets; QString m_additionalArguments; diff --git a/src/plugins/baremetal/baremetalcustomrunconfiguration.cpp b/src/plugins/baremetal/baremetalcustomrunconfiguration.cpp index 1121b52f04..f61e3d0df4 100644 --- a/src/plugins/baremetal/baremetalcustomrunconfiguration.cpp +++ b/src/plugins/baremetal/baremetalcustomrunconfiguration.cpp @@ -117,11 +117,6 @@ BareMetalCustomRunConfiguration::BareMetalCustomRunConfiguration(ProjectExplorer { } -void BareMetalCustomRunConfiguration::initialize(Core::Id) -{ - BareMetalRunConfiguration::initialize(runConfigId()); -} - bool BareMetalCustomRunConfiguration::isConfigured() const { return !m_localExecutable.isEmpty(); diff --git a/src/plugins/baremetal/baremetalcustomrunconfiguration.h b/src/plugins/baremetal/baremetalcustomrunconfiguration.h index ea2d3b337f..94687ba876 100644 --- a/src/plugins/baremetal/baremetalcustomrunconfiguration.h +++ b/src/plugins/baremetal/baremetalcustomrunconfiguration.h @@ -38,8 +38,6 @@ class BareMetalCustomRunConfiguration : public BareMetalRunConfiguration public: explicit BareMetalCustomRunConfiguration(ProjectExplorer::Target *parent); - void initialize(Core::Id) override; - bool isConfigured() const override; ConfigurationState ensureConfigured(QString *errorMessage) override; QWidget *createConfigurationWidget() override; diff --git a/src/plugins/baremetal/baremetalgdbcommandsdeploystep.cpp b/src/plugins/baremetal/baremetalgdbcommandsdeploystep.cpp index d02ed5a212..8affd8d659 100644 --- a/src/plugins/baremetal/baremetalgdbcommandsdeploystep.cpp +++ b/src/plugins/baremetal/baremetalgdbcommandsdeploystep.cpp @@ -62,21 +62,8 @@ QString BareMetalGdbCommandsDeployStepWidget::summaryText() const return displayName(); } -BareMetalGdbCommandsDeployStep::BareMetalGdbCommandsDeployStep(BuildStepList *bsl, - const Core::Id id) - : BuildStep(bsl, id) -{ - ctor(); -} - -BareMetalGdbCommandsDeployStep::BareMetalGdbCommandsDeployStep(BuildStepList *bsl, - BareMetalGdbCommandsDeployStep *other) - : BuildStep(bsl, other) -{ - ctor(); -} - -void BareMetalGdbCommandsDeployStep::ctor() +BareMetalGdbCommandsDeployStep::BareMetalGdbCommandsDeployStep(BuildStepList *bsl) + : BuildStep(bsl, stepId()) { setDefaultDisplayName(displayName()); } diff --git a/src/plugins/baremetal/baremetalgdbcommandsdeploystep.h b/src/plugins/baremetal/baremetalgdbcommandsdeploystep.h index 0278dbc0ac..83a2191369 100644 --- a/src/plugins/baremetal/baremetalgdbcommandsdeploystep.h +++ b/src/plugins/baremetal/baremetalgdbcommandsdeploystep.h @@ -38,9 +38,7 @@ class BareMetalGdbCommandsDeployStep : public ProjectExplorer::BuildStep Q_OBJECT public: - BareMetalGdbCommandsDeployStep(ProjectExplorer::BuildStepList *bsl, Core::Id id); - BareMetalGdbCommandsDeployStep(ProjectExplorer::BuildStepList *bsl, - BareMetalGdbCommandsDeployStep *other); + explicit BareMetalGdbCommandsDeployStep(ProjectExplorer::BuildStepList *bsl); bool init(QList<const BuildStep *> &earlierSteps) override; void run(QFutureInterface<bool> &fi) override; @@ -58,7 +56,6 @@ public: QString gdbCommands() const; private: - void ctor(); QString m_gdbCommands; }; diff --git a/src/plugins/baremetal/baremetalrunconfiguration.cpp b/src/plugins/baremetal/baremetalrunconfiguration.cpp index b18f1528d7..bbdbe4e680 100644 --- a/src/plugins/baremetal/baremetalrunconfiguration.cpp +++ b/src/plugins/baremetal/baremetalrunconfiguration.cpp @@ -45,19 +45,8 @@ namespace Internal { const char ProFileKey[] = "Qt4ProjectManager.MaemoRunConfiguration.ProFile"; const char WorkingDirectoryKey[] = "BareMetal.RunConfig.WorkingDirectory"; -static QString pathFromId(Core::Id id) -{ - if (id == BareMetalCustomRunConfiguration::runConfigId()) - return QString(); - - QByteArray idStr = id.name(); - if (!idStr.startsWith(BareMetalRunConfiguration::IdPrefix)) - return QString(); - return QString::fromUtf8(idStr.mid(int(strlen(BareMetalRunConfiguration::IdPrefix)))); -} - BareMetalRunConfiguration::BareMetalRunConfiguration(Target *target) - : RunConfiguration(target) + : RunConfiguration(target, IdPrefix) { addExtraAspect(new ArgumentsAspect(this, "Qt4ProjectManager.MaemoRunConfiguration.Arguments")); connect(target, &Target::deploymentDataChanged, @@ -68,17 +57,9 @@ BareMetalRunConfiguration::BareMetalRunConfiguration(Target *target) this, &BareMetalRunConfiguration::handleBuildSystemDataUpdated); // Handles device changes, etc. } -void BareMetalRunConfiguration::initialize(const Core::Id id) -{ - RunConfiguration::initialize(id); - m_projectFilePath = pathFromId(id); - - setDefaultDisplayName(defaultDisplayName()); -} - -QString BareMetalRunConfiguration::targetNameFromId(Core::Id id) +QString BareMetalRunConfiguration::extraId() const { - return QFileInfo(pathFromId(id)).fileName(); + return m_projectFilePath; } QWidget *BareMetalRunConfiguration::createConfigurationWidget() @@ -110,8 +91,11 @@ bool BareMetalRunConfiguration::fromMap(const QVariantMap &map) = QDir::cleanPath(dir.filePath(map.value(QLatin1String(ProFileKey)).toString())); m_workingDirectory = map.value(QLatin1String(WorkingDirectoryKey)).toString(); - setDefaultDisplayName(defaultDisplayName()); + // Hack for old-style mangled ids. FIXME: Remove. + if (m_projectFilePath.isEmpty()) + m_projectFilePath = ProjectExplorer::idFromMap(map).suffixAfter(id()); + setDefaultDisplayName(defaultDisplayName()); return true; } diff --git a/src/plugins/baremetal/baremetalrunconfiguration.h b/src/plugins/baremetal/baremetalrunconfiguration.h index 647fa40c3e..62ffaf5d34 100644 --- a/src/plugins/baremetal/baremetalrunconfiguration.h +++ b/src/plugins/baremetal/baremetalrunconfiguration.h @@ -57,7 +57,6 @@ public: QString buildSystemTarget() const final; - static QString targetNameFromId(Core::Id id); static const char *IdPrefix; signals: @@ -66,8 +65,9 @@ signals: protected: bool fromMap(const QVariantMap &map) override; + QString extraId() const final; + QString defaultDisplayName(); - void initialize(Core::Id id) override; private: void handleBuildSystemDataUpdated(); diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index fb7f0d658f..b239171fb5 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -51,9 +51,6 @@ #include <utils/qtcassert.h> #include <utils/qtcprocess.h> -#include <QHash> -#include <QInputDialog> - using namespace ProjectExplorer; using namespace Utils; @@ -63,10 +60,33 @@ namespace Internal { const char INITIAL_ARGUMENTS[] = "CMakeProjectManager.CMakeBuildConfiguration.InitialArgument"; // Obsolete since QtC 3.7 const char CONFIGURATION_KEY[] = "CMake.Configuration"; -CMakeBuildConfiguration::CMakeBuildConfiguration(ProjectExplorer::Target *parent) : - BuildConfiguration(parent, Core::Id(Constants::CMAKE_BC_ID)) +CMakeBuildConfiguration::CMakeBuildConfiguration(Target *parent) + : BuildConfiguration(parent, Constants::CMAKE_BC_ID) { - ctor(); + CMakeProject *project = static_cast<CMakeProject *>(target()->project()); + setBuildDirectory(shadowBuildDirectory(project->projectFilePath(), + target()->kit(), + displayName(), BuildConfiguration::Unknown)); + connect(project, &Project::parsingFinished, this, &BuildConfiguration::enabledChanged); +} + +void CMakeBuildConfiguration::initialize(const BuildInfo *info) +{ + BuildConfiguration::initialize(info); + + BuildStepList *buildSteps = stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); + buildSteps->appendStep(new CMakeBuildStep(buildSteps)); + + BuildStepList *cleanSteps = stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN); + cleanSteps->appendStep(new CMakeBuildStep(cleanSteps)); + + if (info->buildDirectory.isEmpty()) { + CMakeProject *project = static_cast<CMakeProject *>(target()->project()); + setBuildDirectory(CMakeBuildConfiguration::shadowBuildDirectory(project->projectFilePath(), + target()->kit(), + info->displayName, info->buildType)); + } + setConfigurationForCMake(static_cast<const CMakeBuildInfo *>(info)->configuration); } bool CMakeBuildConfiguration::isEnabled() const @@ -79,15 +99,6 @@ QString CMakeBuildConfiguration::disabledReason() const return error(); } -CMakeBuildConfiguration::CMakeBuildConfiguration(ProjectExplorer::Target *parent, - CMakeBuildConfiguration *source) : - BuildConfiguration(parent, source), - m_configurationForCMake(source->m_configurationForCMake) -{ - ctor(); - cloneSteps(source); -} - QVariantMap CMakeBuildConfiguration::toMap() const { QVariantMap map(ProjectExplorer::BuildConfiguration::toMap()); @@ -128,15 +139,6 @@ bool CMakeBuildConfiguration::fromMap(const QVariantMap &map) return true; } -void CMakeBuildConfiguration::ctor() -{ - auto p = static_cast<CMakeProject *>(project()); - setBuildDirectory(shadowBuildDirectory(p->projectFilePath(), - target()->kit(), - displayName(), BuildConfiguration::Unknown)); - connect(p, &Project::parsingFinished, this, &BuildConfiguration::enabledChanged); -} - bool CMakeBuildConfiguration::isParsing() const { return project()->isParsing() && isActive(); @@ -331,9 +333,12 @@ ProjectExplorer::NamedWidget *CMakeBuildConfiguration::createConfigWidget() \class CMakeBuildConfigurationFactory */ -CMakeBuildConfigurationFactory::CMakeBuildConfigurationFactory(QObject *parent) : - ProjectExplorer::IBuildConfigurationFactory(parent) -{ } +CMakeBuildConfigurationFactory::CMakeBuildConfigurationFactory() +{ + registerBuildConfiguration<CMakeBuildConfiguration>(Constants::CMAKE_BC_ID); + setSupportedProjectType(CMakeProjectManager::Constants::CMAKEPROJECT_ID); + setSupportedProjectMimeTypeName(Constants::CMAKEPROJECTMIMETYPE); +} CMakeBuildConfigurationFactory::BuildType CMakeBuildConfigurationFactory::buildTypeFromByteArray(const QByteArray &in) { @@ -362,11 +367,6 @@ BuildConfiguration::BuildType CMakeBuildConfigurationFactory::cmakeBuildTypeToBu return BuildConfiguration::Unknown; } -int CMakeBuildConfigurationFactory::priority(const ProjectExplorer::Target *parent) const -{ - return canHandle(parent) ? 0 : -1; -} - QList<ProjectExplorer::BuildInfo *> CMakeBuildConfigurationFactory::availableBuilds(const ProjectExplorer::Target *parent) const { QList<ProjectExplorer::BuildInfo *> result; @@ -380,13 +380,6 @@ QList<ProjectExplorer::BuildInfo *> CMakeBuildConfigurationFactory::availableBui return result; } -int CMakeBuildConfigurationFactory::priority(const ProjectExplorer::Kit *k, const QString &projectPath) const -{ - if (k && Utils::mimeTypeForFile(projectPath).matchesName(Constants::CMAKEPROJECTMIMETYPE)) - return 0; - return -1; -} - QList<ProjectExplorer::BuildInfo *> CMakeBuildConfigurationFactory::availableSetups(const ProjectExplorer::Kit *k, const QString &projectPath) const { @@ -410,82 +403,6 @@ QList<ProjectExplorer::BuildInfo *> CMakeBuildConfigurationFactory::availableSet return result; } -ProjectExplorer::BuildConfiguration *CMakeBuildConfigurationFactory::create(ProjectExplorer::Target *parent, - const ProjectExplorer::BuildInfo *info) const -{ - QTC_ASSERT(info->factory() == this, return nullptr); - QTC_ASSERT(info->kitId == parent->kit()->id(), return nullptr); - QTC_ASSERT(!info->displayName.isEmpty(), return nullptr); - - CMakeBuildInfo copy(*static_cast<const CMakeBuildInfo *>(info)); - CMakeProject *project = static_cast<CMakeProject *>(parent->project()); - - if (copy.buildDirectory.isEmpty()) { - copy.buildDirectory - = CMakeBuildConfiguration::shadowBuildDirectory(project->projectFilePath(), - parent->kit(), - copy.displayName, info->buildType); - } - - auto bc = new CMakeBuildConfiguration(parent); - bc->setDisplayName(copy.displayName); - bc->setDefaultDisplayName(copy.displayName); - - ProjectExplorer::BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); - ProjectExplorer::BuildStepList *cleanSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN); - - auto buildStep = new CMakeBuildStep(buildSteps); - buildSteps->insertStep(0, buildStep); - - auto cleanStep = new CMakeBuildStep(cleanSteps); - cleanSteps->insertStep(0, cleanStep); - - bc->setBuildDirectory(copy.buildDirectory); - bc->setConfigurationForCMake(copy.configuration); - - return bc; -} - -bool CMakeBuildConfigurationFactory::canClone(const ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const -{ - if (!canHandle(parent)) - return false; - return source->id() == Constants::CMAKE_BC_ID; -} - -CMakeBuildConfiguration *CMakeBuildConfigurationFactory::clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) -{ - if (!canClone(parent, source)) - return nullptr; - auto old = static_cast<CMakeBuildConfiguration *>(source); - return new CMakeBuildConfiguration(parent, old); -} - -bool CMakeBuildConfigurationFactory::canRestore(const ProjectExplorer::Target *parent, const QVariantMap &map) const -{ - if (!canHandle(parent)) - return false; - return ProjectExplorer::idFromMap(map) == Constants::CMAKE_BC_ID; -} - -CMakeBuildConfiguration *CMakeBuildConfigurationFactory::restore(ProjectExplorer::Target *parent, const QVariantMap &map) -{ - if (!canRestore(parent, map)) - return nullptr; - auto bc = std::make_unique<CMakeBuildConfiguration>(parent); - if (bc->fromMap(map)) - return bc.release(); - return nullptr; -} - -bool CMakeBuildConfigurationFactory::canHandle(const ProjectExplorer::Target *t) const -{ - QTC_ASSERT(t, return false); - if (!t->project()->supportsKit(t->kit())) - return false; - return qobject_cast<CMakeProject *>(t->project()); -} - CMakeBuildInfo *CMakeBuildConfigurationFactory::createBuildInfo(const ProjectExplorer::Kit *k, const QString &sourceDir, BuildType buildType) const diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h index be257a21fb..5a381d0f47 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h @@ -32,11 +32,6 @@ #include <cpptools/cpprawprojectpart.h> #include <projectexplorer/buildconfiguration.h> -#include <projectexplorer/abi.h> - -#include <memory> - -namespace ProjectExplorer { class ToolChain; } namespace CMakeProjectManager { class CMakeBuildInfo; @@ -45,27 +40,19 @@ class CMakeProject; namespace Internal { class BuildDirManager; -class CMakeBuildConfigurationFactory; class CMakeBuildSettingsWidget; -class CMakeProjectNode; class CMakeBuildConfiguration : public ProjectExplorer::BuildConfiguration { Q_OBJECT + friend class ProjectExplorer::IBuildConfigurationFactory; + explicit CMakeBuildConfiguration(ProjectExplorer::Target *parent); + public: - CMakeBuildConfiguration(ProjectExplorer::Target *parent); + void emitBuildTypeChanged(); bool isEnabled() const override; - QString disabledReason() const override; - - ProjectExplorer::NamedWidget *createConfigWidget() override; - - QVariantMap toMap() const override; - - BuildType buildType() const override; - - void emitBuildTypeChanged(); CMakeConfig configurationForCMake() const; CMakeConfig configurationFromCMake() const; @@ -88,12 +75,16 @@ signals: void configurationForCMakeChanged(); -protected: - CMakeBuildConfiguration(ProjectExplorer::Target *parent, CMakeBuildConfiguration *source); - bool fromMap(const QVariantMap &map) override; - private: - void ctor(); + QVariantMap toMap() const override; + BuildType buildType() const override; + + void initialize(const ProjectExplorer::BuildInfo *info) override; + QString disabledReason() const override; + + ProjectExplorer::NamedWidget *createConfigWidget() override; + + bool fromMap(const QVariantMap &map) override; bool isParsing() const; @@ -115,7 +106,6 @@ private: CMakeConfig m_configurationFromCMake; QList<CMakeBuildTarget> m_buildTargets; - friend class CMakeBuildConfigurationFactory; friend class CMakeBuildSettingsWidget; friend class CMakeProjectManager::CMakeProject; friend class BuildDirManager; @@ -128,7 +118,7 @@ class CMakeBuildConfigurationFactory : public ProjectExplorer::IBuildConfigurati Q_OBJECT public: - CMakeBuildConfigurationFactory(QObject *parent = 0); + CMakeBuildConfigurationFactory(); enum BuildType { BuildTypeNone = 0, BuildTypeDebug = 1, @@ -139,22 +129,11 @@ public: static BuildType buildTypeFromByteArray(const QByteArray &in); static ProjectExplorer::BuildConfiguration::BuildType cmakeBuildTypeToBuildType(const BuildType &in); - int priority(const ProjectExplorer::Target *parent) const override; QList<ProjectExplorer::BuildInfo *> availableBuilds(const ProjectExplorer::Target *parent) const override; - int priority(const ProjectExplorer::Kit *k, const QString &projectPath) const override; QList<ProjectExplorer::BuildInfo *> availableSetups(const ProjectExplorer::Kit *k, const QString &projectPath) const override; - ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, - const ProjectExplorer::BuildInfo *info) const override; - - bool canClone(const ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const override; - CMakeBuildConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) override; - bool canRestore(const ProjectExplorer::Target *parent, const QVariantMap &map) const override; - CMakeBuildConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map) override; private: - bool canHandle(const ProjectExplorer::Target *t) const; - CMakeBuildInfo *createBuildInfo(const ProjectExplorer::Kit *k, const QString &sourceDir, BuildType buildType) const; diff --git a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp index 7b3ff357b5..04cda44655 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp @@ -75,25 +75,7 @@ static bool isCurrentExecutableTarget(const QString &target) } CMakeBuildStep::CMakeBuildStep(BuildStepList *bsl) : - AbstractProcessStep(bsl, Core::Id(Constants::CMAKE_BUILD_STEP_ID)) -{ - ctor(bsl); -} - -CMakeBuildStep::CMakeBuildStep(BuildStepList *bsl, Core::Id id) : AbstractProcessStep(bsl, id) -{ - ctor(bsl); -} - -CMakeBuildStep::CMakeBuildStep(BuildStepList *bsl, CMakeBuildStep *bs) : - AbstractProcessStep(bsl, bs), - m_buildTarget(bs->m_buildTarget), - m_toolArguments(bs->m_toolArguments) -{ - ctor(bsl); -} - -void CMakeBuildStep::ctor(BuildStepList *bsl) + AbstractProcessStep(bsl, Constants::CMAKE_BUILD_STEP_ID) { m_percentProgress = QRegExp("^\\[\\s*(\\d*)%\\]"); m_ninjaProgress = QRegExp("^\\[\\s*(\\d*)/\\s*(\\d*)"); @@ -586,27 +568,12 @@ QString CMakeBuildStepConfigWidget::summaryText() const // CMakeBuildStepFactory // -CMakeBuildStepFactory::CMakeBuildStepFactory(QObject *parent) : IBuildStepFactory(parent) -{ } - -QList<BuildStepInfo> CMakeBuildStepFactory::availableSteps(BuildStepList *parent) const -{ - if (parent->target()->project()->id() != Constants::CMAKEPROJECT_ID) - return {}; - - return {{Constants::CMAKE_BUILD_STEP_ID, - tr("Build", "Display name for CMakeProjectManager::CMakeBuildStep id.")}}; -} - -BuildStep *CMakeBuildStepFactory::create(BuildStepList *parent, Core::Id id) -{ - Q_UNUSED(id); - return new CMakeBuildStep(parent); -} - -BuildStep *CMakeBuildStepFactory::clone(BuildStepList *parent, BuildStep *source) +CMakeBuildStepFactory::CMakeBuildStepFactory() { - return new CMakeBuildStep(parent, static_cast<CMakeBuildStep *>(source)); + registerStep<CMakeBuildStep>(Constants::CMAKE_BUILD_STEP_ID); + setDisplayName(tr("Build", "Display name for CMakeProjectManager::CMakeBuildStep id.")); + setSupportedProjectType(Constants::CMAKEPROJECT_ID); + setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); } void CMakeBuildStep::processStarted() diff --git a/src/plugins/cmakeprojectmanager/cmakebuildstep.h b/src/plugins/cmakeprojectmanager/cmakebuildstep.h index 754aae52cb..68c40d5752 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildstep.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildstep.h @@ -92,9 +92,6 @@ protected: void processStarted() override; void processFinished(int exitCode, QProcess::ExitStatus status) override; - CMakeBuildStep(ProjectExplorer::BuildStepList *bsl, CMakeBuildStep *bs); - CMakeBuildStep(ProjectExplorer::BuildStepList *bsl, Core::Id id); - bool fromMap(const QVariantMap &map) override; // For parsing [ 76%] @@ -140,18 +137,12 @@ private: QString m_summaryText; }; -class CMakeBuildStepFactory : public ProjectExplorer::IBuildStepFactory +class CMakeBuildStepFactory : public ProjectExplorer::BuildStepFactory { Q_OBJECT public: - explicit CMakeBuildStepFactory(QObject *parent = 0); - - QList<ProjectExplorer::BuildStepInfo> - availableSteps(ProjectExplorer::BuildStepList *parent) const override; - - ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, Core::Id id) override; - ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source) override; + CMakeBuildStepFactory(); }; } // namespace Internal diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp index 5272547da6..8da4ccf5e6 100644 --- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp @@ -63,7 +63,7 @@ const char TITLE_KEY[] = "CMakeProjectManager.CMakeRunConfiguation.Title"; } // namespace CMakeRunConfiguration::CMakeRunConfiguration(Target *target) - : RunConfiguration(target) + : RunConfiguration(target, CMAKE_RC_PREFIX) { // Workaround for QTCREATORBUG-19354: auto cmakeRunEnvironmentModifier = [](RunConfiguration *rc, Utils::Environment &env) { @@ -81,23 +81,9 @@ CMakeRunConfiguration::CMakeRunConfiguration(Target *target) addExtraAspect(new WorkingDirectoryAspect(this, "CMakeProjectManager.CMakeRunConfiguration.UserWorkingDirectory")); } -void CMakeRunConfiguration::initialize(Core::Id id) +QString CMakeRunConfiguration::extraId() const { - RunConfiguration::initialize(id); - QString executable = id.suffixAfter(CMAKE_RC_PREFIX); - - CMakeProject *project = static_cast<CMakeProject *>(target()->project()); - - m_buildSystemTarget = executable; - m_executable = executable; - - if (!executable.isEmpty()) { - const CMakeBuildTarget ct = project->buildTargetForTitle(executable); - m_title = ct.title; - extraAspect<WorkingDirectoryAspect>()->setDefaultWorkingDirectory(ct.workingDirectory); - } - - setDefaultDisplayName(defaultDisplayName()); + return m_buildSystemTarget; } Runnable CMakeRunConfiguration::runnable() const @@ -143,8 +129,26 @@ QVariantMap CMakeRunConfiguration::toMap() const bool CMakeRunConfiguration::fromMap(const QVariantMap &map) { + RunConfiguration::fromMap(map); + m_title = map.value(QLatin1String(TITLE_KEY)).toString(); - return RunConfiguration::fromMap(map); + + QString extraId = ProjectExplorer::idFromMap(map).suffixAfter(id()); + + if (!extraId.isEmpty()) { + m_buildSystemTarget = extraId; + m_executable = extraId; + if (m_title.isEmpty()) + m_title = extraId; + + CMakeProject *project = static_cast<CMakeProject *>(target()->project()); + const CMakeBuildTarget ct = project->buildTargetForTitle(m_title); + extraAspect<WorkingDirectoryAspect>()->setDefaultWorkingDirectory(ct.workingDirectory); + } + + setDefaultDisplayName(defaultDisplayName()); + + return true; } QString CMakeRunConfiguration::defaultDisplayName() const diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h index 7551f34f27..79bd94c78a 100644 --- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h @@ -44,7 +44,6 @@ public: void setExecutable(const QString &executable); void setBaseWorkingDirectory(const Utils::FileName &workingDirectory); - QString title() const; QVariantMap toMap() const override; @@ -55,13 +54,12 @@ public: Utils::OutputFormatter *createOutputFormatter() const final; - void initialize(Core::Id id) override; - private: bool fromMap(const QVariantMap &map) override; QString defaultDisplayName() const; void updateEnabledState() final; + QString extraId() const final; QString baseWorkingDirectory() const; diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp index 236352c647..4080fcf7f2 100644 --- a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp +++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp @@ -55,21 +55,21 @@ namespace Internal { const char GENERIC_BC_ID[] = "GenericProjectManager.GenericBuildConfiguration"; GenericBuildConfiguration::GenericBuildConfiguration(Target *parent) - : BuildConfiguration(parent, Core::Id(GENERIC_BC_ID)) + : BuildConfiguration(parent, GENERIC_BC_ID) { updateCacheAndEmitEnvironmentChanged(); } -GenericBuildConfiguration::GenericBuildConfiguration(Target *parent, Core::Id id) - : BuildConfiguration(parent, id) +void GenericBuildConfiguration::initialize(const BuildInfo *info) { - updateCacheAndEmitEnvironmentChanged(); -} + BuildConfiguration::initialize(info); + + BuildStepList *buildSteps = stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); + buildSteps->appendStep(new GenericMakeStep(buildSteps, "all")); + + BuildStepList *cleanSteps = stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN); + cleanSteps->appendStep(new GenericMakeStep(cleanSteps, "clean")); -GenericBuildConfiguration::GenericBuildConfiguration(Target *parent, GenericBuildConfiguration *source) : - BuildConfiguration(parent, source) -{ - cloneSteps(source); updateCacheAndEmitEnvironmentChanged(); } @@ -82,33 +82,20 @@ NamedWidget *GenericBuildConfiguration::createConfigWidget() \class GenericBuildConfigurationFactory */ -GenericBuildConfigurationFactory::GenericBuildConfigurationFactory(QObject *parent) : - IBuildConfigurationFactory(parent) +GenericBuildConfigurationFactory::GenericBuildConfigurationFactory() { + registerBuildConfiguration<GenericBuildConfiguration>(GENERIC_BC_ID); + setSupportedProjectType(Constants::GENERICPROJECT_ID); + setSupportedProjectMimeTypeName(Constants::GENERICMIMETYPE); } GenericBuildConfigurationFactory::~GenericBuildConfigurationFactory() { } -int GenericBuildConfigurationFactory::priority(const Target *parent) const -{ - return canHandle(parent) ? 0 : -1; -} - QList<BuildInfo *> GenericBuildConfigurationFactory::availableBuilds(const Target *parent) const { - QList<BuildInfo *> result; - BuildInfo *info = createBuildInfo(parent->kit(), parent->project()->projectDirectory()); - result << info; - return result; -} - -int GenericBuildConfigurationFactory::priority(const Kit *k, const QString &projectPath) const -{ - if (k && Utils::mimeTypeForFile(projectPath).matchesName(Constants::GENERICMIMETYPE)) - return 0; - return -1; + return {createBuildInfo(parent->kit(), parent->project()->projectDirectory())}; } QList<BuildInfo *> GenericBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const @@ -121,73 +108,6 @@ QList<BuildInfo *> GenericBuildConfigurationFactory::availableSetups(const Kit * return result; } -BuildConfiguration *GenericBuildConfigurationFactory::create(Target *parent, const BuildInfo *info) const -{ - QTC_ASSERT(info->factory() == this, return 0); - QTC_ASSERT(info->kitId == parent->kit()->id(), return 0); - QTC_ASSERT(!info->displayName.isEmpty(), return 0); - - auto bc = new GenericBuildConfiguration(parent); - bc->setDisplayName(info->displayName); - bc->setDefaultDisplayName(info->displayName); - bc->setBuildDirectory(info->buildDirectory); - - BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); - BuildStepList *cleanSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN); - - Q_ASSERT(buildSteps); - auto makeStep = new GenericMakeStep(buildSteps); - buildSteps->insertStep(0, makeStep); - makeStep->setBuildTarget("all", /* on = */ true); - - Q_ASSERT(cleanSteps); - auto cleanMakeStep = new GenericMakeStep(cleanSteps); - cleanSteps->insertStep(0, cleanMakeStep); - cleanMakeStep->setBuildTarget("clean", /* on = */ true); - cleanMakeStep->setClean(true); - - return bc; -} - -bool GenericBuildConfigurationFactory::canClone(const Target *parent, BuildConfiguration *source) const -{ - if (!canHandle(parent)) - return false; - return source->id() == GENERIC_BC_ID; -} - -BuildConfiguration *GenericBuildConfigurationFactory::clone(Target *parent, BuildConfiguration *source) -{ - if (!canClone(parent, source)) - return 0; - return new GenericBuildConfiguration(parent, qobject_cast<GenericBuildConfiguration *>(source)); -} - -bool GenericBuildConfigurationFactory::canRestore(const Target *parent, const QVariantMap &map) const -{ - if (!canHandle(parent)) - return false; - return ProjectExplorer::idFromMap(map) == GENERIC_BC_ID; -} - -BuildConfiguration *GenericBuildConfigurationFactory::restore(Target *parent, const QVariantMap &map) -{ - if (!canRestore(parent, map)) - return 0; - auto bc = new GenericBuildConfiguration(parent); - if (bc->fromMap(map)) - return bc; - delete bc; - return 0; -} - -bool GenericBuildConfigurationFactory::canHandle(const Target *t) const -{ - if (!t->project()->supportsKit(t->kit())) - return false; - return qobject_cast<GenericProject *>(t->project()); -} - BuildInfo *GenericBuildConfigurationFactory::createBuildInfo(const Kit *k, const Utils::FileName &buildDir) const { diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.h b/src/plugins/genericprojectmanager/genericbuildconfiguration.h index 54e375e88f..dc2121c16d 100644 --- a/src/plugins/genericprojectmanager/genericbuildconfiguration.h +++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.h @@ -36,29 +36,17 @@ class PathChooser; namespace GenericProjectManager { namespace Internal { -class GenericTarget; -class GenericBuildConfigurationFactory; -class GenericBuildSettingsWidget; - class GenericBuildConfiguration : public ProjectExplorer::BuildConfiguration { Q_OBJECT - friend class GenericBuildConfigurationFactory; -public: + friend class ProjectExplorer::IBuildConfigurationFactory; explicit GenericBuildConfiguration(ProjectExplorer::Target *parent); + void initialize(const ProjectExplorer::BuildInfo *info) override; ProjectExplorer::NamedWidget *createConfigWidget() override; - BuildType buildType() const override; - void addToEnvironment(Utils::Environment &env) const final; - -protected: - GenericBuildConfiguration(ProjectExplorer::Target *parent, GenericBuildConfiguration *source); - GenericBuildConfiguration(ProjectExplorer::Target *parent, Core::Id id); - - friend class GenericBuildSettingsWidget; }; class GenericBuildConfigurationFactory : public ProjectExplorer::IBuildConfigurationFactory @@ -66,24 +54,14 @@ class GenericBuildConfigurationFactory : public ProjectExplorer::IBuildConfigura Q_OBJECT public: - explicit GenericBuildConfigurationFactory(QObject *parent = nullptr); + GenericBuildConfigurationFactory(); ~GenericBuildConfigurationFactory(); - int priority(const ProjectExplorer::Target *parent) const override; +private: QList<ProjectExplorer::BuildInfo *> availableBuilds(const ProjectExplorer::Target *parent) const override; - int priority(const ProjectExplorer::Kit *k, const QString &projectPath) const override; QList<ProjectExplorer::BuildInfo *> availableSetups(const ProjectExplorer::Kit *k, const QString &projectPath) const override; - ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, - const ProjectExplorer::BuildInfo *info) const override; - bool canClone(const ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const override; - ProjectExplorer::BuildConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) override; - bool canRestore(const ProjectExplorer::Target *parent, const QVariantMap &map) const override; - ProjectExplorer::BuildConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map) override; - -private: - bool canHandle(const ProjectExplorer::Target *t) const; ProjectExplorer::BuildInfo *createBuildInfo(const ProjectExplorer::Kit *k, const Utils::FileName &buildDir) const; }; diff --git a/src/plugins/genericprojectmanager/genericmakestep.cpp b/src/plugins/genericprojectmanager/genericmakestep.cpp index be9f30854d..1b8cca5bfd 100644 --- a/src/plugins/genericprojectmanager/genericmakestep.cpp +++ b/src/plugins/genericprojectmanager/genericmakestep.cpp @@ -61,32 +61,12 @@ const char MAKE_ARGUMENTS_KEY[] = "GenericProjectManager.GenericMakeStep.MakeArg const char MAKE_COMMAND_KEY[] = "GenericProjectManager.GenericMakeStep.MakeCommand"; const char CLEAN_KEY[] = "GenericProjectManager.GenericMakeStep.Clean"; -GenericMakeStep::GenericMakeStep(BuildStepList *parent) : - AbstractProcessStep(parent, Id(GENERIC_MS_ID)) -{ - ctor(); -} - -GenericMakeStep::GenericMakeStep(BuildStepList *parent, const Id id) : - AbstractProcessStep(parent, id) -{ - ctor(); -} - -GenericMakeStep::GenericMakeStep(BuildStepList *parent, GenericMakeStep *bs) : - AbstractProcessStep(parent, bs), - m_buildTargets(bs->m_buildTargets), - m_makeArguments(bs->m_makeArguments), - m_makeCommand(bs->m_makeCommand), - m_clean(bs->m_clean) -{ - ctor(); -} - -void GenericMakeStep::ctor() +GenericMakeStep::GenericMakeStep(BuildStepList *parent, const QString &buildTarget) + : AbstractProcessStep(parent, GENERIC_MS_ID) { setDefaultDisplayName(QCoreApplication::translate("GenericProjectManager::Internal::GenericMakeStep", GENERIC_MS_DISPLAY_NAME)); + setBuildTarget(buildTarget, true); } bool GenericMakeStep::init(QList<const BuildStep *> &earlierSteps) @@ -324,42 +304,46 @@ void GenericMakeStepConfigWidget::makeArgumentsLineEditTextEdited() } // -// GenericMakeStepFactory +// GenericMakeAllStepFactory // -GenericMakeStepFactory::GenericMakeStepFactory(QObject *parent) : - IBuildStepFactory(parent) -{ -} - -QList<BuildStepInfo> GenericMakeStepFactory::availableSteps(BuildStepList *parent) const +GenericMakeAllStepFactory::GenericMakeAllStepFactory() { - if (parent->target()->project()->id() != Constants::GENERICPROJECT_ID) - return {}; + struct Step : GenericMakeStep + { + Step(BuildStepList *bsl) : GenericMakeStep(bsl) + { + setBuildTarget("all", true); + } + }; - return {{GENERIC_MS_ID, - QCoreApplication::translate("GenericProjectManager::Internal::GenericMakeStep", - GENERIC_MS_DISPLAY_NAME)}}; + registerStep<Step>(GENERIC_MS_ID); + setDisplayName(QCoreApplication::translate( + "GenericProjectManager::Internal::GenericMakeStep", GENERIC_MS_DISPLAY_NAME)); + setSupportedProjectType(Constants::GENERICPROJECT_ID); + setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); } -BuildStep *GenericMakeStepFactory::create(BuildStepList *parent, const Id id) -{ - Q_UNUSED(id) - auto step = new GenericMakeStep(parent); - if (parent->id() == ProjectExplorer::Constants::BUILDSTEPS_CLEAN) { - step->setClean(true); - step->setBuildTarget("clean", /* on = */ true); - } else if (parent->id() == ProjectExplorer::Constants::BUILDSTEPS_BUILD) { - step->setBuildTarget("all", /* on = */ true); - } - return step; -} +// +// GenericMakeCleanStepFactory +// -BuildStep *GenericMakeStepFactory::clone(BuildStepList *parent, BuildStep *source) +GenericMakeCleanStepFactory::GenericMakeCleanStepFactory() { - auto old = qobject_cast<GenericMakeStep *>(source); - Q_ASSERT(old); - return new GenericMakeStep(parent, old); + struct Step : GenericMakeStep + { + Step(BuildStepList *bsl) : GenericMakeStep(bsl) + { + setBuildTarget("clean", true); + setClean(true); + } + }; + + registerStep<Step>(GENERIC_MS_ID); + setDisplayName(QCoreApplication::translate( + "GenericProjectManager::Internal::GenericMakeStep", GENERIC_MS_DISPLAY_NAME)); + setSupportedProjectType(Constants::GENERICPROJECT_ID); + setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN); } } // namespace Internal diff --git a/src/plugins/genericprojectmanager/genericmakestep.h b/src/plugins/genericprojectmanager/genericmakestep.h index de23ffda39..8a5758b100 100644 --- a/src/plugins/genericprojectmanager/genericmakestep.h +++ b/src/plugins/genericprojectmanager/genericmakestep.h @@ -33,7 +33,6 @@ namespace GenericProjectManager { namespace Internal { class GenericMakeStepConfigWidget; -class GenericMakeStepFactory; namespace Ui { class GenericMakeStep; } @@ -42,10 +41,9 @@ class GenericMakeStep : public ProjectExplorer::AbstractProcessStep Q_OBJECT friend class GenericMakeStepConfigWidget; - friend class GenericMakeStepFactory; public: - explicit GenericMakeStep(ProjectExplorer::BuildStepList *parent); + explicit GenericMakeStep(ProjectExplorer::BuildStepList *parent, const QString &buildTarget = {}); bool init(QList<const BuildStep *> &earlierSteps) override; void run(QFutureInterface<bool> &fi) override; @@ -60,16 +58,10 @@ public: void setClean(bool clean); bool isClean() const; +private: QVariantMap toMap() const override; - -protected: - GenericMakeStep(ProjectExplorer::BuildStepList *parent, GenericMakeStep *bs); - GenericMakeStep(ProjectExplorer::BuildStepList *parent, Core::Id id); bool fromMap(const QVariantMap &map) override; -private: - void ctor(); - QStringList m_buildTargets; QString m_makeArguments; QString m_makeCommand; @@ -99,19 +91,16 @@ private: QString m_summaryText; }; -class GenericMakeStepFactory : public ProjectExplorer::IBuildStepFactory +class GenericMakeAllStepFactory : public ProjectExplorer::BuildStepFactory { - Q_OBJECT - public: - explicit GenericMakeStepFactory(QObject *parent = nullptr); - - QList<ProjectExplorer::BuildStepInfo> - availableSteps(ProjectExplorer::BuildStepList *parent) const override; + GenericMakeAllStepFactory(); +}; - ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, Core::Id id) override; - ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, - ProjectExplorer::BuildStep *source) override; +class GenericMakeCleanStepFactory : public ProjectExplorer::BuildStepFactory +{ +public: + GenericMakeCleanStepFactory(); }; } // namespace Internal diff --git a/src/plugins/genericprojectmanager/genericprojectplugin.cpp b/src/plugins/genericprojectmanager/genericprojectplugin.cpp index 6c6a35431f..8cb6c96666 100644 --- a/src/plugins/genericprojectmanager/genericprojectplugin.cpp +++ b/src/plugins/genericprojectmanager/genericprojectplugin.cpp @@ -62,7 +62,8 @@ bool GenericProjectPlugin::initialize(const QStringList &, QString *errorMessage ProjectManager::registerProjectType<GenericProject>(Constants::GENERICMIMETYPE); addAutoReleasedObject(new ProjectFilesFactory); - addAutoReleasedObject(new GenericMakeStepFactory); + addAutoReleasedObject(new GenericMakeAllStepFactory); + addAutoReleasedObject(new GenericMakeCleanStepFactory); addAutoReleasedObject(new GenericBuildConfigurationFactory); IWizardFactory::registerFactoryCreator([]() { return QList<IWizardFactory *>() << new GenericProjectWizard; }); diff --git a/src/plugins/ios/iosbuildconfiguration.cpp b/src/plugins/ios/iosbuildconfiguration.cpp index 74d14d08db..f7d056e4f5 100644 --- a/src/plugins/ios/iosbuildconfiguration.cpp +++ b/src/plugins/ios/iosbuildconfiguration.cpp @@ -32,12 +32,14 @@ #include "projectexplorer/kitinformation.h" #include "projectexplorer/namedwidget.h" #include "projectexplorer/target.h" + #include "qmakeprojectmanager/qmakebuildinfo.h" -#include "utils/algorithm.h" +#include "qmakeprojectmanager/qmakeprojectmanagerconstants.h" -#include <memory> +#include "utils/algorithm.h" using namespace QmakeProjectManager; +using namespace ProjectExplorer; namespace Ios { namespace Internal { @@ -47,13 +49,8 @@ const char qmakeProvisioningProfileSettings[] = "QMAKE_MAC_XCODE_SETTINGS+=qprof const char signingIdentifierKey[] = "Ios.SigningIdentifier"; const char autoManagedSigningKey[] = "Ios.AutoManagedSigning"; -IosBuildConfiguration::IosBuildConfiguration(ProjectExplorer::Target *target) : - QmakeBuildConfiguration(target) -{ -} - -IosBuildConfiguration::IosBuildConfiguration(ProjectExplorer::Target *target, IosBuildConfiguration *source) : - QmakeBuildConfiguration(target, source) +IosBuildConfiguration::IosBuildConfiguration(Target *target) + : QmakeBuildConfiguration(target) { } @@ -143,12 +140,11 @@ void IosBuildConfiguration::updateQmakeCommand() } } -IosBuildConfigurationFactory::IosBuildConfigurationFactory(QObject *parent) - : QmakeBuildConfigurationFactory(parent) +IosBuildConfigurationFactory::IosBuildConfigurationFactory() { + registerBuildConfiguration<IosBuildConfiguration>(QmakeProjectManager::Constants::QMAKE_BC_ID); } - int IosBuildConfigurationFactory::priority(const ProjectExplorer::Kit *k, const QString &projectPath) const { return (QmakeBuildConfigurationFactory::priority(k, projectPath) >= 0 @@ -157,37 +153,10 @@ int IosBuildConfigurationFactory::priority(const ProjectExplorer::Kit *k, const int IosBuildConfigurationFactory::priority(const ProjectExplorer::Target *parent) const { - return (QmakeBuildConfigurationFactory::priority(parent) >= 0 + return (IBuildConfigurationFactory::priority(parent) >= 0 && IosManager::supportsIos(parent)) ? 1 : -1; } -ProjectExplorer::BuildConfiguration *IosBuildConfigurationFactory::create(ProjectExplorer::Target *parent, - const ProjectExplorer::BuildInfo *info) const -{ - auto qmakeInfo = static_cast<const QmakeBuildInfo *>(info); - auto bc = new IosBuildConfiguration(parent); - configureBuildConfiguration(parent, bc, qmakeInfo); - return bc; -} - -ProjectExplorer::BuildConfiguration *IosBuildConfigurationFactory::clone(ProjectExplorer::Target *parent, - ProjectExplorer::BuildConfiguration *source) -{ - if (!canClone(parent, source)) - return nullptr; - auto *oldbc = static_cast<IosBuildConfiguration *>(source); - return new IosBuildConfiguration(parent, oldbc); -} - -ProjectExplorer::BuildConfiguration *IosBuildConfigurationFactory::restore(ProjectExplorer::Target *parent, const QVariantMap &map) -{ - if (canRestore(parent, map)) { - std::unique_ptr<IosBuildConfiguration> bc(new IosBuildConfiguration(parent)); - if (bc->fromMap(map)) - return bc.release(); - } - return nullptr; -} } // namespace Internal } // namespace Ios diff --git a/src/plugins/ios/iosbuildconfiguration.h b/src/plugins/ios/iosbuildconfiguration.h index 2bb94fc529..8eff217bc8 100644 --- a/src/plugins/ios/iosbuildconfiguration.h +++ b/src/plugins/ios/iosbuildconfiguration.h @@ -26,49 +26,35 @@ #include "qmakeprojectmanager/qmakebuildconfiguration.h" -namespace ProjectExplorer { -class Target; -class Kit; -class NamedWidget; -} - namespace Ios { namespace Internal { class IosBuildConfiguration : public QmakeProjectManager::QmakeBuildConfiguration { - friend class IosBuildConfigurationFactory; Q_OBJECT + public: explicit IosBuildConfiguration(ProjectExplorer::Target *target); - IosBuildConfiguration(ProjectExplorer::Target *target, IosBuildConfiguration *source); +private: QList<ProjectExplorer::NamedWidget *> createSubConfigWidgets() override; QVariantMap toMap() const override; -protected: bool fromMap(const QVariantMap &map) override; -private: void onSigningSettingsChanged(bool autoManagedSigning, QString identifier); void updateQmakeCommand(); -private: QString m_signingIdentifier; bool m_autoManagedSigning = true; }; - class IosBuildConfigurationFactory : public QmakeProjectManager::QmakeBuildConfigurationFactory { public: - explicit IosBuildConfigurationFactory(QObject *parent = 0); + IosBuildConfigurationFactory(); int priority(const ProjectExplorer::Kit *k, const QString &projectPath) const override; int priority(const ProjectExplorer::Target *parent) const override; - - ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, const ProjectExplorer::BuildInfo *info) const override; - ProjectExplorer::BuildConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) override; - ProjectExplorer::BuildConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map) override; }; } // namespace Internal diff --git a/src/plugins/ios/iosbuildstep.cpp b/src/plugins/ios/iosbuildstep.cpp index c088b1ede4..5d89f7c6a8 100644 --- a/src/plugins/ios/iosbuildstep.cpp +++ b/src/plugins/ios/iosbuildstep.cpp @@ -60,30 +60,14 @@ const char BUILD_ARGUMENTS_KEY[] = "Ios.IosBuildStep.XcodeArguments"; const char CLEAN_KEY[] = "Ios.IosBuildStep.Clean"; IosBuildStep::IosBuildStep(BuildStepList *parent) : - AbstractProcessStep(parent, Id(IOS_BUILD_STEP_ID)) -{ - ctor(); -} - -IosBuildStep::IosBuildStep(BuildStepList *parent, const Id id) : - AbstractProcessStep(parent, id) -{ - ctor(); -} - -IosBuildStep::IosBuildStep(BuildStepList *parent, IosBuildStep *bs) : - AbstractProcessStep(parent, bs), - m_baseBuildArguments(bs->m_baseBuildArguments), - m_useDefaultArguments(bs->m_useDefaultArguments), - m_clean(bs->m_clean) -{ - ctor(); -} - -void IosBuildStep::ctor() + AbstractProcessStep(parent, IOS_BUILD_STEP_ID) { setDefaultDisplayName(QCoreApplication::translate("GenericProjectManager::Internal::IosBuildStep", IOS_BUILD_STEP_DISPLAY_NAME)); + if (parent->id() == ProjectExplorer::Constants::BUILDSTEPS_CLEAN) { + m_clean = true; + setExtraArguments(QStringList("clean")); + } } bool IosBuildStep::init(QList<const BuildStep *> &earlierSteps) @@ -127,16 +111,6 @@ bool IosBuildStep::init(QList<const BuildStep *> &earlierSteps) return AbstractProcessStep::init(earlierSteps); } -void IosBuildStep::setClean(bool clean) -{ - m_clean = clean; -} - -bool IosBuildStep::isClean() const -{ - return m_clean; -} - QVariantMap IosBuildStep::toMap() const { QVariantMap map(AbstractProcessStep::toMap()); @@ -323,49 +297,20 @@ void IosBuildStepConfigWidget::extraArgumentsChanged() m_buildStep->setExtraArguments(Utils::QtcProcess::splitArgs( m_ui->extraArgumentsLineEdit->text())); } + // // IosBuildStepFactory // -IosBuildStepFactory::IosBuildStepFactory(QObject *parent) : - IBuildStepFactory(parent) -{ -} - -BuildStep *IosBuildStepFactory::create(BuildStepList *parent, const Id id) -{ - Q_UNUSED(id); - IosBuildStep *step = new IosBuildStep(parent); - if (parent->id() == ProjectExplorer::Constants::BUILDSTEPS_CLEAN) { - step->setClean(true); - step->setExtraArguments(QStringList("clean")); - } else if (parent->id() == ProjectExplorer::Constants::BUILDSTEPS_BUILD) { - // nomal setup - } - return step; -} - -BuildStep *IosBuildStepFactory::clone(BuildStepList *parent, BuildStep *source) -{ - IosBuildStep *old = qobject_cast<IosBuildStep *>(source); - Q_ASSERT(old); - return new IosBuildStep(parent, old); -} - -QList<BuildStepInfo> IosBuildStepFactory::availableSteps(BuildStepList *parent) const +IosBuildStepFactory::IosBuildStepFactory() { - Id deviceType = DeviceTypeKitInformation::deviceTypeId(parent->target()->kit()); - if (deviceType != Constants::IOS_DEVICE_TYPE - && deviceType != Constants::IOS_SIMULATOR_TYPE) - return {}; - - if (parent->id() != ProjectExplorer::Constants::BUILDSTEPS_CLEAN - && parent->id() != ProjectExplorer::Constants::BUILDSTEPS_BUILD) - return {}; - - return {{IOS_BUILD_STEP_ID, - QCoreApplication::translate("GenericProjectManager::Internal::IosBuildStep", - IOS_BUILD_STEP_DISPLAY_NAME)}}; + registerStep<IosBuildStep>(IOS_BUILD_STEP_ID); + setSupportedDeviceTypes({Constants::IOS_DEVICE_TYPE, + Constants::IOS_SIMULATOR_TYPE}); + setSupportedStepLists({ProjectExplorer::Constants::BUILDSTEPS_CLEAN, + ProjectExplorer::Constants::BUILDSTEPS_BUILD}); + setDisplayName(QCoreApplication::translate("GenericProjectManager::Internal::IosBuildStep", + IOS_BUILD_STEP_DISPLAY_NAME)); } } // namespace Internal diff --git a/src/plugins/ios/iosbuildstep.h b/src/plugins/ios/iosbuildstep.h index 047eb799f9..47de3d6651 100644 --- a/src/plugins/ios/iosbuildstep.h +++ b/src/plugins/ios/iosbuildstep.h @@ -60,17 +60,9 @@ public: QStringList defaultArguments() const; QString buildCommand() const; - void setClean(bool clean); - bool isClean() const; - - QVariantMap toMap() const override; -protected: - IosBuildStep(ProjectExplorer::BuildStepList *parent, IosBuildStep *bs); - IosBuildStep(ProjectExplorer::BuildStepList *parent, Core::Id id); - bool fromMap(const QVariantMap &map) override; - private: - void ctor(); + bool fromMap(const QVariantMap &map) override; + QVariantMap toMap() const override; QStringList m_baseBuildArguments; QStringList m_extraArguments; @@ -99,19 +91,10 @@ private: QString m_summaryText; }; -class IosBuildStepFactory : public ProjectExplorer::IBuildStepFactory +class IosBuildStepFactory : public ProjectExplorer::BuildStepFactory { - Q_OBJECT - public: - explicit IosBuildStepFactory(QObject *parent = 0); - - QList<ProjectExplorer::BuildStepInfo> - availableSteps(ProjectExplorer::BuildStepList *parent) const override; - - ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, Core::Id id) override; - ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, - ProjectExplorer::BuildStep *source) override; + IosBuildStepFactory(); }; } // namespace Internal diff --git a/src/plugins/ios/iosconstants.h b/src/plugins/ios/iosconstants.h index 22ef1836f4..769067a80b 100644 --- a/src/plugins/ios/iosconstants.h +++ b/src/plugins/ios/iosconstants.h @@ -41,6 +41,7 @@ const char IOS_DEVICE_TYPE[] = "Ios.Device.Type"; const char IOS_SIMULATOR_TYPE[] = "Ios.Simulator.Type"; const char IOS_DEVICE_ID[] = "iOS Device "; const char IOS_SIMULATOR_DEVICE_ID[] = "iOS Simulator Device "; +const char IOS_PRESET_BUILD_STEP_ID[] = "Ios.IosPresetBuildStep"; const char IOS_DSYM_BUILD_STEP_ID[] = "Ios.IosDsymBuildStep"; const quint16 IOS_DEVICE_PORT_START = 30000; diff --git a/src/plugins/ios/iosdeployconfiguration.cpp b/src/plugins/ios/iosdeployconfiguration.cpp index ec7ab7f9c9..fcdb6ad066 100644 --- a/src/plugins/ios/iosdeployconfiguration.cpp +++ b/src/plugins/ios/iosdeployconfiguration.cpp @@ -32,8 +32,7 @@ #include <projectexplorer/target.h> #include <qmakeprojectmanager/qmakeproject.h> -#include <qtsupport/qtkitinformation.h> -#include <qtsupport/qtsupportconstants.h> +#include <qmakeprojectmanager/qmakeprojectmanagerconstants.h> using namespace ProjectExplorer; @@ -41,89 +40,28 @@ namespace Ios { namespace Internal { const char IOS_DEPLOYCONFIGURATION_ID[] = "Qt4ProjectManager.IosDeployConfiguration"; -const char IOS_DC_PREFIX[] = "Qt4ProjectManager.IosDeployConfiguration."; -IosDeployConfiguration::IosDeployConfiguration(Target *parent, Core::Id id) - : DeployConfiguration(parent, id) +IosDeployConfiguration::IosDeployConfiguration(Target *parent) + : DeployConfiguration(parent, IOS_DEPLOYCONFIGURATION_ID) { - setDisplayName(tr("Deploy to iOS")); - setDefaultDisplayName(displayName()); } -IosDeployConfiguration::IosDeployConfiguration(Target *parent, DeployConfiguration *source) - : DeployConfiguration(parent, source) +void IosDeployConfiguration::initialize() { - cloneSteps(source); + stepList()->insertStep(0, new IosDeployStep(stepList())); } -IosDeployConfigurationFactory::IosDeployConfigurationFactory(QObject *parent) - : DeployConfigurationFactory(parent) +IosDeployConfigurationFactory::IosDeployConfigurationFactory() { - setObjectName(QLatin1String("IosDeployConfigurationFactory")); + setObjectName("IosDeployConfigurationFactory"); + registerDeployConfiguration<IosDeployConfiguration>(IOS_DEPLOYCONFIGURATION_ID); + setSupportedProjectType(QmakeProjectManager::Constants::QMAKEPROJECT_ID); + setDefaultDisplayName(tr("Deploy on iOS")); } -bool IosDeployConfigurationFactory::canCreate(Target *parent, Core::Id id) const +bool IosDeployConfigurationFactory::canHandle(Target *target) const { - return availableCreationIds(parent).contains(id); -} - -DeployConfiguration *IosDeployConfigurationFactory::create(Target *parent, Core::Id id) -{ - IosDeployConfiguration *dc = new IosDeployConfiguration(parent, id); - dc->stepList()->insertStep(0, new IosDeployStep(dc->stepList())); - return dc; -} - -bool IosDeployConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const -{ - return canCreate(parent, idFromMap(map)); -} - -DeployConfiguration *IosDeployConfigurationFactory::restore(Target *parent, const QVariantMap &map) -{ - if (!canRestore(parent, map)) - return 0; - - IosDeployConfiguration *dc = new IosDeployConfiguration(parent, idFromMap(map)); - if (dc->fromMap(map)) - return dc; - - delete dc; - return 0; -} - -bool IosDeployConfigurationFactory::canClone(Target *parent, DeployConfiguration *source) const -{ - if (!IosManager::supportsIos(parent)) - return false; - return source->id() == IOS_DEPLOYCONFIGURATION_ID; -} - -DeployConfiguration *IosDeployConfigurationFactory::clone(Target *parent, DeployConfiguration *source) -{ - if (!canClone(parent, source)) - return 0; - return new IosDeployConfiguration(parent, source); -} - -QList<Core::Id> IosDeployConfigurationFactory::availableCreationIds(Target *parent) const -{ - QList<Core::Id> ids; - if (!qobject_cast<QmakeProjectManager::QmakeProject *>(parent->project())) - return ids; - if (!parent->project()->supportsKit(parent->kit())) - return ids; - if (!IosManager::supportsIos(parent)) - return ids; - ids << Core::Id(IOS_DEPLOYCONFIGURATION_ID); - return ids; -} - -QString IosDeployConfigurationFactory::displayNameForId(Core::Id id) const -{ - if (id.name().startsWith(IOS_DC_PREFIX)) - return tr("Deploy on iOS"); - return QString(); + return DeployConfigurationFactory::canHandle(target) && IosManager::supportsIos(target->kit()); } } // namespace Internal diff --git a/src/plugins/ios/iosdeployconfiguration.h b/src/plugins/ios/iosdeployconfiguration.h index 2dc92fdfce..1a1f8bd377 100644 --- a/src/plugins/ios/iosdeployconfiguration.h +++ b/src/plugins/ios/iosdeployconfiguration.h @@ -33,15 +33,10 @@ namespace Internal { class IosDeployConfiguration : public ProjectExplorer::DeployConfiguration { Q_OBJECT - friend class IosDeployConfigurationFactory; public: - IosDeployConfiguration(ProjectExplorer::Target *parent, Core::Id id); - -protected: - IosDeployConfiguration(ProjectExplorer::Target *parent, - ProjectExplorer::DeployConfiguration *source); - + explicit IosDeployConfiguration(ProjectExplorer::Target *parent); + void initialize() override; }; class IosDeployConfigurationFactory : public ProjectExplorer::DeployConfigurationFactory @@ -49,21 +44,9 @@ class IosDeployConfigurationFactory : public ProjectExplorer::DeployConfiguratio Q_OBJECT public: - explicit IosDeployConfigurationFactory(QObject *parent = 0); - - bool canCreate(ProjectExplorer::Target *parent, Core::Id id) const override; - ProjectExplorer::DeployConfiguration *create(ProjectExplorer::Target *parent, Core::Id id) override; - bool canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const override; - ProjectExplorer::DeployConfiguration *restore(ProjectExplorer::Target *parent, - const QVariantMap &map) override; - bool canClone(ProjectExplorer::Target *parent, - ProjectExplorer::DeployConfiguration *source) const override; - ProjectExplorer::DeployConfiguration *clone(ProjectExplorer::Target *parent, - ProjectExplorer::DeployConfiguration *source) override; + IosDeployConfigurationFactory(); - QList<Core::Id> availableCreationIds(ProjectExplorer::Target *parent) const override; - // used to translate the ids to names to display to the user - QString displayNameForId(Core::Id id) const override; + bool canHandle(ProjectExplorer::Target *target) const override; }; } // namespace Internal diff --git a/src/plugins/ios/iosdeploystep.cpp b/src/plugins/ios/iosdeploystep.cpp index e48170b574..d9a67ea962 100644 --- a/src/plugins/ios/iosdeploystep.cpp +++ b/src/plugins/ios/iosdeploystep.cpp @@ -59,24 +59,7 @@ const Core::Id IosDeployStep::Id("Qt4ProjectManager.IosDeployStep"); IosDeployStep::IosDeployStep(BuildStepList *parent) : BuildStep(parent, Id) - , m_expectFail(false) { - ctor(); -} - -IosDeployStep::IosDeployStep(BuildStepList *parent, - IosDeployStep *other) - : BuildStep(parent, other) - , m_expectFail(false) -{ - ctor(); -} - -void IosDeployStep::ctor() -{ - m_toolHandler = 0; - m_transferStatus = NoTransfer; - cleanup(); updateDisplayNames(); connect(DeviceManager::instance(), &DeviceManager::updated, this, &IosDeployStep::updateDisplayNames); diff --git a/src/plugins/ios/iosdeploystep.h b/src/plugins/ios/iosdeploystep.h index 068df59c49..d16fa8a4a2 100644 --- a/src/plugins/ios/iosdeploystep.h +++ b/src/plugins/ios/iosdeploystep.h @@ -36,16 +36,9 @@ #include <QFutureInterface> #include <QProcess> -QT_BEGIN_NAMESPACE -class QEventLoop; -class QTimer; -QT_END_NAMESPACE - namespace Ios { class IosToolHandler; namespace Internal { -class IosDeviceConfigListModel; -class IosPackageCreationStep; class IosDeployStep : public ProjectExplorer::BuildStep { @@ -67,9 +60,6 @@ public: void run(QFutureInterface<bool> &fi) override; void cleanup(); void cancel() override; -signals: - //void done(); - //void error(); private: void handleIsTransferringApp(Ios::IosToolHandler *handler, const QString &bundlePath, @@ -80,7 +70,7 @@ private: void handleFinished(Ios::IosToolHandler *handler); void handleErrorMsg(Ios::IosToolHandler *handler, const QString &msg); void updateDisplayNames(); - IosDeployStep(ProjectExplorer::BuildStepList *bc, IosDeployStep *other); + bool init(QList<const BuildStep *> &earlierSteps) override; ProjectExplorer::BuildStepConfigWidget *createConfigWidget() override; bool immutable() const override { return true; } @@ -89,21 +79,20 @@ private: IosDevice::ConstPtr iosdevice() const; IosSimulator::ConstPtr iossimulator() const; - void ctor(); QString deviceId() const; QString appBundle() const; void raiseError(const QString &error); void writeOutput(const QString &text, OutputFormat = OutputFormat::NormalMessage); void checkProvisioningProfile(); - TransferStatus m_transferStatus; - IosToolHandler *m_toolHandler; + TransferStatus m_transferStatus = NoTransfer; + IosToolHandler *m_toolHandler = nullptr; QFutureInterface<bool> m_futureInterface; ProjectExplorer::IDevice::ConstPtr m_device; QString m_bundlePath; IosDeviceType m_deviceType; static const Core::Id Id; - bool m_expectFail; + bool m_expectFail = false; }; } // namespace Internal diff --git a/src/plugins/ios/iosdeploystepfactory.cpp b/src/plugins/ios/iosdeploystepfactory.cpp index 8c8d4cc332..d14660fa38 100644 --- a/src/plugins/ios/iosdeploystepfactory.cpp +++ b/src/plugins/ios/iosdeploystepfactory.cpp @@ -31,8 +31,6 @@ #include <projectexplorer/buildsteplist.h> #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/target.h> -#include <qtsupport/qtsupportconstants.h> -#include <qtsupport/qtkitinformation.h> #include <QCoreApplication> @@ -41,29 +39,18 @@ using namespace ProjectExplorer; namespace Ios { namespace Internal { -IosDeployStepFactory::IosDeployStepFactory(QObject *parent) - : IBuildStepFactory(parent) +IosDeployStepFactory::IosDeployStepFactory() { + registerStep<IosDeployStep>(IosDeployStep::Id); + setDisplayName(tr("Deploy to iOS device or emulator")); + setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY); + setRepeatable(false); } -QList<BuildStepInfo> IosDeployStepFactory::availableSteps(BuildStepList *parent) const +bool IosDeployStepFactory::canHandle(BuildStepList *parent) const { - if (parent->id() == ProjectExplorer::Constants::BUILDSTEPS_DEPLOY - && IosManager::supportsIos(parent->target()) - && !parent->contains(IosDeployStep::Id)) - return {{IosDeployStep::Id, tr("Deploy to iOS device or emulator")}}; - return {}; -} - -BuildStep *IosDeployStepFactory::create(BuildStepList *parent, Core::Id id) -{ - Q_UNUSED(id); - return new IosDeployStep(parent); -} - -BuildStep *IosDeployStepFactory::clone(BuildStepList *parent, BuildStep *product) -{ - return new IosDeployStep(parent, static_cast<IosDeployStep *>(product)); + return BuildStepFactory::canHandle(parent) + && IosManager::supportsIos(parent->target()); } } // namespace Internal diff --git a/src/plugins/ios/iosdeploystepfactory.h b/src/plugins/ios/iosdeploystepfactory.h index 08c550c2b1..75bf7ef7cb 100644 --- a/src/plugins/ios/iosdeploystepfactory.h +++ b/src/plugins/ios/iosdeploystepfactory.h @@ -30,19 +30,13 @@ namespace Ios { namespace Internal { -class IosDeployStepFactory : public ProjectExplorer::IBuildStepFactory +class IosDeployStepFactory : public ProjectExplorer::BuildStepFactory { Q_OBJECT public: - explicit IosDeployStepFactory(QObject *parent = 0); - - QList<ProjectExplorer::BuildStepInfo> - availableSteps(ProjectExplorer::BuildStepList *parent) const override; - - ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, Core::Id id) override; - ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, - ProjectExplorer::BuildStep *product) override; + IosDeployStepFactory(); + bool canHandle(ProjectExplorer::BuildStepList *parent) const; }; } // namespace Internal diff --git a/src/plugins/ios/iosdsymbuildstep.cpp b/src/plugins/ios/iosdsymbuildstep.cpp index 3d876621e9..2d2f494766 100644 --- a/src/plugins/ios/iosdsymbuildstep.cpp +++ b/src/plugins/ios/iosdsymbuildstep.cpp @@ -56,31 +56,13 @@ static const char COMMAND_PARTIAL_KEY[] = ".Command"; static const char ARGUMENTS_PARTIAL_KEY[] = ".Arguments"; static const char CLEAN_PARTIAL_KEY[] = ".Clean"; -IosPresetBuildStep::IosPresetBuildStep(BuildStepList *parent, const Id id) : - AbstractProcessStep(parent, id), +IosDsymBuildStep::IosDsymBuildStep(BuildStepList *parent) : + AbstractProcessStep(parent, Constants::IOS_DSYM_BUILD_STEP_ID), m_clean(parent->id() == ProjectExplorer::Constants::BUILDSTEPS_CLEAN) { } -bool IosPresetBuildStep::completeSetup() -{ - m_command = defaultCommand(); - m_arguments = defaultArguments(); - return true; -} - -bool IosPresetBuildStep::completeSetupWithStep(BuildStep *bs) -{ - IosPresetBuildStep *o = qobject_cast<IosPresetBuildStep *>(bs); - if (!o) - return false; - m_arguments = o->m_arguments; - m_clean = o->m_clean; - m_command = o->m_command; - return true; -} - -bool IosPresetBuildStep::init(QList<const BuildStep *> &earlierSteps) +bool IosDsymBuildStep::init(QList<const BuildStep *> &earlierSteps) { BuildConfiguration *bc = buildConfiguration(); if (!bc) @@ -108,7 +90,7 @@ bool IosPresetBuildStep::init(QList<const BuildStep *> &earlierSteps) return AbstractProcessStep::init(earlierSteps); } -QVariantMap IosPresetBuildStep::toMap() const +QVariantMap IosDsymBuildStep::toMap() const { QVariantMap map(AbstractProcessStep::toMap()); @@ -121,7 +103,7 @@ QVariantMap IosPresetBuildStep::toMap() const return map; } -bool IosPresetBuildStep::fromMap(const QVariantMap &map) +bool IosDsymBuildStep::fromMap(const QVariantMap &map) { QVariant bArgs = map.value(id().withSuffix(ARGUMENTS_PARTIAL_KEY).toString()); m_arguments = bArgs.toStringList(); @@ -138,14 +120,14 @@ bool IosPresetBuildStep::fromMap(const QVariantMap &map) return BuildStep::fromMap(map); } -QStringList IosPresetBuildStep::defaultArguments() const +QStringList IosDsymBuildStep::defaultArguments() const { if (m_clean) return defaultCleanCmdList().mid(1); return defaultCmdList().mid(1); } -QString IosPresetBuildStep::defaultCommand() const +QString IosDsymBuildStep::defaultCommand() const { if (m_clean) return defaultCleanCmdList().at(0); @@ -153,14 +135,40 @@ QString IosPresetBuildStep::defaultCommand() const return defaultCmdList().at(0); } -QString IosPresetBuildStep::command() const +QStringList IosDsymBuildStep::defaultCleanCmdList() const +{ + auto runConf = qobject_cast<IosRunConfiguration *>(target()->activeRunConfiguration()); + QTC_ASSERT(runConf, return QStringList("echo")); + QString dsymPath = runConf->bundleDirectory().toUserOutput(); + dsymPath.chop(4); + dsymPath.append(".dSYM"); + return QStringList({"rm", "-rf", dsymPath}); +} + +QStringList IosDsymBuildStep::defaultCmdList() const +{ + QString dsymutilCmd = "dsymutil"; + Utils::FileName dsymUtilPath = IosConfigurations::developerPath() + .appendPath("Toolchains/XcodeDefault.xctoolchain/usr/bin/dsymutil"); + if (dsymUtilPath.exists()) + dsymutilCmd = dsymUtilPath.toUserOutput(); + IosRunConfiguration *runConf = + qobject_cast<IosRunConfiguration *>(target()->activeRunConfiguration()); + QTC_ASSERT(runConf, return QStringList("echo")); + QString dsymPath = runConf->bundleDirectory().toUserOutput(); + dsymPath.chop(4); + dsymPath.append(".dSYM"); + return QStringList({dsymutilCmd, "-o", dsymPath, runConf->localExecutable().toUserOutput()}); +} + +QString IosDsymBuildStep::command() const { if (m_command.isEmpty()) return defaultCommand(); return m_command; } -void IosPresetBuildStep::setCommand(const QString &command) +void IosDsymBuildStep::setCommand(const QString &command) { if (command == m_command) return; @@ -177,41 +185,27 @@ void IosPresetBuildStep::setCommand(const QString &command) } } -bool IosPresetBuildStep::clean() const -{ - return m_clean; -} - -void IosPresetBuildStep::setClean(bool clean) -{ - if (m_clean != clean) { - m_clean = clean; - m_arguments = defaultArguments(); - m_command = defaultCommand(); - } -} - -bool IosPresetBuildStep::isDefault() const +bool IosDsymBuildStep::isDefault() const { return arguments() == defaultArguments() && command() == defaultCommand(); } -void IosPresetBuildStep::run(QFutureInterface<bool> &fi) +void IosDsymBuildStep::run(QFutureInterface<bool> &fi) { AbstractProcessStep::run(fi); } -BuildStepConfigWidget *IosPresetBuildStep::createConfigWidget() +BuildStepConfigWidget *IosDsymBuildStep::createConfigWidget() { - return new IosPresetBuildStepConfigWidget(this); + return new IosDsymBuildStepConfigWidget(this); } -bool IosPresetBuildStep::immutable() const +bool IosDsymBuildStep::immutable() const { return false; } -void IosPresetBuildStep::setArguments(const QStringList &args) +void IosDsymBuildStep::setArguments(const QStringList &args) { if (arguments() == args) return; @@ -224,7 +218,7 @@ void IosPresetBuildStep::setArguments(const QStringList &args) } } -QStringList IosPresetBuildStep::arguments() const +QStringList IosDsymBuildStep::arguments() const { if (m_command.isEmpty()) return defaultArguments(); @@ -232,10 +226,10 @@ QStringList IosPresetBuildStep::arguments() const } // -// IosPresetBuildStepConfigWidget +// IosDsymBuildStepConfigWidget // -IosPresetBuildStepConfigWidget::IosPresetBuildStepConfigWidget(IosPresetBuildStep *buildStep) +IosDsymBuildStepConfigWidget::IosDsymBuildStepConfigWidget(IosDsymBuildStep *buildStep) : m_buildStep(buildStep) { m_ui = new Ui::IosPresetBuildStep; @@ -250,16 +244,16 @@ IosPresetBuildStepConfigWidget::IosPresetBuildStepConfigWidget(IosPresetBuildSte updateDetails(); connect(m_ui->argumentsTextEdit, &QPlainTextEdit::textChanged, - this, &IosPresetBuildStepConfigWidget::argumentsChanged); + this, &IosDsymBuildStepConfigWidget::argumentsChanged); connect(m_ui->commandLineEdit, &QLineEdit::editingFinished, - this, &IosPresetBuildStepConfigWidget::commandChanged); + this, &IosDsymBuildStepConfigWidget::commandChanged); connect(m_ui->resetDefaultsButton, &QAbstractButton::clicked, - this, &IosPresetBuildStepConfigWidget::resetDefaults); + this, &IosDsymBuildStepConfigWidget::resetDefaults); connect(ProjectExplorerPlugin::instance(), &ProjectExplorerPlugin::settingsChanged, - this, &IosPresetBuildStepConfigWidget::updateDetails); + this, &IosDsymBuildStepConfigWidget::updateDetails); connect(m_buildStep->target(), &Target::kitChanged, - this, &IosPresetBuildStepConfigWidget::updateDetails); + this, &IosDsymBuildStepConfigWidget::updateDetails); pro->subscribeSignal(&BuildConfiguration::environmentChanged, this, [this]() { if (static_cast<BuildConfiguration *>(sender())->isActive()) updateDetails(); @@ -271,17 +265,17 @@ IosPresetBuildStepConfigWidget::IosPresetBuildStepConfigWidget(IosPresetBuildSte }); } -IosPresetBuildStepConfigWidget::~IosPresetBuildStepConfigWidget() +IosDsymBuildStepConfigWidget::~IosDsymBuildStepConfigWidget() { delete m_ui; } -QString IosPresetBuildStepConfigWidget::displayName() const +QString IosDsymBuildStepConfigWidget::displayName() const { return m_buildStep->displayName(); } -void IosPresetBuildStepConfigWidget::updateDetails() +void IosDsymBuildStepConfigWidget::updateDetails() { BuildConfiguration *bc = m_buildStep->buildConfiguration(); if (!bc) @@ -297,19 +291,19 @@ void IosPresetBuildStepConfigWidget::updateDetails() emit updateSummary(); } -QString IosPresetBuildStepConfigWidget::summaryText() const +QString IosDsymBuildStepConfigWidget::summaryText() const { return m_summaryText; } -void IosPresetBuildStepConfigWidget::commandChanged() +void IosDsymBuildStepConfigWidget::commandChanged() { m_buildStep->setCommand(m_ui->commandLineEdit->text()); m_ui->resetDefaultsButton->setEnabled(!m_buildStep->isDefault()); updateDetails(); } -void IosPresetBuildStepConfigWidget::argumentsChanged() +void IosDsymBuildStepConfigWidget::argumentsChanged() { m_buildStep->setArguments(Utils::QtcProcess::splitArgs( m_ui->argumentsTextEdit->toPlainText())); @@ -317,7 +311,7 @@ void IosPresetBuildStepConfigWidget::argumentsChanged() updateDetails(); } -void IosPresetBuildStepConfigWidget::resetDefaults() +void IosDsymBuildStepConfigWidget::resetDefaults() { m_buildStep->setCommand(m_buildStep->defaultCommand()); m_buildStep->setArguments(m_buildStep->defaultArguments()); @@ -329,95 +323,19 @@ void IosPresetBuildStepConfigWidget::resetDefaults() } // -// IosPresetBuildStepFactory +// IosDsymBuildStepFactory // -IosPresetBuildStepFactory::IosPresetBuildStepFactory(QObject *parent) : - IBuildStepFactory(parent) -{ -} - -BuildStep *IosPresetBuildStepFactory::create(BuildStepList *parent, const Id id) -{ - IosPresetBuildStep *step = createPresetStep(parent, id); - if (step->completeSetup()) - return step; - delete step; - return 0; -} - -BuildStep *IosPresetBuildStepFactory::clone(BuildStepList *parent, BuildStep *source) -{ - IosPresetBuildStep *old = qobject_cast<IosPresetBuildStep *>(source); - Q_ASSERT(old); - IosPresetBuildStep *res = createPresetStep(parent, old->id()); - if (res->completeSetupWithStep(old)) - return res; - delete res; - return 0; -} - -BuildStep *IosPresetBuildStepFactory::restore(BuildStepList *parent, const QVariantMap &map) -{ - IosPresetBuildStep *bs = createPresetStep(parent, idFromMap(map)); - if (bs->fromMap(map)) - return bs; - delete bs; - return 0; -} - -QList<BuildStepInfo> IosDsymBuildStepFactory::availableSteps(BuildStepList *parent) const -{ - if (parent->id() != ProjectExplorer::Constants::BUILDSTEPS_CLEAN - && parent->id() != ProjectExplorer::Constants::BUILDSTEPS_BUILD - && parent->id() != ProjectExplorer::Constants::BUILDSTEPS_DEPLOY) - return {}; - - Id deviceType = DeviceTypeKitInformation::deviceTypeId(parent->target()->kit()); - if (deviceType != Constants::IOS_DEVICE_TYPE && deviceType != Constants::IOS_SIMULATOR_TYPE) - return {}; - - return {{Constants::IOS_DSYM_BUILD_STEP_ID, "dsymutil"}}; -} - -IosPresetBuildStep *IosDsymBuildStepFactory::createPresetStep(BuildStepList *parent, const Id id) const -{ - return new IosDsymBuildStep(parent, id); -} - -IosDsymBuildStep::IosDsymBuildStep(BuildStepList *parent, const Id id) - : IosPresetBuildStep(parent, id) -{ - setDefaultDisplayName("dsymutil"); -} - -QStringList IosDsymBuildStep::defaultCleanCmdList() const -{ - IosRunConfiguration *runConf = - qobject_cast<IosRunConfiguration *>(target()->activeRunConfiguration()); - QTC_ASSERT(runConf, return QStringList("echo")); - QString dsymPath = runConf->bundleDirectory().toUserOutput(); - dsymPath.chop(4); - dsymPath.append(".dSYM"); - return QStringList({"rm", "-rf", dsymPath}); -} - -QStringList IosDsymBuildStep::defaultCmdList() const +IosDsymBuildStepFactory::IosDsymBuildStepFactory() { - QString dsymutilCmd = "dsymutil"; - Utils::FileName dsymUtilPath = IosConfigurations::developerPath() - .appendPath("Toolchains/XcodeDefault.xctoolchain/usr/bin/dsymutil"); - if (dsymUtilPath.exists()) - dsymutilCmd = dsymUtilPath.toUserOutput(); - IosRunConfiguration *runConf = - qobject_cast<IosRunConfiguration *>(target()->activeRunConfiguration()); - QTC_ASSERT(runConf, return QStringList("echo")); - QString dsymPath = runConf->bundleDirectory().toUserOutput(); - dsymPath.chop(4); - dsymPath.append(".dSYM"); - return QStringList({dsymutilCmd, "-o", dsymPath, runConf->localExecutable().toUserOutput()}); + registerStep<IosDsymBuildStep>(Constants::IOS_DSYM_BUILD_STEP_ID); + setSupportedStepLists({ProjectExplorer::Constants::BUILDSTEPS_CLEAN, + ProjectExplorer::Constants::BUILDSTEPS_BUILD, + ProjectExplorer::Constants::BUILDSTEPS_DEPLOY}); + setSupportedDeviceTypes({Constants::IOS_DEVICE_TYPE, + Constants::IOS_SIMULATOR_TYPE}); + setDisplayName("dsymutil"); } - } // namespace Internal } // namespace Ios diff --git a/src/plugins/ios/iosdsymbuildstep.h b/src/plugins/ios/iosdsymbuildstep.h index 851d60f97e..39d01ef667 100644 --- a/src/plugins/ios/iosdsymbuildstep.h +++ b/src/plugins/ios/iosdsymbuildstep.h @@ -31,17 +31,17 @@ namespace Ios { namespace Internal { namespace Ui { class IosPresetBuildStep; } -class IosPresetBuildStepConfigWidget; -class IosPresetBuildStepFactory; +class IosDsymBuildStepConfigWidget; -class IosPresetBuildStep : public ProjectExplorer::AbstractProcessStep +class IosDsymBuildStep : public ProjectExplorer::AbstractProcessStep { Q_OBJECT - friend class IosPresetBuildStepConfigWidget; - friend class IosPresetBuildStepFactory; + friend class IosDsymBuildStepConfigWidget; public: + IosDsymBuildStep(ProjectExplorer::BuildStepList *parent); + bool init(QList<const BuildStep *> &earlierSteps) override; void run(QFutureInterface<bool> &fi) override; @@ -53,31 +53,27 @@ public: QString defaultCommand() const; QString command() const; void setCommand(const QString &command); - bool clean() const; - void setClean(bool clean); bool isDefault() const; QVariantMap toMap() const override; -protected: - IosPresetBuildStep(ProjectExplorer::BuildStepList *parent, Core::Id id); - virtual bool completeSetup(); - virtual bool completeSetupWithStep(ProjectExplorer::BuildStep *bs); - bool fromMap(const QVariantMap &map) override; - virtual QStringList defaultCleanCmdList() const = 0; - virtual QStringList defaultCmdList() const = 0; + private: + bool fromMap(const QVariantMap &map) override; + QStringList defaultCleanCmdList() const; + QStringList defaultCmdList() const; + QStringList m_arguments; QString m_command; bool m_clean; }; -class IosPresetBuildStepConfigWidget : public ProjectExplorer::BuildStepConfigWidget +class IosDsymBuildStepConfigWidget : public ProjectExplorer::BuildStepConfigWidget { Q_OBJECT public: - IosPresetBuildStepConfigWidget(IosPresetBuildStep *buildStep); - ~IosPresetBuildStepConfigWidget(); + IosDsymBuildStepConfigWidget(IosDsymBuildStep *buildStep); + ~IosDsymBuildStepConfigWidget(); QString displayName() const override; QString summaryText() const override; @@ -88,47 +84,15 @@ private: void updateDetails(); Ui::IosPresetBuildStep *m_ui; - IosPresetBuildStep *m_buildStep; + IosDsymBuildStep *m_buildStep; QString m_summaryText; }; -class IosPresetBuildStepFactory : public ProjectExplorer::IBuildStepFactory -{ - Q_OBJECT - -public: - explicit IosPresetBuildStepFactory(QObject *parent = 0); - - ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, Core::Id id) override; - ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, - ProjectExplorer::BuildStep *source) override; - ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildStepList *parent, - const QVariantMap &map) override; - -protected: - virtual IosPresetBuildStep *createPresetStep(ProjectExplorer::BuildStepList *parent, - const Core::Id id) const = 0; -}; - -class IosDsymBuildStep : public IosPresetBuildStep -{ - Q_OBJECT - friend class IosDsymBuildStepFactory; -protected: - QStringList defaultCleanCmdList() const override; - QStringList defaultCmdList() const override; - IosDsymBuildStep(ProjectExplorer::BuildStepList *parent, Core::Id id); -}; - -class IosDsymBuildStepFactory : public IosPresetBuildStepFactory +class IosDsymBuildStepFactory : public ProjectExplorer::BuildStepFactory { Q_OBJECT public: - QList<ProjectExplorer::BuildStepInfo> - availableSteps(ProjectExplorer::BuildStepList *parent) const override; - - IosPresetBuildStep *createPresetStep(ProjectExplorer::BuildStepList *parent, - const Core::Id id) const override; + explicit IosDsymBuildStepFactory(); }; } // namespace Internal diff --git a/src/plugins/ios/iosrunconfiguration.cpp b/src/plugins/ios/iosrunconfiguration.cpp index f26b6cca86..78a3928d52 100644 --- a/src/plugins/ios/iosrunconfiguration.cpp +++ b/src/plugins/ios/iosrunconfiguration.cpp @@ -95,7 +95,7 @@ private: }; IosRunConfiguration::IosRunConfiguration(Target *target) - : RunConfiguration(target) + : RunConfiguration(target, Constants::IOS_RC_ID_PREFIX) { addExtraAspect(new ArgumentsAspect(this, "Ios.run_arguments")); @@ -105,15 +105,13 @@ IosRunConfiguration::IosRunConfiguration(Target *target) this, &IosRunConfiguration::deviceChanges); } -void IosRunConfiguration::initialize(Core::Id id) +QString IosRunConfiguration::extraId() const { - RunConfiguration::initialize(id); - m_profilePath = pathFromId(id); - - updateDisplayNames(); + return m_profilePath.toString(); } -void IosRunConfiguration::deviceChanges() { +void IosRunConfiguration::deviceChanges() +{ updateDisplayNames(); updateEnabledState(); } @@ -242,6 +240,12 @@ FileName IosRunConfiguration::localExecutable() const bool IosRunConfiguration::fromMap(const QVariantMap &map) { + if (!RunConfiguration::fromMap(map)) + return false; + + QString extraId = idFromMap(map).suffixAfter(id()); + m_profilePath = Utils::FileName::fromString(extraId); + bool deviceTypeIsInt; map.value(deviceTypeKey).toInt(&deviceTypeIsInt); if (deviceTypeIsInt || !m_deviceType.fromMap(map.value(deviceTypeKey).toMap())) { @@ -250,7 +254,9 @@ bool IosRunConfiguration::fromMap(const QVariantMap &map) else m_deviceType = IosDeviceType(IosDeviceType::SimulatedDevice); } - return RunConfiguration::fromMap(map); + + updateDisplayNames(); + return true; } QVariantMap IosRunConfiguration::toMap() const @@ -265,15 +271,6 @@ QString IosRunConfiguration::buildSystemTarget() const return static_cast<QmakeProject *>(target()->project())->mapProFilePathToTarget(m_profilePath); } -FileName IosRunConfiguration::pathFromId(Core::Id id) -{ - QString pathStr = id.toString(); - const QString prefix = Constants::IOS_RC_ID_PREFIX; - if (!pathStr.startsWith(prefix)) - return Utils::FileName(); - return Utils::FileName::fromString(pathStr.mid(prefix.size())); -} - QString IosRunConfiguration::disabledReason() const { Core::Id devType = DeviceTypeKitInformation::deviceTypeId(target()->kit()); diff --git a/src/plugins/ios/iosrunconfiguration.h b/src/plugins/ios/iosrunconfiguration.h index 9a88424e8e..5295fc7c22 100644 --- a/src/plugins/ios/iosrunconfiguration.h +++ b/src/plugins/ios/iosrunconfiguration.h @@ -66,14 +66,11 @@ public: QString buildSystemTarget() const final; - static Utils::FileName pathFromId(Core::Id id); - signals: void localExecutableChanged(); private: - friend class ProjectExplorer::IRunConfigurationFactory; - void initialize(Core::Id id) override; + QString extraId() const final; void deviceChanges(); friend class IosRunConfigurationWidget; diff --git a/src/plugins/nim/nim.pro b/src/plugins/nim/nim.pro index ae570653a0..9a53b0ed55 100644 --- a/src/plugins/nim/nim.pro +++ b/src/plugins/nim/nim.pro @@ -18,7 +18,6 @@ HEADERS += \ project/nimproject.h \ project/nimprojectnode.h \ project/nimbuildconfiguration.h \ - project/nimbuildconfigurationfactory.h \ project/nimcompilerbuildstep.h \ project/nimcompilerbuildstepconfigwidget.h \ project/nimcompilercleanstep.h \ @@ -45,7 +44,6 @@ SOURCES += \ project/nimproject.cpp \ project/nimprojectnode.cpp \ project/nimbuildconfiguration.cpp \ - project/nimbuildconfigurationfactory.cpp \ project/nimcompilerbuildstep.cpp \ project/nimcompilerbuildstepconfigwidget.cpp \ project/nimcompilercleanstep.cpp \ diff --git a/src/plugins/nim/nim.qbs b/src/plugins/nim/nim.qbs index 5b6d140719..2142b9848e 100644 --- a/src/plugins/nim/nim.qbs +++ b/src/plugins/nim/nim.qbs @@ -36,7 +36,6 @@ QtcPlugin { prefix: "project/" files: [ "nimbuildconfiguration.h", "nimbuildconfiguration.cpp", - "nimbuildconfigurationfactory.h", "nimbuildconfigurationfactory.cpp", "nimbuildconfigurationwidget.h", "nimbuildconfigurationwidget.cpp", "nimcompilerbuildstep.h", "nimcompilerbuildstep.cpp", "nimcompilerbuildstepconfigwidget.h", "nimcompilerbuildstepconfigwidget.cpp", "nimcompilerbuildstepconfigwidget.ui", diff --git a/src/plugins/nim/nimplugin.cpp b/src/plugins/nim/nimplugin.cpp index b07d847219..52a267b965 100644 --- a/src/plugins/nim/nimplugin.cpp +++ b/src/plugins/nim/nimplugin.cpp @@ -28,7 +28,7 @@ #include "nimconstants.h" #include "editor/nimeditorfactory.h" #include "editor/nimhighlighter.h" -#include "project/nimbuildconfigurationfactory.h" +#include "project/nimbuildconfiguration.h" #include "project/nimcompilerbuildstepfactory.h" #include "project/nimcompilercleanstepfactory.h" #include "project/nimproject.h" diff --git a/src/plugins/nim/project/nimbuildconfiguration.cpp b/src/plugins/nim/project/nimbuildconfiguration.cpp index 81f34e12fb..7be50ea787 100644 --- a/src/plugins/nim/project/nimbuildconfiguration.cpp +++ b/src/plugins/nim/project/nimbuildconfiguration.cpp @@ -27,12 +27,23 @@ #include "nimbuildconfigurationwidget.h" #include "nimcompilerbuildstep.h" #include "nimproject.h" +#include "nimbuildconfiguration.h" +#include "nimcompilerbuildstep.h" +#include "nimcompilercleanstep.h" +#include "nimproject.h" #include "../nimconstants.h" -#include <projectexplorer/namedwidget.h> -#include <projectexplorer/projectexplorerconstants.h> +#include <coreplugin/documentmanager.h> +#include <projectexplorer/buildconfiguration.h> +#include <projectexplorer/buildinfo.h> #include <projectexplorer/buildsteplist.h> +#include <projectexplorer/buildstep.h> +#include <projectexplorer/kit.h> +#include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/projectmacroexpander.h> +#include <projectexplorer/target.h> +#include <utils/mimetypes/mimedatabase.h> #include <utils/qtcassert.h> using namespace ProjectExplorer; @@ -40,9 +51,73 @@ using namespace Utils; namespace Nim { +static FileName defaultBuildDirectory(const Kit *k, + const QString &projectFilePath, + const QString &bc, + BuildConfiguration::BuildType buildType) +{ + QFileInfo projectFileInfo(projectFilePath); + + ProjectMacroExpander expander(projectFilePath, projectFileInfo.baseName(), k, bc, buildType); + QString buildDirectory = expander.expand(Core::DocumentManager::buildDirectory()); + + if (FileUtils::isAbsolutePath(buildDirectory)) + return FileName::fromString(buildDirectory); + + auto projectDir = FileName::fromString(projectFileInfo.absoluteDir().absolutePath()); + auto result = projectDir.appendPath(buildDirectory); + + return result; +} + NimBuildConfiguration::NimBuildConfiguration(Target *target) : BuildConfiguration(target, Constants::C_NIMBUILDCONFIGURATION_ID) -{} +{ +} + +void NimBuildConfiguration::initialize(const BuildInfo *info) +{ + BuildConfiguration::initialize(info); + + auto project = qobject_cast<NimProject *>(target()->project()); + QTC_ASSERT(project, return); + + // Create the build configuration and initialize it from build info + setBuildDirectory(defaultBuildDirectory(target()->kit(), + project->projectFilePath().toString(), + info->displayName, + info->buildType)); + + // Add nim compiler build step + { + BuildStepList *buildSteps = stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); + auto nimCompilerBuildStep = new NimCompilerBuildStep(buildSteps); + NimCompilerBuildStep::DefaultBuildOptions defaultOption; + switch (info->buildType) { + case BuildConfiguration::Release: + defaultOption = NimCompilerBuildStep::DefaultBuildOptions::Release; + break; + case BuildConfiguration::Debug: + defaultOption = NimCompilerBuildStep::DefaultBuildOptions::Debug; + break; + default: + defaultOption = NimCompilerBuildStep::DefaultBuildOptions::Empty; + break; + } + nimCompilerBuildStep->setDefaultCompilerOptions(defaultOption); + Utils::FileNameList nimFiles = project->nimFiles(); + if (!nimFiles.isEmpty()) + nimCompilerBuildStep->setTargetNimFile(nimFiles.first()); + buildSteps->appendStep(nimCompilerBuildStep); + } + + // Add clean step + { + BuildStepList *cleanSteps = stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN); + cleanSteps->appendStep(new NimCompilerCleanStep(cleanSteps)); + } +} + NamedWidget *NimBuildConfiguration::createConfigWidget() { @@ -59,9 +134,6 @@ bool NimBuildConfiguration::fromMap(const QVariantMap &map) if (!BuildConfiguration::fromMap(map)) return false; - if (!canRestore(map)) - return false; - const QString displayName = map[Constants::C_NIMBUILDCONFIGURATION_DISPLAY_KEY].toString(); const QString buildDirectory = map[Constants::C_NIMBUILDCONFIGURATION_BUILDDIRECTORY_KEY].toString(); @@ -91,32 +163,58 @@ FileName NimBuildConfiguration::outFilePath() const return step->outFilePath(); } -bool NimBuildConfiguration::canRestore(const QVariantMap &map) +const NimCompilerBuildStep *NimBuildConfiguration::nimCompilerBuildStep() const { - return idFromMap(map) == Constants::C_NIMBUILDCONFIGURATION_ID; + BuildStepList *steps = stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); + QTC_ASSERT(steps, return nullptr); + foreach (BuildStep *step, steps->steps()) + if (step->id() == Constants::C_NIMCOMPILERBUILDSTEP_ID) + return qobject_cast<NimCompilerBuildStep *>(step); + return nullptr; } -bool NimBuildConfiguration::hasNimCompilerBuildStep() const + +NimBuildConfigurationFactory::NimBuildConfigurationFactory() { - BuildStepList *steps = stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); - return steps ? steps->contains(Constants::C_NIMCOMPILERBUILDSTEP_ID) : false; + registerBuildConfiguration<NimBuildConfiguration>(Constants::C_NIMBUILDCONFIGURATION_ID); + setSupportedProjectType(Constants::C_NIMPROJECT_ID); + setSupportedProjectMimeTypeName(Constants::C_NIM_PROJECT_MIMETYPE); } -bool NimBuildConfiguration::hasNimCompilerCleanStep() const +QList<BuildInfo *> NimBuildConfigurationFactory::availableBuilds(const Target *parent) const { - BuildStepList *steps = stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN); - return steps ? steps->contains(Constants::C_NIMCOMPILERCLEANSTEP_ID) : false; + // Retrieve the project path + auto project = qobject_cast<NimProject *>(parent->project()); + QTC_ASSERT(project, return {}); + + // Create the build info + BuildInfo *info = createBuildInfo(parent->kit(), project->projectFilePath().toString(), + BuildConfiguration::Debug); + + info->displayName.clear(); // ask for a name + info->buildDirectory.clear(); // This depends on the displayName + + return {info}; } -const NimCompilerBuildStep *NimBuildConfiguration::nimCompilerBuildStep() const +QList<BuildInfo *> NimBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const { - BuildStepList *steps = stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); - QTC_ASSERT(steps, return nullptr); - foreach (BuildStep *step, steps->steps()) - if (step->id() == Constants::C_NIMCOMPILERBUILDSTEP_ID) - return qobject_cast<NimCompilerBuildStep *>(step); - return nullptr; + BuildInfo *debug = createBuildInfo(k, projectPath, BuildConfiguration::Debug); + BuildInfo *release = createBuildInfo(k, projectPath, BuildConfiguration::Release); + return {debug, release}; } +BuildInfo *NimBuildConfigurationFactory::createBuildInfo(const Kit *k, const QString &projectFilePath, + BuildConfiguration::BuildType buildType) const +{ + auto result = new BuildInfo(this); + result->buildType = buildType; + result->displayName = BuildConfiguration::buildTypeName(buildType); + result->buildDirectory = defaultBuildDirectory(k, projectFilePath, result->displayName, buildType); + result->kitId = k->id(); + result->typeName = tr("Build"); + return result; } +} // namespace Nim + diff --git a/src/plugins/nim/project/nimbuildconfiguration.h b/src/plugins/nim/project/nimbuildconfiguration.h index 1228be0680..de2b5a9464 100644 --- a/src/plugins/nim/project/nimbuildconfiguration.h +++ b/src/plugins/nim/project/nimbuildconfiguration.h @@ -28,40 +28,53 @@ #include <projectexplorer/buildconfiguration.h> #include <projectexplorer/target.h> -#include <QPointer> - namespace Nim { -class NimProject; class NimCompilerBuildStep; class NimBuildConfiguration : public ProjectExplorer::BuildConfiguration { Q_OBJECT -public: - NimBuildConfiguration(ProjectExplorer::Target *target); + friend class ProjectExplorer::IBuildConfigurationFactory; + explicit NimBuildConfiguration(ProjectExplorer::Target *target); + void initialize(const ProjectExplorer::BuildInfo *info) override; ProjectExplorer::NamedWidget *createConfigWidget() override; - ProjectExplorer::BuildConfiguration::BuildType buildType() const override; bool fromMap(const QVariantMap &map) override; QVariantMap toMap() const override; +public: Utils::FileName cacheDirectory() const; Utils::FileName outFilePath() const; - static bool canRestore(const QVariantMap &map); - - bool hasNimCompilerBuildStep() const; - bool hasNimCompilerCleanStep() const; - signals: void outFilePathChanged(const Utils::FileName &outFilePath); private: + void setupBuild(const ProjectExplorer::BuildInfo *info); const NimCompilerBuildStep *nimCompilerBuildStep() const; }; + +class NimBuildConfigurationFactory : public ProjectExplorer::IBuildConfigurationFactory +{ + Q_OBJECT + +public: + NimBuildConfigurationFactory(); + +private: + QList<ProjectExplorer::BuildInfo *> availableBuilds(const ProjectExplorer::Target *parent) const override; + + QList<ProjectExplorer::BuildInfo *> availableSetups(const ProjectExplorer::Kit *k, + const QString &projectPath) const override; + + ProjectExplorer::BuildInfo *createBuildInfo(const ProjectExplorer::Kit *k, + const QString &projectPath, + ProjectExplorer::BuildConfiguration::BuildType buildType) const; +}; + } diff --git a/src/plugins/nim/project/nimbuildconfigurationfactory.cpp b/src/plugins/nim/project/nimbuildconfigurationfactory.cpp deleted file mode 100644 index 99839eec72..0000000000 --- a/src/plugins/nim/project/nimbuildconfigurationfactory.cpp +++ /dev/null @@ -1,217 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) Filippo Cucchetto <filippocucchetto@gmail.com> -** Contact: http://www.qt.io/licensing -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "nimbuildconfigurationfactory.h" -#include "nimbuildconfiguration.h" -#include "nimcompilerbuildstep.h" -#include "nimcompilercleanstep.h" -#include "nimproject.h" - -#include "../nimconstants.h" - -#include <coreplugin/documentmanager.h> -#include <projectexplorer/buildconfiguration.h> -#include <projectexplorer/buildinfo.h> -#include <projectexplorer/buildsteplist.h> -#include <projectexplorer/buildstep.h> -#include <projectexplorer/kit.h> -#include <projectexplorer/projectexplorerconstants.h> -#include <projectexplorer/projectmacroexpander.h> -#include <projectexplorer/target.h> -#include <utils/mimetypes/mimedatabase.h> -#include <utils/qtcassert.h> - -#include <memory> - -using namespace ProjectExplorer; -using namespace Utils; - -namespace Nim { - -NimBuildConfigurationFactory::NimBuildConfigurationFactory(QObject *parent) - : IBuildConfigurationFactory(parent) -{} - -QList<BuildInfo *> NimBuildConfigurationFactory::availableBuilds(const Target *parent) const -{ - // Retrieve the project path - auto project = qobject_cast<NimProject *>(parent->project()); - QTC_ASSERT(project, return {}); - - // Create the build info - BuildInfo *info = createBuildInfo(parent->kit(), project->projectFilePath().toString(), - BuildConfiguration::Debug); - - info->displayName.clear(); // ask for a name - info->buildDirectory.clear(); // This depends on the displayName - - return {info}; -} - -QList<BuildInfo *> NimBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const -{ - BuildInfo *debug = createBuildInfo(k, projectPath, BuildConfiguration::Debug); - BuildInfo *release = createBuildInfo(k, projectPath, BuildConfiguration::Release); - return {debug, release}; -} - -BuildConfiguration *NimBuildConfigurationFactory::create(Target *parent, const BuildInfo *info) const -{ - auto project = qobject_cast<NimProject *>(parent->project()); - QTC_ASSERT(project, return nullptr); - - // Create the build configuration and initialize it from build info - auto result = new NimBuildConfiguration(parent); - result->setDisplayName(info->displayName); - result->setDefaultDisplayName(info->displayName); - result->setBuildDirectory(defaultBuildDirectory(parent->kit(), - project->projectFilePath().toString(), - info->displayName, - info->buildType)); - - // Add nim compiler build step - { - BuildStepList *buildSteps = result->stepList(Core::Id(ProjectExplorer::Constants::BUILDSTEPS_BUILD)); - auto nimCompilerBuildStep = new NimCompilerBuildStep(buildSteps); - NimCompilerBuildStep::DefaultBuildOptions defaultOption; - switch (info->buildType) { - case BuildConfiguration::Release: - defaultOption = NimCompilerBuildStep::DefaultBuildOptions::Release; - break; - case BuildConfiguration::Debug: - defaultOption = NimCompilerBuildStep::DefaultBuildOptions::Debug; - break; - default: - defaultOption = NimCompilerBuildStep::DefaultBuildOptions::Empty; - break; - } - nimCompilerBuildStep->setDefaultCompilerOptions(defaultOption); - Utils::FileNameList nimFiles = project->nimFiles(); - if (!nimFiles.isEmpty()) - nimCompilerBuildStep->setTargetNimFile(nimFiles.first()); - buildSteps->appendStep(nimCompilerBuildStep); - } - - // Add clean step - { - BuildStepList *cleanSteps = result->stepList(Core::Id(ProjectExplorer::Constants::BUILDSTEPS_CLEAN)); - cleanSteps->appendStep(new NimCompilerCleanStep(cleanSteps)); - } - - return result; -} - -bool NimBuildConfigurationFactory::canRestore(const Target *parent, const QVariantMap &map) const -{ - Q_UNUSED(parent); - if (!canHandle(parent)) - return false; - return NimBuildConfiguration::canRestore(map); -} - -BuildConfiguration *NimBuildConfigurationFactory::restore(Target *parent, const QVariantMap &map) -{ - QTC_ASSERT(canRestore(parent, map), return nullptr); - - // Create the build configuration - auto result = new NimBuildConfiguration(parent); - - // Restore from map - bool status = result->fromMap(map); - QTC_ASSERT(status, return nullptr); - - return result; -} - -bool NimBuildConfigurationFactory::canClone(const Target *parent, BuildConfiguration *product) const -{ - QTC_ASSERT(parent, return false); - QTC_ASSERT(product, return false); - if (!canHandle(parent)) - return false; - return product->id() == Constants::C_NIMBUILDCONFIGURATION_ID; -} - -BuildConfiguration *NimBuildConfigurationFactory::clone(Target *parent, BuildConfiguration *product) -{ - QTC_ASSERT(parent, return nullptr); - QTC_ASSERT(product, return nullptr); - auto buildConfiguration = qobject_cast<NimBuildConfiguration *>(product); - QTC_ASSERT(buildConfiguration, return nullptr); - std::unique_ptr<NimBuildConfiguration> result(new NimBuildConfiguration(parent)); - return result->fromMap(buildConfiguration->toMap()) ? result.release() : nullptr; -} - -int NimBuildConfigurationFactory::priority(const Kit *k, const QString &projectPath) const -{ - if (k && Utils::mimeTypeForFile(projectPath).matchesName(Constants::C_NIM_PROJECT_MIMETYPE)) - return 0; - return -1; -} - -int NimBuildConfigurationFactory::priority(const Target *parent) const -{ - return canHandle(parent) ? 0 : -1; -} - -bool NimBuildConfigurationFactory::canHandle(const Target *t) const -{ - if (!t->project()->supportsKit(t->kit())) - return false; - return qobject_cast<NimProject *>(t->project()); -} - -FileName NimBuildConfigurationFactory::defaultBuildDirectory(const Kit *k, - const QString &projectFilePath, - const QString &bc, - BuildConfiguration::BuildType buildType) -{ - QFileInfo projectFileInfo(projectFilePath); - - ProjectMacroExpander expander(projectFilePath, projectFileInfo.baseName(), k, bc, buildType); - QString buildDirectory = expander.expand(Core::DocumentManager::buildDirectory()); - - if (FileUtils::isAbsolutePath(buildDirectory)) - return FileName::fromString(buildDirectory); - - auto projectDir = FileName::fromString(projectFileInfo.absoluteDir().absolutePath()); - auto result = projectDir.appendPath(buildDirectory); - - return result; -} - -BuildInfo *NimBuildConfigurationFactory::createBuildInfo(const Kit *k, const QString &projectFilePath, - BuildConfiguration::BuildType buildType) const -{ - auto result = new BuildInfo(this); - result->buildType = buildType; - result->displayName = BuildConfiguration::buildTypeName(buildType); - result->buildDirectory = defaultBuildDirectory(k, projectFilePath, result->displayName, buildType); - result->kitId = k->id(); - result->typeName = tr("Build"); - return result; -} - -} // namespace Nim diff --git a/src/plugins/nim/project/nimbuildconfigurationfactory.h b/src/plugins/nim/project/nimbuildconfigurationfactory.h deleted file mode 100644 index 40532ca2ee..0000000000 --- a/src/plugins/nim/project/nimbuildconfigurationfactory.h +++ /dev/null @@ -1,74 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) Filippo Cucchetto <filippocucchetto@gmail.com> -** Contact: http://www.qt.io/licensing -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#pragma once - -#include <projectexplorer/buildconfiguration.h> - -namespace Nim { - -class NimBuildConfigurationFactory : public ProjectExplorer::IBuildConfigurationFactory -{ - Q_OBJECT - -public: - explicit NimBuildConfigurationFactory(QObject *parent = 0); - - QList<ProjectExplorer::BuildInfo *> availableBuilds(const ProjectExplorer::Target *parent) const override; - - QList<ProjectExplorer::BuildInfo *> availableSetups(const ProjectExplorer::Kit *k, - const QString &projectPath) const override; - - ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, - const ProjectExplorer::BuildInfo *info) const override; - - bool canRestore(const ProjectExplorer::Target *parent, - const QVariantMap &map) const override; - - ProjectExplorer::BuildConfiguration *restore(ProjectExplorer::Target *parent, - const QVariantMap &map) override; - - bool canClone(const ProjectExplorer::Target *parent, - ProjectExplorer::BuildConfiguration *product) const override; - - ProjectExplorer::BuildConfiguration *clone(ProjectExplorer::Target *parent, - ProjectExplorer::BuildConfiguration *product) override; - - int priority(const ProjectExplorer::Kit *k, const QString &projectPath) const override; - - int priority(const ProjectExplorer::Target *parent) const override; - -private: - bool canHandle(const ProjectExplorer::Target *t) const; - static Utils::FileName defaultBuildDirectory(const ProjectExplorer::Kit *k, - const QString &projectPath, - const QString &bc, ProjectExplorer::BuildConfiguration::BuildType buildType); - - ProjectExplorer::BuildInfo *createBuildInfo(const ProjectExplorer::Kit *k, - const QString &projectPath, - ProjectExplorer::BuildConfiguration::BuildType buildType) const; -}; - -} diff --git a/src/plugins/nim/project/nimcompilerbuildstepfactory.cpp b/src/plugins/nim/project/nimcompilerbuildstepfactory.cpp index afd2125f3f..c1d25593d7 100644 --- a/src/plugins/nim/project/nimcompilerbuildstepfactory.cpp +++ b/src/plugins/nim/project/nimcompilerbuildstepfactory.cpp @@ -32,39 +32,17 @@ #include <projectexplorer/projectexplorerconstants.h> #include <utils/qtcassert.h> -#include <memory> - using namespace ProjectExplorer; namespace Nim { -NimCompilerBuildStepFactory::NimCompilerBuildStepFactory(QObject *parent) - : IBuildStepFactory(parent) -{} - -QList<BuildStepInfo> NimCompilerBuildStepFactory::availableSteps(BuildStepList *parent) const -{ - if (parent->id() != ProjectExplorer::Constants::BUILDSTEPS_BUILD) - return {}; - - auto bc = qobject_cast<NimBuildConfiguration *>(parent->parent()); - if (!bc || bc->hasNimCompilerBuildStep()) - return {}; - - return {{Constants::C_NIMCOMPILERBUILDSTEP_ID, tr("Nim Compiler Build Step")}}; -} - -BuildStep *NimCompilerBuildStepFactory::create(BuildStepList *parent, Core::Id) -{ - return new NimCompilerBuildStep(parent); -} - -BuildStep *NimCompilerBuildStepFactory::clone(BuildStepList *parent, BuildStep *buildStep) +NimCompilerBuildStepFactory::NimCompilerBuildStepFactory() { - QTC_ASSERT(parent, return nullptr); - QTC_ASSERT(buildStep, return nullptr); - std::unique_ptr<NimCompilerBuildStep> result(new NimCompilerBuildStep(parent)); - return result->fromMap(buildStep->toMap()) ? result.release() : nullptr; + registerStep<NimCompilerBuildStep>(Constants::C_NIMCOMPILERBUILDSTEP_ID); + setDisplayName(tr("Nim Compiler Build Step")); + setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); + setSupportedConfiguration(Constants::C_NIMBUILDCONFIGURATION_ID); + setRepeatable(false); } } diff --git a/src/plugins/nim/project/nimcompilerbuildstepfactory.h b/src/plugins/nim/project/nimcompilerbuildstepfactory.h index 9ccb6cbde6..a19c34792f 100644 --- a/src/plugins/nim/project/nimcompilerbuildstepfactory.h +++ b/src/plugins/nim/project/nimcompilerbuildstepfactory.h @@ -29,18 +29,12 @@ namespace Nim { -class NimCompilerBuildStepFactory : public ProjectExplorer::IBuildStepFactory +class NimCompilerBuildStepFactory : public ProjectExplorer::BuildStepFactory { Q_OBJECT public: - NimCompilerBuildStepFactory(QObject *parent = nullptr); - - QList<ProjectExplorer::BuildStepInfo> - availableSteps(ProjectExplorer::BuildStepList *parent) const override; - - ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, Core::Id id) override; - ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *product) override; + NimCompilerBuildStepFactory(); }; } diff --git a/src/plugins/nim/project/nimcompilercleanstepfactory.cpp b/src/plugins/nim/project/nimcompilercleanstepfactory.cpp index 2478d33fd3..eaac014dde 100644 --- a/src/plugins/nim/project/nimcompilercleanstepfactory.cpp +++ b/src/plugins/nim/project/nimcompilercleanstepfactory.cpp @@ -31,38 +31,18 @@ #include <projectexplorer/projectexplorerconstants.h> -#include <memory> - using namespace ProjectExplorer; namespace Nim { -NimCompilerCleanStepFactory::NimCompilerCleanStepFactory(QObject *parent) - : IBuildStepFactory(parent) -{} - -QList<BuildStepInfo> NimCompilerCleanStepFactory::availableSteps(BuildStepList *parent) const -{ - if (parent->id() != ProjectExplorer::Constants::BUILDSTEPS_CLEAN) - return {}; - - auto bc = qobject_cast<NimBuildConfiguration *>(parent->parent()); - if (!bc || bc->hasNimCompilerCleanStep()) - return {}; - - return {{Constants::C_NIMCOMPILERCLEANSTEP_ID, - tr(Nim::Constants::C_NIMCOMPILERCLEANSTEP_DISPLAY), - BuildStepInfo::Unclonable}}; -} - -BuildStep *NimCompilerCleanStepFactory::create(BuildStepList *parent, Core::Id) -{ - return new NimCompilerCleanStep(parent); -} - -BuildStep *NimCompilerCleanStepFactory::clone(BuildStepList *, BuildStep *) +NimCompilerCleanStepFactory::NimCompilerCleanStepFactory() { - return nullptr; + registerStep<NimCompilerCleanStep>(Constants::C_NIMCOMPILERCLEANSTEP_ID); + setFlags(BuildStepInfo::Unclonable); + setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN); + setSupportedConfiguration(Constants::C_NIMBUILDCONFIGURATION_ID); + setRepeatable(false); + setDisplayName(tr(Nim::Constants::C_NIMCOMPILERCLEANSTEP_DISPLAY)); } } diff --git a/src/plugins/nim/project/nimcompilercleanstepfactory.h b/src/plugins/nim/project/nimcompilercleanstepfactory.h index 0ae04e5813..a3b5c3d099 100644 --- a/src/plugins/nim/project/nimcompilercleanstepfactory.h +++ b/src/plugins/nim/project/nimcompilercleanstepfactory.h @@ -29,18 +29,12 @@ namespace Nim { -class NimCompilerCleanStepFactory : public ProjectExplorer::IBuildStepFactory +class NimCompilerCleanStepFactory : public ProjectExplorer::BuildStepFactory { Q_OBJECT public: - NimCompilerCleanStepFactory(QObject *parent = nullptr); - - QList<ProjectExplorer::BuildStepInfo> - availableSteps(ProjectExplorer::BuildStepList *parent) const override; - - ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, Core::Id id) override; - ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *product) override; + NimCompilerCleanStepFactory(); }; } diff --git a/src/plugins/nim/project/nimrunconfiguration.cpp b/src/plugins/nim/project/nimrunconfiguration.cpp index 341eeba5f4..177f3f938b 100644 --- a/src/plugins/nim/project/nimrunconfiguration.cpp +++ b/src/plugins/nim/project/nimrunconfiguration.cpp @@ -44,7 +44,7 @@ using namespace Utils; namespace Nim { NimRunConfiguration::NimRunConfiguration(Target *target) - : RunConfiguration(target) + : RunConfiguration(target, Constants::C_NIMRUNCONFIGURATION_ID) , m_workingDirectoryAspect(new WorkingDirectoryAspect(this, Nim::Constants::C_NIMRUNCONFIGURATION_WORKINGDIRECTORYASPECT_ID)) , m_argumentAspect(new ArgumentsAspect(this, Nim::Constants::C_NIMRUNCONFIGURATION_ARGUMENTASPECT_ID)) , m_terminalAspect(new TerminalAspect(this, Nim::Constants::C_NIMRUNCONFIGURATION_TERMINALASPECT_ID)) diff --git a/src/plugins/projectexplorer/abstractprocessstep.cpp b/src/plugins/projectexplorer/abstractprocessstep.cpp index 563cc4f97b..bfd7f0ef1d 100644 --- a/src/plugins/projectexplorer/abstractprocessstep.cpp +++ b/src/plugins/projectexplorer/abstractprocessstep.cpp @@ -89,11 +89,6 @@ AbstractProcessStep::AbstractProcessStep(BuildStepList *bsl, Core::Id id) : connect(&m_timer, &QTimer::timeout, this, &AbstractProcessStep::checkForCancel); } -AbstractProcessStep::AbstractProcessStep(BuildStepList *bsl, - AbstractProcessStep *bs) : - BuildStep(bsl, bs), m_ignoreReturnValue(bs->m_ignoreReturnValue) -{ } - /*! Deletes all existing output parsers and starts a new chain with the given parser. diff --git a/src/plugins/projectexplorer/abstractprocessstep.h b/src/plugins/projectexplorer/abstractprocessstep.h index d94734469a..1117996506 100644 --- a/src/plugins/projectexplorer/abstractprocessstep.h +++ b/src/plugins/projectexplorer/abstractprocessstep.h @@ -65,7 +65,6 @@ public: protected: AbstractProcessStep(BuildStepList *bsl, Core::Id id); - AbstractProcessStep(BuildStepList *bsl, AbstractProcessStep *bs); virtual void processStarted(); virtual void processFinished(int exitCode, QProcess::ExitStatus status); diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp index 44f883f454..b1556595de 100644 --- a/src/plugins/projectexplorer/buildconfiguration.cpp +++ b/src/plugins/projectexplorer/buildconfiguration.cpp @@ -25,6 +25,7 @@ #include "buildconfiguration.h" +#include "buildinfo.h" #include "buildsteplist.h" #include "projectexplorer.h" #include "kitmanager.h" @@ -43,6 +44,8 @@ #include <utils/qtcassert.h> #include <utils/macroexpander.h> #include <utils/algorithm.h> +#include <utils/mimetypes/mimetype.h> +#include <utils/mimetypes/mimedatabase.h> #include <QDebug> @@ -54,57 +57,13 @@ static const char BUILDDIRECTORY_KEY[] = "ProjectExplorer.BuildConfiguration.Bui namespace ProjectExplorer { -BuildConfiguration::BuildConfiguration(Target *target, Core::Id id) : - ProjectConfiguration(target), - m_clearSystemEnvironment(false) -{ - initialize(id); - Q_ASSERT(target); - auto bsl = new BuildStepList(this, Core::Id(Constants::BUILDSTEPS_BUILD)); - //: Display name of the build build step list. Used as part of the labels in the project window. - bsl->setDefaultDisplayName(tr("Build")); - m_stepLists.append(bsl); - bsl = new BuildStepList(this, Core::Id(Constants::BUILDSTEPS_CLEAN)); - //: Display name of the clean build step list. Used as part of the labels in the project window. - bsl->setDefaultDisplayName(tr("Clean")); - m_stepLists.append(bsl); - - updateCacheAndEmitEnvironmentChanged(); - - connect(target, &Target::kitChanged, - this, &BuildConfiguration::handleKitUpdate); - connect(this, &BuildConfiguration::environmentChanged, - this, &BuildConfiguration::emitBuildDirectoryChanged); - - ctor(); -} - -BuildConfiguration::BuildConfiguration(Target *target, BuildConfiguration *source) : - ProjectConfiguration(target), - m_clearSystemEnvironment(source->m_clearSystemEnvironment), - m_userEnvironmentChanges(source->m_userEnvironmentChanges), - m_buildDirectory(source->m_buildDirectory) -{ - copyFrom(source); - Q_ASSERT(target); - // Do not clone stepLists here, do that in the derived constructor instead - // otherwise BuildStepFactories might reject to set up a BuildStep for us - // since we are not yet the derived class! - - updateCacheAndEmitEnvironmentChanged(); - - connect(target, &Target::kitChanged, - this, &BuildConfiguration::handleKitUpdate); - - ctor(); -} - -void BuildConfiguration::ctor() +BuildConfiguration::BuildConfiguration(Target *target, Core::Id id) + : ProjectConfiguration(target, id) { Utils::MacroExpander *expander = macroExpander(); expander->setDisplayName(tr("Build Settings")); expander->setAccumulating(true); - expander->registerSubProvider([this] { return target()->macroExpander(); }); + expander->registerSubProvider([target] { return target->macroExpander(); }); expander->registerVariable("buildDir", tr("Build directory"), [this] { return buildDirectory().toUserOutput(); }); @@ -115,6 +74,12 @@ void BuildConfiguration::ctor() expander->registerPrefix(Constants::VAR_CURRENTBUILD_ENV, tr("Variables in the current build environment"), [this](const QString &var) { return environment().value(var); }); + + updateCacheAndEmitEnvironmentChanged(); + connect(target, &Target::kitChanged, + this, &BuildConfiguration::handleKitUpdate); + connect(this, &BuildConfiguration::environmentChanged, + this, &BuildConfiguration::emitBuildDirectoryChanged); } Utils::FileName BuildConfiguration::buildDirectory() const @@ -136,6 +101,16 @@ void BuildConfiguration::setBuildDirectory(const Utils::FileName &dir) emitBuildDirectoryChanged(); } +void BuildConfiguration::initialize(const BuildInfo *info) +{ + setDisplayName(info->displayName); + setDefaultDisplayName(info->displayName); + setBuildDirectory(info->buildDirectory); + + m_stepLists.append(new BuildStepList(this, Constants::BUILDSTEPS_BUILD)); + m_stepLists.append(new BuildStepList(this, Constants::BUILDSTEPS_CLEAN)); +} + QList<NamedWidget *> BuildConfiguration::createSubConfigWidgets() { return QList<NamedWidget *>() << new BuildEnvironmentWidget(this); @@ -183,16 +158,12 @@ bool BuildConfiguration::fromMap(const QVariantMap &map) qWarning() << "No data for build step list" << i << "found!"; continue; } - auto list = new BuildStepList(this, Core::Id()); + auto list = new BuildStepList(this, idFromMap(data)); if (!list->fromMap(data)) { qWarning() << "Failed to restore build step list" << i; delete list; return false; } - if (list->id() == Constants::BUILDSTEPS_BUILD) - list->setDefaultDisplayName(tr("Build")); - else if (list->id() == Constants::BUILDSTEPS_CLEAN) - list->setDefaultDisplayName(tr("Clean")); m_stepLists.append(list); } @@ -290,19 +261,6 @@ void BuildConfiguration::setUserEnvironmentChanges(const QList<Utils::Environmen updateCacheAndEmitEnvironmentChanged(); } -void BuildConfiguration::cloneSteps(BuildConfiguration *source) -{ - if (source == this) - return; - qDeleteAll(m_stepLists); - m_stepLists.clear(); - foreach (BuildStepList *bsl, source->m_stepLists) { - auto newBsl = new BuildStepList(this, bsl); - newBsl->cloneSteps(bsl); - m_stepLists.append(newBsl); - } -} - bool BuildConfiguration::isEnabled() const { return true; @@ -360,12 +318,18 @@ void BuildConfiguration::prependCompilerPathToEnvironment(Kit *k, Utils::Environ // IBuildConfigurationFactory /// -IBuildConfigurationFactory::IBuildConfigurationFactory(QObject *parent) : - QObject(parent) -{ } +int IBuildConfigurationFactory::priority(const Target *parent) const +{ + return canHandle(parent) ? 0 : -1; +} -IBuildConfigurationFactory::~IBuildConfigurationFactory() -{ } +int IBuildConfigurationFactory::priority(const Kit *k, const QString &projectPath) const +{ + QTC_ASSERT(!m_supportedProjectMimeTypeName.isEmpty(), return -1); + if (k && Utils::mimeTypeForFile(projectPath).matchesName(m_supportedProjectMimeTypeName)) + return 0; + return -1; +} // restore IBuildConfigurationFactory *IBuildConfigurationFactory::find(Target *parent, const QVariantMap &map) @@ -442,4 +406,89 @@ IBuildConfigurationFactory *IBuildConfigurationFactory::find(Target *parent, Bui } return factory; } + +void IBuildConfigurationFactory::setSupportedProjectType(Core::Id id) +{ + m_supportedProjectType = id; +} + +void IBuildConfigurationFactory::setSupportedProjectMimeTypeName(const QString &mimeTypeName) +{ + m_supportedProjectMimeTypeName = mimeTypeName; +} + +void IBuildConfigurationFactory::setSupportedTargetDeviceTypes(const QList<Core::Id> &ids) +{ + m_supportedTargetDeviceTypes = ids; +} + +bool IBuildConfigurationFactory::canHandle(const Target *target) const +{ + if (m_supportedProjectType.isValid() && m_supportedProjectType != target->project()->id()) + return false; + + if (!target->project()->supportsKit(target->kit())) + return false; + + if (!m_supportedTargetDeviceTypes.isEmpty()) + if (!m_supportedTargetDeviceTypes.contains( + DeviceTypeKitInformation::deviceTypeId(target->kit()))) + return false; + + return true; +} + +BuildConfiguration *IBuildConfigurationFactory::create(Target *parent, const BuildInfo *info) const +{ + if (!canHandle(parent)) + return nullptr; + QTC_ASSERT(m_creator, return nullptr); + BuildConfiguration *bc = m_creator(parent); + if (!bc) + return nullptr; + bc->initialize(info); + return bc; +} + +bool IBuildConfigurationFactory::canClone(const Target *parent, BuildConfiguration *product) const +{ + if (!canHandle(parent)) + return false; + const Core::Id id = product->id(); + return id == m_buildConfigId; +} + +BuildConfiguration *IBuildConfigurationFactory::restore(Target *parent, const QVariantMap &map) +{ + if (!canRestore(parent, map)) + return nullptr; + QTC_ASSERT(m_creator, return nullptr); + BuildConfiguration *bc = m_creator(parent); + QTC_ASSERT(bc, return nullptr); + if (!bc->fromMap(map)) { + delete bc; + bc = nullptr; + } + return bc; +} + +bool IBuildConfigurationFactory::canRestore(const Target *parent, const QVariantMap &map) const +{ + if (!canHandle(parent)) + return false; + const Core::Id id = idFromMap(map); + return id.name().startsWith(m_buildConfigId.name()); +} + +BuildConfiguration *IBuildConfigurationFactory::clone(Target *parent, BuildConfiguration *product) +{ + QTC_ASSERT(m_creator, return nullptr); + if (!canClone(parent, product)) + return nullptr; + BuildConfiguration *bc = m_creator(parent); + QVariantMap data = product->toMap(); + bc->fromMap(data); + return bc; +} + } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/buildconfiguration.h b/src/plugins/projectexplorer/buildconfiguration.h index 08307eae58..3bc718fd51 100644 --- a/src/plugins/projectexplorer/buildconfiguration.h +++ b/src/plugins/projectexplorer/buildconfiguration.h @@ -33,7 +33,6 @@ namespace ProjectExplorer { -class BuildConfiguration; class BuildInfo; class NamedWidget; class BuildStepList; @@ -45,9 +44,11 @@ class PROJECTEXPLORER_EXPORT BuildConfiguration : public ProjectConfiguration { Q_OBJECT -public: - // ctors are protected +protected: + friend class IBuildConfigurationFactory; + explicit BuildConfiguration(Target *target, Core::Id id); +public: Utils::FileName buildDirectory() const; Utils::FileName rawBuildDirectory() const; void setBuildDirectory(const Utils::FileName &dir); @@ -100,19 +101,14 @@ signals: void buildTypeChanged(); protected: - BuildConfiguration(Target *target, Core::Id id); - BuildConfiguration(Target *target, BuildConfiguration *source); - - void cloneSteps(BuildConfiguration *source); + virtual void initialize(const BuildInfo *info); void updateCacheAndEmitEnvironmentChanged(); private: void handleKitUpdate(); void emitBuildDirectoryChanged(); - void ctor(); - - bool m_clearSystemEnvironment; + bool m_clearSystemEnvironment = false; QList<Utils::EnvironmentItem> m_userEnvironmentChanges; QList<BuildStepList *> m_stepLists; Utils::FileName m_buildDirectory; @@ -124,37 +120,62 @@ class PROJECTEXPLORER_EXPORT IBuildConfigurationFactory : public QObject { Q_OBJECT -public: - explicit IBuildConfigurationFactory(QObject *parent = nullptr); - ~IBuildConfigurationFactory() override; +protected: + IBuildConfigurationFactory() = default; +public: // The priority is negative if this factory can not create anything for the target. // It is 0 for the "default" factory that wants to handle the target. // Add 100 for each specialization. - virtual int priority(const Target *parent) const = 0; + virtual int priority(const Target *parent) const; // List of build information that can be used to create a new build configuration via // "Add Build Configuration" button. virtual QList<BuildInfo *> availableBuilds(const Target *parent) const = 0; - virtual int priority(const Kit *k, const QString &projectPath) const = 0; + virtual int priority(const Kit *k, const QString &projectPath) const; // List of build information that can be used to initially set up a new build configuration. virtual QList<BuildInfo *> availableSetups(const Kit *k, const QString &projectPath) const = 0; - virtual BuildConfiguration *create(Target *parent, const BuildInfo *info) const = 0; + BuildConfiguration *create(Target *parent, const BuildInfo *info) const; // used to recreate the runConfigurations when restoring settings - virtual bool canRestore(const Target *parent, const QVariantMap &map) const = 0; - virtual BuildConfiguration *restore(Target *parent, const QVariantMap &map) = 0; - virtual bool canClone(const Target *parent, BuildConfiguration *product) const = 0; - virtual BuildConfiguration *clone(Target *parent, BuildConfiguration *product) = 0; + bool canRestore(const Target *parent, const QVariantMap &map) const; + BuildConfiguration *restore(Target *parent, const QVariantMap &map); + bool canClone(const Target *parent, BuildConfiguration *product) const; + BuildConfiguration *clone(Target *parent, BuildConfiguration *product); static IBuildConfigurationFactory *find(Target *parent, const QVariantMap &map); static IBuildConfigurationFactory *find(const Kit *k, const QString &projectPath); static IBuildConfigurationFactory *find(Target *parent); static IBuildConfigurationFactory *find(Target *parent, BuildConfiguration *bc); + virtual bool canHandle(const ProjectExplorer::Target *t) const; + +protected: + void setSupportedProjectType(Core::Id id); + void setSupportedProjectMimeTypeName(const QString &mimeTypeName); + void setSupportedTargetDeviceTypes(const QList<Core::Id> &ids); + void setDefaultDisplayName(const QString &defaultDisplayName); + + using BuildConfigurationCreator = std::function<BuildConfiguration *(Target *)>; + + template <class BuildConfig> + void registerBuildConfiguration(Core::Id buildConfigId) + { + setObjectName(buildConfigId.toString() + "BuildConfigurationFactory"); + m_creator = [](Target *t) { return new BuildConfig(t); }; + m_buildConfigId = buildConfigId; + } + signals: void availableCreationIdsChanged(); + +private: + BuildConfigurationCreator m_creator; + Core::Id m_buildConfigId; + Core::Id m_supportedProjectType; + QList<Core::Id> m_supportedTargetDeviceTypes; + QString m_supportedProjectMimeTypeName; }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/buildstep.cpp b/src/plugins/projectexplorer/buildstep.cpp index 40c31f0c9f..ff2bf2bf3f 100644 --- a/src/plugins/projectexplorer/buildstep.cpp +++ b/src/plugins/projectexplorer/buildstep.cpp @@ -28,9 +28,12 @@ #include "buildconfiguration.h" #include "buildsteplist.h" #include "deployconfiguration.h" +#include "kitinformation.h" +#include "project.h" #include "target.h" #include <utils/algorithm.h> +#include <utils/qtcassert.h> /*! \class ProjectExplorer::BuildStep @@ -109,26 +112,10 @@ static const char buildStepEnabledKey[] = "ProjectExplorer.BuildStep.Enabled"; -using namespace ProjectExplorer; +namespace ProjectExplorer { BuildStep::BuildStep(BuildStepList *bsl, Core::Id id) : - ProjectConfiguration(bsl), m_enabled(true) -{ - initialize(id); - Q_ASSERT(bsl); - ctor(); -} - -BuildStep::BuildStep(BuildStepList *bsl, BuildStep *bs) : - ProjectConfiguration(bsl), m_enabled(bs->m_enabled) -{ - copyFrom(bs); - Q_ASSERT(bsl); - setDisplayName(bs->displayName()); - ctor(); -} - -void BuildStep::ctor() + ProjectConfiguration(bsl, id) { Utils::MacroExpander *expander = macroExpander(); expander->setDisplayName(tr("Build Step")); @@ -225,17 +212,133 @@ bool BuildStep::enabled() const return m_enabled; } -IBuildStepFactory::IBuildStepFactory(QObject *parent) : - QObject(parent) +BuildStepFactory::BuildStepFactory() { } -BuildStep *IBuildStepFactory::restore(BuildStepList *parent, const QVariantMap &map) +bool BuildStepFactory::canHandle(BuildStepList *bsl) const +{ + if (!m_supportedStepLists.isEmpty() && !m_supportedStepLists.contains(bsl->id())) + return false; + + auto config = qobject_cast<ProjectConfiguration *>(bsl->parent()); + + if (!m_supportedDeviceTypes.isEmpty()) { + Target *target = bsl->target(); + QTC_ASSERT(target, return false); + Core::Id deviceType = DeviceTypeKitInformation::deviceTypeId(target->kit()); + if (!m_supportedDeviceTypes.contains(deviceType)) + return false; + } + + if (m_supportedProjectType.isValid()) { + if (!config) + return false; + Core::Id projectId = config->project()->id(); + if (projectId != m_supportedProjectType) + return false; + } + + if (!m_isRepeatable && bsl->contains(m_info.id)) + return false; + + if (m_supportedConfiguration.isValid()) { + if (!config) + return false; + Core::Id configId = config->id(); + if (configId != m_supportedConfiguration) + return false; + } + + return true; +} + +void BuildStepFactory::setDisplayName(const QString &displayName) +{ + m_info.displayName = displayName; +} + +void BuildStepFactory::setFlags(BuildStepInfo::Flags flags) +{ + m_info.flags = flags; +} + +void BuildStepFactory::setSupportedStepList(Core::Id id) +{ + m_supportedStepLists = {id}; +} + +void BuildStepFactory::setSupportedStepLists(const QList<Core::Id> &ids) +{ + m_supportedStepLists = ids; +} + +void BuildStepFactory::setSupportedConfiguration(Core::Id id) +{ + m_supportedConfiguration = id; +} + +void BuildStepFactory::setSupportedProjectType(Core::Id id) +{ + m_supportedProjectType = id; +} + +void BuildStepFactory::setSupportedDeviceType(Core::Id id) +{ + m_supportedDeviceTypes = {id}; +} + +void BuildStepFactory::setSupportedDeviceTypes(const QList<Core::Id> &ids) +{ + m_supportedDeviceTypes = ids; +} + +BuildStepInfo BuildStepFactory::stepInfo() const +{ + return m_info; +} + +Core::Id BuildStepFactory::stepId() const +{ + return m_info.id; +} + +BuildStep *BuildStepFactory::create(BuildStepList *parent, Core::Id id) +{ + BuildStep *bs = nullptr; + if (id == m_info.id) + bs = m_info.creator(parent); + return bs; +} + +BuildStep *BuildStepFactory::restore(BuildStepList *parent, const QVariantMap &map) +{ + BuildStep *bs = m_info.creator(parent); + if (!bs) + return nullptr; + if (!bs->fromMap(map)) { + QTC_CHECK(false); + delete bs; + return nullptr; + } + return bs; +} + +BuildStep *BuildStepFactory::clone(BuildStepList *parent, BuildStep *product) { - const Core::Id id = idFromMap(map); - BuildStep *bs = create(parent, id); - if (bs->fromMap(map)) - return bs; - delete bs; - return nullptr; + if ((m_info.flags & BuildStepInfo::Unclonable) != 0) + return nullptr; + if (m_info.id != product->id()) + return nullptr; + BuildStep *bs = m_info.creator(parent); + if (!bs) + return nullptr; + const QVariantMap map = product->toMap(); + if (!bs->fromMap(map)) { + QTC_CHECK(false); + delete bs; + return nullptr; + } + return bs; } +} // ProjectExplorer diff --git a/src/plugins/projectexplorer/buildstep.h b/src/plugins/projectexplorer/buildstep.h index 2fe6ee1960..adc9192060 100644 --- a/src/plugins/projectexplorer/buildstep.h +++ b/src/plugins/projectexplorer/buildstep.h @@ -28,17 +28,20 @@ #include "projectconfiguration.h" #include "projectexplorer_export.h" +#include <utils/qtcassert.h> + #include <QFutureInterface> #include <QWidget> namespace ProjectExplorer { -class Task; + class BuildConfiguration; +class BuildStepConfigWidget; +class BuildStepFactory; class BuildStepList; class DeployConfiguration; class Target; - -class BuildStepConfigWidget; +class Task; // Documentation inside. class PROJECTEXPLORER_EXPORT BuildStep : public ProjectConfiguration @@ -46,14 +49,12 @@ class PROJECTEXPLORER_EXPORT BuildStep : public ProjectConfiguration Q_OBJECT protected: - BuildStep(BuildStepList *bsl, Core::Id id); - BuildStep(BuildStepList *bsl, BuildStep *bs); + friend class BuildStepFactory; + explicit BuildStep(BuildStepList *bsl, Core::Id id); public: virtual bool init(QList<const BuildStep *> &earlierSteps) = 0; - virtual void run(QFutureInterface<bool> &fi) = 0; - virtual BuildStepConfigWidget *createConfigWidget() = 0; virtual bool immutable() const; @@ -97,8 +98,6 @@ signals: void enabledChanged(); private: - void ctor(); - bool m_enabled = true; }; @@ -111,27 +110,58 @@ public: UniqueStep = 1 << 8 // Can't be used twice in a BuildStepList }; - BuildStepInfo() {} - BuildStepInfo(Core::Id id, const QString &displayName, Flags flags = Flags()) - : id(id), displayName(displayName), flags(flags) - {} + using BuildStepCreator = std::function<BuildStep *(BuildStepList *)>; Core::Id id; QString displayName; Flags flags = Flags(); + BuildStepCreator creator; }; -class PROJECTEXPLORER_EXPORT IBuildStepFactory : public QObject +class PROJECTEXPLORER_EXPORT BuildStepFactory : public QObject { Q_OBJECT public: - explicit IBuildStepFactory(QObject *parent = nullptr); + BuildStepFactory(); + + BuildStepInfo stepInfo() const; + Core::Id stepId() const; + BuildStep *create(BuildStepList *parent, Core::Id id); + BuildStep *restore(BuildStepList *parent, const QVariantMap &map); + BuildStep *clone(BuildStepList *parent, BuildStep *product); + + virtual bool canHandle(BuildStepList *bsl) const; + +protected: + using BuildStepCreator = std::function<BuildStep *(BuildStepList *)>; + + template <class BuildStepType> + void registerStep(Core::Id id) + { + QTC_CHECK(!m_info.creator); + m_info.id = id; + m_info.creator = [](BuildStepList *bsl) { return new BuildStepType(bsl); }; + } + + void setSupportedStepList(Core::Id id); + void setSupportedStepLists(const QList<Core::Id> &ids); + void setSupportedConfiguration(Core::Id id); + void setSupportedProjectType(Core::Id id); + void setSupportedDeviceType(Core::Id id); + void setSupportedDeviceTypes(const QList<Core::Id> &ids); + void setRepeatable(bool on) { m_isRepeatable = on; } + void setDisplayName(const QString &displayName); + void setFlags(BuildStepInfo::Flags flags); + +private: + BuildStepInfo m_info; - virtual QList<BuildStepInfo> availableSteps(BuildStepList *parent) const = 0; - virtual BuildStep *create(BuildStepList *parent, Core::Id id) = 0; - virtual BuildStep *restore(BuildStepList *parent, const QVariantMap &map); - virtual BuildStep *clone(BuildStepList *parent, BuildStep *product) = 0; + Core::Id m_supportedProjectType; + QList<Core::Id> m_supportedDeviceTypes; + QList<Core::Id> m_supportedStepLists; + Core::Id m_supportedConfiguration; + bool m_isRepeatable = true; }; class PROJECTEXPLORER_EXPORT BuildStepConfigWidget : public QWidget diff --git a/src/plugins/projectexplorer/buildsteplist.cpp b/src/plugins/projectexplorer/buildsteplist.cpp index 0cb7e618a5..1d1ffab0d6 100644 --- a/src/plugins/projectexplorer/buildsteplist.cpp +++ b/src/plugins/projectexplorer/buildsteplist.cpp @@ -44,27 +44,27 @@ const char STEPS_PREFIX[] = "ProjectExplorer.BuildStepList.Step."; } // namespace -BuildStepList::BuildStepList(QObject *parent, Core::Id id) : - ProjectConfiguration(parent) -{ - Q_ASSERT(parent); - initialize(id); +BuildStepList::BuildStepList(QObject *parent, Core::Id id) + : ProjectConfiguration(parent, id) +{ + if (id == Constants::BUILDSTEPS_BUILD) { + //: Display name of the clean build step list. Used as part of the labels in the project window. + setDefaultDisplayName(tr("Build")); + } else if (id == Constants::BUILDSTEPS_CLEAN) { + //: Display name of the build build step list. Used as part of the labels in the project window. + setDefaultDisplayName(tr("Clean")); + } } -BuildStepList::BuildStepList(QObject *parent, BuildStepList *source) : - ProjectConfiguration(parent) +BuildStepList::~BuildStepList() { - copyFrom(source); - setDisplayName(source->displayName()); - Q_ASSERT(parent); - // do not clone the steps here: - // The BC is not fully set up yet and thus some of the buildstepfactories - // will fail to clone the buildsteps! + clear(); } -BuildStepList::~BuildStepList() +void BuildStepList::clear() { qDeleteAll(m_steps); + m_steps.clear(); } QVariantMap BuildStepList::toMap() const @@ -95,29 +95,6 @@ bool BuildStepList::contains(Core::Id id) const }); } -void BuildStepList::cloneSteps(BuildStepList *source) -{ - Q_ASSERT(source); - const QList<IBuildStepFactory *> factories - = ExtensionSystem::PluginManager::getObjects<IBuildStepFactory>(); - foreach (BuildStep *originalbs, source->steps()) { - foreach (IBuildStepFactory *factory, factories) { - const QList<BuildStepInfo> steps = factory->availableSteps(source); - const Core::Id sourceId = originalbs->id(); - const auto canClone = [sourceId](const BuildStepInfo &info) { - return (info.flags & BuildStepInfo::Unclonable) == 0 && info.id == sourceId; - }; - if (Utils::contains(steps, canClone)) { - if (BuildStep *clonebs = factory->clone(this, originalbs)) { - m_steps.append(clonebs); - break; - } - qWarning() << "Cloning of step " << originalbs->displayName() << " failed (continuing)."; - } - } - } -} - bool BuildStepList::isActive() const { return qobject_cast<ProjectConfiguration *>(parent())->isActive(); @@ -125,12 +102,14 @@ bool BuildStepList::isActive() const bool BuildStepList::fromMap(const QVariantMap &map) { + clear(); + // We need the ID set before trying to restore the steps! if (!ProjectConfiguration::fromMap(map)) return false; - const QList<IBuildStepFactory *> factories - = ExtensionSystem::PluginManager::getObjects<IBuildStepFactory>(); + const QList<BuildStepFactory *> factories + = ExtensionSystem::PluginManager::getObjects<BuildStepFactory>(); int maxSteps = map.value(QString::fromLatin1(STEPS_COUNT_KEY), 0).toInt(); for (int i = 0; i < maxSteps; ++i) { @@ -139,17 +118,21 @@ bool BuildStepList::fromMap(const QVariantMap &map) qWarning() << "No step data found for" << i << "(continuing)."; continue; } - foreach (IBuildStepFactory *factory, factories) { - const QList<BuildStepInfo> steps = factory->availableSteps(this); - const Core::Id id = ProjectExplorer::idFromMap(bsData); - if (Utils::contains(steps, Utils::equal(&BuildStepInfo::id, id))) { - if (BuildStep *bs = factory->restore(this, bsData)) { - appendStep(bs); - break; + bool handled = false; + Core::Id stepId = idFromMap(bsData); + for (BuildStepFactory *factory : factories) { + if (factory->stepId() == stepId) { + if (factory->canHandle(this)) { + if (BuildStep *bs = factory->restore(this, bsData)) { + appendStep(bs); + handled = true; + } else { + qWarning() << "Restoration of step" << i << "failed (continuing)."; + } } - qWarning() << "Restoration of step" << i << "failed (continuing)."; } } + QTC_CHECK(handled); } return true; } diff --git a/src/plugins/projectexplorer/buildsteplist.h b/src/plugins/projectexplorer/buildsteplist.h index 8a1c6659bc..80ef5e5310 100644 --- a/src/plugins/projectexplorer/buildsteplist.h +++ b/src/plugins/projectexplorer/buildsteplist.h @@ -41,10 +41,11 @@ class PROJECTEXPLORER_EXPORT BuildStepList : public ProjectConfiguration Q_OBJECT public: - BuildStepList(QObject *parent, Core::Id id); - BuildStepList(QObject *parent, BuildStepList *source); + explicit BuildStepList(QObject *parent, Core::Id id); ~BuildStepList() override; + void clear(); + QList<BuildStep *> steps() const; QList<BuildStep *> steps(const std::function<bool(const BuildStep *)> &filter) const; template <class BS> BS *firstOfType() { @@ -82,7 +83,6 @@ public: virtual QVariantMap toMap() const override; virtual bool fromMap(const QVariantMap &map) override; - void cloneSteps(BuildStepList *source); bool isActive() const override; diff --git a/src/plugins/projectexplorer/buildstepspage.cpp b/src/plugins/projectexplorer/buildstepspage.cpp index 64610a7b3e..d835b3f609 100644 --- a/src/plugins/projectexplorer/buildstepspage.cpp +++ b/src/plugins/projectexplorer/buildstepspage.cpp @@ -286,12 +286,12 @@ void BuildStepListWidget::init(BuildStepList *bsl) void BuildStepListWidget::updateAddBuildStepMenu() { - QMap<QString, QPair<Core::Id, IBuildStepFactory *> > map; + QMap<QString, QPair<Core::Id, BuildStepFactory *> > map; //Build up a list of possible steps and save map the display names to the (internal) name and factories. - QList<IBuildStepFactory *> factories = ExtensionSystem::PluginManager::getObjects<IBuildStepFactory>(); - foreach (IBuildStepFactory *factory, factories) { - const QList<BuildStepInfo> infos = factory->availableSteps(m_buildStepList); - for (const BuildStepInfo &info : infos) { + QList<BuildStepFactory *> factories = ExtensionSystem::PluginManager::getObjects<BuildStepFactory>(); + foreach (BuildStepFactory *factory, factories) { + if (factory->canHandle(m_buildStepList)) { + const BuildStepInfo &info = factory->stepInfo(); if (info.flags & BuildStepInfo::Uncreatable) continue; if ((info.flags & BuildStepInfo::UniqueStep) && m_buildStepList->contains(info.id)) @@ -304,11 +304,11 @@ void BuildStepListWidget::updateAddBuildStepMenu() QMenu *menu = m_addButton->menu(); menu->clear(); if (!map.isEmpty()) { - QMap<QString, QPair<Core::Id, IBuildStepFactory *> >::const_iterator it, end; + QMap<QString, QPair<Core::Id, BuildStepFactory *> >::const_iterator it, end; end = map.constEnd(); for (it = map.constBegin(); it != end; ++it) { QAction *action = menu->addAction(it.key()); - IBuildStepFactory *factory = it.value().second; + BuildStepFactory *factory = it.value().second; Core::Id id = it.value().first; connect(action, &QAction::triggered, [id, factory, this]() { diff --git a/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp b/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp index 7f357fc774..3e732af2e4 100644 --- a/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp +++ b/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp @@ -83,24 +83,13 @@ private: }; CustomExecutableRunConfiguration::CustomExecutableRunConfiguration(Target *target) - : RunConfiguration(target) + : RunConfiguration(target, CUSTOM_EXECUTABLE_ID) { addExtraAspect(new LocalEnvironmentAspect(this, LocalEnvironmentAspect::BaseEnvironmentModifier())); addExtraAspect(new ArgumentsAspect(this, "ProjectExplorer.CustomExecutableRunConfiguration.Arguments")); addExtraAspect(new TerminalAspect(this, "ProjectExplorer.CustomExecutableRunConfiguration.UseTerminal")); } -void CustomExecutableRunConfiguration::initialize(Core::Id) -{ - RunConfiguration::initialize(CUSTOM_EXECUTABLE_ID); - if (target()->activeBuildConfiguration()) - m_workingDirectory = Constants::DEFAULT_WORKING_DIR; - else - m_workingDirectory = Constants::DEFAULT_WORKING_DIR_ALTERNATE; - - setDefaultDisplayName(defaultDisplayName()); -} - // Note: Qt4Project deletes all empty customexecrunconfigs for which isConfigured() == false. CustomExecutableRunConfiguration::~CustomExecutableRunConfiguration() { diff --git a/src/plugins/projectexplorer/customexecutablerunconfiguration.h b/src/plugins/projectexplorer/customexecutablerunconfiguration.h index 483954e7af..925af00358 100644 --- a/src/plugins/projectexplorer/customexecutablerunconfiguration.h +++ b/src/plugins/projectexplorer/customexecutablerunconfiguration.h @@ -65,14 +65,10 @@ public: signals: void changed(); -protected: - void initialize(Core::Id) override; +private: bool fromMap(const QVariantMap &map) override; QString defaultDisplayName() const; -private: - void ctor(); - void configurationDialogFinished(); void setExecutable(const QString &executable); QString rawExecutable() const; diff --git a/src/plugins/projectexplorer/deployconfiguration.cpp b/src/plugins/projectexplorer/deployconfiguration.cpp index 6f44d135b1..1c3967442d 100644 --- a/src/plugins/projectexplorer/deployconfiguration.cpp +++ b/src/plugins/projectexplorer/deployconfiguration.cpp @@ -34,62 +34,51 @@ #include <extensionsystem/pluginmanager.h> +#include <utils/algorithm.h> + namespace ProjectExplorer { const char BUILD_STEP_LIST_COUNT[] = "ProjectExplorer.BuildConfiguration.BuildStepListCount"; const char BUILD_STEP_LIST_PREFIX[] = "ProjectExplorer.BuildConfiguration.BuildStepList."; const char DEFAULT_DEPLOYCONFIGURATION_ID[] = "ProjectExplorer.DefaultDeployConfiguration"; -DeployConfiguration::DeployConfiguration(Target *target, Core::Id id) : - ProjectConfiguration(target) +DeployConfiguration::DeployConfiguration(Target *target, Core::Id id) + : ProjectConfiguration(target, id), + m_stepList(this, Constants::BUILDSTEPS_DEPLOY) { - ProjectConfiguration::initialize(id); - Q_ASSERT(target); - m_stepList = new BuildStepList(this, Core::Id(Constants::BUILDSTEPS_DEPLOY)); + Utils::MacroExpander *expander = macroExpander(); + expander->setDisplayName(tr("Deploy Settings")); + expander->setAccumulating(true); + expander->registerSubProvider([target] { + BuildConfiguration *bc = target->activeBuildConfiguration(); + return bc ? bc->macroExpander() : target->macroExpander(); + }); + //: Display name of the deploy build step list. Used as part of the labels in the project window. - m_stepList->setDefaultDisplayName(tr("Deploy")); + m_stepList.setDefaultDisplayName(tr("Deploy")); //: Default DeployConfiguration display name setDefaultDisplayName(tr("Deploy locally")); - ctor(); } -DeployConfiguration::DeployConfiguration(Target *target, DeployConfiguration *source) : - ProjectConfiguration(target) +void DeployConfiguration::initialize() { - ProjectConfiguration::copyFrom(source); - Q_ASSERT(target); - // Do not clone stepLists here, do that in the derived constructor instead - // otherwise BuildStepFactories might reject to set up a BuildStep for us - // since we are not yet the derived class! - ctor(); } -void DeployConfiguration::ctor() +BuildStepList *DeployConfiguration::stepList() { - Utils::MacroExpander *expander = macroExpander(); - expander->setDisplayName(tr("Deploy Settings")); - expander->setAccumulating(true); - expander->registerSubProvider([this]() -> Utils::MacroExpander * { - BuildConfiguration *bc = target()->activeBuildConfiguration(); - return bc ? bc->macroExpander() : target()->macroExpander(); - }); + return &m_stepList; } -DeployConfiguration::~DeployConfiguration() +const BuildStepList *DeployConfiguration::stepList() const { - delete m_stepList; -} - -BuildStepList *DeployConfiguration::stepList() const -{ - return m_stepList; + return &m_stepList; } QVariantMap DeployConfiguration::toMap() const { QVariantMap map(ProjectConfiguration::toMap()); map.insert(QLatin1String(BUILD_STEP_LIST_COUNT), 1); - map.insert(QLatin1String(BUILD_STEP_LIST_PREFIX) + QLatin1Char('0'), m_stepList->toMap()); + map.insert(QLatin1String(BUILD_STEP_LIST_PREFIX) + QLatin1Char('0'), m_stepList.toMap()); return map; } @@ -118,23 +107,18 @@ bool DeployConfiguration::fromMap(const QVariantMap &map) return false; QVariantMap data = map.value(QLatin1String(BUILD_STEP_LIST_PREFIX) + QLatin1Char('0')).toMap(); if (!data.isEmpty()) { - delete m_stepList; - m_stepList = new BuildStepList(this, Core::Id()); - if (!m_stepList->fromMap(data)) { + m_stepList.clear(); + if (!m_stepList.fromMap(data)) { qWarning() << "Failed to restore deploy step list"; - delete m_stepList; - m_stepList = 0; + m_stepList.clear(); return false; } - m_stepList->setDefaultDisplayName(tr("Deploy")); + m_stepList.setDefaultDisplayName(tr("Deploy")); } else { qWarning() << "No data for deploy step list found!"; return false; } - // We assume that we hold the deploy list - Q_ASSERT(m_stepList && m_stepList->id() == Constants::BUILDSTEPS_DEPLOY); - return true; } @@ -153,129 +137,185 @@ bool DeployConfiguration::isActive() const return target()->isActive() && target()->activeDeployConfiguration() == this; } -void DeployConfiguration::cloneSteps(DeployConfiguration *source) -{ - if (source == this) - return; - delete m_stepList; - m_stepList = new BuildStepList(this, source->stepList()); - m_stepList->cloneSteps(source->stepList()); -} /// -// DefaultDeployConfiguration +// DeployConfigurationFactory /// -DefaultDeployConfiguration::DefaultDeployConfiguration(Target *target, Core::Id id) - : DeployConfiguration(target, id) -{ -} - -DefaultDeployConfiguration::DefaultDeployConfiguration(Target *target, DeployConfiguration *source) - : DeployConfiguration(target, source) +DeployConfigurationFactory::DeployConfigurationFactory() { - cloneSteps(source); + setObjectName("DeployConfigurationFactory"); } -/// -// DeployConfigurationFactory -/// - -DeployConfigurationFactory::DeployConfigurationFactory(QObject *parent) : - QObject(parent) -{ setObjectName(QLatin1String("DeployConfigurationFactory")); } - -DeployConfigurationFactory *DeployConfigurationFactory::find(Target *parent, const QVariantMap &map) +QList<Core::Id> DeployConfigurationFactory::availableCreationIds(Target *parent) const { - return ExtensionSystem::PluginManager::getObject<DeployConfigurationFactory>( - [&parent, &map](DeployConfigurationFactory *factory) { - return factory->canRestore(parent, map); - }); + if (!canHandle(parent)) + return {}; + return Utils::transform(availableBuildTargets(parent), [this](const QString &suffix) { + return m_deployConfigBaseId.withSuffix(suffix); + }); } -QList<DeployConfigurationFactory *> DeployConfigurationFactory::find(Target *parent) +QList<QString> DeployConfigurationFactory::availableBuildTargets(Target *) const { - return ExtensionSystem::PluginManager::getObjects<DeployConfigurationFactory>( - [&parent](DeployConfigurationFactory *factory) { - return !factory->availableCreationIds(parent).isEmpty(); - }); + return {QString()}; } -DeployConfigurationFactory *DeployConfigurationFactory::find(Target *parent, DeployConfiguration *dc) +QString DeployConfigurationFactory::displayNameForBuildTarget(const QString &) const { - return ExtensionSystem::PluginManager::getObject<DeployConfigurationFactory>( - [&parent, &dc](DeployConfigurationFactory *factory) { - return factory->canClone(parent, dc); - }); + return m_defaultDisplayName; } -/// -// DefaultDeployConfigurationFactory -/// - -QList<Core::Id> DefaultDeployConfigurationFactory::availableCreationIds(Target *parent) const +QString DeployConfigurationFactory::displayNameForId(Core::Id id) const { - if (!canHandle(parent)) - return QList<Core::Id>(); - return QList<Core::Id>() << Core::Id(DEFAULT_DEPLOYCONFIGURATION_ID); + return displayNameForBuildTarget(id.suffixAfter(m_deployConfigBaseId)); } -QString DefaultDeployConfigurationFactory::displayNameForId(Core::Id id) const +bool DeployConfigurationFactory::canHandle(Target *target) const { - if (id == DEFAULT_DEPLOYCONFIGURATION_ID) - //: Display name of the default deploy configuration - return DeployConfigurationFactory::tr("Deploy Configuration"); - return QString(); + if (m_supportedProjectType.isValid()) { + if (target->project()->id() != m_supportedProjectType) + return false; + } + + if (!target->project()->supportsKit(target->kit())) + return false; + + if (!m_supportedTargetDeviceTypes.isEmpty()) { + if (!m_supportedTargetDeviceTypes.contains( + DeviceTypeKitInformation::deviceTypeId(target->kit()))) + return false; + } + + return true; } -bool DefaultDeployConfigurationFactory::canCreate(Target *parent, Core::Id id) const +bool DeployConfigurationFactory::canCreate(Target *parent, Core::Id id) const { if (!canHandle(parent)) return false; - return id == DEFAULT_DEPLOYCONFIGURATION_ID; + if (!id.name().startsWith(m_deployConfigBaseId.name())) + return false; + return true; } -DeployConfiguration *DefaultDeployConfigurationFactory::create(Target *parent, Core::Id id) +DeployConfiguration *DeployConfigurationFactory::create(Target *parent, Core::Id id) { if (!canCreate(parent, id)) return nullptr; - return new DefaultDeployConfiguration(parent, id); + QTC_ASSERT(m_creator, return nullptr); + DeployConfiguration *dc = m_creator(parent); + if (!dc) + return nullptr; + dc->initialize(); + return dc; } -bool DefaultDeployConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const +bool DeployConfigurationFactory::canClone(Target *parent, DeployConfiguration *product) const { - return canCreate(parent, idFromMap(map)); + if (!canHandle(parent)) + return false; + const Core::Id id = product->id(); + if (!id.name().startsWith(m_deployConfigBaseId.name())) + return false; + return true; } -DeployConfiguration *DefaultDeployConfigurationFactory::restore(Target *parent, const QVariantMap &map) +DeployConfiguration *DeployConfigurationFactory::clone(Target *parent, DeployConfiguration *product) +{ + QTC_ASSERT(m_creator, return nullptr); + if (!canClone(parent, product)) + return nullptr; + DeployConfiguration *dc = m_creator(parent); + QVariantMap data = product->toMap(); + dc->fromMap(data); + return dc; +} + +DeployConfiguration *DeployConfigurationFactory::restore(Target *parent, const QVariantMap &map) { if (!canRestore(parent, map)) return nullptr; - auto dc = new DefaultDeployConfiguration(parent, idFromMap(map)); + QTC_ASSERT(m_creator, return nullptr); + DeployConfiguration *dc = m_creator(parent); + QTC_ASSERT(dc, return nullptr); if (!dc->fromMap(map)) { delete dc; - return nullptr; + dc = nullptr; } return dc; } -bool DefaultDeployConfigurationFactory::canClone(Target *parent, DeployConfiguration *product) const +bool DeployConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const { - return canCreate(parent, product->id()); + if (!canHandle(parent)) + return false; + const Core::Id id = idFromMap(map); + return id.name().startsWith(m_deployConfigBaseId.name()); } -DeployConfiguration *DefaultDeployConfigurationFactory::clone(Target *parent, DeployConfiguration *product) +DeployConfigurationFactory *DeployConfigurationFactory::find(Target *parent, const QVariantMap &map) { - if (!canClone(parent, product)) - return nullptr; - return new DefaultDeployConfiguration(parent, product); + return ExtensionSystem::PluginManager::getObject<DeployConfigurationFactory>( + [&parent, &map](DeployConfigurationFactory *factory) { + return factory->canRestore(parent, map); + }); +} + +QList<DeployConfigurationFactory *> DeployConfigurationFactory::find(Target *parent) +{ + return ExtensionSystem::PluginManager::getObjects<DeployConfigurationFactory>( + [&parent](DeployConfigurationFactory *factory) { + return !factory->availableCreationIds(parent).isEmpty(); + }); +} + +DeployConfigurationFactory *DeployConfigurationFactory::find(Target *parent, DeployConfiguration *dc) +{ + return ExtensionSystem::PluginManager::getObject<DeployConfigurationFactory>( + [&parent, &dc](DeployConfigurationFactory *factory) { + return factory->canClone(parent, dc); + }); +} + +void DeployConfigurationFactory::setSupportedTargetDeviceTypes(const QList<Core::Id> &ids) +{ + m_supportedTargetDeviceTypes = ids; +} + +void DeployConfigurationFactory::setDefaultDisplayName(const QString &defaultDisplayName) +{ + m_defaultDisplayName = defaultDisplayName; +} + +void DeployConfigurationFactory::setSupportedProjectType(Core::Id id) +{ + m_supportedProjectType = id; +} + +/// +// DefaultDeployConfigurationFactory +/// + +DefaultDeployConfigurationFactory::DefaultDeployConfigurationFactory() +{ + struct DefaultDeployConfiguration : DeployConfiguration + { + DefaultDeployConfiguration(Target *t) + : DeployConfiguration(t, DEFAULT_DEPLOYCONFIGURATION_ID) + {} + }; + + registerDeployConfiguration<DefaultDeployConfiguration>(DEFAULT_DEPLOYCONFIGURATION_ID); + setSupportedTargetDeviceTypes({Constants::DESKTOP_DEVICE_TYPE}); + //: Display name of the default deploy configuration + setDefaultDisplayName(DeployConfigurationFactory::tr("Deploy Configuration")); } bool DefaultDeployConfigurationFactory::canHandle(Target *parent) const { - if (!parent->project()->supportsKit(parent->kit()) || parent->project()->needsSpecialDeployment()) - return false; - return DeviceTypeKitInformation::deviceTypeId(parent->kit()) == Constants::DESKTOP_DEVICE_TYPE; + return DeployConfigurationFactory::canHandle(parent) + && !parent->project()->needsSpecialDeployment(); } } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/deployconfiguration.h b/src/plugins/projectexplorer/deployconfiguration.h index db3b37c5c3..4e42e5e00f 100644 --- a/src/plugins/projectexplorer/deployconfiguration.h +++ b/src/plugins/projectexplorer/deployconfiguration.h @@ -27,12 +27,9 @@ #include "projectexplorer_export.h" +#include "buildsteplist.h" #include "projectconfiguration.h" -#include <QString> - -QT_FORWARD_DECLARE_CLASS(QStringList) - namespace ProjectExplorer { class BuildStepList; @@ -44,11 +41,16 @@ class PROJECTEXPLORER_EXPORT DeployConfiguration : public ProjectConfiguration { Q_OBJECT +protected: + friend class DeployConfigurationFactory; + explicit DeployConfiguration(Target *target, Core::Id id); + public: - // ctors are protected - ~DeployConfiguration() override; + ~DeployConfiguration() override = default; + virtual void initialize(); - BuildStepList *stepList() const; + BuildStepList *stepList(); + const BuildStepList *stepList() const; bool fromMap(const QVariantMap &map) override; QVariantMap toMap() const override; @@ -66,26 +68,8 @@ public: signals: void enabledChanged(); -protected: - DeployConfiguration(Target *target, Core::Id id); - DeployConfiguration(Target *target, DeployConfiguration *source); - - void cloneSteps(DeployConfiguration *source); - private: - void ctor(); - - BuildStepList *m_stepList = nullptr; -}; - -class PROJECTEXPLORER_EXPORT DefaultDeployConfiguration : public DeployConfiguration -{ - Q_OBJECT - friend class DefaultDeployConfigurationFactory; // for the ctors - -protected: - DefaultDeployConfiguration(Target *target, Core::Id id); - DefaultDeployConfiguration(Target *target, DeployConfiguration *source); + BuildStepList m_stepList; }; class PROJECTEXPLORER_EXPORT DeployConfigurationFactory : public QObject @@ -93,43 +77,66 @@ class PROJECTEXPLORER_EXPORT DeployConfigurationFactory : public QObject Q_OBJECT public: - explicit DeployConfigurationFactory(QObject *parent = nullptr); + DeployConfigurationFactory(); // used to show the list of possible additons to a target, returns a list of types - virtual QList<Core::Id> availableCreationIds(Target *parent) const = 0; + QList<Core::Id> availableCreationIds(Target *parent) const; // used to translate the types to names to display to the user - virtual QString displayNameForId(Core::Id id) const = 0; + QString displayNameForId(Core::Id id) const; - virtual bool canCreate(Target *parent, Core::Id id) const = 0; - virtual DeployConfiguration *create(Target *parent, Core::Id id) = 0; + virtual bool canHandle(ProjectExplorer::Target *target) const; + + bool canCreate(Target *parent, Core::Id id) const; + virtual DeployConfiguration *create(Target *parent, Core::Id id); // used to recreate the runConfigurations when restoring settings - virtual bool canRestore(Target *parent, const QVariantMap &map) const = 0; - virtual DeployConfiguration *restore(Target *parent, const QVariantMap &map) = 0; - virtual bool canClone(Target *parent, DeployConfiguration *product) const = 0; - virtual DeployConfiguration *clone(Target *parent, DeployConfiguration *product) = 0; + bool canRestore(Target *parent, const QVariantMap &map) const; + DeployConfiguration *restore(Target *parent, const QVariantMap &map); + bool canClone(Target *parent, DeployConfiguration *product) const; + DeployConfiguration *clone(Target *parent, DeployConfiguration *product); static DeployConfigurationFactory *find(Target *parent, const QVariantMap &map); static QList<DeployConfigurationFactory *> find(Target *parent); static DeployConfigurationFactory *find(Target *parent, DeployConfiguration *dc); + void setSupportedTargetDeviceTypes(const QList<Core::Id> &ids); + void setDefaultDisplayName(const QString &defaultDisplayName); + void setSupportedProjectType(Core::Id id); + +protected: + virtual QList<QString> availableBuildTargets(Target *parent) const; + virtual QString displayNameForBuildTarget(const QString &buildTarget) const; + + using DeployConfigurationCreator = std::function<DeployConfiguration *(Target *)>; + + template <class DeployConfig> + void registerDeployConfiguration(Core::Id deployConfigBaseId) + { + m_creator = [this](Target *t) { + auto dc = new DeployConfig(t); + dc->setDefaultDisplayName(m_defaultDisplayName); + return dc; + }; + m_deployConfigBaseId = deployConfigBaseId; + } + signals: void availableCreationIdsChanged(); + +private: + DeployConfigurationCreator m_creator; + Core::Id m_deployConfigBaseId; + Core::Id m_supportedProjectType; + QList<Core::Id> m_supportedTargetDeviceTypes; + QString m_defaultDisplayName; }; class DefaultDeployConfigurationFactory : public DeployConfigurationFactory { public: - QList<Core::Id> availableCreationIds(Target *parent) const override; - // used to translate the types to names to display to the user - QString displayNameForId(Core::Id id) const override; - bool canCreate(Target *parent, Core::Id id) const override; - DeployConfiguration *create(Target *parent, Core::Id id) override; - bool canRestore(Target *parent, const QVariantMap &map) const override; - DeployConfiguration *restore(Target *parent, const QVariantMap &map) override; - bool canClone(Target *parent, DeployConfiguration *product) const override; - DeployConfiguration *clone(Target *parent, DeployConfiguration *product) override; + DefaultDeployConfigurationFactory(); + private: - bool canHandle(Target *parent) const; + bool canHandle(Target *parent) const override; }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/devicesupport/devicecheckbuildstep.cpp b/src/plugins/projectexplorer/devicesupport/devicecheckbuildstep.cpp index a978543354..2d6164c9ae 100644 --- a/src/plugins/projectexplorer/devicesupport/devicecheckbuildstep.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicecheckbuildstep.cpp @@ -35,14 +35,8 @@ using namespace ProjectExplorer; -DeviceCheckBuildStep::DeviceCheckBuildStep(BuildStepList *bsl, Core::Id id) - : BuildStep(bsl, id) -{ - setDefaultDisplayName(stepDisplayName()); -} - -DeviceCheckBuildStep::DeviceCheckBuildStep(BuildStepList *bsl, DeviceCheckBuildStep *bs) - : BuildStep(bsl, bs) +DeviceCheckBuildStep::DeviceCheckBuildStep(BuildStepList *bsl) + : BuildStep(bsl, stepId()) { setDefaultDisplayName(stepDisplayName()); } diff --git a/src/plugins/projectexplorer/devicesupport/devicecheckbuildstep.h b/src/plugins/projectexplorer/devicesupport/devicecheckbuildstep.h index b56f12f078..7886a9e8ab 100644 --- a/src/plugins/projectexplorer/devicesupport/devicecheckbuildstep.h +++ b/src/plugins/projectexplorer/devicesupport/devicecheckbuildstep.h @@ -36,8 +36,7 @@ class PROJECTEXPLORER_EXPORT DeviceCheckBuildStep : public BuildStep { Q_OBJECT public: - DeviceCheckBuildStep(BuildStepList *bsl, Core::Id id); - DeviceCheckBuildStep(BuildStepList *bsl, DeviceCheckBuildStep *bs); + explicit DeviceCheckBuildStep(BuildStepList *bsl); bool init(QList<const BuildStep *> &earlierSteps) override; diff --git a/src/plugins/projectexplorer/processstep.cpp b/src/plugins/projectexplorer/processstep.cpp index ae7b2a31a0..afe2f9ada4 100644 --- a/src/plugins/projectexplorer/processstep.cpp +++ b/src/plugins/projectexplorer/processstep.cpp @@ -46,20 +46,8 @@ const char PROCESS_WORKINGDIRECTORY_KEY[] = "ProjectExplorer.ProcessStep.Working const char PROCESS_ARGUMENTS_KEY[] = "ProjectExplorer.ProcessStep.Arguments"; } -ProcessStep::ProcessStep(BuildStepList *bsl) : AbstractProcessStep(bsl, Core::Id(PROCESS_STEP_ID)) -{ - ctor(); -} - -ProcessStep::ProcessStep(BuildStepList *bsl, ProcessStep *bs) : AbstractProcessStep(bsl, bs), - m_command(bs->m_command), - m_arguments(bs->m_arguments), - m_workingDirectory(bs->m_workingDirectory) -{ - ctor(); -} - -void ProcessStep::ctor() +ProcessStep::ProcessStep(BuildStepList *bsl) + : AbstractProcessStep(bsl, PROCESS_STEP_ID) { //: Default ProcessStep display name setDefaultDisplayName(tr("Custom Process Step")); @@ -156,21 +144,13 @@ bool ProcessStep::fromMap(const QVariantMap &map) // ProcessStepFactory //******* -QList<BuildStepInfo> ProcessStepFactory::availableSteps(BuildStepList *parent) const -{ - Q_UNUSED(parent); - return {{PROCESS_STEP_ID, ProcessStep::tr("Custom Process Step", "item in combobox")}}; -} - -BuildStep *ProcessStepFactory::create(BuildStepList *parent, Core::Id id) -{ - Q_UNUSED(id); - return new ProcessStep(parent); -} - -BuildStep *ProcessStepFactory::clone(BuildStepList *parent, BuildStep *bs) +ProcessStepFactory::ProcessStepFactory() { - return new ProcessStep(parent, static_cast<ProcessStep *>(bs)); + registerStep<ProcessStep>(PROCESS_STEP_ID); + setDisplayName(ProcessStep::tr("Custom Process Step", "item in combobox")); + setSupportedStepLists({ProjectExplorer::Constants::BUILDSTEPS_BUILD, + ProjectExplorer::Constants::BUILDSTEPS_CLEAN, + ProjectExplorer::Constants::BUILDSTEPS_DEPLOY}); } //******* diff --git a/src/plugins/projectexplorer/processstep.h b/src/plugins/projectexplorer/processstep.h index 8d92fca092..7da9f4ec09 100644 --- a/src/plugins/projectexplorer/processstep.h +++ b/src/plugins/projectexplorer/processstep.h @@ -29,19 +29,14 @@ #include "abstractprocessstep.h" namespace ProjectExplorer { - namespace Internal { -class ProcessStepFactory : public IBuildStepFactory +class ProcessStepFactory : public BuildStepFactory { Q_OBJECT public: - QList<ProjectExplorer::BuildStepInfo> - availableSteps(ProjectExplorer::BuildStepList *parent) const override; - - BuildStep *create(BuildStepList *parent, Core::Id id) override; - BuildStep *clone(BuildStepList *parent, BuildStep *product) override; + ProcessStepFactory(); }; class ProcessStep : public AbstractProcessStep @@ -68,13 +63,8 @@ public: QVariantMap toMap() const override; -protected: - ProcessStep(BuildStepList *bsl, ProcessStep *bs); - - bool fromMap(const QVariantMap &map) override; - private: - void ctor(); + bool fromMap(const QVariantMap &map) override; QString m_command; QString m_arguments; diff --git a/src/plugins/projectexplorer/projectconfiguration.cpp b/src/plugins/projectexplorer/projectconfiguration.cpp index 0362c747c9..3ab01fba2f 100644 --- a/src/plugins/projectexplorer/projectconfiguration.cpp +++ b/src/plugins/projectexplorer/projectconfiguration.cpp @@ -25,33 +25,34 @@ #include "projectconfiguration.h" +#include <utils/qtcassert.h> + using namespace ProjectExplorer; const char CONFIGURATION_ID_KEY[] = "ProjectExplorer.ProjectConfiguration.Id"; const char DISPLAY_NAME_KEY[] = "ProjectExplorer.ProjectConfiguration.DisplayName"; const char DEFAULT_DISPLAY_NAME_KEY[] = "ProjectExplorer.ProjectConfiguration.DefaultDisplayName"; -ProjectConfiguration::ProjectConfiguration(QObject *parent) - : QObject(parent) -{} - -void ProjectConfiguration::initialize(Core::Id id) +ProjectConfiguration::ProjectConfiguration(QObject *parent, Core::Id id) + : QObject(parent), m_id(id) { - m_id = id; + QTC_CHECK(id.isValid()); setObjectName(id.toString()); } -void ProjectConfiguration::copyFrom(const ProjectConfiguration *source) +Core::Id ProjectConfiguration::id() const { - Q_ASSERT(source); - m_id = source->m_id; - m_defaultDisplayName = source->m_defaultDisplayName; - m_displayName = tr("Clone of %1").arg(source->displayName()); + return m_id; } -Core::Id ProjectConfiguration::id() const +QString ProjectConfiguration::extraId() const { - return m_id; + return QString(); +} + +QString ProjectConfiguration::settingsIdKey() +{ + return QString(CONFIGURATION_ID_KEY); } QString ProjectConfiguration::displayName() const @@ -102,8 +103,9 @@ bool ProjectConfiguration::usesDefaultDisplayName() const QVariantMap ProjectConfiguration::toMap() const { + QTC_CHECK(m_id.isValid()); QVariantMap map; - map.insert(QLatin1String(CONFIGURATION_ID_KEY), m_id.toSetting()); + map.insert(QLatin1String(CONFIGURATION_ID_KEY), m_id.withSuffix(extraId()).toSetting()); map.insert(QLatin1String(DISPLAY_NAME_KEY), m_displayName); map.insert(QLatin1String(DEFAULT_DISPLAY_NAME_KEY), m_defaultDisplayName); return map; @@ -111,12 +113,14 @@ QVariantMap ProjectConfiguration::toMap() const bool ProjectConfiguration::fromMap(const QVariantMap &map) { - m_id = Core::Id::fromSetting(map.value(QLatin1String(CONFIGURATION_ID_KEY))); + Core::Id id = Core::Id::fromSetting(map.value(QLatin1String(CONFIGURATION_ID_KEY))); + QTC_ASSERT(id.toString().startsWith(m_id.toString()), return false); + m_displayName = map.value(QLatin1String(DISPLAY_NAME_KEY), QString()).toString(); m_defaultDisplayName = map.value(QLatin1String(DEFAULT_DISPLAY_NAME_KEY), m_defaultDisplayName.isEmpty() ? m_displayName : m_defaultDisplayName).toString(); - return m_id.isValid(); + return true; } Core::Id ProjectExplorer::idFromMap(const QVariantMap &map) @@ -134,16 +138,10 @@ bool StatefulProjectConfiguration::isEnabled() const return m_isEnabled; } -StatefulProjectConfiguration::StatefulProjectConfiguration(QObject *parent) : - ProjectConfiguration(parent) +StatefulProjectConfiguration::StatefulProjectConfiguration(QObject *parent, Core::Id id) : + ProjectConfiguration(parent, id) { } -void StatefulProjectConfiguration::copyFrom(const StatefulProjectConfiguration *source) -{ - ProjectConfiguration::copyFrom(source); - m_isEnabled = source->m_isEnabled; -} - void StatefulProjectConfiguration::setEnabled(bool enabled) { if (enabled == m_isEnabled) diff --git a/src/plugins/projectexplorer/projectconfiguration.h b/src/plugins/projectexplorer/projectconfiguration.h index 38fe375e02..ec23948571 100644 --- a/src/plugins/projectexplorer/projectconfiguration.h +++ b/src/plugins/projectexplorer/projectconfiguration.h @@ -42,11 +42,14 @@ class PROJECTEXPLORER_EXPORT ProjectConfiguration : public QObject { Q_OBJECT +protected: + explicit ProjectConfiguration(QObject *parent, Core::Id id); + public: - // ctors are protected ~ProjectConfiguration() = default; Core::Id id() const; + QString displayName() const; bool usesDefaultDisplayName() const; @@ -69,17 +72,17 @@ public: virtual bool isActive() const = 0; + // Used in settings to mangle in build targets in RunConfigurations. + virtual QString extraId() const; + + static QString settingsIdKey(); + signals: void displayNameChanged(); void toolTipChanged(); -protected: - ProjectConfiguration(QObject *parent); - void initialize(Core::Id id); - void copyFrom(const ProjectConfiguration *source); - private: - Core::Id m_id; + const Core::Id m_id; QString m_displayName; QString m_defaultDisplayName; QString m_toolTip; @@ -101,8 +104,7 @@ signals: void enabledChanged(); protected: - StatefulProjectConfiguration(QObject *parent); - void copyFrom(const StatefulProjectConfiguration *source); + StatefulProjectConfiguration(QObject *parent, Core::Id id); void setEnabled(bool enabled); diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index 512ae87491..83cbdd0249 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -191,11 +191,9 @@ void IRunConfigurationAspect::resetProjectToGlobalSettings() static std::vector<RunConfiguration::AspectFactory> theAspectFactories; -RunConfiguration::RunConfiguration(Target *target) - : StatefulProjectConfiguration(target) +RunConfiguration::RunConfiguration(Target *target, Core::Id id) + : StatefulProjectConfiguration(target, id) { - Q_ASSERT(target); - connect(target->project(), &Project::parsingStarted, this, [this]() { updateEnabledState(); }); connect(target->project(), &Project::parsingFinished, @@ -235,17 +233,6 @@ RunConfiguration::~RunConfiguration() qDeleteAll(m_aspects); } -void RunConfiguration::initialize(Core::Id id) -{ - StatefulProjectConfiguration::initialize(id); -} - -void RunConfiguration::copyFrom(const RunConfiguration *source) -{ - QVariantMap data = source->toMap(); - fromMap(data); -} - bool RunConfiguration::isActive() const { return target()->isActive() && target()->activeRunConfiguration() == this; @@ -450,20 +437,17 @@ IRunConfigurationFactory::IRunConfigurationFactory(QObject *parent) : { } -QList<Core::Id> IRunConfigurationFactory::availableCreationIds(Target *parent, CreationMode mode) const +QList<RunConfigurationCreationInfo> + IRunConfigurationFactory::availableCreators(Target *parent, CreationMode mode) const { if (!canHandle(parent)) return {}; return Utils::transform(availableBuildTargets(parent, mode), [this](const QString &suffix) { - return m_runConfigBaseId.withSuffix(suffix); + return RunConfigurationCreationInfo{this, m_runConfigBaseId, suffix, + this->displayNameForBuildTarget(suffix)}; }); } -QString IRunConfigurationFactory::displayNameForId(Core::Id id) const -{ - return displayNameForBuildTarget(id.suffixAfter(m_runConfigBaseId)); -} - QString IRunConfigurationFactory::displayNameForBuildTarget(const QString &buildTarget) const { return buildTarget; @@ -501,30 +485,30 @@ bool IRunConfigurationFactory::canCreateHelper(Target *, const QString &) const return true; } -bool IRunConfigurationFactory::canCreate(Target *parent, Core::Id id) const +RunConfiguration *IRunConfigurationFactory::create(Target *parent, Core::Id id, const QString &extra) const { if (!canHandle(parent)) - return false; - if (!id.name().startsWith(m_runConfigBaseId.name())) - return false; - return canCreateHelper(parent, id.suffixAfter(m_runConfigBaseId)); -} - -RunConfiguration *IRunConfigurationFactory::create(Target *parent, Core::Id id) -{ - if (!canCreate(parent, id)) return nullptr; + if (id != m_runConfigBaseId) + return nullptr; + if (!canCreateHelper(parent, extra)) + return nullptr; + QTC_ASSERT(m_creator, return nullptr); RunConfiguration *rc = m_creator(parent); if (!rc) return nullptr; - rc->initialize(id); - return rc; -} -bool IRunConfigurationFactory::canCloneHelper(Target *, RunConfiguration *) const -{ - return true; + // "FIX" ids by mangling in the extra data (build system target etc) + // for compatibility for the current format used in settings. + if (!extra.isEmpty()) { + QVariantMap data = rc->toMap(); + data[ProjectConfiguration::settingsIdKey()] = id.withSuffix(extra).toString(); + rc->fromMap(data); + QVariantMap data2 = rc->toMap(); + } + + return rc; } bool IRunConfigurationFactory::canClone(Target *parent, RunConfiguration *product) const @@ -532,19 +516,16 @@ bool IRunConfigurationFactory::canClone(Target *parent, RunConfiguration *produc if (!canHandle(parent)) return false; const Core::Id id = product->id(); - if (!id.name().startsWith(m_runConfigBaseId.name())) - return false; - return canCloneHelper(parent, product); + return id.name().startsWith(m_runConfigBaseId.name()); } -RunConfiguration *IRunConfigurationFactory::restore(Target *parent, const QVariantMap &map) +RunConfiguration *IRunConfigurationFactory::restore(Target *parent, const QVariantMap &map) const { if (!canRestore(parent, map)) return nullptr; QTC_ASSERT(m_creator, return nullptr); RunConfiguration *rc = m_creator(parent); QTC_ASSERT(rc, return nullptr); - rc->initialize(idFromMap(map)); if (!rc->fromMap(map)) { delete rc; rc = nullptr; @@ -560,13 +541,16 @@ bool IRunConfigurationFactory::canRestore(Target *parent, const QVariantMap &map return id.name().startsWith(m_runConfigBaseId.name()); } -RunConfiguration *IRunConfigurationFactory::clone(Target *parent, RunConfiguration *product) +RunConfiguration *IRunConfigurationFactory::clone(Target *parent, RunConfiguration *product) const { QTC_ASSERT(m_creator, return nullptr); if (!canClone(parent, product)) return nullptr; RunConfiguration *runConfig = m_creator(parent); - runConfig->copyFrom(product); + + QVariantMap data = product->toMap(); + runConfig->fromMap(data); + return runConfig; } @@ -590,7 +574,7 @@ QList<IRunConfigurationFactory *> IRunConfigurationFactory::find(Target *parent) { return ExtensionSystem::PluginManager::getObjects<IRunConfigurationFactory>( [&parent](IRunConfigurationFactory *factory) { - return !factory->availableCreationIds(parent).isEmpty(); + return !factory->availableCreators(parent).isEmpty(); }); } diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h index f9166d8312..740e400a40 100644 --- a/src/plugins/projectexplorer/runconfiguration.h +++ b/src/plugins/projectexplorer/runconfiguration.h @@ -47,6 +47,7 @@ namespace ProjectExplorer { class Abi; class BuildConfiguration; class IRunConfigurationAspect; +class IRunConfigurationFactory; class RunConfiguration; class RunConfigWidget; class RunControl; @@ -262,9 +263,7 @@ signals: protected: friend class IRunConfigurationFactory; - RunConfiguration(Target *target); - virtual void initialize(Core::Id id); - void copyFrom(const RunConfiguration *source); + RunConfiguration(Target *target, Core::Id id); /// convenience function to get current build configuration. BuildConfiguration *activeBuildConfiguration() const; @@ -274,9 +273,24 @@ protected: private: static void addAspectFactory(const AspectFactory &aspectFactory); + friend class IRunConfigurationFactory; + QList<IRunConfigurationAspect *> m_aspects; }; +class RunConfigurationCreationInfo +{ +public: + RunConfigurationCreationInfo(const IRunConfigurationFactory *factory, Core::Id id, + QString extra, QString displayName) + : factory(factory) , id(id) , extra(extra) , displayName(displayName) {} + + const IRunConfigurationFactory *factory = nullptr; + Core::Id id; + QString extra; + QString displayName; +}; + class PROJECTEXPLORER_EXPORT IRunConfigurationFactory : public QObject { Q_OBJECT @@ -285,17 +299,17 @@ public: explicit IRunConfigurationFactory(QObject *parent = nullptr); enum CreationMode {UserCreate, AutoCreate}; - QList<Core::Id> availableCreationIds(Target *parent, CreationMode mode = UserCreate) const; - QString displayNameForId(Core::Id id) const; + + QList<RunConfigurationCreationInfo> availableCreators(Target *parent, + CreationMode mode = UserCreate) const; virtual bool canHandle(Target *target) const; - bool canCreate(Target *parent, Core::Id id) const; - RunConfiguration *create(Target *parent, Core::Id id); + RunConfiguration *create(Target *parent, Core::Id id, const QString &extra) const; bool canRestore(Target *parent, const QVariantMap &map) const; - RunConfiguration *restore(Target *parent, const QVariantMap &map); + RunConfiguration *restore(Target *parent, const QVariantMap &map) const; bool canClone(Target *parent, RunConfiguration *product) const; - RunConfiguration *clone(Target *parent, RunConfiguration *product); + RunConfiguration *clone(Target *parent, RunConfiguration *product) const; static IRunConfigurationFactory *find(Target *parent, const QVariantMap &map); static IRunConfigurationFactory *find(Target *parent, RunConfiguration *rc); @@ -309,7 +323,6 @@ protected: virtual QString displayNameForBuildTarget(const QString &buildTarget) const; virtual bool canCreateHelper(Target *parent, const QString &buildTarget) const; - virtual bool canCloneHelper(Target *parent, RunConfiguration *product) const; using RunConfigurationCreator = std::function<RunConfiguration *(Target *)>; diff --git a/src/plugins/projectexplorer/runsettingspropertiespage.cpp b/src/plugins/projectexplorer/runsettingspropertiespage.cpp index 7930a78336..5687534756 100644 --- a/src/plugins/projectexplorer/runsettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/runsettingspropertiespage.cpp @@ -237,19 +237,19 @@ void RunSettingsWidget::aboutToShowAddMenu() connect(cloneAction, &QAction::triggered, this, &RunSettingsWidget::cloneRunConfiguration); } - QList<IRunConfigurationFactory *> factories = + const QList<IRunConfigurationFactory *> factories = ExtensionSystem::PluginManager::getObjects<IRunConfigurationFactory>(); QList<QAction *> menuActions; - foreach (IRunConfigurationFactory *factory, factories) { - QList<Core::Id> ids = factory->availableCreationIds(m_target); - foreach (Core::Id id, ids) { - auto action = new QAction(factory->displayNameForId(id), m_addRunMenu); - connect(action, &QAction::triggered, [factory, id, this]() { - RunConfiguration *newRC = factory->create(m_target, id); + for (IRunConfigurationFactory *factory : factories) { + const QList<RunConfigurationCreationInfo> items = factory->availableCreators(m_target); + for (const RunConfigurationCreationInfo &item : items) { + auto action = new QAction(item.displayName, m_addRunMenu); + connect(action, &QAction::triggered, [item, this] { + RunConfiguration *newRC = item.factory->create(m_target, item.id, item.extra); if (!newRC) return; - QTC_CHECK(newRC->id() == id); + QTC_CHECK(newRC->id() == item.id); m_target->addRunConfiguration(newRC); m_target->setActiveRunConfiguration(newRC); m_removeRunToolButton->setEnabled(m_target->runConfigurations().size() > 1); diff --git a/src/plugins/projectexplorer/target.cpp b/src/plugins/projectexplorer/target.cpp index 221a8d55a2..33bd4d83f0 100644 --- a/src/plugins/projectexplorer/target.cpp +++ b/src/plugins/projectexplorer/target.cpp @@ -115,10 +115,9 @@ QList<DeployConfigurationFactory *> TargetPrivate::deployFactories() const } Target::Target(Project *project, Kit *k) : - ProjectConfiguration(project), + ProjectConfiguration(project, k->id()), d(new TargetPrivate(k)) { - initialize(k->id()); QTC_CHECK(d->m_kit); connect(DeviceManager::instance(), &DeviceManager::updated, this, &Target::updateDeviceState); @@ -547,7 +546,7 @@ void Target::updateDefaultDeployConfigurations() void Target::updateDefaultRunConfigurations() { - QList<IRunConfigurationFactory *> rcFactories = IRunConfigurationFactory::find(this); + const QList<IRunConfigurationFactory *> rcFactories = IRunConfigurationFactory::find(this); if (rcFactories.isEmpty()) { qWarning("No run configuration factory found for target id '%s'.", qPrintable(id().toString())); return; @@ -565,42 +564,46 @@ void Target::updateDefaultRunConfigurations() int configuredCount = existingConfigured.count(); // find all RC ids that can get created: - QList<Core::Id> availableFactoryIds; - foreach (IRunConfigurationFactory *rcFactory, rcFactories) - availableFactoryIds.append(rcFactory->availableCreationIds(this)); + QList<RunConfigurationCreationInfo> availableFactories; + for (IRunConfigurationFactory *rcFactory : rcFactories) + availableFactories.append(rcFactory->availableCreators(this)); - QList<Core::Id> autoCreateFactoryIds; - foreach (IRunConfigurationFactory *rcFactory, rcFactories) - autoCreateFactoryIds.append(rcFactory->availableCreationIds(this, - IRunConfigurationFactory::AutoCreate)); + QList<RunConfigurationCreationInfo> autoCreateFactories; + for (IRunConfigurationFactory *rcFactory : rcFactories) + autoCreateFactories.append(rcFactory->availableCreators(this, + IRunConfigurationFactory::AutoCreate)); // Put outdated RCs into toRemove, do not bother with factories // that produce already existing RCs QList<RunConfiguration *> toRemove; - QList<Core::Id> toIgnore; + QList<RunConfigurationCreationInfo> existing; foreach (RunConfiguration *rc, existingConfigured) { - if (availableFactoryIds.contains(rc->id())) - toIgnore.append(rc->id()); // Already there - else if (project()->knowsAllBuildExecutables()) - toRemove << rc; + bool present = false; + for (const RunConfigurationCreationInfo &item : availableFactories) { + if (item.id == rc->id() && item.extra == rc->extraId()) { + existing.append(item); + present = true; + } + } + if (!present && project()->knowsAllBuildExecutables()) + toRemove.append(rc); } - foreach (Core::Id i, toIgnore) - autoCreateFactoryIds.removeAll(i); configuredCount -= toRemove.count(); // Create new RCs and put them into newConfigured/newUnconfigured - foreach (Core::Id id, autoCreateFactoryIds) { - IRunConfigurationFactory *factory = Utils::findOrDefault(rcFactories, - [this, id] (IRunConfigurationFactory *i) { - return i->canCreate(this, id); - }); - if (!factory) + foreach (const RunConfigurationCreationInfo &item, autoCreateFactories) { + bool exists = false; + for (const RunConfigurationCreationInfo &ex : existing) { + if (ex.id == item.id && ex.extra == item.extra) + exists = true; + } + if (exists) continue; - RunConfiguration *rc = factory->create(this, id); + RunConfiguration *rc = item.factory->create(this, item.id, item.extra); if (!rc) continue; - QTC_CHECK(rc->id() == id); + QTC_CHECK(rc->id() == item.id); if (!rc->isConfigured()) newUnconfigured << rc; else @@ -643,7 +646,7 @@ void Target::updateDefaultRunConfigurations() // Make sure a configured RC will be active after we delete the RCs: RunConfiguration *active = activeRunConfiguration(); - if (removalList.contains(active) || !active->isEnabled()) { + if (active && (removalList.contains(active) || !active->isEnabled())) { RunConfiguration *newConfiguredDefault = newConfigured.isEmpty() ? nullptr : newConfigured.at(0); RunConfiguration *rc @@ -796,7 +799,7 @@ bool Target::fromMap(const QVariantMap &map) qWarning("Factory '%s' failed to restore deployment configuration!", qPrintable(factory->objectName())); continue; } - QTC_CHECK(dc->id() == ProjectExplorer::idFromMap(valueMap)); + QTC_CHECK(dc->id().withSuffix(dc->extraId()) == ProjectExplorer::idFromMap(valueMap)); addDeployConfiguration(dc); if (i == activeConfiguration) setActiveDeployConfiguration(dc); @@ -824,7 +827,7 @@ bool Target::fromMap(const QVariantMap &map) RunConfiguration *rc = factory->restore(this, valueMap); if (!rc) continue; - QTC_CHECK(rc->id() == ProjectExplorer::idFromMap(valueMap)); + QTC_CHECK(rc->id().withSuffix(rc->extraId()) == ProjectExplorer::idFromMap(valueMap)); addRunConfiguration(rc); if (i == activeConfiguration) setActiveRunConfiguration(rc); diff --git a/src/plugins/pythoneditor/pythoneditorplugin.cpp b/src/plugins/pythoneditor/pythoneditorplugin.cpp index 051d124495..02ded99c42 100644 --- a/src/plugins/pythoneditor/pythoneditorplugin.cpp +++ b/src/plugins/pythoneditor/pythoneditorplugin.cpp @@ -79,11 +79,6 @@ const char PythonProjectContext[] = "PythonProjectContext"; class PythonRunConfiguration; class PythonProjectFile; -static QString scriptFromId(Core::Id id) -{ - return id.suffixAfter(PythonRunConfigurationPrefix); -} - class PythonProject : public Project { Q_OBJECT @@ -162,7 +157,6 @@ public: private: friend class ProjectExplorer::IRunConfigurationFactory; - void initialize(Core::Id id) override; QString defaultDisplayName() const; @@ -173,24 +167,17 @@ private: //////////////////////////////////////////////////////////////// PythonRunConfiguration::PythonRunConfiguration(Target *target) - : RunConfiguration(target) + : RunConfiguration(target, PythonRunConfigurationPrefix) { addExtraAspect(new LocalEnvironmentAspect(this, LocalEnvironmentAspect::BaseEnvironmentModifier())); addExtraAspect(new ArgumentsAspect(this, "PythonEditor.RunConfiguration.Arguments")); addExtraAspect(new TerminalAspect(this, "PythonEditor.RunConfiguration.UseTerminal")); - setDefaultDisplayName(defaultDisplayName()); -} - -void PythonRunConfiguration::initialize(Core::Id id) -{ - RunConfiguration::initialize(id); - - m_mainScript = scriptFromId(id); - setDisplayName(defaultDisplayName()); Environment sysEnv = Environment::systemEnvironment(); const QString exec = sysEnv.searchInPath("python").toString(); m_interpreter = exec.isEmpty() ? "python" : exec; + + setDefaultDisplayName(defaultDisplayName()); } QVariantMap PythonRunConfiguration::toMap() const diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp index 1b167d74f9..34c328be30 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp @@ -52,39 +52,70 @@ #include <QInputDialog> using namespace ProjectExplorer; +using namespace Utils; namespace QbsProjectManager { namespace Internal { static QString configNameKey() { return QStringLiteral("Qbs.configName"); } -const char QBS_BC_ID[] = "Qbs.QbsBuildConfiguration"; +static FileName defaultBuildDirectory(const QString &projectFilePath, const Kit *k, + const QString &bcName, + BuildConfiguration::BuildType buildType) +{ + const QString projectName = QFileInfo(projectFilePath).completeBaseName(); + ProjectMacroExpander expander(projectFilePath, projectName, k, bcName, buildType); + QString projectDir = Project::projectDirectory(FileName::fromString(projectFilePath)).toString(); + QString buildPath = expander.expand(Core::DocumentManager::buildDirectory()); + return FileName::fromString(FileUtils::resolvePath(projectDir, buildPath)); +} // --------------------------------------------------------------------------- // QbsBuildConfiguration: // --------------------------------------------------------------------------- -QbsBuildConfiguration::QbsBuildConfiguration(Target *target) : - BuildConfiguration(target, Core::Id(QBS_BC_ID)), - m_isParsing(true), - m_parsingError(false) +QbsBuildConfiguration::QbsBuildConfiguration(Target *target) + : BuildConfiguration(target, Constants::QBS_BC_ID) { connect(project(), &Project::parsingStarted, this, &BuildConfiguration::enabledChanged); connect(project(), &Project::parsingFinished, this, &BuildConfiguration::enabledChanged); - - BuildStepList *bsl = stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); - connect(bsl, &BuildStepList::stepInserted, this, &QbsBuildConfiguration::buildStepInserted); } -QbsBuildConfiguration::QbsBuildConfiguration(Target *target, Core::Id id) : - BuildConfiguration(target, id) -{ } - -QbsBuildConfiguration::QbsBuildConfiguration(Target *target, QbsBuildConfiguration *source) : - BuildConfiguration(target, source) +void QbsBuildConfiguration::initialize(const BuildInfo *info) { - m_configurationName = source->configurationName(); - cloneSteps(source); + BuildConfiguration::initialize(info); + + const QbsBuildInfo * const bi = static_cast<const QbsBuildInfo *>(info); + QVariantMap configData = bi->config; + configData.insert(QLatin1String(Constants::QBS_CONFIG_VARIANT_KEY), + (info->buildType == BuildConfiguration::Debug) + ? QLatin1String(Constants::QBS_VARIANT_DEBUG) + : QLatin1String(Constants::QBS_VARIANT_RELEASE)); + + Utils::FileName buildDir = info->buildDirectory; + if (buildDir.isEmpty()) + buildDir = defaultBuildDirectory(target()->project()->projectDirectory().toString(), + target()->kit(), info->displayName, info->buildType); + + // Add the build configuration. + QVariantMap bd = configData; + QString configName = bd.take("configName").toString(); + if (configName.isEmpty()) { + configName = "qtc_" + target()->kit()->fileSystemFriendlyName() + '_' + + Utils::FileUtils::fileSystemFriendlyName(info->displayName); + } + setConfigurationName(configName); + + BuildStepList *buildSteps = stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); + auto bs = new QbsBuildStep(buildSteps); + bs->setQbsConfiguration(bd); + buildSteps->appendStep(bs); + + BuildStepList *cleanSteps = stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN); + cleanSteps->appendStep(new QbsCleanStep(cleanSteps)); + + connect(bs, &QbsBuildStep::qbsConfigurationChanged, this, &QbsBuildConfiguration::qbsConfigurationChanged); + emit qbsConfigurationChanged(); } bool QbsBuildConfiguration::fromMap(const QVariantMap &map) @@ -117,15 +148,6 @@ QVariantMap QbsBuildConfiguration::toMap() const return map; } -void QbsBuildConfiguration::buildStepInserted(int pos) -{ - QbsBuildStep *step = qobject_cast<QbsBuildStep *>(stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD)->at(pos)); - if (step) { - connect(step, &QbsBuildStep::qbsConfigurationChanged, this, &QbsBuildConfiguration::qbsConfigurationChanged); - emit qbsConfigurationChanged(); - } -} - NamedWidget *QbsBuildConfiguration::createConfigWidget() { return new QbsBuildConfigurationWidget(this); @@ -366,48 +388,15 @@ QString QbsBuildConfiguration::equivalentCommandLine(const BuildStep *buildStep) return commandLine; } -QbsBuildConfiguration *QbsBuildConfiguration::setup(Target *t, - const QString &defaultDisplayName, - const QString &displayName, - const QVariantMap &buildData, - const Utils::FileName &directory) -{ - // Add the build configuration. - QbsBuildConfiguration *bc = new QbsBuildConfiguration(t); - bc->setDefaultDisplayName(defaultDisplayName); - bc->setDisplayName(displayName); - bc->setBuildDirectory(directory); - QVariantMap bd = buildData; - QString configName = bd.take("configName").toString(); - if (configName.isEmpty()) { - configName = "qtc_" + t->kit()->fileSystemFriendlyName() + QLatin1Char('_') - + Utils::FileUtils::fileSystemFriendlyName(displayName); - } - bc->setConfigurationName(configName); - - BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); - QbsBuildStep *bs = new QbsBuildStep(buildSteps); - bs->setQbsConfiguration(bd); - buildSteps->insertStep(0, bs); - - BuildStepList *cleanSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN); - QbsCleanStep *cs = new QbsCleanStep(cleanSteps); - cleanSteps->insertStep(0, cs); - - return bc; -} - // --------------------------------------------------------------------------- // QbsBuildConfigurationFactory: // --------------------------------------------------------------------------- -QbsBuildConfigurationFactory::QbsBuildConfigurationFactory(QObject *parent) : - IBuildConfigurationFactory(parent) -{ } - -bool QbsBuildConfigurationFactory::canHandle(const Target *t) const +QbsBuildConfigurationFactory::QbsBuildConfigurationFactory() { - return qobject_cast<Internal::QbsProject *>(t->project()); + registerBuildConfiguration<QbsBuildConfiguration>(Constants::QBS_BC_ID); + setSupportedProjectType(Constants::PROJECT_ID); + setSupportedProjectMimeTypeName(Constants::MIME_TYPE); } BuildInfo *QbsBuildConfigurationFactory::createBuildInfo(const Kit *k, @@ -420,37 +409,9 @@ BuildInfo *QbsBuildConfigurationFactory::createBuildInfo(const Kit *k, return info; } -int QbsBuildConfigurationFactory::priority(const Target *parent) const -{ - return canHandle(parent) ? 0 : -1; -} - QList<BuildInfo *> QbsBuildConfigurationFactory::availableBuilds(const Target *parent) const { - QList<BuildInfo *> result; - - BuildInfo *info = createBuildInfo(parent->kit(), BuildConfiguration::Debug); - result << info; - - return result; -} - -int QbsBuildConfigurationFactory::priority(const Kit *k, const QString &projectPath) const -{ - if (k && Utils::mimeTypeForFile(projectPath).matchesName(Constants::MIME_TYPE)) - return 0; - return -1; -} - -static Utils::FileName defaultBuildDirectory(const QString &projectFilePath, const Kit *k, - const QString &bcName, - BuildConfiguration::BuildType buildType) -{ - const QString projectName = QFileInfo(projectFilePath).completeBaseName(); - ProjectMacroExpander expander(projectFilePath, projectName, k, bcName, buildType); - QString projectDir = Project::projectDirectory(Utils::FileName::fromString(projectFilePath)).toString(); - QString buildPath = expander.expand(Core::DocumentManager::buildDirectory()); - return Utils::FileName::fromString(Utils::FileUtils::resolvePath(projectDir, buildPath)); + return {createBuildInfo(parent->kit(), BuildConfiguration::Debug)}; } QList<BuildInfo *> QbsBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const @@ -478,61 +439,5 @@ QList<BuildInfo *> QbsBuildConfigurationFactory::availableSetups(const Kit *k, c return result; } -BuildConfiguration *QbsBuildConfigurationFactory::create(Target *parent, const BuildInfo *info) const -{ - QTC_ASSERT(info->factory() == this, return 0); - QTC_ASSERT(info->kitId == parent->kit()->id(), return 0); - QTC_ASSERT(!info->displayName.isEmpty(), return 0); - - const QbsBuildInfo * const bi = static_cast<const QbsBuildInfo *>(info); - QVariantMap configData = bi->config; - configData.insert(QLatin1String(Constants::QBS_CONFIG_VARIANT_KEY), - (info->buildType == BuildConfiguration::Debug) - ? QLatin1String(Constants::QBS_VARIANT_DEBUG) - : QLatin1String(Constants::QBS_VARIANT_RELEASE)); - - Utils::FileName buildDir = info->buildDirectory; - if (buildDir.isEmpty()) - buildDir = defaultBuildDirectory(parent->project()->projectDirectory().toString(), - parent->kit(), info->displayName, info->buildType); - - BuildConfiguration *bc - = QbsBuildConfiguration::setup(parent, info->displayName, info->displayName, - configData, buildDir); - - return bc; -} - -bool QbsBuildConfigurationFactory::canClone(const Target *parent, BuildConfiguration *source) const -{ - return canHandle(parent) && qobject_cast<QbsBuildConfiguration *>(source); -} - -BuildConfiguration *QbsBuildConfigurationFactory::clone(Target *parent, BuildConfiguration *source) -{ - if (!canClone(parent, source)) - return 0; - QbsBuildConfiguration *oldbc(static_cast<QbsBuildConfiguration *>(source)); - return new QbsBuildConfiguration(parent, oldbc); -} - -bool QbsBuildConfigurationFactory::canRestore(const Target *parent, const QVariantMap &map) const -{ - if (!canHandle(parent)) - return false; - return ProjectExplorer::idFromMap(map) == Core::Id(QBS_BC_ID); -} - -BuildConfiguration *QbsBuildConfigurationFactory::restore(Target *parent, const QVariantMap &map) -{ - if (!canRestore(parent, map)) - return 0; - QbsBuildConfiguration *bc = new QbsBuildConfiguration(parent); - if (bc->fromMap(map)) - return bc; - delete bc; - return 0; -} - } // namespace Internal } // namespace QbsProjectManager diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h index 1a0248d8f6..3c3fbdf30b 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h +++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h @@ -32,16 +32,11 @@ #include <projectexplorer/buildconfiguration.h> #include <qtsupport/baseqtversion.h> -namespace ProjectExplorer { -class BuildStep; -class FileNode; -} +namespace ProjectExplorer { class BuildStep; } namespace QbsProjectManager { - namespace Internal { -class QbsBuildConfigurationFactory; class QbsBuildConfigurationWidget; class QbsBuildStep; class QbsProject; @@ -50,9 +45,11 @@ class QbsBuildConfiguration : public ProjectExplorer::BuildConfiguration { Q_OBJECT -public: + friend class ProjectExplorer::IBuildConfigurationFactory; explicit QbsBuildConfiguration(ProjectExplorer::Target *target); +public: + void initialize(const ProjectExplorer::BuildInfo *info) override; ProjectExplorer::NamedWidget *createConfigWidget() override; QbsBuildStep *qbsStep() const; @@ -86,29 +83,17 @@ public: signals: void qbsConfigurationChanged(); -protected: - QbsBuildConfiguration(ProjectExplorer::Target *target, QbsBuildConfiguration *source); - QbsBuildConfiguration(ProjectExplorer::Target *target, Core::Id id); +private: bool fromMap(const QVariantMap &map) override; QVariantMap toMap() const override; -private: - void buildStepInserted(int pos); - - static QbsBuildConfiguration *setup(ProjectExplorer::Target *t, - const QString &defaultDisplayName, - const QString &displayName, - const QVariantMap &buildData, - const Utils::FileName &directory); - - bool m_isParsing; - bool m_parsingError; + bool m_isParsing = true; + bool m_parsingError = false; QStringList m_changedFiles; QStringList m_activeFileTags; QStringList m_products; QString m_configurationName; - friend class QbsBuildConfigurationFactory; friend class QbsBuildConfigurationWidget; }; @@ -117,23 +102,13 @@ class QbsBuildConfigurationFactory : public ProjectExplorer::IBuildConfiguration Q_OBJECT public: - explicit QbsBuildConfigurationFactory(QObject *parent = 0); + QbsBuildConfigurationFactory(); - int priority(const ProjectExplorer::Target *parent) const override; QList<ProjectExplorer::BuildInfo *> availableBuilds(const ProjectExplorer::Target *parent) const override; - int priority(const ProjectExplorer::Kit *k, const QString &projectPath) const override; QList<ProjectExplorer::BuildInfo *> availableSetups(const ProjectExplorer::Kit *k, const QString &projectPath) const override; - ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, - const ProjectExplorer::BuildInfo *info) const override; - - bool canClone(const ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const override; - ProjectExplorer::BuildConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) override; - bool canRestore(const ProjectExplorer::Target *parent, const QVariantMap &map) const override; - ProjectExplorer::BuildConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map) override; private: - bool canHandle(const ProjectExplorer::Target *t) const; ProjectExplorer::BuildInfo *createBuildInfo(const ProjectExplorer::Kit *k, ProjectExplorer::BuildConfiguration::BuildType type) const; }; diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp index 9474702904..d68cdb93a1 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp @@ -124,18 +124,11 @@ private: // -------------------------------------------------------------------- QbsBuildStep::QbsBuildStep(ProjectExplorer::BuildStepList *bsl) : - ProjectExplorer::BuildStep(bsl, Core::Id(Constants::QBS_BUILDSTEP_ID)), - m_job(0), m_parser(0), m_parsingProject(false) + ProjectExplorer::BuildStep(bsl, Constants::QBS_BUILDSTEP_ID) { setDisplayName(tr("Qbs Build")); setQbsConfiguration(QVariantMap()); -} - -QbsBuildStep::QbsBuildStep(ProjectExplorer::BuildStepList *bsl, const QbsBuildStep *other) : - ProjectExplorer::BuildStep(bsl, Core::Id(Constants::QBS_BUILDSTEP_ID)), - m_qbsBuildOptions(other->m_qbsBuildOptions), m_job(0), m_parser(0), m_parsingProject(false) -{ - setQbsConfiguration(other->qbsConfiguration(PreserveVariables)); +// setQbsConfiguration(other->qbsConfiguration(PreserveVariables)); } QbsBuildStep::~QbsBuildStep() @@ -846,29 +839,13 @@ bool QbsBuildStepConfigWidget::validateProperties(Utils::FancyLineEdit *edit, QS // QbsBuildStepFactory: // -------------------------------------------------------------------- -QbsBuildStepFactory::QbsBuildStepFactory(QObject *parent) : - ProjectExplorer::IBuildStepFactory(parent) -{ } - -QList<ProjectExplorer::BuildStepInfo> QbsBuildStepFactory::availableSteps(ProjectExplorer::BuildStepList *parent) const -{ - if (parent->id() == ProjectExplorer::Constants::BUILDSTEPS_BUILD - && qobject_cast<QbsBuildConfiguration *>(parent->parent()) - && qobject_cast<QbsProject *>(parent->target()->project())) - return {{Constants::QBS_BUILDSTEP_ID, tr("Qbs Build")}}; - - return {}; -} - -ProjectExplorer::BuildStep *QbsBuildStepFactory::create(ProjectExplorer::BuildStepList *parent, Core::Id id) -{ - Q_UNUSED(id); - return new QbsBuildStep(parent); -} - -ProjectExplorer::BuildStep *QbsBuildStepFactory::clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *product) +QbsBuildStepFactory::QbsBuildStepFactory() { - return new QbsBuildStep(parent, static_cast<QbsBuildStep *>(product)); + registerStep<QbsBuildStep>(Constants::QBS_BUILDSTEP_ID); + setDisplayName(tr("Qbs Build")); + setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); + setSupportedConfiguration(Constants::QBS_BC_ID); + setSupportedProjectType(Constants::PROJECT_ID); } } // namespace Internal diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.h b/src/plugins/qbsprojectmanager/qbsbuildstep.h index 8682347589..652267361a 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildstep.h +++ b/src/plugins/qbsprojectmanager/qbsbuildstep.h @@ -52,7 +52,6 @@ public: }; explicit QbsBuildStep(ProjectExplorer::BuildStepList *bsl); - QbsBuildStep(ProjectExplorer::BuildStepList *bsl, const QbsBuildStep *other); ~QbsBuildStep() override; bool init(QList<const BuildStep *> &earlierSteps) override; @@ -81,14 +80,14 @@ public: bool isQmlDebuggingEnabled() const; - bool fromMap(const QVariantMap &map) override; - QVariantMap toMap() const override; - signals: void qbsConfigurationChanged(); void qbsBuildOptionsChanged(); private: + bool fromMap(const QVariantMap &map) override; + QVariantMap toMap() const override; + void buildingDone(bool success); void reparsingDone(bool success); void handleTaskStarted(const QString &desciption, int max); @@ -124,27 +123,21 @@ private: QStringList m_products; QFutureInterface<bool> *m_fi; - qbs::BuildJob *m_job; + qbs::BuildJob *m_job = nullptr; int m_progressBase; bool m_lastWasSuccess; - ProjectExplorer::IOutputParser *m_parser; - bool m_parsingProject; + ProjectExplorer::IOutputParser *m_parser = nullptr; + bool m_parsingProject = false; friend class QbsBuildStepConfigWidget; }; -class QbsBuildStepFactory : public ProjectExplorer::IBuildStepFactory +class QbsBuildStepFactory : public ProjectExplorer::BuildStepFactory { Q_OBJECT public: - explicit QbsBuildStepFactory(QObject *parent = 0); - - QList<ProjectExplorer::BuildStepInfo> - availableSteps(ProjectExplorer::BuildStepList *parent) const override; - - ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, Core::Id id) override; - ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *product) override; + QbsBuildStepFactory(); }; } // namespace Internal diff --git a/src/plugins/qbsprojectmanager/qbscleanstep.cpp b/src/plugins/qbsprojectmanager/qbscleanstep.cpp index ee1163be3c..7ca3289931 100644 --- a/src/plugins/qbsprojectmanager/qbscleanstep.cpp +++ b/src/plugins/qbsprojectmanager/qbscleanstep.cpp @@ -41,10 +41,6 @@ static const char QBS_DRY_RUN[] = "Qbs.DryRun"; static const char QBS_KEEP_GOING[] = "Qbs.DryKeepGoing"; -// -------------------------------------------------------------------- -// Constants: -// -------------------------------------------------------------------- - namespace QbsProjectManager { namespace Internal { @@ -53,18 +49,11 @@ namespace Internal { // -------------------------------------------------------------------- QbsCleanStep::QbsCleanStep(ProjectExplorer::BuildStepList *bsl) : - ProjectExplorer::BuildStep(bsl, Core::Id(Constants::QBS_CLEANSTEP_ID)), - m_job(0), m_showCompilerOutput(true), m_parser(0) + ProjectExplorer::BuildStep(bsl, Constants::QBS_CLEANSTEP_ID) { setDisplayName(tr("Qbs Clean")); } -QbsCleanStep::QbsCleanStep(ProjectExplorer::BuildStepList *bsl, const QbsCleanStep *other) : - ProjectExplorer::BuildStep(bsl, Core::Id(Constants::QBS_CLEANSTEP_ID)), - m_qbsCleanOptions(other->m_qbsCleanOptions), m_job(0), - m_showCompilerOutput(other->m_showCompilerOutput), m_parser(0) -{ } - QbsCleanStep::~QbsCleanStep() { cancel(); @@ -303,27 +292,12 @@ void QbsCleanStepConfigWidget::changeJobCount(int count) // QbsCleanStepFactory: // -------------------------------------------------------------------- -QbsCleanStepFactory::QbsCleanStepFactory(QObject *parent) : - ProjectExplorer::IBuildStepFactory(parent) -{ } - -QList<ProjectExplorer::BuildStepInfo> QbsCleanStepFactory::availableSteps(ProjectExplorer::BuildStepList *parent) const -{ - if (parent->id() == ProjectExplorer::Constants::BUILDSTEPS_CLEAN - && qobject_cast<QbsBuildConfiguration *>(parent->parent())) - return {{Constants::QBS_CLEANSTEP_ID, tr("Qbs Clean")}}; - return {}; -} - -ProjectExplorer::BuildStep *QbsCleanStepFactory::create(ProjectExplorer::BuildStepList *parent, Core::Id id) -{ - Q_UNUSED(id); - return new QbsCleanStep(parent); -} - -ProjectExplorer::BuildStep *QbsCleanStepFactory::clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *product) +QbsCleanStepFactory::QbsCleanStepFactory() { - return new QbsCleanStep(parent, static_cast<QbsCleanStep *>(product)); + registerStep<QbsCleanStep>(Constants::QBS_CLEANSTEP_ID); + setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN); + setSupportedConfiguration(Constants::QBS_BC_ID); + setDisplayName(tr("Qbs Clean")); } } // namespace Internal diff --git a/src/plugins/qbsprojectmanager/qbscleanstep.h b/src/plugins/qbsprojectmanager/qbscleanstep.h index 48292082b6..b7f84a1d5b 100644 --- a/src/plugins/qbsprojectmanager/qbscleanstep.h +++ b/src/plugins/qbsprojectmanager/qbscleanstep.h @@ -43,7 +43,6 @@ class QbsCleanStep : public ProjectExplorer::BuildStep public: explicit QbsCleanStep(ProjectExplorer::BuildStepList *bsl); - QbsCleanStep(ProjectExplorer::BuildStepList *bsl, const QbsCleanStep *other); ~QbsCleanStep() override; bool init(QList<const BuildStep *> &earlierSteps) override; @@ -80,11 +79,11 @@ private: qbs::CleanOptions m_qbsCleanOptions; QStringList m_products; - QFutureInterface<bool> *m_fi; - qbs::CleanJob *m_job; + QFutureInterface<bool> *m_fi = nullptr; + qbs::CleanJob *m_job = nullptr; int m_progressBase; - bool m_showCompilerOutput; - ProjectExplorer::IOutputParser *m_parser; + bool m_showCompilerOutput = true; + ProjectExplorer::IOutputParser *m_parser = nullptr; friend class QbsCleanStepConfigWidget; }; @@ -113,18 +112,12 @@ private: QString m_summary; }; -class QbsCleanStepFactory : public ProjectExplorer::IBuildStepFactory +class QbsCleanStepFactory : public ProjectExplorer::BuildStepFactory { Q_OBJECT public: - explicit QbsCleanStepFactory(QObject *parent = 0); - - QList<ProjectExplorer::BuildStepInfo> - availableSteps(ProjectExplorer::BuildStepList *parent) const override; - - ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, Core::Id id) override; - ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *product) override; + QbsCleanStepFactory(); }; } // namespace Internal diff --git a/src/plugins/qbsprojectmanager/qbsdeployconfigurationfactory.cpp b/src/plugins/qbsprojectmanager/qbsdeployconfigurationfactory.cpp index 5435d5777c..c97e134d96 100644 --- a/src/plugins/qbsprojectmanager/qbsdeployconfigurationfactory.cpp +++ b/src/plugins/qbsprojectmanager/qbsdeployconfigurationfactory.cpp @@ -25,121 +25,30 @@ #include "qbsdeployconfigurationfactory.h" +#include "qbsprojectmanagerconstants.h" #include "qbsinstallstep.h" #include "qbsproject.h" #include <projectexplorer/buildsteplist.h> -#include <projectexplorer/kitinformation.h> #include <projectexplorer/projectexplorerconstants.h> -#include <projectexplorer/target.h> namespace QbsProjectManager { namespace Internal { -// -------------------------------------------------------------------- -// Helpers: -// -------------------------------------------------------------------- +const char QBS_DEPLOYCONFIG_ID[] = "Qbs.Deploy"; -static QString genericQbsDisplayName() { - return QCoreApplication::translate("Qbs", "Qbs Install"); -} - -static Core::Id genericQbsDeployConfigurationId() -{ - return "Qbs.Deploy"; -} - -// -------------------------------------------------------------------- -// QbsDeployConfiguration: -// -------------------------------------------------------------------- - -QbsDeployConfiguration::QbsDeployConfiguration(ProjectExplorer::Target *target, Core::Id id) : - ProjectExplorer::DeployConfiguration(target, id) -{ } - -QbsDeployConfiguration::QbsDeployConfiguration(ProjectExplorer::Target *target, - ProjectExplorer::DeployConfiguration *source) : - ProjectExplorer::DeployConfiguration(target, source) -{ - cloneSteps(source); -} - -// -------------------------------------------------------------------- -// QbsDeployConfigurationFactory: -// -------------------------------------------------------------------- - -QbsDeployConfigurationFactory::QbsDeployConfigurationFactory(QObject *parent) : - ProjectExplorer::DeployConfigurationFactory(parent) -{ - setObjectName(QLatin1String("QbsDeployConfiguration")); -} - -QList<Core::Id> QbsDeployConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const -{ - QList<Core::Id> ids; - const Core::Id deviceId = ProjectExplorer::DeviceKitInformation::deviceId(parent->kit()); - if (qobject_cast<QbsProject *>(parent->project()) - && deviceId == ProjectExplorer::Constants::DESKTOP_DEVICE_ID) { - ids << genericQbsDeployConfigurationId(); - } - return ids; -} - -QString QbsDeployConfigurationFactory::displayNameForId(Core::Id id) const -{ - if (id == genericQbsDeployConfigurationId()) - return genericQbsDisplayName(); - return QString(); -} - -bool QbsDeployConfigurationFactory::canCreate(ProjectExplorer::Target *parent, - const Core::Id id) const -{ - return availableCreationIds(parent).contains(id); -} - -ProjectExplorer::DeployConfiguration -*QbsDeployConfigurationFactory::create(ProjectExplorer::Target *parent, Core::Id id) -{ - Q_ASSERT(canCreate(parent, id)); - - QbsDeployConfiguration *dc = new QbsDeployConfiguration(parent, id); - dc->setDisplayName(genericQbsDisplayName()); - return dc; -} - -bool QbsDeployConfigurationFactory::canRestore(ProjectExplorer::Target *parent, - const QVariantMap &map) const -{ - return canCreate(parent, ProjectExplorer::idFromMap(map)); -} - -ProjectExplorer::DeployConfiguration -*QbsDeployConfigurationFactory::restore(ProjectExplorer::Target *parent, const QVariantMap &map) -{ - if (!canRestore(parent, map)) - return 0; - Core::Id id = ProjectExplorer::idFromMap(map); - QbsDeployConfiguration *dc = new QbsDeployConfiguration(parent, id); - if (!dc->fromMap(map)) { - delete dc; - return 0; - } - return dc; -} - -bool QbsDeployConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::DeployConfiguration *product) const +QbsDeployConfiguration::QbsDeployConfiguration(ProjectExplorer::Target *target) : + ProjectExplorer::DeployConfiguration(target, QBS_DEPLOYCONFIG_ID) { - return canCreate(parent, product->id()); } -ProjectExplorer::DeployConfiguration -*QbsDeployConfigurationFactory::clone(ProjectExplorer::Target *parent, - ProjectExplorer::DeployConfiguration *product) +QbsDeployConfigurationFactory::QbsDeployConfigurationFactory() { - if (!canClone(parent, product)) - return 0; - return new QbsDeployConfiguration(parent, qobject_cast<QbsDeployConfiguration *>(product)); + setObjectName("QbsDeployConfiguration"); + registerDeployConfiguration<QbsDeployConfiguration>(QBS_DEPLOYCONFIG_ID); + setSupportedTargetDeviceTypes({ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE}); + setSupportedProjectType(Constants::PROJECT_ID); + setDefaultDisplayName(QCoreApplication::translate("Qbs", "Qbs Install")); } } // namespace Internal diff --git a/src/plugins/qbsprojectmanager/qbsdeployconfigurationfactory.h b/src/plugins/qbsprojectmanager/qbsdeployconfigurationfactory.h index 91ca997e23..beb9d23324 100644 --- a/src/plugins/qbsprojectmanager/qbsdeployconfigurationfactory.h +++ b/src/plugins/qbsprojectmanager/qbsdeployconfigurationfactory.h @@ -28,22 +28,14 @@ #include <projectexplorer/deployconfiguration.h> namespace QbsProjectManager { - - namespace Internal { -class QbsDeployConfigurationFactory; - class QbsDeployConfiguration : public ProjectExplorer::DeployConfiguration { Q_OBJECT -private: - QbsDeployConfiguration(ProjectExplorer::Target *target, Core::Id id); - QbsDeployConfiguration(ProjectExplorer::Target *target, - ProjectExplorer::DeployConfiguration *source); - - friend class QbsDeployConfigurationFactory; +public: + explicit QbsDeployConfiguration(ProjectExplorer::Target *target); }; class QbsDeployConfigurationFactory : public ProjectExplorer::DeployConfigurationFactory @@ -51,17 +43,7 @@ class QbsDeployConfigurationFactory : public ProjectExplorer::DeployConfiguratio Q_OBJECT public: - explicit QbsDeployConfigurationFactory(QObject *parent = 0); - - QList<Core::Id> availableCreationIds(ProjectExplorer::Target *parent) const override; - QString displayNameForId(Core::Id id) const override; - bool canCreate(ProjectExplorer::Target *parent, Core::Id id) const override; - ProjectExplorer::DeployConfiguration *create(ProjectExplorer::Target *parent, Core::Id id) override; - bool canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const override; - ProjectExplorer::DeployConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map) override; - bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::DeployConfiguration *product) const override; - ProjectExplorer::DeployConfiguration *clone(ProjectExplorer::Target *parent, - ProjectExplorer::DeployConfiguration *product) override; + QbsDeployConfigurationFactory(); }; } // namespace Internal diff --git a/src/plugins/qbsprojectmanager/qbsinstallstep.cpp b/src/plugins/qbsprojectmanager/qbsinstallstep.cpp index 8a4e9ad7b9..e196c36277 100644 --- a/src/plugins/qbsprojectmanager/qbsinstallstep.cpp +++ b/src/plugins/qbsprojectmanager/qbsinstallstep.cpp @@ -58,19 +58,17 @@ namespace Internal { // -------------------------------------------------------------------- QbsInstallStep::QbsInstallStep(ProjectExplorer::BuildStepList *bsl) : - ProjectExplorer::BuildStep(bsl, Core::Id(Constants::QBS_INSTALLSTEP_ID)), - m_job(0), m_showCompilerOutput(true), m_parser(0) + ProjectExplorer::BuildStep(bsl, Constants::QBS_INSTALLSTEP_ID) { setDisplayName(tr("Qbs Install")); - ctor(); -} -QbsInstallStep::QbsInstallStep(ProjectExplorer::BuildStepList *bsl, const QbsInstallStep *other) : - ProjectExplorer::BuildStep(bsl, Core::Id(Constants::QBS_INSTALLSTEP_ID)), - m_qbsInstallOptions(other->m_qbsInstallOptions), m_job(0), - m_showCompilerOutput(other->m_showCompilerOutput), m_parser(0) -{ - ctor(); + const QbsBuildConfiguration * const bc = buildConfig(); + connect(bc, &QbsBuildConfiguration::qbsConfigurationChanged, + this, &QbsInstallStep::handleBuildConfigChanged); + if (bc->qbsStep()) { + connect(bc->qbsStep(), &QbsBuildStep::qbsBuildOptionsChanged, + this, &QbsInstallStep::handleBuildConfigChanged); + } } QbsInstallStep::~QbsInstallStep() @@ -146,17 +144,6 @@ bool QbsInstallStep::keepGoing() const return m_qbsInstallOptions.keepGoing(); } -void QbsInstallStep::ctor() -{ - const QbsBuildConfiguration * const bc = buildConfig(); - connect(bc, &QbsBuildConfiguration::qbsConfigurationChanged, - this, &QbsInstallStep::handleBuildConfigChanged); - if (bc->qbsStep()) { - connect(bc->qbsStep(), &QbsBuildStep::qbsBuildOptionsChanged, - this, &QbsInstallStep::handleBuildConfigChanged); - } -} - const QbsBuildConfiguration *QbsInstallStep::buildConfig() const { return static_cast<QbsBuildConfiguration *>( @@ -346,30 +333,13 @@ void QbsInstallStepConfigWidget::changeKeepGoing(bool kg) // QbsInstallStepFactory: // -------------------------------------------------------------------- -QbsInstallStepFactory::QbsInstallStepFactory(QObject *parent) : - ProjectExplorer::IBuildStepFactory(parent) -{ } - -QList<ProjectExplorer::BuildStepInfo> QbsInstallStepFactory::availableSteps(ProjectExplorer::BuildStepList *parent) const +QbsInstallStepFactory::QbsInstallStepFactory() { - if (parent->id() == ProjectExplorer::Constants::BUILDSTEPS_DEPLOY - && qobject_cast<ProjectExplorer::DeployConfiguration *>(parent->parent()) - && qobject_cast<QbsProject *>(parent->target()->project())) - return {{ Constants::QBS_INSTALLSTEP_ID, tr("Qbs Install") }}; - return {}; -} - -ProjectExplorer::BuildStep *QbsInstallStepFactory::create(ProjectExplorer::BuildStepList *parent, - const Core::Id id) -{ - Q_UNUSED(id); - return new QbsInstallStep(parent); -} - -ProjectExplorer::BuildStep *QbsInstallStepFactory::clone(ProjectExplorer::BuildStepList *parent, - ProjectExplorer::BuildStep *product) -{ - return new QbsInstallStep(parent, static_cast<QbsInstallStep *>(product)); + registerStep<QbsInstallStep>(Constants::QBS_INSTALLSTEP_ID); + setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY); + setSupportedDeviceType(ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE); + setSupportedProjectType(Constants::PROJECT_ID); + setDisplayName(tr("Qbs Install")); } } // namespace Internal diff --git a/src/plugins/qbsprojectmanager/qbsinstallstep.h b/src/plugins/qbsprojectmanager/qbsinstallstep.h index ff1c5b9b1e..74e930570a 100644 --- a/src/plugins/qbsprojectmanager/qbsinstallstep.h +++ b/src/plugins/qbsprojectmanager/qbsinstallstep.h @@ -43,7 +43,6 @@ class QbsInstallStep : public ProjectExplorer::BuildStep public: explicit QbsInstallStep(ProjectExplorer::BuildStepList *bsl); - QbsInstallStep(ProjectExplorer::BuildStepList *bsl, const QbsInstallStep *other); ~QbsInstallStep() override; bool init(QList<const BuildStep *> &earlierSteps) override; @@ -68,7 +67,6 @@ signals: void changed(); private: - void ctor(); const QbsBuildConfiguration *buildConfig() const; void installDone(bool success); void handleTaskStarted(const QString &desciption, int max); @@ -84,11 +82,11 @@ private: qbs::InstallOptions m_qbsInstallOptions; - QFutureInterface<bool> *m_fi; - qbs::InstallJob *m_job; + QFutureInterface<bool> *m_fi = nullptr; + qbs::InstallJob *m_job = nullptr; int m_progressBase; - bool m_showCompilerOutput; - ProjectExplorer::IOutputParser *m_parser; + bool m_showCompilerOutput = true; + ProjectExplorer::IOutputParser *m_parser = nullptr; friend class QbsInstallStepConfigWidget; }; @@ -119,18 +117,12 @@ private: bool m_ignoreChange; }; -class QbsInstallStepFactory : public ProjectExplorer::IBuildStepFactory +class QbsInstallStepFactory : public ProjectExplorer::BuildStepFactory { Q_OBJECT public: - explicit QbsInstallStepFactory(QObject *parent = 0); - - QList<ProjectExplorer::BuildStepInfo> - availableSteps(ProjectExplorer::BuildStepList *parent) const override; - - ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, Core::Id id) override; - ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *product) override; + QbsInstallStepFactory(); }; } // namespace Internal diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanagerconstants.h b/src/plugins/qbsprojectmanager/qbsprojectmanagerconstants.h index 8bc262710c..c55da0f3d7 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanagerconstants.h +++ b/src/plugins/qbsprojectmanager/qbsprojectmanagerconstants.h @@ -58,6 +58,7 @@ const char ACTION_REBUILD_SUBPROJECT[] = "Qbs.RebuildSubproject"; const char QBS_BUILDSTEP_ID[] = "Qbs.BuildStep"; const char QBS_CLEANSTEP_ID[] = "Qbs.CleanStep"; const char QBS_INSTALLSTEP_ID[] = "Qbs.InstallStep"; +const char QBS_BC_ID[] = "Qbs.QbsBuildConfiguration"; // QBS strings: const char QBS_VARIANT_DEBUG[] = "debug"; diff --git a/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp index 26196dc2e6..1b2c5b324e 100644 --- a/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp +++ b/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp @@ -72,21 +72,6 @@ const char QBS_RC_PREFIX[] = "Qbs.RunConfiguration:"; static QString rcNameSeparator() { return QLatin1String("---Qbs.RC.NameSeparator---"); } -static QString uniqueProductNameFromId(Core::Id id) -{ - const QString suffix = id.suffixAfter(QBS_RC_PREFIX); - return suffix.left(suffix.indexOf(rcNameSeparator())); -} - -static QString productDisplayNameFromId(Core::Id id) -{ - const QString suffix = id.suffixAfter(QBS_RC_PREFIX); - const int sepPos = suffix.indexOf(rcNameSeparator()); - if (sepPos == -1) - return suffix; - return suffix.mid(sepPos + rcNameSeparator().count()); -} - const qbs::ProductData findProduct(const qbs::ProjectData &pro, const QString &uniqeName) { foreach (const qbs::ProductData &product, pro.allProducts()) { @@ -101,7 +86,7 @@ const qbs::ProductData findProduct(const qbs::ProjectData &pro, const QString &u // -------------------------------------------------------------------- QbsRunConfiguration::QbsRunConfiguration(Target *target) - : RunConfiguration(target) + : RunConfiguration(target, QBS_RC_PREFIX) { auto envAspect = new LocalEnvironmentAspect(this, [](RunConfiguration *rc, Environment &env) { @@ -138,14 +123,30 @@ QbsRunConfiguration::QbsRunConfiguration(Target *target) this, &QbsRunConfiguration::installStepChanged); } -void QbsRunConfiguration::initialize(Core::Id id) +bool QbsRunConfiguration::fromMap(const QVariantMap &map) { - RunConfiguration::initialize(id); + if (!RunConfiguration::fromMap(map)) + return false; + + QString extraId = ProjectExplorer::idFromMap(map).suffixAfter(id()); + if (!extraId.isEmpty()) { + const int sepPos = extraId.indexOf(rcNameSeparator()); + m_uniqueProductName = extraId.left(sepPos); + m_productDisplayName = sepPos == -1 ? QString() : extraId.mid(sepPos + rcNameSeparator().size()); + } setDefaultDisplayName(defaultDisplayName()); installStepChanged(); + + return true; +} + +QString QbsRunConfiguration::extraId() const +{ + return m_uniqueProductName + rcNameSeparator() + m_productDisplayName; } + QWidget *QbsRunConfiguration::createConfigurationWidget() { return new QbsRunConfigurationWidget(this); @@ -266,17 +267,17 @@ void QbsRunConfiguration::addToBaseEnvironment(Utils::Environment &env) const QString QbsRunConfiguration::buildSystemTarget() const { - return productDisplayNameFromId(id()); + return m_productDisplayName; } QString QbsRunConfiguration::uniqueProductName() const { - return uniqueProductNameFromId(id()); + return m_uniqueProductName; } QString QbsRunConfiguration::defaultDisplayName() { - QString defaultName = productDisplayNameFromId(id()); + QString defaultName = m_productDisplayName; if (defaultName.isEmpty()) defaultName = tr("Qbs Run Configuration"); return defaultName; diff --git a/src/plugins/qbsprojectmanager/qbsrunconfiguration.h b/src/plugins/qbsprojectmanager/qbsrunconfiguration.h index 2d5ac1d263..0566adb590 100644 --- a/src/plugins/qbsprojectmanager/qbsrunconfiguration.h +++ b/src/plugins/qbsprojectmanager/qbsrunconfiguration.h @@ -68,9 +68,9 @@ signals: void targetInformationChanged(); void usingDyldImageSuffixChanged(bool); - private: - void initialize(Core::Id id) override; + bool fromMap(const QVariantMap &map) final; + QString extraId() const final; void installStepChanged(); void installStepToBeRemoved(int pos); @@ -81,6 +81,8 @@ private: QbsInstallStep *m_currentInstallStep = nullptr; // We do not take ownership! ProjectExplorer::BuildStepList *m_currentBuildStepList = nullptr; // We do not take ownership! + QString m_uniqueProductName; + QString m_productDisplayName; }; class QbsRunConfigurationWidget : public QWidget diff --git a/src/plugins/qmakeandroidsupport/androidpackageinstallationfactory.cpp b/src/plugins/qmakeandroidsupport/androidpackageinstallationfactory.cpp index 7a36dbbf1b..9e7b27ba49 100644 --- a/src/plugins/qmakeandroidsupport/androidpackageinstallationfactory.cpp +++ b/src/plugins/qmakeandroidsupport/androidpackageinstallationfactory.cpp @@ -28,7 +28,6 @@ #include <projectexplorer/buildsteplist.h> #include <projectexplorer/projectexplorerconstants.h> -#include <projectexplorer/target.h> #include <android/androidmanager.h> using namespace ProjectExplorer; @@ -36,32 +35,17 @@ using namespace ProjectExplorer; namespace QmakeAndroidSupport { namespace Internal { -AndroidPackageInstallationFactory::AndroidPackageInstallationFactory(QObject *parent) - : IBuildStepFactory(parent) +AndroidPackageInstallationFactory::AndroidPackageInstallationFactory() { + registerStep<AndroidPackageInstallationStep>(AndroidPackageInstallationStep::Id); + setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); + setRepeatable(false); + setDisplayName(tr("Deploy to device")); } -QList<BuildStepInfo> AndroidPackageInstallationFactory::availableSteps(BuildStepList *parent) const +bool AndroidPackageInstallationFactory::canHandle(BuildStepList *bsl) const { - if (parent->id() != ProjectExplorer::Constants::BUILDSTEPS_BUILD) - return {}; - if (!Android::AndroidManager::supportsAndroid(parent->target())) - return {}; - if (parent->contains(AndroidPackageInstallationStep::Id)) - return {}; - - return {{AndroidPackageInstallationStep::Id, tr("Deploy to device"), BuildStepInfo::Uncreatable}}; -} - -BuildStep *AndroidPackageInstallationFactory::create(BuildStepList *parent, Core::Id id) -{ - Q_UNUSED(id) - return new AndroidPackageInstallationStep(parent); -} - -BuildStep *AndroidPackageInstallationFactory::clone(BuildStepList *parent, BuildStep *product) -{ - return new AndroidPackageInstallationStep(parent, static_cast<AndroidPackageInstallationStep*>(product)); + return BuildStepFactory::canHandle(bsl) && Android::AndroidManager::supportsAndroid(bsl->target()); } } // namespace Internal diff --git a/src/plugins/qmakeandroidsupport/androidpackageinstallationfactory.h b/src/plugins/qmakeandroidsupport/androidpackageinstallationfactory.h index b1fe533f97..9b4a2f10d4 100644 --- a/src/plugins/qmakeandroidsupport/androidpackageinstallationfactory.h +++ b/src/plugins/qmakeandroidsupport/androidpackageinstallationfactory.h @@ -30,19 +30,14 @@ namespace QmakeAndroidSupport { namespace Internal { -class AndroidPackageInstallationFactory: public ProjectExplorer::IBuildStepFactory +class AndroidPackageInstallationFactory: public ProjectExplorer::BuildStepFactory { Q_OBJECT public: - explicit AndroidPackageInstallationFactory(QObject *parent = 0); + AndroidPackageInstallationFactory(); - QList<ProjectExplorer::BuildStepInfo> - availableSteps(ProjectExplorer::BuildStepList *parent) const override; - - ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, Core::Id id) override; - ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, - ProjectExplorer::BuildStep *product) override; + bool canHandle(ProjectExplorer::BuildStepList *bsl) const override; }; } // namespace Internal diff --git a/src/plugins/qmakeandroidsupport/androidpackageinstallationstep.cpp b/src/plugins/qmakeandroidsupport/androidpackageinstallationstep.cpp index c7d0db210b..b9280cc7e0 100644 --- a/src/plugins/qmakeandroidsupport/androidpackageinstallationstep.cpp +++ b/src/plugins/qmakeandroidsupport/androidpackageinstallationstep.cpp @@ -45,17 +45,13 @@ using namespace QmakeAndroidSupport::Internal; const Core::Id AndroidPackageInstallationStep::Id = Core::Id("Qt4ProjectManager.AndroidPackageInstallationStep"); AndroidPackageInstallationStep::AndroidPackageInstallationStep(ProjectExplorer::BuildStepList *bsl) - : AbstractProcessStep(bsl, Id) + : AbstractProcessStep(bsl, AndroidPackageInstallationStep::Id) { const QString name = tr("Copy application data"); setDefaultDisplayName(name); setDisplayName(name); } -AndroidPackageInstallationStep::AndroidPackageInstallationStep(ProjectExplorer::BuildStepList *bc, AndroidPackageInstallationStep *other) - : AbstractProcessStep(bc, other) -{ } - bool AndroidPackageInstallationStep::init(QList<const BuildStep *> &earlierSteps) { ProjectExplorer::BuildConfiguration *bc = buildConfiguration(); diff --git a/src/plugins/qmakeandroidsupport/androidpackageinstallationstep.h b/src/plugins/qmakeandroidsupport/androidpackageinstallationstep.h index c27d43aa4f..3f163a0e27 100644 --- a/src/plugins/qmakeandroidsupport/androidpackageinstallationstep.h +++ b/src/plugins/qmakeandroidsupport/androidpackageinstallationstep.h @@ -44,9 +44,8 @@ public: bool immutable() const override; void run(QFutureInterface<bool> &fi) override; + private: - AndroidPackageInstallationStep(ProjectExplorer::BuildStepList *bc, - AndroidPackageInstallationStep *other); QStringList m_androidDirsToClean; static const Core::Id Id; }; diff --git a/src/plugins/qmakeandroidsupport/androidqmakebuildconfigurationfactory.cpp b/src/plugins/qmakeandroidsupport/androidqmakebuildconfigurationfactory.cpp index 3cb4fa73ba..ef0ccca475 100644 --- a/src/plugins/qmakeandroidsupport/androidqmakebuildconfigurationfactory.cpp +++ b/src/plugins/qmakeandroidsupport/androidqmakebuildconfigurationfactory.cpp @@ -38,6 +38,7 @@ #include <qmakeprojectmanager/qmakebuildinfo.h> #include <qmakeprojectmanager/qmakeproject.h> +#include <qmakeprojectmanager/qmakeprojectmanagerconstants.h> using namespace Android; using namespace ProjectExplorer; @@ -46,9 +47,16 @@ using namespace QmakeProjectManager; namespace QmakeAndroidSupport { namespace Internal { +// AndroidQmakeBuildConfigurationFactory + +AndroidQmakeBuildConfigurationFactory::AndroidQmakeBuildConfigurationFactory() +{ + registerBuildConfiguration<AndroidQmakeBuildConfiguration>(QmakeProjectManager::Constants::QMAKE_BC_ID); +} + int AndroidQmakeBuildConfigurationFactory::priority(const Kit *k, const QString &projectPath) const { - if (QmakeBuildConfigurationFactory::priority(k, projectPath) >= 0 + if (IBuildConfigurationFactory::priority(k, projectPath) >= 0 && Android::AndroidManager::supportsAndroid(k)) return 1; return -1; @@ -56,44 +64,13 @@ int AndroidQmakeBuildConfigurationFactory::priority(const Kit *k, const QString int AndroidQmakeBuildConfigurationFactory::priority(const Target *parent) const { - if (QmakeBuildConfigurationFactory::priority(parent) >= 0 + if (IBuildConfigurationFactory::priority(parent) >= 0 && Android::AndroidManager::supportsAndroid(parent)) return 1; return -1; } -BuildConfiguration *AndroidQmakeBuildConfigurationFactory::create(Target *parent, - const BuildInfo *info) const -{ - auto qmakeInfo = static_cast<const QmakeBuildInfo *>(info); - auto bc = new AndroidQmakeBuildConfiguration(parent); - configureBuildConfiguration(parent, bc, qmakeInfo); - - BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); - buildSteps->insertStep(2, new AndroidPackageInstallationStep(buildSteps)); - buildSteps->insertStep(3, new QmakeAndroidBuildApkStep(buildSteps)); - return bc; -} - -BuildConfiguration *AndroidQmakeBuildConfigurationFactory::clone(Target *parent, BuildConfiguration *source) -{ - if (!canClone(parent, source)) - return 0; - auto *oldbc = static_cast<AndroidQmakeBuildConfiguration *>(source); - return new AndroidQmakeBuildConfiguration(parent, oldbc); -} - -BuildConfiguration *AndroidQmakeBuildConfigurationFactory::restore(Target *parent, const QVariantMap &map) -{ - if (!canRestore(parent, map)) - return 0; - auto bc = new AndroidQmakeBuildConfiguration(parent); - if (bc->fromMap(map)) - return bc; - delete bc; - return 0; -} - +// AndroidQmakeBuildConfiguration AndroidQmakeBuildConfiguration::AndroidQmakeBuildConfiguration(Target *target) : QmakeBuildConfiguration(target) @@ -109,15 +86,14 @@ AndroidQmakeBuildConfiguration::AndroidQmakeBuildConfiguration(Target *target) connect(this, &AndroidQmakeBuildConfiguration::enabledChanged, this, updateGrade); } -AndroidQmakeBuildConfiguration::AndroidQmakeBuildConfiguration(Target *target, AndroidQmakeBuildConfiguration *source) - : QmakeBuildConfiguration(target, source) +void AndroidQmakeBuildConfiguration::initialize(const BuildInfo *info) { - updateCacheAndEmitEnvironmentChanged(); -} + QmakeBuildConfiguration::initialize(info); + + BuildStepList *buildSteps = stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); + buildSteps->appendStep(new AndroidPackageInstallationStep(buildSteps)); + buildSteps->appendStep(new QmakeAndroidBuildApkStep(buildSteps)); -AndroidQmakeBuildConfiguration::AndroidQmakeBuildConfiguration(Target *target, Core::Id id) - : QmakeBuildConfiguration(target, id) -{ updateCacheAndEmitEnvironmentChanged(); } diff --git a/src/plugins/qmakeandroidsupport/androidqmakebuildconfigurationfactory.h b/src/plugins/qmakeandroidsupport/androidqmakebuildconfigurationfactory.h index 55e68bf719..db2afa8980 100644 --- a/src/plugins/qmakeandroidsupport/androidqmakebuildconfigurationfactory.h +++ b/src/plugins/qmakeandroidsupport/androidqmakebuildconfigurationfactory.h @@ -33,31 +33,25 @@ namespace Internal { class AndroidQmakeBuildConfigurationFactory : public QmakeProjectManager::QmakeBuildConfigurationFactory { public: - explicit AndroidQmakeBuildConfigurationFactory(QObject *parent = 0) - : QmakeBuildConfigurationFactory(parent) - { } + AndroidQmakeBuildConfigurationFactory(); int priority(const ProjectExplorer::Kit *k, const QString &projectPath) const override; int priority(const ProjectExplorer::Target *parent) const override; - - ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, - const ProjectExplorer::BuildInfo *info) const override; - ProjectExplorer::BuildConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) override; - ProjectExplorer::BuildConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map) override; }; class AndroidQmakeBuildConfiguration : public QmakeProjectManager::QmakeBuildConfiguration { - friend class AndroidQmakeBuildConfigurationFactory; Q_OBJECT + public: explicit AndroidQmakeBuildConfiguration(ProjectExplorer::Target *target); - AndroidQmakeBuildConfiguration(ProjectExplorer::Target *target, AndroidQmakeBuildConfiguration *source); - AndroidQmakeBuildConfiguration(ProjectExplorer::Target *target, Core::Id id); + + void initialize(const ProjectExplorer::BuildInfo *info) override; void addToEnvironment(Utils::Environment &env) const override; void manifestSaved(); using BuildConfiguration::updateCacheAndEmitEnvironmentChanged; + private: mutable QString m_androidNdkPlatform; }; diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkstep.cpp b/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkstep.cpp index fdc9c21020..78d9cfff2a 100644 --- a/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkstep.cpp +++ b/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkstep.cpp @@ -39,8 +39,10 @@ #include <projectexplorer/projectexplorer.h> #include <projectexplorer/target.h> #include <qtsupport/qtkitinformation.h> + #include <qmakeprojectmanager/qmakenodes.h> #include <qmakeprojectmanager/qmakeproject.h> +#include <qmakeprojectmanager/qmakeprojectmanagerconstants.h> #include <utils/qtcprocess.h> @@ -55,42 +57,31 @@ namespace Internal { const Core::Id ANDROID_BUILD_APK_ID("QmakeProjectManager.AndroidBuildApkStep"); -////////////////// + // QmakeAndroidBuildApkStepFactory -///////////////// -QmakeAndroidBuildApkStepFactory::QmakeAndroidBuildApkStepFactory(QObject *parent) - : IBuildStepFactory(parent) +QmakeAndroidBuildApkStepFactory::QmakeAndroidBuildApkStepFactory() { + registerStep<QmakeAndroidBuildApkStep>(ANDROID_BUILD_APK_ID); + setSupportedProjectType(QmakeProjectManager::Constants::QMAKEPROJECT_ID); + setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); + setDisplayName(tr("Build Android APK")); + setRepeatable(false); } -QList<ProjectExplorer::BuildStepInfo> QmakeAndroidBuildApkStepFactory::availableSteps(ProjectExplorer::BuildStepList *parent) const +bool QmakeAndroidBuildApkStepFactory::canHandle(ProjectExplorer::BuildStepList *bsl) const { - ProjectExplorer::Target *target = parent->target(); - if (parent->id() != ProjectExplorer::Constants::BUILDSTEPS_BUILD - || !target->project()->supportsKit(target->kit()) - || !AndroidManager::supportsAndroid(target) - || !qobject_cast<QmakeProject *>(target->project()) - || parent->contains(ANDROID_BUILD_APK_ID)) - return {}; - - return {{ANDROID_BUILD_APK_ID, tr("Build Android APK")}}; + return BuildStepFactory::canHandle(bsl) + && AndroidManager::supportsAndroid(bsl->target()); } -ProjectExplorer::BuildStep *QmakeAndroidBuildApkStepFactory::create(ProjectExplorer::BuildStepList *parent, const Core::Id id) -{ - Q_UNUSED(id); - return new QmakeAndroidBuildApkStep(parent); -} -ProjectExplorer::BuildStep *QmakeAndroidBuildApkStepFactory::clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *product) -{ - return new QmakeAndroidBuildApkStep(parent, static_cast<QmakeAndroidBuildApkStep *>(product)); -} +// QmakeAndroidBuildApkStep QmakeAndroidBuildApkStep::QmakeAndroidBuildApkStep(ProjectExplorer::BuildStepList *bc) - :AndroidBuildApkStep(bc, ANDROID_BUILD_APK_ID) -{ } + : AndroidBuildApkStep(bc, ANDROID_BUILD_APK_ID) +{ +} Utils::FileName QmakeAndroidBuildApkStep::proFilePathForInputFile() const { @@ -100,10 +91,6 @@ Utils::FileName QmakeAndroidBuildApkStep::proFilePathForInputFile() const return Utils::FileName(); } -QmakeAndroidBuildApkStep::QmakeAndroidBuildApkStep(ProjectExplorer::BuildStepList *bc, QmakeAndroidBuildApkStep *other) - : AndroidBuildApkStep(bc, other) -{ } - Utils::FileName QmakeAndroidBuildApkStep::androidPackageSourceDir() const { QmakeProjectManager::QmakeProject *pro = static_cast<QmakeProjectManager::QmakeProject *>(project()); diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkstep.h b/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkstep.h index 7706e8091b..0425a567f3 100644 --- a/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkstep.h +++ b/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkstep.h @@ -31,19 +31,13 @@ namespace QmakeAndroidSupport { namespace Internal { -class QmakeAndroidBuildApkStepFactory : public ProjectExplorer::IBuildStepFactory +class QmakeAndroidBuildApkStepFactory : public ProjectExplorer::BuildStepFactory { Q_OBJECT public: - explicit QmakeAndroidBuildApkStepFactory(QObject *parent = 0); - - QList<ProjectExplorer::BuildStepInfo> - availableSteps(ProjectExplorer::BuildStepList *parent) const override; - - ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, Core::Id id) override; - ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, - ProjectExplorer::BuildStep *product) override; + QmakeAndroidBuildApkStepFactory(); + bool canHandle(ProjectExplorer::BuildStepList *bsl) const; }; class QmakeAndroidBuildApkStep : public Android::AndroidBuildApkStep @@ -55,12 +49,7 @@ public: void setProFilePathForInputFile(const QString &path); protected: - friend class QmakeAndroidBuildApkStepFactory; - QmakeAndroidBuildApkStep(ProjectExplorer::BuildStepList *bc, QmakeAndroidBuildApkStep *other); - Utils::FileName androidPackageSourceDir() const override; - -protected: bool init(QList<const BuildStep *> &earlierSteps) override; void run(QFutureInterface<bool> &fi) override; void processStarted() override; diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidrunconfiguration.cpp b/src/plugins/qmakeandroidsupport/qmakeandroidrunconfiguration.cpp index aa6deea385..d27ee943bb 100644 --- a/src/plugins/qmakeandroidsupport/qmakeandroidrunconfiguration.cpp +++ b/src/plugins/qmakeandroidsupport/qmakeandroidrunconfiguration.cpp @@ -49,32 +49,31 @@ namespace Internal { static const char ANDROID_RC_ID_PREFIX[] = "Qt4ProjectManager.AndroidRunConfiguration:"; -static Utils::FileName pathFromId(const Core::Id id) -{ - return Utils::FileName::fromString(id.suffixAfter(ANDROID_RC_ID_PREFIX)); -} - QmakeAndroidRunConfiguration::QmakeAndroidRunConfiguration(Target *target) - : AndroidRunConfiguration(target) + : AndroidRunConfiguration(target, ANDROID_RC_ID_PREFIX) {} -void QmakeAndroidRunConfiguration::initialize(Core::Id id) +QString QmakeAndroidRunConfiguration::extraId() const { - AndroidRunConfiguration::initialize(id); - m_proFilePath = pathFromId(id); - - setDefaultDisplayName(defaultDisplayName()); - QTC_CHECK(!m_proFilePath.isEmpty()); + return m_proFilePath.toString(); } bool QmakeAndroidRunConfiguration::fromMap(const QVariantMap &map) { + if (!AndroidRunConfiguration::fromMap(map)) + return false; + QmakeProject *project = qmakeProject(); QTC_ASSERT(project, return false); const QDir projectDir = QDir(project->projectDirectory().toString()); m_proFilePath = Utils::FileName::fromUserInput(projectDir.filePath(map.value(PRO_FILE_KEY).toString())); - return AndroidRunConfiguration::fromMap(map); + QString extraId = ProjectExplorer::idFromMap(map).suffixAfter(id()); + if (!extraId.isEmpty()) + m_proFilePath = Utils::FileName::fromString(extraId); + + setDefaultDisplayName(defaultDisplayName()); + return true; } QVariantMap QmakeAndroidRunConfiguration::toMap() const diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidrunconfiguration.h b/src/plugins/qmakeandroidsupport/qmakeandroidrunconfiguration.h index 7a85d5bbb4..9132006cfd 100644 --- a/src/plugins/qmakeandroidsupport/qmakeandroidrunconfiguration.h +++ b/src/plugins/qmakeandroidsupport/qmakeandroidrunconfiguration.h @@ -29,10 +29,7 @@ #include <utils/fileutils.h> -namespace QmakeProjectManager { -class QmakeProFile; -class QmakeProject; -} // namespace QmakeProjectManager +namespace QmakeProjectManager { class QmakeProject; } namespace QmakeAndroidSupport { namespace Internal { @@ -46,14 +43,10 @@ public: Utils::FileName proFilePath() const; +private: QString disabledReason() const override; - QString buildSystemTarget() const final; - -private: - friend class ProjectExplorer::IRunConfigurationFactory; - void initialize(Core::Id id) override; - + QString extraId() const final; bool fromMap(const QVariantMap &map) override; QVariantMap toMap() const override; QString defaultDisplayName(); diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidrunfactories.cpp b/src/plugins/qmakeandroidsupport/qmakeandroidrunfactories.cpp index ee5dff0a14..79deb4efc5 100644 --- a/src/plugins/qmakeandroidsupport/qmakeandroidrunfactories.cpp +++ b/src/plugins/qmakeandroidsupport/qmakeandroidrunfactories.cpp @@ -58,11 +58,6 @@ QString QmakeAndroidRunConfigurationFactory::displayNameForBuildTarget(const QSt return QFileInfo(buildTarget).completeBaseName(); } -bool QmakeAndroidRunConfigurationFactory::canCreateHelper(Target *parent, const QString &buildTarget) const -{ - return availableBuildTargets(parent, UserCreate).contains(buildTarget); -} - QList<QString> QmakeAndroidRunConfigurationFactory::availableBuildTargets(Target *parent, CreationMode mode) const { auto project = static_cast<QmakeProject *>(parent->project()); @@ -74,18 +69,5 @@ bool QmakeAndroidRunConfigurationFactory::canHandle(Target *t) const return IRunConfigurationFactory::canHandle(t) && AndroidManager::supportsAndroid(t); } -#ifdef Q_CC_GCC -# warning FIX ME !!! -#endif -QList<RunConfiguration *> QmakeAndroidRunConfigurationFactory::runConfigurationsForNode(Target *t, Node *n) -{ - QList<RunConfiguration *> result; - foreach (RunConfiguration *rc, t->runConfigurations()) - if (QmakeAndroidRunConfiguration *qt4c = qobject_cast<QmakeAndroidRunConfiguration *>(rc)) - if (qt4c->proFilePath() == n->filePath()) - result << rc; - return result; -} - } // namespace Internal } // namespace Android diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidrunfactories.h b/src/plugins/qmakeandroidsupport/qmakeandroidrunfactories.h index a9a1514580..ea5456d45e 100644 --- a/src/plugins/qmakeandroidsupport/qmakeandroidrunfactories.h +++ b/src/plugins/qmakeandroidsupport/qmakeandroidrunfactories.h @@ -46,12 +46,6 @@ public: QList<QString> availableBuildTargets(ProjectExplorer::Target *parent, CreationMode mode) const override; QString displayNameForBuildTarget(const QString &buildTarget) const override; - bool canCreateHelper(ProjectExplorer::Target *parent, const QString &suffix) const override; - - QList<ProjectExplorer::RunConfiguration *> runConfigurationsForNode(ProjectExplorer::Target *t, - ProjectExplorer::Node *n); - -private: bool canHandle(ProjectExplorer::Target *t) const override; }; diff --git a/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp b/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp index ca6abc4af2..20f5b04e01 100644 --- a/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp +++ b/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp @@ -72,7 +72,7 @@ const char USE_LIBRARY_SEARCH_PATH[] = "QmakeProjectManager.QmakeRunConfiguratio // DesktopQmakeRunConfiguration::DesktopQmakeRunConfiguration(Target *target) - : RunConfiguration(target) + : RunConfiguration(target, QMAKE_RC_PREFIX) { addExtraAspect(new LocalEnvironmentAspect(this, [](RunConfiguration *rc, Environment &env) { static_cast<DesktopQmakeRunConfiguration *>(rc)->addToBaseEnvironment(env); @@ -88,12 +88,9 @@ DesktopQmakeRunConfiguration::DesktopQmakeRunConfiguration(Target *target) this, &DesktopQmakeRunConfiguration::proFileEvaluated); } -void DesktopQmakeRunConfiguration::initialize(Core::Id id) +QString DesktopQmakeRunConfiguration::extraId() const { - RunConfiguration::initialize(id); - m_proFilePath = FileName::fromString(id.suffixAfter(QMAKE_RC_PREFIX)); - - updateTargetInformation(); + return m_proFilePath.toString(); } void DesktopQmakeRunConfiguration::proFileEvaluated() @@ -260,6 +257,10 @@ bool DesktopQmakeRunConfiguration::fromMap(const QVariantMap &map) m_isUsingDyldImageSuffix = map.value(QLatin1String(USE_DYLD_IMAGE_SUFFIX_KEY), false).toBool(); m_isUsingLibrarySearchPath = map.value(QLatin1String(USE_LIBRARY_SEARCH_PATH), true).toBool(); + QString extraId = ProjectExplorer::idFromMap(map).suffixAfter(id()); + if (!extraId.isEmpty()) + m_proFilePath = FileName::fromString(extraId); + return RunConfiguration::fromMap(map); } diff --git a/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.h b/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.h index b59fa370bd..fe12be10c5 100644 --- a/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.h +++ b/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.h @@ -52,7 +52,6 @@ class DesktopQmakeRunConfiguration : public ProjectExplorer::RunConfiguration Q_OBJECT // to change the display name and arguments and set the userenvironmentchanges friend class DesktopQmakeRunConfigurationWidget; - friend class ProjectExplorer::IRunConfigurationFactory; public: explicit DesktopQmakeRunConfiguration(ProjectExplorer::Target *target); @@ -87,8 +86,8 @@ signals: void effectiveTargetInformationChanged(); protected: - void initialize(Core::Id id) override; bool fromMap(const QVariantMap &map) override; + QString extraId() const override; private: void proFileEvaluated(); diff --git a/src/plugins/qmakeprojectmanager/makestep.cpp b/src/plugins/qmakeprojectmanager/makestep.cpp index 24c480ffc9..bbcf04fdc8 100644 --- a/src/plugins/qmakeprojectmanager/makestep.cpp +++ b/src/plugins/qmakeprojectmanager/makestep.cpp @@ -58,30 +58,13 @@ const char MAKE_COMMAND_KEY[] = "Qt4ProjectManager.MakeStep.MakeCommand"; const char CLEAN_KEY[] = "Qt4ProjectManager.MakeStep.Clean"; } -MakeStep::MakeStep(BuildStepList *bsl) : - AbstractProcessStep(bsl, Core::Id(MAKESTEP_BS_ID)) -{ - ctor(); -} - -MakeStep::MakeStep(BuildStepList *bsl, MakeStep *bs) : - AbstractProcessStep(bsl, bs), - m_clean(bs->m_clean), - m_userArgs(bs->m_userArgs), - m_makeCmd(bs->m_makeCmd) -{ - ctor(); -} - -MakeStep::MakeStep(BuildStepList *bsl, Core::Id id) : - AbstractProcessStep(bsl, id) -{ - ctor(); -} - -void MakeStep::ctor() +MakeStep::MakeStep(BuildStepList *bsl) + : AbstractProcessStep(bsl, MAKESTEP_BS_ID) { setDefaultDisplayName(tr("Make", "Qt MakeStep display name.")); + m_clean = bsl->id() == ProjectExplorer::Constants::BUILDSTEPS_CLEAN; + if (m_clean) + m_userArgs = "clean"; } void MakeStep::setMakeCommand(const QString &make) @@ -94,16 +77,6 @@ QmakeBuildConfiguration *MakeStep::qmakeBuildConfiguration() const return static_cast<QmakeBuildConfiguration *>(buildConfiguration()); } -void MakeStep::setClean(bool clean) -{ - m_clean = clean; -} - -bool MakeStep::isClean() const -{ - return m_clean; -} - QString MakeStep::makeCommand() const { return m_makeCmd; @@ -483,40 +456,11 @@ void MakeStepConfigWidget::makeArgumentsLineEdited() // MakeStepFactory /// -MakeStepFactory::MakeStepFactory(QObject *parent) : - IBuildStepFactory(parent) -{ -} - -QList<BuildStepInfo> MakeStepFactory::availableSteps(BuildStepList *parent) const -{ - if (parent->target()->project()->id() != Constants::QMAKEPROJECT_ID) - return {}; - - return {{MAKESTEP_BS_ID, tr("Make")}}; -} - -BuildStep *MakeStepFactory::create(BuildStepList *parent, Core::Id id) -{ - Q_UNUSED(id); - MakeStep *step = new MakeStep(parent); - if (parent->id() == ProjectExplorer::Constants::BUILDSTEPS_CLEAN) { - step->setClean(true); - step->setUserArguments("clean"); - } - return step; -} - -BuildStep *MakeStepFactory::clone(BuildStepList *parent, BuildStep *source) -{ - return new MakeStep(parent, static_cast<MakeStep *>(source)); -} - -BuildStep *MakeStepFactory::restore(BuildStepList *parent, const QVariantMap &map) +MakeStepFactory::MakeStepFactory() { - MakeStep *bs(new MakeStep(parent)); - if (bs->fromMap(map)) - return bs; - delete bs; - return 0; + registerStep<MakeStep>(MAKESTEP_BS_ID); + setSupportedProjectType(Constants::QMAKEPROJECT_ID); + setDisplayName(tr("Make")); + setSupportedStepLists({ProjectExplorer::Constants::BUILDSTEPS_BUILD, + ProjectExplorer::Constants::BUILDSTEPS_CLEAN}); } diff --git a/src/plugins/qmakeprojectmanager/makestep.h b/src/plugins/qmakeprojectmanager/makestep.h index 72a0b54e2e..075b50e1b7 100644 --- a/src/plugins/qmakeprojectmanager/makestep.h +++ b/src/plugins/qmakeprojectmanager/makestep.h @@ -29,11 +29,6 @@ #include <projectexplorer/abstractprocessstep.h> -namespace ProjectExplorer { -class BuildStep; -class IBuildStepFactory; -} - namespace QmakeProjectManager { class QmakeBuildConfiguration; @@ -43,19 +38,12 @@ namespace Internal { namespace Ui { class MakeStep; } -class MakeStepFactory : public ProjectExplorer::IBuildStepFactory +class MakeStepFactory : public ProjectExplorer::BuildStepFactory { Q_OBJECT public: - explicit MakeStepFactory(QObject *parent = 0); - - QList<ProjectExplorer::BuildStepInfo> - availableSteps(ProjectExplorer::BuildStepList *parent) const override; - - ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, Core::Id id) override; - ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source) override; - ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map) override; + MakeStepFactory(); }; } //namespace Internal @@ -80,7 +68,6 @@ public: bool immutable() const override; QString userArguments(); void setUserArguments(const QString &arguments); - void setClean(bool clean); bool isClean() const; QString makeCommand() const; @@ -91,13 +78,9 @@ public: signals: void userArgumentsChanged(); -protected: - MakeStep(ProjectExplorer::BuildStepList *bsl, MakeStep *bs); - MakeStep(ProjectExplorer::BuildStepList *bsl, Core::Id id); +private: bool fromMap(const QVariantMap &map) override; -private: - void ctor(); void setMakeCommand(const QString &make); QStringList automaticallyAddedArguments() const; bool m_clean = false; diff --git a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp index 5d3332b9cb..8594d89a1d 100644 --- a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp +++ b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp @@ -93,32 +93,71 @@ static FileName defaultBuildDirectory(const QString &projectPath, suffix, type)); } -const char QMAKE_BC_ID[] = "Qt4ProjectManager.Qt4BuildConfiguration"; const char USE_SHADOW_BUILD_KEY[] = "Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild"; const char BUILD_CONFIGURATION_KEY[] = "Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration"; enum { debug = 0 }; QmakeBuildConfiguration::QmakeBuildConfiguration(Target *target) - : QmakeBuildConfiguration(target, Core::Id(QMAKE_BC_ID)) + : BuildConfiguration(target, Constants::QMAKE_BC_ID) { connect(this, &BuildConfiguration::buildDirectoryChanged, this, &QmakeBuildConfiguration::emitProFileEvaluateNeeded); + connect(this, &BuildConfiguration::environmentChanged, + this, &QmakeBuildConfiguration::emitProFileEvaluateNeeded); + connect(target, &Target::kitChanged, + this, &QmakeBuildConfiguration::kitChanged); + MacroExpander *expander = macroExpander(); + expander->registerVariable("Qmake:Makefile", "Qmake makefile", [this]() -> QString { + const QString file = makefile(); + if (!file.isEmpty()) + return file; + return QLatin1String("Makefile"); + }); + connect(ToolChainManager::instance(), &ToolChainManager::toolChainUpdated, + this, &QmakeBuildConfiguration::toolChainUpdated); + connect(QtVersionManager::instance(), &QtVersionManager::qtVersionsChanged, + this, &QmakeBuildConfiguration::qtVersionsChanged); } -QmakeBuildConfiguration::QmakeBuildConfiguration(Target *target, Core::Id id) : - BuildConfiguration(target, id) +void QmakeBuildConfiguration::initialize(const BuildInfo *info) { - ctor(); -} + BuildConfiguration::initialize(info); -QmakeBuildConfiguration::QmakeBuildConfiguration(Target *target, QmakeBuildConfiguration *source) : - BuildConfiguration(target, source), - m_shadowBuild(source->m_shadowBuild), - m_qmakeBuildConfiguration(source->m_qmakeBuildConfiguration) -{ - cloneSteps(source); - ctor(); + BuildStepList *buildSteps = stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); + auto qmakeStep = new QMakeStep(buildSteps); + buildSteps->appendStep(qmakeStep); + buildSteps->appendStep(new MakeStep(buildSteps)); + + BuildStepList *cleanSteps = stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN); + cleanSteps->appendStep(new MakeStep(cleanSteps)); + + const QmakeBuildInfo *qmakeInfo = static_cast<const QmakeBuildInfo *>(info); + BaseQtVersion *version = QtKitInformation::qtVersion(target()->kit()); + + BaseQtVersion::QmakeBuildConfigs config = version->defaultBuildConfig(); + if (qmakeInfo->buildType == BuildConfiguration::Debug) + config |= BaseQtVersion::DebugBuild; + else + config &= ~BaseQtVersion::DebugBuild; + + QString additionalArguments = qmakeInfo->additionalArguments; + if (!additionalArguments.isEmpty()) + qmakeStep->setUserArguments(additionalArguments); + qmakeStep->setLinkQmlDebuggingLibrary(qmakeInfo->config.linkQmlDebuggingQQ2); + qmakeStep->setSeparateDebugInfo(qmakeInfo->config.separateDebugInfo); + qmakeStep->setUseQtQuickCompiler(qmakeInfo->config.useQtQuickCompiler); + + setQMakeBuildConfiguration(config); + + FileName directory = qmakeInfo->buildDirectory; + if (directory.isEmpty()) { + directory = defaultBuildDirectory(target()->project()->projectFilePath().toString(), + target()->kit(), qmakeInfo->displayName, buildType()); + } + + setBuildDirectory(directory); + updateCacheAndEmitEnvironmentChanged(); } QmakeBuildConfiguration::~QmakeBuildConfiguration() @@ -142,31 +181,9 @@ bool QmakeBuildConfiguration::fromMap(const QVariantMap &map) m_qmakeBuildConfiguration = BaseQtVersion::QmakeBuildConfigs(map.value(QLatin1String(BUILD_CONFIGURATION_KEY)).toInt()); m_lastKitState = LastKitState(target()->kit()); - - connect(ToolChainManager::instance(), &ToolChainManager::toolChainUpdated, - this, &QmakeBuildConfiguration::toolChainUpdated); - connect(QtVersionManager::instance(), &QtVersionManager::qtVersionsChanged, - this, &QmakeBuildConfiguration::qtVersionsChanged); return true; } -void QmakeBuildConfiguration::ctor() -{ - updateCacheAndEmitEnvironmentChanged(); - - connect(this, &BuildConfiguration::environmentChanged, - this, &QmakeBuildConfiguration::emitProFileEvaluateNeeded); - connect(target(), &Target::kitChanged, - this, &QmakeBuildConfiguration::kitChanged); - MacroExpander *expander = macroExpander(); - expander->registerVariable("Qmake:Makefile", "Qmake makefile", [this]() -> QString { - const QString file = makefile(); - if (!file.isEmpty()) - return file; - return QLatin1String("Makefile"); - }); -} - void QmakeBuildConfiguration::kitChanged() { LastKitState newState = LastKitState(target()->kit()); @@ -529,25 +546,14 @@ void QmakeBuildConfiguration::setEnabled(bool enabled) \class QmakeBuildConfigurationFactory */ -QmakeBuildConfigurationFactory::QmakeBuildConfigurationFactory(QObject *parent) : - IBuildConfigurationFactory(parent) +QmakeBuildConfigurationFactory::QmakeBuildConfigurationFactory() { - update(); + registerBuildConfiguration<QmakeBuildConfiguration>(Constants::QMAKE_BC_ID); + setSupportedProjectType(Constants::QMAKEPROJECT_ID); + setSupportedProjectMimeTypeName(Constants::PROFILE_MIMETYPE); connect(QtVersionManager::instance(), &QtVersionManager::qtVersionsChanged, - this, &QmakeBuildConfigurationFactory::update); -} - -void QmakeBuildConfigurationFactory::update() -{ - emit availableCreationIdsChanged(); -} - -bool QmakeBuildConfigurationFactory::canHandle(const Target *t) const -{ - if (!t->project()->supportsKit(t->kit())) - return false; - return qobject_cast<QmakeProject *>(t->project()); + this, &IBuildConfigurationFactory::availableCreationIdsChanged); } QmakeBuildInfo *QmakeBuildConfigurationFactory::createBuildInfo(const Kit *k, @@ -604,11 +610,6 @@ QmakeBuildInfo *QmakeBuildConfigurationFactory::createBuildInfo(const Kit *k, return info; } -int QmakeBuildConfigurationFactory::priority(const Target *parent) const -{ - return canHandle(parent) ? 0 : -1; -} - static QList<BuildConfiguration::BuildType> availableBuildTypes(const BaseQtVersion *version) { QList<BuildConfiguration::BuildType> types = {BuildConfiguration::Debug, @@ -635,13 +636,6 @@ QList<BuildInfo *> QmakeBuildConfigurationFactory::availableBuilds(const Target return result; } -int QmakeBuildConfigurationFactory::priority(const Kit *k, const QString &projectPath) const -{ - if (k && Utils::mimeTypeForFile(projectPath).matchesName(Constants::PROFILE_MIMETYPE)) - return 0; - return -1; -} - QList<BuildInfo *> QmakeBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const { QList<BuildInfo *> result; @@ -655,98 +649,6 @@ QList<BuildInfo *> QmakeBuildConfigurationFactory::availableSetups(const Kit *k, return result; } -void QmakeBuildConfigurationFactory::configureBuildConfiguration(Target *parent, - QmakeBuildConfiguration *bc, - const QmakeBuildInfo *qmakeInfo) const -{ - BaseQtVersion *version = QtKitInformation::qtVersion(parent->kit()); - - BaseQtVersion::QmakeBuildConfigs config = version->defaultBuildConfig(); - if (qmakeInfo->buildType == BuildConfiguration::Debug) - config |= BaseQtVersion::DebugBuild; - else - config &= ~BaseQtVersion::DebugBuild; - - bc->setDefaultDisplayName(qmakeInfo->displayName); - bc->setDisplayName(qmakeInfo->displayName); - - BuildStepList *buildSteps = bc->stepList(Core::Id(ProjectExplorer::Constants::BUILDSTEPS_BUILD)); - BuildStepList *cleanSteps = bc->stepList(Core::Id(ProjectExplorer::Constants::BUILDSTEPS_CLEAN)); - Q_ASSERT(buildSteps); - Q_ASSERT(cleanSteps); - - QMakeStep *qmakeStep = new QMakeStep(buildSteps); - buildSteps->insertStep(0, qmakeStep); - - MakeStep *makeStep = new MakeStep(buildSteps); - buildSteps->insertStep(1, makeStep); - - MakeStep *cleanStep = new MakeStep(cleanSteps); - cleanStep->setClean(true); - cleanStep->setUserArguments(QLatin1String("clean")); - cleanSteps->insertStep(0, cleanStep); - - QString additionalArguments = qmakeInfo->additionalArguments; - if (!additionalArguments.isEmpty()) - qmakeStep->setUserArguments(additionalArguments); - qmakeStep->setLinkQmlDebuggingLibrary(qmakeInfo->config.linkQmlDebuggingQQ2); - qmakeStep->setSeparateDebugInfo(qmakeInfo->config.separateDebugInfo); - qmakeStep->setUseQtQuickCompiler(qmakeInfo->config.useQtQuickCompiler); - - bc->setQMakeBuildConfiguration(config); - - FileName directory = qmakeInfo->buildDirectory; - if (directory.isEmpty()) { - directory = defaultBuildDirectory(parent->project()->projectFilePath().toString(), - parent->kit(), qmakeInfo->displayName, bc->buildType()); - } - - bc->setBuildDirectory(directory); -} - -BuildConfiguration *QmakeBuildConfigurationFactory::create(Target *parent, const BuildInfo *info) const -{ - QTC_ASSERT(info->factory() == this, return 0); - QTC_ASSERT(info->kitId == parent->kit()->id(), return 0); - QTC_ASSERT(!info->displayName.isEmpty(), return 0); - - const QmakeBuildInfo *qmakeInfo = static_cast<const QmakeBuildInfo *>(info); - QmakeBuildConfiguration *bc = new QmakeBuildConfiguration(parent); - configureBuildConfiguration(parent, bc, qmakeInfo); - return bc; -} - -bool QmakeBuildConfigurationFactory::canClone(const Target *parent, BuildConfiguration *source) const -{ - return canHandle(parent) && qobject_cast<QmakeBuildConfiguration *>(source); -} - -BuildConfiguration *QmakeBuildConfigurationFactory::clone(Target *parent, BuildConfiguration *source) -{ - if (!canClone(parent, source)) - return 0; - QmakeBuildConfiguration *oldbc(static_cast<QmakeBuildConfiguration *>(source)); - return new QmakeBuildConfiguration(parent, oldbc); -} - -bool QmakeBuildConfigurationFactory::canRestore(const Target *parent, const QVariantMap &map) const -{ - if (!canHandle(parent)) - return false; - return ProjectExplorer::idFromMap(map) == QMAKE_BC_ID; -} - -BuildConfiguration *QmakeBuildConfigurationFactory::restore(Target *parent, const QVariantMap &map) -{ - if (!canRestore(parent, map)) - return 0; - QmakeBuildConfiguration *bc = new QmakeBuildConfiguration(parent); - if (bc->fromMap(map)) - return bc; - delete bc; - return 0; -} - BuildConfiguration::BuildType QmakeBuildConfiguration::buildType() const { QMakeStep *qs = qmakeStep(); diff --git a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h index 36ed928884..bca9a48769 100644 --- a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h +++ b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h @@ -50,6 +50,7 @@ public: explicit QmakeBuildConfiguration(ProjectExplorer::Target *target); ~QmakeBuildConfiguration(); + void initialize(const ProjectExplorer::BuildInfo *info) override; ProjectExplorer::NamedWidget *createConfigWidget() override; bool isShadowBuild() const; @@ -110,18 +111,13 @@ signals: void qmakeBuildConfigurationChanged(); void shadowBuildChanged(); -private: - void kitChanged(); - void toolChainUpdated(ProjectExplorer::ToolChain *tc); - void qtVersionsChanged(const QList<int> &, const QList<int> &, const QList<int> &changed); - protected: - QmakeBuildConfiguration(ProjectExplorer::Target *target, QmakeBuildConfiguration *source); - QmakeBuildConfiguration(ProjectExplorer::Target *target, Core::Id id); bool fromMap(const QVariantMap &map) override; private: - void ctor(); + void kitChanged(); + void toolChainUpdated(ProjectExplorer::ToolChain *tc); + void qtVersionsChanged(const QList<int> &, const QList<int> &, const QList<int> &changed); class LastKitState { @@ -153,27 +149,12 @@ class QMAKEPROJECTMANAGER_EXPORT QmakeBuildConfigurationFactory : public Project Q_OBJECT public: - explicit QmakeBuildConfigurationFactory(QObject *parent = 0); + QmakeBuildConfigurationFactory(); - int priority(const ProjectExplorer::Target *parent) const override; QList<ProjectExplorer::BuildInfo *> availableBuilds(const ProjectExplorer::Target *parent) const override; - int priority(const ProjectExplorer::Kit *k, const QString &projectPath) const override; QList<ProjectExplorer::BuildInfo *> availableSetups(const ProjectExplorer::Kit *k, const QString &projectPath) const override; - ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, - const ProjectExplorer::BuildInfo *info) const override; - - bool canClone(const ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const override; - ProjectExplorer::BuildConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) override; - bool canRestore(const ProjectExplorer::Target *parent, const QVariantMap &map) const override; - ProjectExplorer::BuildConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map) override; -protected: - void configureBuildConfiguration(ProjectExplorer::Target *parent, QmakeBuildConfiguration *bc, const QmakeBuildInfo *info) const; - private: - void update(); - - bool canHandle(const ProjectExplorer::Target *t) const; QmakeBuildInfo *createBuildInfo(const ProjectExplorer::Kit *k, const QString &projectPath, ProjectExplorer::BuildConfiguration::BuildType type) const; }; diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectimporter.h b/src/plugins/qmakeprojectmanager/qmakeprojectimporter.h index 8582f0c38f..adb5a4c9c6 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectimporter.h +++ b/src/plugins/qmakeprojectmanager/qmakeprojectimporter.h @@ -29,12 +29,7 @@ #include <qtsupport/qtprojectimporter.h> -namespace QtSupport { class BaseQtVersion; } - namespace QmakeProjectManager { - -class QmakeProject; - namespace Internal { // Documentation inside. diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerconstants.h b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerconstants.h index fcb102589b..03f3fd368e 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerconstants.h +++ b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerconstants.h @@ -63,6 +63,8 @@ const char PROFILE_EVALUATE[] = "Qt4ProjectManager.ProFileEvaluate"; // Project const char QMAKEPROJECT_ID[] = "Qt4ProjectManager.Qt4Project"; +const char QMAKE_BC_ID[] = "Qt4ProjectManager.Qt4BuildConfiguration"; + // ICONS const char ICON_QTQUICK_APP[] = ":/wizards/images/qtquickapp.png"; diff --git a/src/plugins/qmakeprojectmanager/qmakestep.cpp b/src/plugins/qmakeprojectmanager/qmakestep.cpp index dd5fa50979..f6dd003d55 100644 --- a/src/plugins/qmakeprojectmanager/qmakestep.cpp +++ b/src/plugins/qmakeprojectmanager/qmakestep.cpp @@ -72,31 +72,7 @@ const char QMAKE_QMLDEBUGLIBAUTO_KEY[] = "QtProjectManager.QMakeBuildStep.LinkQm const char QMAKE_QMLDEBUGLIB_KEY[] = "QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary"; } -QMakeStep::QMakeStep(BuildStepList *bsl) : - AbstractProcessStep(bsl, Core::Id(QMAKE_BS_ID)) -{ - ctor(); -} - -QMakeStep::QMakeStep(BuildStepList *bsl, Core::Id id) : - AbstractProcessStep(bsl, id) -{ - ctor(); -} - -QMakeStep::QMakeStep(BuildStepList *bsl, QMakeStep *bs) : - AbstractProcessStep(bsl, bs), - m_userArgs(bs->m_userArgs), - m_extraArgs(bs->m_extraArgs), - m_forced(bs->m_forced), - m_linkQmlDebuggingLibrary(bs->m_linkQmlDebuggingLibrary), - m_useQtQuickCompiler(bs->m_useQtQuickCompiler), - m_separateDebugInfo(bs->m_separateDebugInfo) -{ - ctor(); -} - -void QMakeStep::ctor() +QMakeStep::QMakeStep(BuildStepList *bsl) : AbstractProcessStep(bsl, QMAKE_BS_ID) { //: QMakeStep default display name setDefaultDisplayName(tr("qmake")); @@ -881,30 +857,13 @@ void QMakeStepConfigWidget::setSummaryText(const QString &text) // QMakeStepFactory //// -QMakeStepFactory::QMakeStepFactory(QObject *parent) : - ProjectExplorer::IBuildStepFactory(parent) -{ -} - -QList<BuildStepInfo> QMakeStepFactory::availableSteps(BuildStepList *parent) const -{ - if (parent->id() != ProjectExplorer::Constants::BUILDSTEPS_BUILD) - return {}; - if (!qobject_cast<QmakeBuildConfiguration *>(parent->parent())) - return {}; - - return {{QMAKE_BS_ID, tr("qmake"), BuildStepInfo::UniqueStep}}; -} - -ProjectExplorer::BuildStep *QMakeStepFactory::create(BuildStepList *parent, Core::Id id) -{ - Q_UNUSED(id) - return new QMakeStep(parent); -} - -ProjectExplorer::BuildStep *QMakeStepFactory::clone(BuildStepList *parent, ProjectExplorer::BuildStep *source) +QMakeStepFactory::QMakeStepFactory() { - return new QMakeStep(parent, qobject_cast<QMakeStep *>(source)); + registerStep<QMakeStep>(QMAKE_BS_ID); + setSupportedConfiguration(Constants::QMAKE_BC_ID); + setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); + setDisplayName(tr("qmake")); + setFlags(BuildStepInfo::UniqueStep); } QMakeStepConfig::TargetArchConfig QMakeStepConfig::targetArchFor(const Abi &targetAbi, const BaseQtVersion *version) diff --git a/src/plugins/qmakeprojectmanager/qmakestep.h b/src/plugins/qmakeprojectmanager/qmakestep.h index caf12b129a..f6488cfaa0 100644 --- a/src/plugins/qmakeprojectmanager/qmakestep.h +++ b/src/plugins/qmakeprojectmanager/qmakestep.h @@ -36,7 +36,7 @@ namespace Utils { class FileName; } namespace ProjectExplorer { class Abi; class BuildStep; -class IBuildStepFactory; +class BuildStepFactory; class Project; } // namespace ProjectExplorer @@ -50,18 +50,12 @@ namespace Internal { namespace Ui { class QMakeStep; } -class QMakeStepFactory : public ProjectExplorer::IBuildStepFactory +class QMakeStepFactory : public ProjectExplorer::BuildStepFactory { Q_OBJECT public: - explicit QMakeStepFactory(QObject *parent = 0); - - QList<ProjectExplorer::BuildStepInfo> - availableSteps(ProjectExplorer::BuildStepList *parent) const override; - - ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, Core::Id id) override; - ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *bs) override; + QMakeStepFactory(); }; } // namespace Internal @@ -160,17 +154,13 @@ signals: void separateDebugInfoChanged(); protected: - QMakeStep(ProjectExplorer::BuildStepList *parent, QMakeStep *source); - QMakeStep(ProjectExplorer::BuildStepList *parent, Core::Id id); bool fromMap(const QVariantMap &map) override; - void processStartupFailed() override; bool processSucceeded(int exitCode, QProcess::ExitStatus status) override; private: void startOneCommand(const QString &command, const QString &args); void runNextCommand(); - void ctor(); QString m_qmakeExecutable; QString m_qmakeArguments; diff --git a/src/plugins/qmlprojectmanager/qmlprojectmanagerconstants.h b/src/plugins/qmlprojectmanager/qmlprojectmanagerconstants.h index 9d08d5d59a..595daeb522 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectmanagerconstants.h +++ b/src/plugins/qmlprojectmanager/qmlprojectmanagerconstants.h @@ -30,7 +30,6 @@ namespace QmlProjectManager { namespace Constants { -const char QML_RC_ID[] = "QmlProjectManager.QmlRunConfiguration"; const char QML_SCENE_RC_ID[] = "QmlProjectManager.QmlRunConfiguration.QmlScene"; const char QML_VIEWER_ARGUMENTS_KEY[] = "QmlProjectManager.QmlRunConfiguration.QDeclarativeViewerArguments"; const char QML_VIEWER_TARGET_DISPLAY_NAME[] = "QML Viewer"; diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp index bd49f9f093..12fe2c33f8 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp @@ -52,7 +52,7 @@ namespace QmlProjectManager { const char M_CURRENT_FILE[] = "CurrentFile"; QmlProjectRunConfiguration::QmlProjectRunConfiguration(Target *target) - : RunConfiguration(target) + : RunConfiguration(target, Constants::QML_SCENE_RC_ID) { addExtraAspect(new QmlProjectEnvironmentAspect(this)); @@ -64,13 +64,6 @@ QmlProjectRunConfiguration::QmlProjectRunConfiguration(Target *target) connect(target, &Target::kitChanged, this, &QmlProjectRunConfiguration::updateEnabledState); -} - -void QmlProjectRunConfiguration::initialize(Id id) -{ - QTC_ASSERT(id == Constants::QML_SCENE_RC_ID, return); - - RunConfiguration::initialize(id); m_scriptFile = M_CURRENT_FILE; setDisplayName(tr("QML Scene", "QMLRunConfiguration display name.")); diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h index 7c9aa78596..c2647b4711 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h +++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h @@ -29,10 +29,6 @@ #include <projectexplorer/runnables.h> -#include <QPointer> - -QT_FORWARD_DECLARE_CLASS(QStringListModel) - namespace Core { class IEditor; } namespace QtSupport { class BaseQtVersion; } @@ -73,11 +69,11 @@ public: QVariantMap toMap() const override; ProjectExplorer::Abi abi() const override; + signals: void scriptSourceChanged(); private: - void initialize(Core::Id id) override; bool fromMap(const QVariantMap &map) override; void changeCurrentFile(Core::IEditor* = 0); diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationfactory.cpp b/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationfactory.cpp index 1e1ee2ad8f..18157dbeb6 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationfactory.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationfactory.cpp @@ -28,50 +28,28 @@ #include "qmlproject.h" #include "qmlprojectrunconfiguration.h" -#include <projectexplorer/kitinformation.h> -#include <projectexplorer/runconfiguration.h> -#include <projectexplorer/target.h> -#include <qtsupport/qtkitinformation.h> - namespace QmlProjectManager { namespace Internal { -const char QML_SCENE_SUFFIX[] = ".QmlScene"; - QmlProjectRunConfigurationFactory::QmlProjectRunConfigurationFactory(QObject *parent) : ProjectExplorer::IRunConfigurationFactory(parent) { setObjectName("QmlProjectRunConfigurationFactory"); - registerRunConfiguration<QmlProjectRunConfiguration>(Constants::QML_RC_ID); + registerRunConfiguration<QmlProjectRunConfiguration>(Constants::QML_SCENE_RC_ID); setSupportedProjectType<QmlProject>(); setSupportedTargetDeviceTypes({ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE}); } -QList<QString> QmlProjectRunConfigurationFactory::availableBuildTargets(ProjectExplorer::Target *parent, CreationMode) const +QList<QString> QmlProjectRunConfigurationFactory::availableBuildTargets(ProjectExplorer::Target *, CreationMode) const { - QtSupport::BaseQtVersion *version - = QtSupport::QtKitInformation::qtVersion(parent->kit()); - - return (version && version->qtVersion() >= QtSupport::QtVersionNumber(5, 0, 0)) - ? QList<QString>({QML_SCENE_SUFFIX}) : QList<QString>(); + return {QString()}; } -QString QmlProjectRunConfigurationFactory::displayNameForBuildTarget(const QString &buildTarget) const +QString QmlProjectRunConfigurationFactory::displayNameForBuildTarget(const QString &) const { - QTC_ASSERT(buildTarget == QML_SCENE_SUFFIX, return QString()); return tr("QML Scene"); } -bool QmlProjectRunConfigurationFactory::canCreateHelper(ProjectExplorer::Target *parent, - const QString &buildTarget) const -{ - QTC_ASSERT(buildTarget == QML_SCENE_SUFFIX, return false); - - const QtSupport::BaseQtVersion *version - = QtSupport::QtKitInformation::qtVersion(parent->kit()); - return version && version->qtVersion() >= QtSupport::QtVersionNumber(5, 0, 0); -} - } // namespace Internal } // namespace QmlProjectManager diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationfactory.h b/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationfactory.h index 3dd422f00a..837e422a79 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationfactory.h +++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationfactory.h @@ -39,8 +39,6 @@ public: QList<QString> availableBuildTargets(ProjectExplorer::Target *parent, CreationMode mode) const override; QString displayNameForBuildTarget(const QString &buildTarget) const override; - - bool canCreateHelper(ProjectExplorer::Target *parent, const QString &suffix) const override; }; } // namespace Internal diff --git a/src/plugins/qnx/qnx.pro b/src/plugins/qnx/qnx.pro index 30708de764..cd24ea1f7f 100644 --- a/src/plugins/qnx/qnx.pro +++ b/src/plugins/qnx/qnx.pro @@ -10,8 +10,6 @@ SOURCES += qnxplugin.cpp \ qnxrunconfiguration.cpp \ qnxanalyzesupport.cpp \ qnxdebugsupport.cpp \ - qnxdeploystepfactory.cpp \ - qnxdeployconfigurationfactory.cpp \ qnxrunconfigurationfactory.cpp \ qnxqtversionfactory.cpp \ qnxqtversion.cpp \ @@ -40,8 +38,6 @@ HEADERS += qnxplugin.h\ qnxrunconfiguration.h \ qnxanalyzesupport.h \ qnxdebugsupport.h \ - qnxdeploystepfactory.h \ - qnxdeployconfigurationfactory.h \ qnxrunconfigurationfactory.h \ qnxqtversionfactory.h \ qnxqtversion.h \ diff --git a/src/plugins/qnx/qnx.qbs b/src/plugins/qnx/qnx.qbs index 0ffc887fdf..d3b29d7ef4 100644 --- a/src/plugins/qnx/qnx.qbs +++ b/src/plugins/qnx/qnx.qbs @@ -35,10 +35,6 @@ QtcPlugin { "qnxdebugsupport.h", "qnxdeployconfiguration.cpp", "qnxdeployconfiguration.h", - "qnxdeployconfigurationfactory.cpp", - "qnxdeployconfigurationfactory.h", - "qnxdeploystepfactory.cpp", - "qnxdeploystepfactory.h", "qnxdevice.cpp", "qnxdevice.h", "qnxdevicefactory.cpp", diff --git a/src/plugins/qnx/qnxdeployconfiguration.cpp b/src/plugins/qnx/qnxdeployconfiguration.cpp index 9cc2520515..8c2e4ec38a 100644 --- a/src/plugins/qnx/qnxdeployconfiguration.cpp +++ b/src/plugins/qnx/qnxdeployconfiguration.cpp @@ -25,16 +25,44 @@ #include "qnxdeployconfiguration.h" -using namespace Qnx; -using namespace Qnx::Internal; +#include "qnxconstants.h" +#include "qnxdevicefactory.h" -QnxDeployConfiguration::QnxDeployConfiguration(ProjectExplorer::Target *target, Core::Id id, const QString &defaultDisplayName) - : RemoteLinux::RemoteLinuxDeployConfiguration(target, id, defaultDisplayName) +#include <projectexplorer/devicesupport/devicecheckbuildstep.h> +#include <projectexplorer/deploymentdataview.h> + +#include <remotelinux/genericdirectuploadstep.h> +#include <remotelinux/remotelinuxcheckforfreediskspacestep.h> + +using namespace ProjectExplorer; +using namespace RemoteLinux; + +namespace Qnx { +namespace Internal { + +QnxDeployConfiguration::QnxDeployConfiguration(Target *target) + : DeployConfiguration(target, Constants::QNX_QNX_DEPLOYCONFIGURATION_ID) { } -QnxDeployConfiguration::QnxDeployConfiguration(ProjectExplorer::Target *target, QnxDeployConfiguration *source) - : RemoteLinux::RemoteLinuxDeployConfiguration(target, source) +void QnxDeployConfiguration::initialize() { - cloneSteps(source); + stepList()->appendStep(new DeviceCheckBuildStep(stepList())); + stepList()->appendStep(new RemoteLinuxCheckForFreeDiskSpaceStep(stepList())); + stepList()->appendStep(new GenericDirectUploadStep(stepList())); } + +NamedWidget *QnxDeployConfiguration::createConfigWidget() +{ + return new DeploymentDataView(target()); +} + +QnxDeployConfigurationFactory::QnxDeployConfigurationFactory() +{ + registerDeployConfiguration<QnxDeployConfiguration>(Constants::QNX_QNX_DEPLOYCONFIGURATION_ID); + setDefaultDisplayName(tr("Deploy to QNX Device")); + setSupportedTargetDeviceTypes({QnxDeviceFactory::deviceType()}); +} + +} // namespace Internal +} // namespace Qnx diff --git a/src/plugins/qnx/qnxdeployconfiguration.h b/src/plugins/qnx/qnxdeployconfiguration.h index 0af2552c0d..e9c569969a 100644 --- a/src/plugins/qnx/qnxdeployconfiguration.h +++ b/src/plugins/qnx/qnxdeployconfiguration.h @@ -25,23 +25,27 @@ #pragma once -#include <remotelinux/remotelinuxdeployconfiguration.h> +#include <projectexplorer/deployconfiguration.h> namespace Qnx { namespace Internal { -class QnxDeployConfiguration : public RemoteLinux::RemoteLinuxDeployConfiguration +class QnxDeployConfiguration : public ProjectExplorer::DeployConfiguration { Q_OBJECT + public: - QnxDeployConfiguration(ProjectExplorer::Target *target, Core::Id id, - const QString &defaultDisplayName); + explicit QnxDeployConfiguration(ProjectExplorer::Target *target); + void initialize() override; + ProjectExplorer::NamedWidget *createConfigWidget() override; +}; - QnxDeployConfiguration(ProjectExplorer::Target *target, - QnxDeployConfiguration *source); -private: - friend class QnxDeployConfigurationFactory; +class QnxDeployConfigurationFactory : public ProjectExplorer::DeployConfigurationFactory +{ + Q_OBJECT +public: + QnxDeployConfigurationFactory(); }; } // namespace Internal diff --git a/src/plugins/qnx/qnxdeployconfigurationfactory.cpp b/src/plugins/qnx/qnxdeployconfigurationfactory.cpp deleted file mode 100644 index b35787b3c4..0000000000 --- a/src/plugins/qnx/qnxdeployconfigurationfactory.cpp +++ /dev/null @@ -1,122 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 BlackBerry Limited. All rights reserved. -** Contact: KDAB (info@kdab.com) -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "qnxdeployconfigurationfactory.h" - -#include "qnxconstants.h" -#include "qnxdeployconfiguration.h" -#include "qnxdevicefactory.h" - -#include <projectexplorer/devicesupport/devicecheckbuildstep.h> -#include <projectexplorer/kitinformation.h> -#include <projectexplorer/target.h> -#include <remotelinux/genericdirectuploadstep.h> - -namespace Qnx { -namespace Internal { - -QnxDeployConfigurationFactory::QnxDeployConfigurationFactory(QObject *parent) - : ProjectExplorer::DeployConfigurationFactory(parent) -{ -} - -QList<Core::Id> QnxDeployConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const -{ - QList<Core::Id> ids; - - if (canHandle(parent)) - ids << Core::Id(Constants::QNX_QNX_DEPLOYCONFIGURATION_ID); - - return ids; -} - -QString QnxDeployConfigurationFactory::displayNameForId(Core::Id id) const -{ - if (id.name().startsWith(Constants::QNX_QNX_DEPLOYCONFIGURATION_ID)) - return tr("Deploy to QNX Device"); - - return QString(); -} - -bool QnxDeployConfigurationFactory::canCreate(ProjectExplorer::Target *parent, Core::Id id) const -{ - return canHandle(parent) && id.name().startsWith(Constants::QNX_QNX_DEPLOYCONFIGURATION_ID); -} - -ProjectExplorer::DeployConfiguration *QnxDeployConfigurationFactory::create(ProjectExplorer::Target *parent, Core::Id id) -{ - if (!canCreate(parent, id)) - return 0; - - ProjectExplorer::DeployConfiguration * const dc = new QnxDeployConfiguration(parent, id, - displayNameForId(id)); - dc->stepList()->insertStep(0, new ProjectExplorer::DeviceCheckBuildStep(dc->stepList(), - ProjectExplorer::DeviceCheckBuildStep::stepId())); - dc->stepList()->insertStep(1, new RemoteLinux::GenericDirectUploadStep(dc->stepList(), - RemoteLinux::GenericDirectUploadStep::stepId())); - return dc; -} - -bool QnxDeployConfigurationFactory::canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const -{ - return canCreate(parent, ProjectExplorer::idFromMap(map)); -} - -ProjectExplorer::DeployConfiguration *QnxDeployConfigurationFactory::restore(ProjectExplorer::Target *parent, const QVariantMap &map) -{ - if (!canRestore(parent, map)) - return 0; - Core::Id id = ProjectExplorer::idFromMap(map); - QnxDeployConfiguration * const dc = new QnxDeployConfiguration(parent, id, displayNameForId(id)); - if (!dc->fromMap(map)) { - delete dc; - return 0; - } - return dc; -} - -bool QnxDeployConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::DeployConfiguration *source) const -{ - return canCreate(parent, source->id()); -} - -ProjectExplorer::DeployConfiguration *QnxDeployConfigurationFactory::clone(ProjectExplorer::Target *parent, ProjectExplorer::DeployConfiguration *source) -{ - if (!canClone(parent, source)) - return 0; - return new QnxDeployConfiguration(parent, qobject_cast<QnxDeployConfiguration *>(source)); -} - -bool QnxDeployConfigurationFactory::canHandle(ProjectExplorer::Target *t) const -{ - Core::Id deviceType = ProjectExplorer::DeviceTypeKitInformation::deviceTypeId(t->kit()); - if (deviceType != QnxDeviceFactory::deviceType()) - return false; - - return true; -} - -} // namespace Internal -} // namespace Qnx diff --git a/src/plugins/qnx/qnxdeployconfigurationfactory.h b/src/plugins/qnx/qnxdeployconfigurationfactory.h deleted file mode 100644 index 6564470c19..0000000000 --- a/src/plugins/qnx/qnxdeployconfigurationfactory.h +++ /dev/null @@ -1,58 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 BlackBerry Limited. All rights reserved. -** Contact: KDAB (info@kdab.com) -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#pragma once - -#include <projectexplorer/deployconfiguration.h> - -namespace Qnx { -namespace Internal { - -class QnxDeployConfigurationFactory : public ProjectExplorer::DeployConfigurationFactory -{ - Q_OBJECT -public: - explicit QnxDeployConfigurationFactory(QObject *parent = 0); - - QList<Core::Id> availableCreationIds(ProjectExplorer::Target *parent) const override; - QString displayNameForId(Core::Id id) const override; - - bool canCreate(ProjectExplorer::Target *parent, Core::Id id) const override; - ProjectExplorer::DeployConfiguration *create(ProjectExplorer::Target *parent, Core::Id id) override; - - bool canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const override; - ProjectExplorer::DeployConfiguration *restore(ProjectExplorer::Target *parent, - const QVariantMap &map) override; - - bool canClone(ProjectExplorer::Target *parent, - ProjectExplorer::DeployConfiguration *source) const override; - ProjectExplorer::DeployConfiguration *clone(ProjectExplorer::Target *parent, - ProjectExplorer::DeployConfiguration *source) override; -private: - bool canHandle(ProjectExplorer::Target *t) const; -}; - -} // namespace Internal -} // namespace Qnx diff --git a/src/plugins/qnx/qnxdeploystepfactory.cpp b/src/plugins/qnx/qnxdeploystepfactory.cpp deleted file mode 100644 index c275481e3f..0000000000 --- a/src/plugins/qnx/qnxdeploystepfactory.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 BlackBerry Limited. All rights reserved. -** Contact: KDAB (info@kdab.com) -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "qnxdeploystepfactory.h" -#include "qnxconstants.h" -#include "qnxdevicefactory.h" - -#include <projectexplorer/buildsteplist.h> -#include <projectexplorer/devicesupport/devicecheckbuildstep.h> -#include <projectexplorer/kitinformation.h> -#include <projectexplorer/projectexplorerconstants.h> -#include <projectexplorer/target.h> -#include <remotelinux/genericdirectuploadstep.h> - -using namespace ProjectExplorer; - -namespace Qnx { -namespace Internal { - -QnxDeployStepFactory::QnxDeployStepFactory() - : ProjectExplorer::IBuildStepFactory() -{ -} - -QList<BuildStepInfo> QnxDeployStepFactory::availableSteps(BuildStepList *parent) const -{ - if (parent->id() != ProjectExplorer::Constants::BUILDSTEPS_DEPLOY) - return {}; - - Core::Id deviceType = DeviceTypeKitInformation::deviceTypeId(parent->target()->kit()); - if (deviceType != QnxDeviceFactory::deviceType()) - return {}; - - return {{RemoteLinux::GenericDirectUploadStep::stepId(), - RemoteLinux::GenericDirectUploadStep::displayName()}, - {DeviceCheckBuildStep::stepId(), - DeviceCheckBuildStep::stepDisplayName()}}; -} - -ProjectExplorer::BuildStep *QnxDeployStepFactory::create(ProjectExplorer::BuildStepList *parent, Core::Id id) -{ - if (id == RemoteLinux::GenericDirectUploadStep::stepId()) - return new RemoteLinux::GenericDirectUploadStep(parent, id); - else if (id == ProjectExplorer::DeviceCheckBuildStep::stepId()) - return new ProjectExplorer::DeviceCheckBuildStep(parent, id); - return 0; -} - -ProjectExplorer::BuildStep *QnxDeployStepFactory::clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *product) -{ - if (RemoteLinux::GenericDirectUploadStep * const other = qobject_cast<RemoteLinux::GenericDirectUploadStep*>(product)) - return new RemoteLinux::GenericDirectUploadStep(parent, other); - else if (ProjectExplorer::DeviceCheckBuildStep * const other = qobject_cast<ProjectExplorer::DeviceCheckBuildStep*>(product)) - return new ProjectExplorer::DeviceCheckBuildStep(parent, other); - - return 0; -} - -} // namespace Internal -} // namespace Qnx diff --git a/src/plugins/qnx/qnxdeploystepfactory.h b/src/plugins/qnx/qnxdeploystepfactory.h deleted file mode 100644 index e7f97f5ad5..0000000000 --- a/src/plugins/qnx/qnxdeploystepfactory.h +++ /dev/null @@ -1,48 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 BlackBerry Limited. All rights reserved. -** Contact: KDAB (info@kdab.com) -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#pragma once - -#include <projectexplorer/buildstep.h> - -namespace Qnx { -namespace Internal { - -class QnxDeployStepFactory : public ProjectExplorer::IBuildStepFactory -{ - Q_OBJECT -public: - explicit QnxDeployStepFactory(); - - QList<ProjectExplorer::BuildStepInfo> - availableSteps(ProjectExplorer::BuildStepList *parent) const override; - - ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, Core::Id id) override; - ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, - ProjectExplorer::BuildStep *product) override; -}; - -} // namespace Internal -} // namespace Qnx diff --git a/src/plugins/qnx/qnxplugin.cpp b/src/plugins/qnx/qnxplugin.cpp index 07306e81e3..c5fb91e2bd 100644 --- a/src/plugins/qnx/qnxplugin.cpp +++ b/src/plugins/qnx/qnxplugin.cpp @@ -29,8 +29,7 @@ #include "qnxconfigurationmanager.h" #include "qnxconstants.h" #include "qnxdebugsupport.h" -#include "qnxdeployconfigurationfactory.h" -#include "qnxdeploystepfactory.h" +#include "qnxdeployconfiguration.h" #include "qnxdevice.h" #include "qnxdevicefactory.h" #include "qnxqtversion.h" @@ -77,7 +76,6 @@ bool QnxPlugin::initialize(const QStringList &arguments, QString *errorString) addAutoReleasedObject(new QnxConfigurationManager); addAutoReleasedObject(new QnxQtVersionFactory); addAutoReleasedObject(new QnxDeviceFactory); - addAutoReleasedObject(new QnxDeployStepFactory); addAutoReleasedObject(new QnxDeployConfigurationFactory); addAutoReleasedObject(new QnxRunConfigurationFactory); addAutoReleasedObject(new QnxSettingsPage); diff --git a/src/plugins/qnx/qnxrunconfiguration.cpp b/src/plugins/qnx/qnxrunconfiguration.cpp index 0a50793e75..1a2559ecd3 100644 --- a/src/plugins/qnx/qnxrunconfiguration.cpp +++ b/src/plugins/qnx/qnxrunconfiguration.cpp @@ -48,25 +48,9 @@ namespace Internal { const char QtLibPathKey[] = "Qt4ProjectManager.QnxRunConfiguration.QtLibPath"; QnxRunConfiguration::QnxRunConfiguration(Target *target) - : RemoteLinuxRunConfiguration(target) + : RemoteLinuxRunConfiguration(target, Constants::QNX_QNX_RUNCONFIGURATION_PREFIX) {} -void QnxRunConfiguration::initialize(Core::Id id) -{ - const QString projectFilePath = id.suffixAfter(Constants::QNX_QNX_RUNCONFIGURATION_PREFIX); - auto project = qobject_cast<QmakeProjectManager::QmakeProject *>(target()->project()); - QTC_ASSERT(project, return); - for (const QmakeProjectManager::QmakeProFile *file : project->applicationProFiles()) { - if (file->filePath().toString() == projectFilePath) { - // Circumvent RemoteLinux's initialize() FIXME: Ugly. - RunConfiguration::initialize(id); - setTargetName(file->targetInformation().target); - return; - } - } - RemoteLinuxRunConfiguration::initialize(id); -} - Runnable QnxRunConfiguration::runnable() const { auto r = RemoteLinuxRunConfiguration::runnable().as<StandardRunnable>(); diff --git a/src/plugins/qnx/qnxrunconfiguration.h b/src/plugins/qnx/qnxrunconfiguration.h index 0db88e481f..639badc999 100644 --- a/src/plugins/qnx/qnxrunconfiguration.h +++ b/src/plugins/qnx/qnxrunconfiguration.h @@ -37,8 +37,6 @@ class QnxRunConfiguration : public RemoteLinux::RemoteLinuxRunConfiguration public: explicit QnxRunConfiguration(ProjectExplorer::Target *target); - void initialize(Core::Id id) override; - private: ProjectExplorer::Runnable runnable() const override; QWidget *createConfigurationWidget() override; diff --git a/src/plugins/remotelinux/abstractpackagingstep.cpp b/src/plugins/remotelinux/abstractpackagingstep.cpp index aa45cf15f2..72df1a7fc7 100644 --- a/src/plugins/remotelinux/abstractpackagingstep.cpp +++ b/src/plugins/remotelinux/abstractpackagingstep.cpp @@ -53,17 +53,6 @@ public: AbstractPackagingStep::AbstractPackagingStep(BuildStepList *bsl, Core::Id id) : BuildStep(bsl, id) { - ctor(); -} - -AbstractPackagingStep::AbstractPackagingStep(BuildStepList *bsl, AbstractPackagingStep *other) - : BuildStep(bsl, other) -{ - ctor(); -} - -void AbstractPackagingStep::ctor() -{ d = new Internal::AbstractPackagingStepPrivate; connect(target(), &Target::activeBuildConfigurationChanged, this, &AbstractPackagingStep::handleBuildConfigurationChanged); diff --git a/src/plugins/remotelinux/abstractpackagingstep.h b/src/plugins/remotelinux/abstractpackagingstep.h index b278fd772e..c4857256eb 100644 --- a/src/plugins/remotelinux/abstractpackagingstep.h +++ b/src/plugins/remotelinux/abstractpackagingstep.h @@ -30,7 +30,6 @@ #include <projectexplorer/buildstep.h> namespace RemoteLinux { -class RemoteLinuxDeployConfiguration; namespace Internal { class AbstractPackagingStepPrivate; } @@ -39,8 +38,7 @@ class REMOTELINUX_EXPORT AbstractPackagingStep : public ProjectExplorer::BuildSt Q_OBJECT public: - AbstractPackagingStep(ProjectExplorer::BuildStepList *bsl, Core::Id id); - AbstractPackagingStep(ProjectExplorer::BuildStepList *bsl, AbstractPackagingStep *other); + explicit AbstractPackagingStep(ProjectExplorer::BuildStepList *bsl, Core::Id id); ~AbstractPackagingStep() override; QString packageFilePath() const; @@ -69,8 +67,6 @@ private: virtual QString packageFileName() const = 0; - void ctor(); - Internal::AbstractPackagingStepPrivate *d; }; diff --git a/src/plugins/remotelinux/abstractremotelinuxdeploystep.cpp b/src/plugins/remotelinux/abstractremotelinuxdeploystep.cpp index e70ac3e76b..71744b5724 100644 --- a/src/plugins/remotelinux/abstractremotelinuxdeploystep.cpp +++ b/src/plugins/remotelinux/abstractremotelinuxdeploystep.cpp @@ -50,12 +50,6 @@ AbstractRemoteLinuxDeployStep::AbstractRemoteLinuxDeployStep(BuildStepList *bsl, { } -AbstractRemoteLinuxDeployStep::AbstractRemoteLinuxDeployStep(BuildStepList *bsl, - AbstractRemoteLinuxDeployStep *other) - : BuildStep(bsl, other), d(new Internal::AbstractRemoteLinuxDeployStepPrivate) -{ -} - AbstractRemoteLinuxDeployStep::~AbstractRemoteLinuxDeployStep() { delete d; diff --git a/src/plugins/remotelinux/abstractremotelinuxdeploystep.h b/src/plugins/remotelinux/abstractremotelinuxdeploystep.h index b0148aa2e0..8f885f9ad3 100644 --- a/src/plugins/remotelinux/abstractremotelinuxdeploystep.h +++ b/src/plugins/remotelinux/abstractremotelinuxdeploystep.h @@ -55,9 +55,7 @@ public: virtual AbstractRemoteLinuxDeployService *deployService() const = 0; protected: - AbstractRemoteLinuxDeployStep(ProjectExplorer::BuildStepList *bsl, Core::Id id); - AbstractRemoteLinuxDeployStep(ProjectExplorer::BuildStepList *bsl, - AbstractRemoteLinuxDeployStep *other); + explicit AbstractRemoteLinuxDeployStep(ProjectExplorer::BuildStepList *bsl, Core::Id id); virtual bool initInternal(QString *error = 0) = 0; private: diff --git a/src/plugins/remotelinux/genericdirectuploadstep.cpp b/src/plugins/remotelinux/genericdirectuploadstep.cpp index b0890c6ba6..e6fd038453 100644 --- a/src/plugins/remotelinux/genericdirectuploadstep.cpp +++ b/src/plugins/remotelinux/genericdirectuploadstep.cpp @@ -92,16 +92,11 @@ public: } // namespace Internal -GenericDirectUploadStep::GenericDirectUploadStep(BuildStepList *bsl, Core::Id id) - : AbstractRemoteLinuxDeployStep(bsl, id) +GenericDirectUploadStep::GenericDirectUploadStep(BuildStepList *bsl) + : AbstractRemoteLinuxDeployStep(bsl, stepId()) { - ctor(); -} - -GenericDirectUploadStep::GenericDirectUploadStep(BuildStepList *bsl, GenericDirectUploadStep *other) - : AbstractRemoteLinuxDeployStep(bsl, other) -{ - ctor(); + d = new Internal::GenericDirectUploadStepPrivate; + setDefaultDisplayName(displayName()); } GenericDirectUploadStep::~GenericDirectUploadStep() @@ -144,12 +139,6 @@ QVariantMap GenericDirectUploadStep::toMap() const return map; } -void GenericDirectUploadStep::ctor() -{ - setDefaultDisplayName(displayName()); - d = new Internal::GenericDirectUploadStepPrivate; -} - void GenericDirectUploadStep::setIncrementalDeployment(bool incremental) { d->incremental = incremental; diff --git a/src/plugins/remotelinux/genericdirectuploadstep.h b/src/plugins/remotelinux/genericdirectuploadstep.h index 2ed99b2c18..ed35921618 100644 --- a/src/plugins/remotelinux/genericdirectuploadstep.h +++ b/src/plugins/remotelinux/genericdirectuploadstep.h @@ -37,8 +37,7 @@ class REMOTELINUX_EXPORT GenericDirectUploadStep : public AbstractRemoteLinuxDep Q_OBJECT public: - GenericDirectUploadStep(ProjectExplorer::BuildStepList *bsl, Core::Id id); - GenericDirectUploadStep(ProjectExplorer::BuildStepList *bsl, GenericDirectUploadStep *other); + explicit GenericDirectUploadStep(ProjectExplorer::BuildStepList *bsl); ~GenericDirectUploadStep() override; ProjectExplorer::BuildStepConfigWidget *createConfigWidget() override; @@ -58,8 +57,6 @@ private: bool fromMap(const QVariantMap &map) override; QVariantMap toMap() const override; - void ctor(); - Internal::GenericDirectUploadStepPrivate *d; }; diff --git a/src/plugins/remotelinux/genericremotelinuxdeploystepfactory.cpp b/src/plugins/remotelinux/genericremotelinuxdeploystepfactory.cpp deleted file mode 100644 index 29c7170a6e..0000000000 --- a/src/plugins/remotelinux/genericremotelinuxdeploystepfactory.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "genericremotelinuxdeploystepfactory.h" - -#include "genericdirectuploadstep.h" -#include "remotelinuxcheckforfreediskspacestep.h" -#include "remotelinuxdeployconfiguration.h" -#include "remotelinuxcustomcommanddeploymentstep.h" -#include "tarpackagecreationstep.h" -#include "uploadandinstalltarpackagestep.h" - -using namespace ProjectExplorer; - -namespace RemoteLinux { -namespace Internal { - -GenericRemoteLinuxDeployStepFactory::GenericRemoteLinuxDeployStepFactory(QObject *parent) - : IBuildStepFactory(parent) -{ -} - -QList<BuildStepInfo> GenericRemoteLinuxDeployStepFactory::availableSteps(BuildStepList *parent) const -{ - if (!qobject_cast<RemoteLinuxDeployConfiguration *>(parent->parent())) - return {}; - - return {{TarPackageCreationStep::stepId(), - TarPackageCreationStep::displayName()}, - {UploadAndInstallTarPackageStep::stepId(), - UploadAndInstallTarPackageStep::displayName()}, - {GenericDirectUploadStep::stepId(), - GenericDirectUploadStep::displayName()}, - {GenericRemoteLinuxCustomCommandDeploymentStep::stepId(), - GenericRemoteLinuxCustomCommandDeploymentStep::stepDisplayName()}, - {RemoteLinuxCheckForFreeDiskSpaceStep::stepId(), - RemoteLinuxCheckForFreeDiskSpaceStep::stepDisplayName()}}; -} - -BuildStep *GenericRemoteLinuxDeployStepFactory::create(BuildStepList *parent, Core::Id id) -{ - if (id == TarPackageCreationStep::stepId()) - return new TarPackageCreationStep(parent); - if (id == UploadAndInstallTarPackageStep::stepId()) - return new UploadAndInstallTarPackageStep(parent); - if (id == GenericDirectUploadStep::stepId()) - return new GenericDirectUploadStep(parent, GenericDirectUploadStep::stepId()); - if (id == GenericRemoteLinuxCustomCommandDeploymentStep::stepId()) - return new GenericRemoteLinuxCustomCommandDeploymentStep(parent); - if (id == RemoteLinuxCheckForFreeDiskSpaceStep::stepId()) - return new RemoteLinuxCheckForFreeDiskSpaceStep(parent); - return 0; -} - -BuildStep *GenericRemoteLinuxDeployStepFactory::clone(BuildStepList *parent, BuildStep *product) -{ - if (TarPackageCreationStep * const other = qobject_cast<TarPackageCreationStep *>(product)) - return new TarPackageCreationStep(parent, other); - if (UploadAndInstallTarPackageStep * const other = qobject_cast<UploadAndInstallTarPackageStep*>(product)) - return new UploadAndInstallTarPackageStep(parent, other); - if (GenericDirectUploadStep * const other = qobject_cast<GenericDirectUploadStep *>(product)) - return new GenericDirectUploadStep(parent, other); - if (GenericRemoteLinuxCustomCommandDeploymentStep * const other = qobject_cast<GenericRemoteLinuxCustomCommandDeploymentStep *>(product)) - return new GenericRemoteLinuxCustomCommandDeploymentStep(parent, other); - if (RemoteLinuxCheckForFreeDiskSpaceStep * const other = qobject_cast<RemoteLinuxCheckForFreeDiskSpaceStep *>(product)) - return new RemoteLinuxCheckForFreeDiskSpaceStep(parent, other); - return 0; -} - -} // namespace Internal -} // namespace RemoteLinux diff --git a/src/plugins/remotelinux/genericremotelinuxdeploystepfactory.h b/src/plugins/remotelinux/genericremotelinuxdeploystepfactory.h deleted file mode 100644 index af92564fdb..0000000000 --- a/src/plugins/remotelinux/genericremotelinuxdeploystepfactory.h +++ /dev/null @@ -1,49 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#pragma once - -#include <projectexplorer/buildstep.h> - -namespace RemoteLinux { -namespace Internal { - -class GenericRemoteLinuxDeployStepFactory : public ProjectExplorer::IBuildStepFactory -{ - Q_OBJECT - -public: - GenericRemoteLinuxDeployStepFactory(QObject *parent = 0); - - QList<ProjectExplorer::BuildStepInfo> - availableSteps(ProjectExplorer::BuildStepList *parent) const override; - - ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, Core::Id id) override; - ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, - ProjectExplorer::BuildStep *product) override; -}; - -} // namespace Internal -} // namespace RemoteLinux diff --git a/src/plugins/remotelinux/remotelinux.pro b/src/plugins/remotelinux/remotelinux.pro index e1a43cb21f..e1b755a4b0 100644 --- a/src/plugins/remotelinux/remotelinux.pro +++ b/src/plugins/remotelinux/remotelinux.pro @@ -25,8 +25,6 @@ HEADERS += \ abstractuploadandinstallpackageservice.h \ genericdirectuploadservice.h \ remotelinuxdeployconfiguration.h \ - remotelinuxdeployconfigurationfactory.h \ - genericremotelinuxdeploystepfactory.h \ abstractpackagingstep.h \ tarpackagecreationstep.h \ remotelinuxpackageinstaller.h \ @@ -70,8 +68,6 @@ SOURCES += \ abstractuploadandinstallpackageservice.cpp \ genericdirectuploadservice.cpp \ remotelinuxdeployconfiguration.cpp \ - remotelinuxdeployconfigurationfactory.cpp \ - genericremotelinuxdeploystepfactory.cpp \ abstractpackagingstep.cpp \ tarpackagecreationstep.cpp \ remotelinuxpackageinstaller.cpp \ diff --git a/src/plugins/remotelinux/remotelinux.qbs b/src/plugins/remotelinux/remotelinux.qbs index a7ee122f4f..8fb3cae837 100644 --- a/src/plugins/remotelinux/remotelinux.qbs +++ b/src/plugins/remotelinux/remotelinux.qbs @@ -45,8 +45,6 @@ Project { "genericlinuxdeviceconfigurationwizardpages.cpp", "genericlinuxdeviceconfigurationwizardpages.h", "genericlinuxdeviceconfigurationwizardsetuppage.ui", - "genericremotelinuxdeploystepfactory.cpp", - "genericremotelinuxdeploystepfactory.h", "linuxdevice.cpp", "linuxdevice.h", "linuxdeviceprocess.cpp", @@ -76,8 +74,6 @@ Project { "remotelinuxdebugsupport.h", "remotelinuxdeployconfiguration.cpp", "remotelinuxdeployconfiguration.h", - "remotelinuxdeployconfigurationfactory.cpp", - "remotelinuxdeployconfigurationfactory.h", "remotelinuxenvironmentaspect.cpp", "remotelinuxenvironmentaspect.h", "remotelinuxenvironmentaspectwidget.cpp", diff --git a/src/plugins/remotelinux/remotelinuxcheckforfreediskspacestep.cpp b/src/plugins/remotelinux/remotelinuxcheckforfreediskspacestep.cpp index fa2e323987..8361eb3240 100644 --- a/src/plugins/remotelinux/remotelinuxcheckforfreediskspacestep.cpp +++ b/src/plugins/remotelinux/remotelinuxcheckforfreediskspacestep.cpp @@ -91,33 +91,20 @@ public: } // namespace Internal -RemoteLinuxCheckForFreeDiskSpaceStep::RemoteLinuxCheckForFreeDiskSpaceStep(BuildStepList *bsl, Core::Id id) - : AbstractRemoteLinuxDeployStep(bsl, id) +RemoteLinuxCheckForFreeDiskSpaceStep::RemoteLinuxCheckForFreeDiskSpaceStep(BuildStepList *bsl) + : AbstractRemoteLinuxDeployStep(bsl, stepId()) { - ctor(); - setPathToCheck(QLatin1String("/")); + d = new Internal::RemoteLinuxCheckForFreeDiskSpaceStepPrivate; + setDefaultDisplayName(displayName()); + setPathToCheck("/"); setRequiredSpaceInBytes(5*1024*1024); } -RemoteLinuxCheckForFreeDiskSpaceStep::RemoteLinuxCheckForFreeDiskSpaceStep(BuildStepList *bsl, - RemoteLinuxCheckForFreeDiskSpaceStep *other) : AbstractRemoteLinuxDeployStep(bsl, other) -{ - ctor(); - setPathToCheck(other->pathToCheck()); - setRequiredSpaceInBytes(other->requiredSpaceInBytes()); -} - RemoteLinuxCheckForFreeDiskSpaceStep::~RemoteLinuxCheckForFreeDiskSpaceStep() { delete d; } -void RemoteLinuxCheckForFreeDiskSpaceStep::ctor() -{ - d = new Internal::RemoteLinuxCheckForFreeDiskSpaceStepPrivate; - setDefaultDisplayName(stepDisplayName()); -} - void RemoteLinuxCheckForFreeDiskSpaceStep::setPathToCheck(const QString &path) { d->pathToCheck = path; @@ -178,7 +165,7 @@ Core::Id RemoteLinuxCheckForFreeDiskSpaceStep::stepId() return "RemoteLinux.CheckForFreeDiskSpaceStep"; } -QString RemoteLinuxCheckForFreeDiskSpaceStep::stepDisplayName() +QString RemoteLinuxCheckForFreeDiskSpaceStep::displayName() { return tr("Check for free disk space"); } diff --git a/src/plugins/remotelinux/remotelinuxcheckforfreediskspacestep.h b/src/plugins/remotelinux/remotelinuxcheckforfreediskspacestep.h index 102e494be9..f102c93c62 100644 --- a/src/plugins/remotelinux/remotelinuxcheckforfreediskspacestep.h +++ b/src/plugins/remotelinux/remotelinuxcheckforfreediskspacestep.h @@ -34,10 +34,7 @@ class REMOTELINUX_EXPORT RemoteLinuxCheckForFreeDiskSpaceStep : public AbstractR { Q_OBJECT public: - explicit RemoteLinuxCheckForFreeDiskSpaceStep(ProjectExplorer::BuildStepList *bsl, - Core::Id id = stepId()); - RemoteLinuxCheckForFreeDiskSpaceStep(ProjectExplorer::BuildStepList *bsl, - RemoteLinuxCheckForFreeDiskSpaceStep *other); + explicit RemoteLinuxCheckForFreeDiskSpaceStep(ProjectExplorer::BuildStepList *bsl); ~RemoteLinuxCheckForFreeDiskSpaceStep() override; void setPathToCheck(const QString &path); @@ -47,7 +44,7 @@ public: quint64 requiredSpaceInBytes() const; static Core::Id stepId(); - static QString stepDisplayName(); + static QString displayName(); protected: bool fromMap(const QVariantMap &map) override; @@ -58,8 +55,6 @@ protected: AbstractRemoteLinuxDeployService *deployService() const override; private: - void ctor(); - Internal::RemoteLinuxCheckForFreeDiskSpaceStepPrivate *d; }; diff --git a/src/plugins/remotelinux/remotelinuxcustomcommanddeploymentstep.cpp b/src/plugins/remotelinux/remotelinuxcustomcommanddeploymentstep.cpp index 3e269831b4..c1c25c76fa 100644 --- a/src/plugins/remotelinux/remotelinuxcustomcommanddeploymentstep.cpp +++ b/src/plugins/remotelinux/remotelinuxcustomcommanddeploymentstep.cpp @@ -90,18 +90,11 @@ public: using namespace Internal; -AbstractRemoteLinuxCustomCommandDeploymentStep::AbstractRemoteLinuxCustomCommandDeploymentStep(BuildStepList *bsl, - const Core::Id id) +AbstractRemoteLinuxCustomCommandDeploymentStep::AbstractRemoteLinuxCustomCommandDeploymentStep + (BuildStepList *bsl, Core::Id id) : AbstractRemoteLinuxDeployStep(bsl, id) { - ctor(); -} - -AbstractRemoteLinuxCustomCommandDeploymentStep::AbstractRemoteLinuxCustomCommandDeploymentStep(BuildStepList *bsl, - AbstractRemoteLinuxCustomCommandDeploymentStep *other) - : AbstractRemoteLinuxDeployStep(bsl, other) -{ - ctor(); + d = new AbstractRemoteLinuxCustomCommandDeploymentStepPrivate; } AbstractRemoteLinuxCustomCommandDeploymentStep::~AbstractRemoteLinuxCustomCommandDeploymentStep() @@ -109,11 +102,6 @@ AbstractRemoteLinuxCustomCommandDeploymentStep::~AbstractRemoteLinuxCustomComman delete d; } -void AbstractRemoteLinuxCustomCommandDeploymentStep::ctor() -{ - d = new AbstractRemoteLinuxCustomCommandDeploymentStepPrivate; -} - bool AbstractRemoteLinuxCustomCommandDeploymentStep::fromMap(const QVariantMap &map) { if (!AbstractRemoteLinuxDeployStep::fromMap(map)) @@ -154,14 +142,8 @@ BuildStepConfigWidget *AbstractRemoteLinuxCustomCommandDeploymentStep::createCon GenericRemoteLinuxCustomCommandDeploymentStep::GenericRemoteLinuxCustomCommandDeploymentStep(BuildStepList *bsl) : AbstractRemoteLinuxCustomCommandDeploymentStep(bsl, stepId()) { - ctor(); -} - -GenericRemoteLinuxCustomCommandDeploymentStep::GenericRemoteLinuxCustomCommandDeploymentStep(BuildStepList *bsl, - GenericRemoteLinuxCustomCommandDeploymentStep *other) - : AbstractRemoteLinuxCustomCommandDeploymentStep(bsl, other) -{ - ctor(); + d = new GenericRemoteLinuxCustomCommandDeploymentStepPrivate; + setDefaultDisplayName(displayName()); } GenericRemoteLinuxCustomCommandDeploymentStep::~GenericRemoteLinuxCustomCommandDeploymentStep() @@ -169,12 +151,6 @@ GenericRemoteLinuxCustomCommandDeploymentStep::~GenericRemoteLinuxCustomCommandD delete d; } -void GenericRemoteLinuxCustomCommandDeploymentStep::ctor() -{ - d = new GenericRemoteLinuxCustomCommandDeploymentStepPrivate; - setDefaultDisplayName(stepDisplayName()); -} - RemoteLinuxCustomCommandDeployService *GenericRemoteLinuxCustomCommandDeploymentStep::deployService() const { return &d->service; @@ -185,7 +161,7 @@ Core::Id GenericRemoteLinuxCustomCommandDeploymentStep::stepId() return "RemoteLinux.GenericRemoteLinuxCustomCommandDeploymentStep"; } -QString GenericRemoteLinuxCustomCommandDeploymentStep::stepDisplayName() +QString GenericRemoteLinuxCustomCommandDeploymentStep::displayName() { return tr("Run custom remote command"); } diff --git a/src/plugins/remotelinux/remotelinuxcustomcommanddeploymentstep.h b/src/plugins/remotelinux/remotelinuxcustomcommanddeploymentstep.h index fd2ca29e87..47ff761962 100644 --- a/src/plugins/remotelinux/remotelinuxcustomcommanddeploymentstep.h +++ b/src/plugins/remotelinux/remotelinuxcustomcommanddeploymentstep.h @@ -50,14 +50,10 @@ public: protected: AbstractRemoteLinuxCustomCommandDeploymentStep(ProjectExplorer::BuildStepList *bsl, Core::Id id); - AbstractRemoteLinuxCustomCommandDeploymentStep(ProjectExplorer::BuildStepList *bsl, - AbstractRemoteLinuxCustomCommandDeploymentStep *other); bool initInternal(QString *error = 0) override; private: - void ctor(); - RemoteLinuxCustomCommandDeployService *deployService() const override = 0; ProjectExplorer::BuildStepConfigWidget *createConfigWidget() override; @@ -71,16 +67,13 @@ class REMOTELINUX_EXPORT GenericRemoteLinuxCustomCommandDeploymentStep Q_OBJECT public: explicit GenericRemoteLinuxCustomCommandDeploymentStep(ProjectExplorer::BuildStepList *bsl); - GenericRemoteLinuxCustomCommandDeploymentStep(ProjectExplorer::BuildStepList *bsl, - GenericRemoteLinuxCustomCommandDeploymentStep *other); ~GenericRemoteLinuxCustomCommandDeploymentStep() override; static Core::Id stepId(); - static QString stepDisplayName(); + static QString displayName(); private: RemoteLinuxCustomCommandDeployService *deployService() const override; - void ctor(); Internal::GenericRemoteLinuxCustomCommandDeploymentStepPrivate *d; }; diff --git a/src/plugins/remotelinux/remotelinuxcustomrunconfiguration.cpp b/src/plugins/remotelinux/remotelinuxcustomrunconfiguration.cpp index 2bd5c1196f..64f4f67ce1 100644 --- a/src/plugins/remotelinux/remotelinuxcustomrunconfiguration.cpp +++ b/src/plugins/remotelinux/remotelinuxcustomrunconfiguration.cpp @@ -97,15 +97,9 @@ private: }; RemoteLinuxCustomRunConfiguration::RemoteLinuxCustomRunConfiguration(Target *target) - : RunConfiguration(target) + : RunConfiguration(target, runConfigId()) { addExtraAspect(new RemoteLinuxEnvironmentAspect(this)); -} - -void RemoteLinuxCustomRunConfiguration::initialize(Core::Id) -{ - RunConfiguration::initialize(runConfigId()); - setDefaultDisplayName(runConfigDefaultDisplayName()); } diff --git a/src/plugins/remotelinux/remotelinuxcustomrunconfiguration.h b/src/plugins/remotelinux/remotelinuxcustomrunconfiguration.h index 2d176755b6..22f943efd9 100644 --- a/src/plugins/remotelinux/remotelinuxcustomrunconfiguration.h +++ b/src/plugins/remotelinux/remotelinuxcustomrunconfiguration.h @@ -36,8 +36,6 @@ class RemoteLinuxCustomRunConfiguration : public ProjectExplorer::RunConfigurati public: explicit RemoteLinuxCustomRunConfiguration(ProjectExplorer::Target *target); - void initialize(Core::Id) override; - bool fromMap(const QVariantMap &map) override; QVariantMap toMap() const override; diff --git a/src/plugins/remotelinux/remotelinuxdeployconfiguration.cpp b/src/plugins/remotelinux/remotelinuxdeployconfiguration.cpp index 929f3558b0..fe33f4fe27 100644 --- a/src/plugins/remotelinux/remotelinuxdeployconfiguration.cpp +++ b/src/plugins/remotelinux/remotelinuxdeployconfiguration.cpp @@ -25,7 +25,16 @@ #include "remotelinuxdeployconfiguration.h" +#include "genericdirectuploadstep.h" +#include "remotelinuxcheckforfreediskspacestep.h" +#include "remotelinux_constants.h" + +#include <projectexplorer/abi.h> #include <projectexplorer/deploymentdataview.h> +#include <projectexplorer/project.h> +#include <projectexplorer/target.h> + +#include <QCoreApplication> using namespace ProjectExplorer; @@ -33,21 +42,37 @@ namespace RemoteLinux { using namespace Internal; -RemoteLinuxDeployConfiguration::RemoteLinuxDeployConfiguration(Target *target, - const Core::Id id, const QString &defaultDisplayName) - : DeployConfiguration(target, id) +RemoteLinuxDeployConfiguration::RemoteLinuxDeployConfiguration(Target *target) + : DeployConfiguration(target, genericDeployConfigurationId()) +{} + +void RemoteLinuxDeployConfiguration::initialize() { - setDefaultDisplayName(defaultDisplayName); + stepList()->insertStep(0, new RemoteLinuxCheckForFreeDiskSpaceStep(stepList())); + stepList()->insertStep(1, new GenericDirectUploadStep(stepList())); } -RemoteLinuxDeployConfiguration::RemoteLinuxDeployConfiguration(Target *target, - RemoteLinuxDeployConfiguration *source) - : DeployConfiguration(target, source) -{ } - NamedWidget *RemoteLinuxDeployConfiguration::createConfigWidget() { return new DeploymentDataView(target()); } +Core::Id RemoteLinuxDeployConfiguration::genericDeployConfigurationId() +{ + return "DeployToGenericLinux"; +} + +namespace Internal { + +RemoteLinuxDeployConfigurationFactory::RemoteLinuxDeployConfigurationFactory() +{ + setObjectName("RemoteLinuxDeployConfiguration"); + registerDeployConfiguration<RemoteLinuxDeployConfiguration> + (RemoteLinuxDeployConfiguration::genericDeployConfigurationId()); + setSupportedTargetDeviceTypes({RemoteLinux::Constants::GenericLinuxOsType}); + setDefaultDisplayName(QCoreApplication::translate("RemoteLinux", + "Deploy to Remote Linux Host")); +} + +} // namespace Internal } // namespace RemoteLinux diff --git a/src/plugins/remotelinux/remotelinuxdeployconfiguration.h b/src/plugins/remotelinux/remotelinuxdeployconfiguration.h index 409113ee2a..6b8a1a3525 100644 --- a/src/plugins/remotelinux/remotelinuxdeployconfiguration.h +++ b/src/plugins/remotelinux/remotelinuxdeployconfiguration.h @@ -31,7 +31,6 @@ #include <projectexplorer/deployconfiguration.h> namespace RemoteLinux { -namespace Internal { class RemoteLinuxDeployConfigurationFactory; } class REMOTELINUX_EXPORT RemoteLinuxDeployConfiguration : public ProjectExplorer::DeployConfiguration @@ -39,10 +38,9 @@ class REMOTELINUX_EXPORT RemoteLinuxDeployConfiguration Q_OBJECT public: - RemoteLinuxDeployConfiguration(ProjectExplorer::Target *target, Core::Id id, - const QString &defaultDisplayName); - RemoteLinuxDeployConfiguration(ProjectExplorer::Target *target, - RemoteLinuxDeployConfiguration *source); + explicit RemoteLinuxDeployConfiguration(ProjectExplorer::Target *target); + + static Core::Id genericDeployConfigurationId(); ProjectExplorer::NamedWidget *createConfigWidget() override; @@ -58,8 +56,18 @@ public: return 0; } -private: - friend class Internal::RemoteLinuxDeployConfigurationFactory; + void initialize() override; +}; + +namespace Internal { + +class RemoteLinuxDeployConfigurationFactory : public ProjectExplorer::DeployConfigurationFactory +{ + Q_OBJECT + +public: + RemoteLinuxDeployConfigurationFactory(); }; +} // namespace Internal } // namespace RemoteLinux diff --git a/src/plugins/remotelinux/remotelinuxdeployconfigurationfactory.cpp b/src/plugins/remotelinux/remotelinuxdeployconfigurationfactory.cpp deleted file mode 100644 index 477be3b104..0000000000 --- a/src/plugins/remotelinux/remotelinuxdeployconfigurationfactory.cpp +++ /dev/null @@ -1,134 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "remotelinuxdeployconfigurationfactory.h" - -#include "genericdirectuploadstep.h" -#include "remotelinuxcheckforfreediskspacestep.h" -#include "remotelinux_constants.h" -#include "remotelinuxdeployconfiguration.h" - -#include <projectexplorer/abi.h> -#include <projectexplorer/toolchain.h> -#include <projectexplorer/kitinformation.h> -#include <projectexplorer/project.h> -#include <projectexplorer/target.h> - -#include <QCoreApplication> - -using namespace ProjectExplorer; - -namespace RemoteLinux { -namespace Internal { -namespace { -QString genericLinuxDisplayName() { - return QCoreApplication::translate("RemoteLinux", "Deploy to Remote Linux Host"); -} -} // anonymous namespace - -RemoteLinuxDeployConfigurationFactory::RemoteLinuxDeployConfigurationFactory(QObject *parent) - : DeployConfigurationFactory(parent) -{ setObjectName(QLatin1String("RemoteLinuxDeployConfiguration"));} - -QList<Core::Id> RemoteLinuxDeployConfigurationFactory::availableCreationIds(Target *target) const -{ - QList<Core::Id> ids; - if (!target->project()->supportsKit(target->kit())) - return ids; - - const Core::Id deviceType = DeviceTypeKitInformation::deviceTypeId(target->kit()); - if (deviceType != RemoteLinux::Constants::GenericLinuxOsType) - return ids; - - ids << genericDeployConfigurationId(); - return ids; -} - -QString RemoteLinuxDeployConfigurationFactory::displayNameForId(Core::Id id) const -{ - if (id == genericDeployConfigurationId()) - return genericLinuxDisplayName(); - return QString(); -} - -bool RemoteLinuxDeployConfigurationFactory::canCreate(Target *parent, Core::Id id) const -{ - return availableCreationIds(parent).contains(id); -} - -DeployConfiguration *RemoteLinuxDeployConfigurationFactory::create(Target *parent, - const Core::Id id) -{ - Q_ASSERT(canCreate(parent, id)); - - DeployConfiguration * const dc = new RemoteLinuxDeployConfiguration(parent, id, - genericLinuxDisplayName()); - dc->stepList()->insertStep(0, new RemoteLinuxCheckForFreeDiskSpaceStep(dc->stepList())); - dc->stepList()->insertStep(1, new GenericDirectUploadStep(dc->stepList(), - GenericDirectUploadStep::stepId())); - return dc; -} - -bool RemoteLinuxDeployConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const -{ - return canCreate(parent, idFromMap(map)); -} - -DeployConfiguration *RemoteLinuxDeployConfigurationFactory::restore(Target *parent, - const QVariantMap &map) -{ - if (!canRestore(parent, map)) - return 0; - Core::Id id = idFromMap(map); - RemoteLinuxDeployConfiguration * const dc = new RemoteLinuxDeployConfiguration(parent, id, - genericLinuxDisplayName()); - if (!dc->fromMap(map)) { - delete dc; - return 0; - } - return dc; -} - -bool RemoteLinuxDeployConfigurationFactory::canClone(Target *parent, DeployConfiguration *product) const -{ - return canCreate(parent, product->id()); -} - -DeployConfiguration *RemoteLinuxDeployConfigurationFactory::clone(Target *parent, - DeployConfiguration *product) -{ - if (!canClone(parent, product)) - return 0; - return new RemoteLinuxDeployConfiguration(parent, - qobject_cast<RemoteLinuxDeployConfiguration *>(product)); -} - -Core::Id RemoteLinuxDeployConfigurationFactory::genericDeployConfigurationId() -{ - return "DeployToGenericLinux"; -} - -} // namespace Internal -} // namespace RemoteLinux diff --git a/src/plugins/remotelinux/remotelinuxdeployconfigurationfactory.h b/src/plugins/remotelinux/remotelinuxdeployconfigurationfactory.h deleted file mode 100644 index 762d981f2a..0000000000 --- a/src/plugins/remotelinux/remotelinuxdeployconfigurationfactory.h +++ /dev/null @@ -1,54 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#pragma once - -#include <projectexplorer/deployconfiguration.h> - -namespace RemoteLinux { -namespace Internal { - -class RemoteLinuxDeployConfigurationFactory : public ProjectExplorer::DeployConfigurationFactory -{ - Q_OBJECT - -public: - explicit RemoteLinuxDeployConfigurationFactory(QObject *parent = 0); - - QList<Core::Id> availableCreationIds(ProjectExplorer::Target *target) const override; - QString displayNameForId(Core::Id id) const override; - bool canCreate(ProjectExplorer::Target *parent, Core::Id id) const override; - ProjectExplorer::DeployConfiguration *create(ProjectExplorer::Target *parent, Core::Id id) override; - bool canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const override; - ProjectExplorer::DeployConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map) override; - bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::DeployConfiguration *product) const override; - ProjectExplorer::DeployConfiguration *clone(ProjectExplorer::Target *parent, - ProjectExplorer::DeployConfiguration *product) override; - - static Core::Id genericDeployConfigurationId(); -}; - -} // namespace Internal -} // namespace RemoteLinux diff --git a/src/plugins/remotelinux/remotelinuxplugin.cpp b/src/plugins/remotelinux/remotelinuxplugin.cpp index b7d71997d7..a72bfc5e94 100644 --- a/src/plugins/remotelinux/remotelinuxplugin.cpp +++ b/src/plugins/remotelinux/remotelinuxplugin.cpp @@ -27,19 +27,38 @@ #include "embeddedlinuxqtversionfactory.h" #include "genericlinuxdeviceconfigurationfactory.h" -#include "genericremotelinuxdeploystepfactory.h" #include "remotelinuxqmltoolingsupport.h" #include "remotelinuxcustomrunconfiguration.h" #include "remotelinuxdebugsupport.h" -#include "remotelinuxdeployconfigurationfactory.h" +#include "remotelinuxdeployconfiguration.h" #include "remotelinuxrunconfiguration.h" #include "remotelinuxrunconfigurationfactory.h" +#include "genericdirectuploadstep.h" +#include "remotelinuxcheckforfreediskspacestep.h" +#include "remotelinuxdeployconfiguration.h" +#include "remotelinuxcustomcommanddeploymentstep.h" +#include "tarpackagecreationstep.h" +#include "uploadandinstalltarpackagestep.h" + #include <QtPlugin> namespace RemoteLinux { namespace Internal { +template <class Step> +class GenericLinuxDeployStepFactory : public ProjectExplorer::BuildStepFactory +{ +public: + GenericLinuxDeployStepFactory() + { + registerStep<Step>(Step::stepId()); + setDisplayName(Step::displayName()); + setSupportedConfiguration(RemoteLinuxDeployConfiguration::genericDeployConfigurationId()); + setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY); + } +}; + RemoteLinuxPlugin::RemoteLinuxPlugin() { setObjectName(QLatin1String("RemoteLinuxPlugin")); @@ -69,7 +88,12 @@ bool RemoteLinuxPlugin::initialize(const QStringList &arguments, addAutoReleasedObject(new RemoteLinuxRunConfigurationFactory); addAutoReleasedObject(new RemoteLinuxCustomRunConfigurationFactory); addAutoReleasedObject(new RemoteLinuxDeployConfigurationFactory); - addAutoReleasedObject(new GenericRemoteLinuxDeployStepFactory); + addAutoReleasedObject(new GenericLinuxDeployStepFactory<TarPackageCreationStep>); + addAutoReleasedObject(new GenericLinuxDeployStepFactory<UploadAndInstallTarPackageStep>); + addAutoReleasedObject(new GenericLinuxDeployStepFactory<GenericDirectUploadStep>); + addAutoReleasedObject(new GenericLinuxDeployStepFactory + <GenericRemoteLinuxCustomCommandDeploymentStep>); + addAutoReleasedObject(new GenericLinuxDeployStepFactory<RemoteLinuxCheckForFreeDiskSpaceStep>); addAutoReleasedObject(new EmbeddedLinuxQtVersionFactory); diff --git a/src/plugins/remotelinux/remotelinuxrunconfiguration.cpp b/src/plugins/remotelinux/remotelinuxrunconfiguration.cpp index c16c6371c4..0f5eb89a86 100644 --- a/src/plugins/remotelinux/remotelinuxrunconfiguration.cpp +++ b/src/plugins/remotelinux/remotelinuxrunconfiguration.cpp @@ -66,7 +66,12 @@ public: using namespace Internal; RemoteLinuxRunConfiguration::RemoteLinuxRunConfiguration(Target *target) - : RunConfiguration(target), d(new RemoteLinuxRunConfigurationPrivate) + : RemoteLinuxRunConfiguration(target, IdPrefix) +{ +} + +RemoteLinuxRunConfiguration::RemoteLinuxRunConfiguration(Target *target, Core::Id id) + : RunConfiguration(target, id), d(new RemoteLinuxRunConfigurationPrivate) { addExtraAspect(new RemoteLinuxEnvironmentAspect(this)); @@ -79,18 +84,9 @@ RemoteLinuxRunConfiguration::RemoteLinuxRunConfiguration(Target *target) this, &RemoteLinuxRunConfiguration::handleBuildSystemDataUpdated); } -void RemoteLinuxRunConfiguration::initialize(Core::Id id) -{ - RunConfiguration::initialize(id); - - d->targetName = id.suffixAfter(RemoteLinuxRunConfiguration::IdPrefix); - setDefaultDisplayName(defaultDisplayName()); -} - -void RemoteLinuxRunConfiguration::setTargetName(const QString &targetName) +QString RemoteLinuxRunConfiguration::extraId() const { - d->targetName = targetName; - setDefaultDisplayName(defaultDisplayName()); + return d->targetName; } RemoteLinuxRunConfiguration::~RemoteLinuxRunConfiguration() @@ -120,7 +116,7 @@ Runnable RemoteLinuxRunConfiguration::runnable() const QVariantMap RemoteLinuxRunConfiguration::toMap() const { - QVariantMap map(RunConfiguration::toMap()); + QVariantMap map = RunConfiguration::toMap(); map.insert(QLatin1String(ArgumentsKey), d->arguments); map.insert(QLatin1String(TargetNameKey), d->targetName); map.insert(QLatin1String(UseAlternateExeKey), d->useAlternateRemoteExecutable); @@ -149,8 +145,13 @@ bool RemoteLinuxRunConfiguration::fromMap(const QVariantMap &map) d->alternateRemoteExecutable = map.value(QLatin1String(AlternateExeKey)).toString(); d->workingDirectory = map.value(QLatin1String(WorkingDirectoryKey)).toString(); - setDefaultDisplayName(defaultDisplayName()); + // Hack for old-style mangled ids. FIXME: Remove. + if (d->targetName.isEmpty()) { + QString extra = ProjectExplorer::idFromMap(map).suffixAfter(id()); + d->targetName = extra; + } + setDefaultDisplayName(defaultDisplayName()); return true; } diff --git a/src/plugins/remotelinux/remotelinuxrunconfiguration.h b/src/plugins/remotelinux/remotelinuxrunconfiguration.h index 0aa730e868..466ae3432b 100644 --- a/src/plugins/remotelinux/remotelinuxrunconfiguration.h +++ b/src/plugins/remotelinux/remotelinuxrunconfiguration.h @@ -40,7 +40,6 @@ class REMOTELINUX_EXPORT RemoteLinuxRunConfiguration : public ProjectExplorer::R { Q_OBJECT friend class RemoteLinuxRunConfigurationWidget; - friend class ProjectExplorer::IRunConfigurationFactory; public: explicit RemoteLinuxRunConfiguration(ProjectExplorer::Target *target); @@ -74,13 +73,14 @@ signals: void targetInformationChanged() const; protected: - void initialize(Core::Id id) override; - void setTargetName(const QString &targetName); + // FIXME: Used by QNX, remove. + RemoteLinuxRunConfiguration(ProjectExplorer::Target *target, Core::Id id); bool fromMap(const QVariantMap &map) override; - QString defaultDisplayName(); + QString extraId() const override; private: + QString defaultDisplayName(); void handleBuildSystemDataUpdated(); Internal::RemoteLinuxRunConfigurationPrivate * const d; diff --git a/src/plugins/remotelinux/tarpackagecreationstep.cpp b/src/plugins/remotelinux/tarpackagecreationstep.cpp index 327cbf02d6..65b7c8e80e 100644 --- a/src/plugins/remotelinux/tarpackagecreationstep.cpp +++ b/src/plugins/remotelinux/tarpackagecreationstep.cpp @@ -132,17 +132,6 @@ struct TarFileHeader { TarPackageCreationStep::TarPackageCreationStep(BuildStepList *bsl) : AbstractPackagingStep(bsl, stepId()) { - ctor(); -} - -TarPackageCreationStep::TarPackageCreationStep(BuildStepList *bsl, TarPackageCreationStep *other) - : AbstractPackagingStep(bsl, other) -{ - ctor(); -} - -void TarPackageCreationStep::ctor() -{ setDefaultDisplayName(displayName()); m_ignoreMissingFiles = false; } diff --git a/src/plugins/remotelinux/tarpackagecreationstep.h b/src/plugins/remotelinux/tarpackagecreationstep.h index a2639ab686..b464a1e522 100644 --- a/src/plugins/remotelinux/tarpackagecreationstep.h +++ b/src/plugins/remotelinux/tarpackagecreationstep.h @@ -43,7 +43,6 @@ class REMOTELINUX_EXPORT TarPackageCreationStep : public AbstractPackagingStep Q_OBJECT public: TarPackageCreationStep(ProjectExplorer::BuildStepList *bsl); - TarPackageCreationStep(ProjectExplorer::BuildStepList *bsl, TarPackageCreationStep *other); static Core::Id stepId(); static QString displayName(); @@ -69,7 +68,6 @@ private: QString packageFileName() const override; - void ctor(); bool doPackage(QFutureInterface<bool> &fi); bool appendFile(QFile &tarFile, const QFileInfo &fileInfo, const QString &remoteFilePath, const QFutureInterface<bool> &fi); diff --git a/src/plugins/remotelinux/uploadandinstalltarpackagestep.cpp b/src/plugins/remotelinux/uploadandinstalltarpackagestep.cpp index e188e6a573..a2b00a3f49 100644 --- a/src/plugins/remotelinux/uploadandinstalltarpackagestep.cpp +++ b/src/plugins/remotelinux/uploadandinstalltarpackagestep.cpp @@ -64,18 +64,6 @@ AbstractRemoteLinuxPackageInstaller *UploadAndInstallTarPackageService::packageI UploadAndInstallTarPackageStep::UploadAndInstallTarPackageStep(BuildStepList *bsl) : AbstractRemoteLinuxDeployStep(bsl, stepId()) { - ctor(); -} - -UploadAndInstallTarPackageStep::UploadAndInstallTarPackageStep(BuildStepList *bsl, - UploadAndInstallTarPackageStep *other) - : AbstractRemoteLinuxDeployStep(bsl, other) -{ - ctor(); -} - -void UploadAndInstallTarPackageStep::ctor() -{ m_deployService = new UploadAndInstallTarPackageService(this); setDefaultDisplayName(displayName()); } diff --git a/src/plugins/remotelinux/uploadandinstalltarpackagestep.h b/src/plugins/remotelinux/uploadandinstalltarpackagestep.h index 5ac669de4a..edcdeff9cd 100644 --- a/src/plugins/remotelinux/uploadandinstalltarpackagestep.h +++ b/src/plugins/remotelinux/uploadandinstalltarpackagestep.h @@ -54,8 +54,6 @@ class REMOTELINUX_EXPORT UploadAndInstallTarPackageStep : public AbstractRemoteL public: explicit UploadAndInstallTarPackageStep(ProjectExplorer::BuildStepList *bsl); - UploadAndInstallTarPackageStep(ProjectExplorer::BuildStepList *bsl, - UploadAndInstallTarPackageStep *other); bool initInternal(QString *error = 0) override; @@ -67,8 +65,6 @@ public: private: AbstractRemoteLinuxDeployService *deployService() const override { return m_deployService; } - void ctor(); - UploadAndInstallTarPackageService *m_deployService; }; diff --git a/src/plugins/winrt/winrtdeployconfiguration.cpp b/src/plugins/winrt/winrtdeployconfiguration.cpp index 66b8917b1c..2a801c7ff0 100644 --- a/src/plugins/winrt/winrtdeployconfiguration.cpp +++ b/src/plugins/winrt/winrtdeployconfiguration.cpp @@ -31,7 +31,6 @@ #include <projectexplorer/target.h> #include <projectexplorer/buildsteplist.h> #include <projectexplorer/projectexplorerconstants.h> -#include <qtsupport/qtkitinformation.h> #include <QCoreApplication> @@ -40,142 +39,59 @@ using namespace ProjectExplorer; namespace WinRt { namespace Internal { -static const char appxDeployConfigurationC[] = "WinRTAppxDeployConfiguration"; -static const char phoneDeployConfigurationC[] = "WinRTPhoneDeployConfiguration"; -static const char emulatorDeployConfigurationC[] = "WinRTEmulatorDeployConfiguration"; +const char appxDeployConfigurationC[] = "WinRTAppxDeployConfiguration"; +const char phoneDeployConfigurationC[] = "WinRTPhoneDeployConfiguration"; +const char emulatorDeployConfigurationC[] = "WinRTEmulatorDeployConfiguration"; -static QString msgDeployConfigurationDisplayName(Core::Id id) +struct WinRtAppDeployConfiguration : DeployConfiguration { - if (id == appxDeployConfigurationC) { - return QCoreApplication::translate("WinRt::Internal::WinRtDeployConfiguration", - "Run windeployqt"); - } - if (id == phoneDeployConfigurationC) { - return QCoreApplication::translate("WinRt::Internal::WinRtDeployConfiguration", - "Deploy to Windows Phone"); - } - if (id == emulatorDeployConfigurationC) { - return QCoreApplication::translate("WinRt::Internal::WinRtDeployConfiguration", - "Deploy to Windows Phone Emulator"); - } - return QString(); -} - -WinRtDeployConfigurationFactory::WinRtDeployConfigurationFactory(QObject *parent) - : DeployConfigurationFactory(parent) -{ -} - -QString WinRtDeployConfigurationFactory::displayNameForId(Core::Id id) const -{ - return msgDeployConfigurationDisplayName(id); -} - -QList<Core::Id> WinRtDeployConfigurationFactory::availableCreationIds(Target *parent) const -{ - if (!parent->project()->supportsKit(parent->kit())) - return QList<Core::Id>(); - - IDevice::ConstPtr device = DeviceKitInformation::device(parent->kit()); - if (!device) - return QList<Core::Id>(); - - if (device->type() == Constants::WINRT_DEVICE_TYPE_LOCAL) - return QList<Core::Id>() << Core::Id(appxDeployConfigurationC); - - if (device->type() == Constants::WINRT_DEVICE_TYPE_PHONE) - return QList<Core::Id>() << Core::Id(phoneDeployConfigurationC); - - if (device->type() == Constants::WINRT_DEVICE_TYPE_EMULATOR) - return QList<Core::Id>() << Core::Id(emulatorDeployConfigurationC); - - return QList<Core::Id>(); -} - -bool WinRtDeployConfigurationFactory::canCreate(Target *parent, Core::Id id) const -{ - return availableCreationIds(parent).contains(id); -} + WinRtAppDeployConfiguration(Target *target) : DeployConfiguration(target, appxDeployConfigurationC) {} + void initialize() { stepList()->appendStep(new WinRtPackageDeploymentStep(stepList())); } +}; -DeployConfiguration *WinRtDeployConfigurationFactory::create(Target *parent, Core::Id id) +WinRtAppDeployConfigurationFactory::WinRtAppDeployConfigurationFactory() { - if (id == appxDeployConfigurationC - || id == phoneDeployConfigurationC - || id == emulatorDeployConfigurationC) { - return new WinRtDeployConfiguration(parent, id); - } - return 0; + registerDeployConfiguration<WinRtAppDeployConfiguration>(appxDeployConfigurationC); + setDefaultDisplayName(QCoreApplication::translate("WinRt::Internal::WinRtDeployConfiguration", + "Run windeployqt")); + setSupportedTargetDeviceTypes({Constants::WINRT_DEVICE_TYPE_LOCAL}); } -bool WinRtDeployConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const +struct WinRtPhoneDeployConfiguration : DeployConfiguration { - return canCreate(parent, idFromMap(map)); -} + WinRtPhoneDeployConfiguration(Target *target) : DeployConfiguration(target, phoneDeployConfigurationC) {} + void initialize() { stepList()->appendStep(new WinRtPackageDeploymentStep(stepList())); } +}; -DeployConfiguration *WinRtDeployConfigurationFactory::restore(Target *parent, - const QVariantMap &map) +WinRtPhoneDeployConfigurationFactory::WinRtPhoneDeployConfigurationFactory() { - WinRtDeployConfiguration *dc = new WinRtDeployConfiguration(parent, idFromMap(map)); - if (!dc->fromMap(map)) { - delete dc; - return 0; - } - return dc; + registerDeployConfiguration<WinRtPhoneDeployConfiguration>(phoneDeployConfigurationC); + setDefaultDisplayName(QCoreApplication::translate("WinRt::Internal::WinRtDeployConfiguration", + "Deploy to Windows Phone")); + setSupportedTargetDeviceTypes({Constants::WINRT_DEVICE_TYPE_PHONE}); } -bool WinRtDeployConfigurationFactory::canClone(Target *parent, DeployConfiguration *source) const +struct WinRtEmulatorDeployConfiguration : DeployConfiguration { - return availableCreationIds(parent).contains(source->id()); -} + WinRtEmulatorDeployConfiguration(Target *target) : DeployConfiguration(target, emulatorDeployConfigurationC) {} + void initialize() { stepList()->appendStep(new WinRtPackageDeploymentStep(stepList())); } +}; -DeployConfiguration *WinRtDeployConfigurationFactory::clone(Target *parent, - DeployConfiguration *source) +WinRtEmulatorDeployConfigurationFactory::WinRtEmulatorDeployConfigurationFactory() { - if (source->id() == appxDeployConfigurationC - || source->id() == phoneDeployConfigurationC - || source->id() == emulatorDeployConfigurationC) { - return new WinRtDeployConfiguration(parent, source); - } - return 0; -} - -QList<BuildStepInfo> WinRtDeployStepFactory::availableSteps(BuildStepList *parent) const -{ - if (parent->id() != ProjectExplorer::Constants::BUILDSTEPS_DEPLOY - || !parent->target()->project()->supportsKit(parent->target()->kit()) - || parent->contains(Constants::WINRT_BUILD_STEP_DEPLOY)) - return {}; - - return {{Constants::WINRT_BUILD_STEP_DEPLOY, - QCoreApplication::translate("WinRt::Internal::WinRtDeployStepFactory", "Run windeployqt"), - BuildStepInfo::Unclonable}}; -} - -BuildStep *WinRtDeployStepFactory::create(BuildStepList *parent, Core::Id id) -{ - Q_UNUSED(id) - return new WinRtPackageDeploymentStep(parent); -} - -BuildStep *WinRtDeployStepFactory::clone(BuildStepList *parent, BuildStep *source) -{ - Q_UNUSED(parent); - Q_UNUSED(source); - return 0; -} - -WinRtDeployConfiguration::WinRtDeployConfiguration(Target *target, Core::Id id) - : DeployConfiguration(target, id) -{ - setDefaultDisplayName(msgDeployConfigurationDisplayName(id)); - - stepList()->insertStep(0, new WinRtPackageDeploymentStep(stepList())); + registerDeployConfiguration<WinRtEmulatorDeployConfiguration>(emulatorDeployConfigurationC); + setDefaultDisplayName(QCoreApplication::translate("WinRt::Internal::WinRtDeployConfiguration", + "Deploy to Windows Phone Emulator")); + setSupportedTargetDeviceTypes({Constants::WINRT_DEVICE_TYPE_EMULATOR}); } -WinRtDeployConfiguration::WinRtDeployConfiguration(Target *target, DeployConfiguration *source) - : DeployConfiguration(target, source) +WinRtDeployStepFactory::WinRtDeployStepFactory() { - cloneSteps(source); + registerStep<WinRtPackageDeploymentStep>(Constants::WINRT_BUILD_STEP_DEPLOY); + setDisplayName(QCoreApplication::translate("WinRt::Internal::WinRtDeployStepFactory", "Run windeployqt")); + setFlags(BuildStepInfo::Unclonable); + setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY); + setRepeatable(false); } } // namespace Internal diff --git a/src/plugins/winrt/winrtdeployconfiguration.h b/src/plugins/winrt/winrtdeployconfiguration.h index 6e036ad7d0..906679ea6d 100644 --- a/src/plugins/winrt/winrtdeployconfiguration.h +++ b/src/plugins/winrt/winrtdeployconfiguration.h @@ -31,39 +31,28 @@ namespace WinRt { namespace Internal { -class WinRtDeployConfigurationFactory : public ProjectExplorer::DeployConfigurationFactory +class WinRtAppDeployConfigurationFactory : public ProjectExplorer::DeployConfigurationFactory { public: - explicit WinRtDeployConfigurationFactory(QObject *parent = 0); - QString displayNameForId(Core::Id id) const override; - QList<Core::Id> availableCreationIds(ProjectExplorer::Target *parent) const override; - bool canCreate(ProjectExplorer::Target *parent, Core::Id id) const override; - ProjectExplorer::DeployConfiguration *create(ProjectExplorer::Target *parent, Core::Id id) override; - bool canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const override; - ProjectExplorer::DeployConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map) override; - bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::DeployConfiguration *source) const override; - ProjectExplorer::DeployConfiguration *clone(ProjectExplorer::Target *parent, - ProjectExplorer::DeployConfiguration *source) override; + WinRtAppDeployConfigurationFactory(); }; -class WinRtDeployStepFactory : public ProjectExplorer::IBuildStepFactory +class WinRtPhoneDeployConfigurationFactory : public ProjectExplorer::DeployConfigurationFactory { public: - QList<ProjectExplorer::BuildStepInfo> - availableSteps(ProjectExplorer::BuildStepList *parent) const override; + WinRtPhoneDeployConfigurationFactory(); +}; - ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, Core::Id id) override; - ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, - ProjectExplorer::BuildStep *source) override; +class WinRtEmulatorDeployConfigurationFactory : public ProjectExplorer::DeployConfigurationFactory +{ +public: + WinRtEmulatorDeployConfigurationFactory(); }; -class WinRtDeployConfiguration : public ProjectExplorer::DeployConfiguration +class WinRtDeployStepFactory : public ProjectExplorer::BuildStepFactory { -private: - friend class WinRtDeployConfigurationFactory; - explicit WinRtDeployConfiguration(ProjectExplorer::Target *target, Core::Id id); - explicit WinRtDeployConfiguration(ProjectExplorer::Target *target, - ProjectExplorer::DeployConfiguration *source); +public: + WinRtDeployStepFactory(); }; } // namespace Internal diff --git a/src/plugins/winrt/winrtpackagedeploymentstep.cpp b/src/plugins/winrt/winrtpackagedeploymentstep.cpp index 2725a3cf38..5b9da4f611 100644 --- a/src/plugins/winrt/winrtpackagedeploymentstep.cpp +++ b/src/plugins/winrt/winrtpackagedeploymentstep.cpp @@ -50,7 +50,6 @@ namespace Internal { WinRtPackageDeploymentStep::WinRtPackageDeploymentStep(BuildStepList *bsl) : AbstractProcessStep(bsl, Constants::WINRT_BUILD_STEP_DEPLOY) - , m_createMappingFile(false) { setDisplayName(tr("Run windeployqt")); m_args = defaultWinDeployQtArguments(); diff --git a/src/plugins/winrt/winrtpackagedeploymentstep.h b/src/plugins/winrt/winrtpackagedeploymentstep.h index f7a2cecfbf..55d6d01203 100644 --- a/src/plugins/winrt/winrtpackagedeploymentstep.h +++ b/src/plugins/winrt/winrtpackagedeploymentstep.h @@ -33,8 +33,10 @@ namespace Internal { class WinRtPackageDeploymentStep : public ProjectExplorer::AbstractProcessStep { Q_OBJECT + public: explicit WinRtPackageDeploymentStep(ProjectExplorer::BuildStepList *bsl); + bool init(QList<const BuildStep *> &earlierSteps) override; void run(QFutureInterface<bool> &fi) override; bool processSucceeded(int exitCode, QProcess::ExitStatus status) override; @@ -60,7 +62,7 @@ private: QString m_executablePathInManifest; QString m_mappingFileContent; QString m_manifestFileName; - bool m_createMappingFile; + bool m_createMappingFile = false; }; } // namespace Internal diff --git a/src/plugins/winrt/winrtplugin.cpp b/src/plugins/winrt/winrtplugin.cpp index 3deedc6e45..8a7a371851 100644 --- a/src/plugins/winrt/winrtplugin.cpp +++ b/src/plugins/winrt/winrtplugin.cpp @@ -62,7 +62,9 @@ bool WinRtPlugin::initialize(const QStringList &arguments, QString *errorMessage addAutoReleasedObject(new Internal::WinRtRunConfigurationFactory); addAutoReleasedObject(new Internal::WinRtQtVersionFactory); - addAutoReleasedObject(new Internal::WinRtDeployConfigurationFactory); + addAutoReleasedObject(new Internal::WinRtAppDeployConfigurationFactory); + addAutoReleasedObject(new Internal::WinRtPhoneDeployConfigurationFactory); + addAutoReleasedObject(new Internal::WinRtEmulatorDeployConfigurationFactory); addAutoReleasedObject(new Internal::WinRtDeployStepFactory); auto runConstraint = [](RunConfiguration *runConfig) { diff --git a/src/plugins/winrt/winrtrunconfiguration.cpp b/src/plugins/winrt/winrtrunconfiguration.cpp index 4b01d2f9e9..0b794a0eb3 100644 --- a/src/plugins/winrt/winrtrunconfiguration.cpp +++ b/src/plugins/winrt/winrtrunconfiguration.cpp @@ -41,21 +41,16 @@ namespace Internal { static const char uninstallAfterStopIdC[] = "WinRtRunConfigurationUninstallAfterStopId"; -static QString pathFromId(Core::Id id) -{ - return id.suffixAfter(Constants::WINRT_RC_PREFIX); -} - WinRtRunConfiguration::WinRtRunConfiguration(ProjectExplorer::Target *target) - : RunConfiguration(target) + : RunConfiguration(target, Constants::WINRT_RC_PREFIX) { setDisplayName(tr("Run App Package")); addExtraAspect(new ProjectExplorer::ArgumentsAspect(this, "WinRtRunConfigurationArgumentsId")); } -void WinRtRunConfiguration::initialize(Core::Id id) +QString WinRtRunConfiguration::extraId() const { - m_proFilePath = pathFromId(id); + return m_proFilePath; } QWidget *WinRtRunConfiguration::createConfigurationWidget() @@ -74,7 +69,9 @@ bool WinRtRunConfiguration::fromMap(const QVariantMap &map) { if (!RunConfiguration::fromMap(map)) return false; + setUninstallAfterStop(map.value(QLatin1String(uninstallAfterStopIdC)).toBool()); + m_proFilePath = ProjectExplorer::idFromMap(map).suffixAfter(id()); return true; } diff --git a/src/plugins/winrt/winrtrunconfiguration.h b/src/plugins/winrt/winrtrunconfiguration.h index 54dde540eb..aa07a14261 100644 --- a/src/plugins/winrt/winrtrunconfiguration.h +++ b/src/plugins/winrt/winrtrunconfiguration.h @@ -55,8 +55,7 @@ signals: void uninstallAfterStopChanged(bool); private: - friend class ProjectExplorer::IRunConfigurationFactory; - void initialize(Core::Id id) override; + QString extraId() const final; QString m_proFilePath; bool m_uninstallAfterStop = false; diff --git a/src/plugins/winrt/winrtrunfactories.cpp b/src/plugins/winrt/winrtrunfactories.cpp index 0cf68b7df9..8eb76c7885 100644 --- a/src/plugins/winrt/winrtrunfactories.cpp +++ b/src/plugins/winrt/winrtrunfactories.cpp @@ -62,10 +62,5 @@ QString WinRtRunConfigurationFactory::displayNameForBuildTarget(const QString &) return tr("Run App Package"); } -bool WinRtRunConfigurationFactory::canCloneHelper(Target *, RunConfiguration *) const -{ - return false; // FIXME: Are they really unclonable? -} - } // namespace Internal } // namespace WinRt diff --git a/src/plugins/winrt/winrtrunfactories.h b/src/plugins/winrt/winrtrunfactories.h index 999acba901..cbd4c4afdf 100644 --- a/src/plugins/winrt/winrtrunfactories.h +++ b/src/plugins/winrt/winrtrunfactories.h @@ -40,8 +40,6 @@ public: QList<QString> availableBuildTargets(ProjectExplorer::Target *parent, CreationMode mode) const override; QString displayNameForBuildTarget(const QString &buildTarget) const override; - - bool canCloneHelper(ProjectExplorer::Target *, ProjectExplorer::RunConfiguration *) const override; }; } // namespace Internal |