diff options
author | hjk <hjk@qt.io> | 2019-12-09 12:59:38 +0100 |
---|---|---|
committer | hjk <hjk@qt.io> | 2019-12-09 14:12:45 +0000 |
commit | 041a86c8c7d8a7e563655c5ae4dae08752ceaad8 (patch) | |
tree | f1434adf884c101bc6741ab63c3565b56346a1e6 /src | |
parent | b82add7813384c19879044b44796db1f8f067ad3 (diff) |
ProjectExplorer: Use function object for special build config init
Change-Id: I5da0f28ee1a64f8d9a3145f059019be702bee463
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Diffstat (limited to 'src')
18 files changed, 271 insertions, 284 deletions
diff --git a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp index 0950ae46bc..406347aba0 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp +++ b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp @@ -53,26 +53,25 @@ AutotoolsBuildConfiguration::AutotoolsBuildConfiguration(Target *parent, Core::I setBuildDirectory(Utils::FilePath::fromString("/<foobar>")); setBuildDirectoryHistoryCompleter("AutoTools.BuildDir.History"); setConfigWidgetDisplayName(tr("Autotools Manager")); -} -void AutotoolsBuildConfiguration::initialize() -{ - // ### Build Steps Build ### - // autogen.sh or autoreconf - QFile autogenFile(target()->project()->projectDirectory().toString() + "/autogen.sh"); - if (autogenFile.exists()) - buildSteps()->appendStep(Constants::AUTOGEN_STEP_ID); - else - buildSteps()->appendStep(Constants::AUTORECONF_STEP_ID); - - // ./configure. - buildSteps()->appendStep(Constants::CONFIGURE_STEP_ID); - - // make - buildSteps()->appendStep(Constants::MAKE_STEP_ID); - - // ### Build Steps Clean ### - cleanSteps()->appendStep(Constants::MAKE_STEP_ID); + setInitializer([this] { + // ### Build Steps Build ### + // autogen.sh or autoreconf + QFile autogenFile(target()->project()->projectDirectory().toString() + "/autogen.sh"); + if (autogenFile.exists()) + buildSteps()->appendStep(Constants::AUTOGEN_STEP_ID); + else + buildSteps()->appendStep(Constants::AUTORECONF_STEP_ID); + + // ./configure. + buildSteps()->appendStep(Constants::CONFIGURE_STEP_ID); + + // make + buildSteps()->appendStep(Constants::MAKE_STEP_ID); + + // ### Build Steps Clean ### + cleanSteps()->appendStep(Constants::MAKE_STEP_ID); + }); } diff --git a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h index 1b2bcf8021..d3c89c9d59 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h +++ b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h @@ -38,8 +38,6 @@ class AutotoolsBuildConfiguration : public ProjectExplorer::BuildConfiguration friend class ProjectExplorer::BuildConfigurationFactory; AutotoolsBuildConfiguration(ProjectExplorer::Target *parent, Core::Id id); - - void initialize() override; }; class AutotoolsBuildConfigurationFactory : public ProjectExplorer::BuildConfigurationFactory diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 976d1cc11a..6cfb3b2fed 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -82,91 +82,90 @@ Q_LOGGING_CATEGORY(cmakeBuildConfigurationLog, "qtc.cmake.bc", QtWarningMsg); const char CONFIGURATION_KEY[] = "CMake.Configuration"; -CMakeBuildConfiguration::CMakeBuildConfiguration(Target *parent, Core::Id id) - : BuildConfiguration(parent, id) +CMakeBuildConfiguration::CMakeBuildConfiguration(Target *target, Core::Id id) + : BuildConfiguration(target, id) { m_buildSystem = new CMakeBuildSystem(this); setBuildDirectory(shadowBuildDirectory(project()->projectFilePath(), - target()->kit(), + target->kit(), displayName(), BuildConfiguration::Unknown)); -} -CMakeBuildConfiguration::~CMakeBuildConfiguration() -{ - delete m_buildSystem; -} + setInitializer([this, target] { + buildSteps()->appendStep(Constants::CMAKE_BUILD_STEP_ID); + + if (DeviceTypeKitAspect::deviceTypeId(target->kit()) + == Android::Constants::ANDROID_DEVICE_TYPE) { + buildSteps()->appendStep(Android::Constants::ANDROID_BUILD_APK_ID); + const auto &bs = buildSteps()->steps().constLast(); + m_initialConfiguration.prepend(CMakeProjectManager::CMakeConfigItem{"ANDROID_NATIVE_API_LEVEL", + CMakeProjectManager::CMakeConfigItem::Type::STRING, + "Android native API level", + bs->data(Android::Constants::AndroidNdkPlatform).toString().toUtf8()}); + auto ndkLocation = bs->data(Android::Constants::NdkLocation).value<FilePath>(); + m_initialConfiguration.prepend(CMakeProjectManager::CMakeConfigItem{"ANDROID_NDK", + CMakeProjectManager::CMakeConfigItem::Type::PATH, + "Android NDK PATH", + ndkLocation.toString().toUtf8()}); -void CMakeBuildConfiguration::initialize() -{ - buildSteps()->appendStep(Constants::CMAKE_BUILD_STEP_ID); - - if (DeviceTypeKitAspect::deviceTypeId(target()->kit()) - == Android::Constants::ANDROID_DEVICE_TYPE) { - buildSteps()->appendStep(Android::Constants::ANDROID_BUILD_APK_ID); - const auto &bs = buildSteps()->steps().constLast(); - m_initialConfiguration.prepend(CMakeProjectManager::CMakeConfigItem{"ANDROID_NATIVE_API_LEVEL", - CMakeProjectManager::CMakeConfigItem::Type::STRING, - "Android native API level", - bs->data(Android::Constants::AndroidNdkPlatform).toString().toUtf8()}); - auto ndkLocation = bs->data(Android::Constants::NdkLocation).value<FilePath>(); - m_initialConfiguration.prepend(CMakeProjectManager::CMakeConfigItem{"ANDROID_NDK", - CMakeProjectManager::CMakeConfigItem::Type::PATH, - "Android NDK PATH", - ndkLocation.toString().toUtf8()}); - - m_initialConfiguration.prepend(CMakeProjectManager::CMakeConfigItem{"CMAKE_TOOLCHAIN_FILE", - CMakeProjectManager::CMakeConfigItem::Type::PATH, - "Android CMake toolchain file", - ndkLocation.pathAppended("build/cmake/android.toolchain.cmake").toString().toUtf8()}); - - auto androidAbis = bs->data(Android::Constants::AndroidABIs).toStringList(); - QString preferredAbi; - if (androidAbis.contains("armeabi-v7a")) { - preferredAbi = "armeabi-v7a"; - } else if (androidAbis.isEmpty() || androidAbis.contains("arm64-v8a")) { - preferredAbi = "arm64-v8a"; - } else { - preferredAbi = androidAbis.first(); - } - // FIXME: configmodel doesn't care about our androidAbis list... - m_initialConfiguration.prepend(CMakeProjectManager::CMakeConfigItem{"ANDROID_ABI", - CMakeProjectManager::CMakeConfigItem::Type::STRING, - "Android ABI", - preferredAbi.toLatin1(), - androidAbis}); - - QtSupport::BaseQtVersion *qt = QtSupport::QtKitAspect::qtVersion(target()->kit()); - if (qt->qtVersion() >= QtSupport::QtVersionNumber{5, 14, 0}) { - auto sdkLocation = bs->data(Android::Constants::SdkLocation).value<FilePath>(); - m_initialConfiguration.prepend(CMakeProjectManager::CMakeConfigItem{"ANDROID_SDK", + m_initialConfiguration.prepend(CMakeProjectManager::CMakeConfigItem{"CMAKE_TOOLCHAIN_FILE", CMakeProjectManager::CMakeConfigItem::Type::PATH, - "Android SDK PATH", - sdkLocation.toString().toUtf8()}); + "Android CMake toolchain file", + ndkLocation.pathAppended("build/cmake/android.toolchain.cmake").toString().toUtf8()}); + + auto androidAbis = bs->data(Android::Constants::AndroidABIs).toStringList(); + QString preferredAbi; + if (androidAbis.contains("armeabi-v7a")) { + preferredAbi = "armeabi-v7a"; + } else if (androidAbis.isEmpty() || androidAbis.contains("arm64-v8a")) { + preferredAbi = "arm64-v8a"; + } else { + preferredAbi = androidAbis.first(); + } + // FIXME: configmodel doesn't care about our androidAbis list... + m_initialConfiguration.prepend(CMakeProjectManager::CMakeConfigItem{"ANDROID_ABI", + CMakeProjectManager::CMakeConfigItem::Type::STRING, + "Android ABI", + preferredAbi.toLatin1(), + androidAbis}); + + QtSupport::BaseQtVersion *qt = QtSupport::QtKitAspect::qtVersion(target->kit()); + if (qt->qtVersion() >= QtSupport::QtVersionNumber{5, 14, 0}) { + auto sdkLocation = bs->data(Android::Constants::SdkLocation).value<FilePath>(); + m_initialConfiguration.prepend(CMakeProjectManager::CMakeConfigItem{"ANDROID_SDK", + CMakeProjectManager::CMakeConfigItem::Type::PATH, + "Android SDK PATH", + sdkLocation.toString().toUtf8()}); - } + } - m_initialConfiguration.prepend(CMakeProjectManager::CMakeConfigItem{"ANDROID_STL", - CMakeProjectManager::CMakeConfigItem::Type::STRING, - "Android STL", - "c++_shared"}); + m_initialConfiguration.prepend(CMakeProjectManager::CMakeConfigItem{"ANDROID_STL", + CMakeProjectManager::CMakeConfigItem::Type::STRING, + "Android STL", + "c++_shared"}); - m_initialConfiguration.prepend(CMakeProjectManager::CMakeConfigItem{"CMAKE_FIND_ROOT_PATH", "%{Qt:QT_INSTALL_PREFIX}"}); - } + m_initialConfiguration.prepend(CMakeProjectManager::CMakeConfigItem{"CMAKE_FIND_ROOT_PATH", "%{Qt:QT_INSTALL_PREFIX}"}); + } - cleanSteps()->appendStep(Constants::CMAKE_BUILD_STEP_ID); + cleanSteps()->appendStep(Constants::CMAKE_BUILD_STEP_ID); - if (initialBuildDirectory().isEmpty()) { - auto project = target()->project(); - setBuildDirectory(CMakeBuildConfiguration::shadowBuildDirectory(project->projectFilePath(), - target()->kit(), - initialDisplayName(), - initialBuildType())); - } - auto info = extraInfo().value<CMakeExtraBuildInfo>(); - setConfigurationForCMake(info.configuration); + if (initialBuildDirectory().isEmpty()) { + setBuildDirectory(shadowBuildDirectory(target->project()->projectFilePath(), + target->kit(), + initialDisplayName(), + initialBuildType())); + } + auto info = extraInfo().value<CMakeExtraBuildInfo>(); + setConfigurationForCMake(info.configuration); + }); } +CMakeBuildConfiguration::~CMakeBuildConfiguration() +{ + delete m_buildSystem; +} + + QString CMakeBuildConfiguration::disabledReason() const { return error(); diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h index 70f1b17a74..7b1453e808 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h @@ -47,7 +47,7 @@ class CMakeBuildConfiguration : public ProjectExplorer::BuildConfiguration Q_OBJECT friend class ProjectExplorer::BuildConfigurationFactory; - CMakeBuildConfiguration(ProjectExplorer::Target *parent, Core::Id id); + CMakeBuildConfiguration(ProjectExplorer::Target *target, Core::Id id); ~CMakeBuildConfiguration() final; public: @@ -79,7 +79,6 @@ private: QVariantMap toMap() const override; BuildType buildType() const override; - void initialize() override; QString disabledReason() const override; ProjectExplorer::NamedWidget *createConfigWidget() override; diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp index 403976f7d1..973b37f45a 100644 --- a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp +++ b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp @@ -528,11 +528,15 @@ CompilationDatabaseEditorFactory::CompilationDatabaseEditorFactory() setCodeFoldingSupported(true); } -CompilationDatabaseBuildConfiguration::CompilationDatabaseBuildConfiguration( - ProjectExplorer::Target *target, Core::Id id) - : ProjectExplorer::BuildConfiguration(target, id) +class CompilationDatabaseBuildConfiguration : public BuildConfiguration { -} +public: + CompilationDatabaseBuildConfiguration(Target *target, Core::Id id) + : BuildConfiguration(target, id) + { + } +}; + CompilationDatabaseBuildConfigurationFactory::CompilationDatabaseBuildConfigurationFactory() { diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.h b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.h index d70397c934..e8a3163563 100644 --- a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.h +++ b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.h @@ -95,14 +95,6 @@ public: CompilationDatabaseEditorFactory(); }; -class CompilationDatabaseBuildConfiguration : public ProjectExplorer::BuildConfiguration -{ - Q_OBJECT -public: - CompilationDatabaseBuildConfiguration(ProjectExplorer::Target *target, Core::Id id); - void initialize() final {} -}; - class CompilationDatabaseBuildConfigurationFactory : public ProjectExplorer::BuildConfigurationFactory { diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp index bfe729d502..0e909ebc5c 100644 --- a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp +++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp @@ -55,13 +55,11 @@ GenericBuildConfiguration::GenericBuildConfiguration(Target *parent, Core::Id id setConfigWidgetDisplayName(tr("Generic Manager")); setBuildDirectoryHistoryCompleter("Generic.BuildDir.History"); - updateCacheAndEmitEnvironmentChanged(); -} - -void GenericBuildConfiguration::initialize() -{ - buildSteps()->appendStep(Constants::GENERIC_MS_ID); - cleanSteps()->appendStep(Constants::GENERIC_MS_ID); + setInitializer([this] { + buildSteps()->appendStep(Constants::GENERIC_MS_ID); + cleanSteps()->appendStep(Constants::GENERIC_MS_ID); + updateCacheAndEmitEnvironmentChanged(); + }); updateCacheAndEmitEnvironmentChanged(); } diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.h b/src/plugins/genericprojectmanager/genericbuildconfiguration.h index 03e590ab92..9416dd1414 100644 --- a/src/plugins/genericprojectmanager/genericbuildconfiguration.h +++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.h @@ -27,8 +27,6 @@ #include <projectexplorer/buildconfiguration.h> -namespace Utils { class FilePath; } - namespace GenericProjectManager { namespace Internal { @@ -39,7 +37,6 @@ class GenericBuildConfiguration : public ProjectExplorer::BuildConfiguration friend class ProjectExplorer::BuildConfigurationFactory; GenericBuildConfiguration(ProjectExplorer::Target *parent, Core::Id id); - void initialize() override; void addToEnvironment(Utils::Environment &env) const final; }; diff --git a/src/plugins/nim/project/nimblebuildconfiguration.cpp b/src/plugins/nim/project/nimblebuildconfiguration.cpp index 873b88de66..3703cb6442 100644 --- a/src/plugins/nim/project/nimblebuildconfiguration.cpp +++ b/src/plugins/nim/project/nimblebuildconfiguration.cpp @@ -54,30 +54,28 @@ NimbleBuildConfiguration::NimbleBuildConfiguration(Target *target, Core::Id id) setConfigWidgetHasFrame(true); setBuildDirectorySettingsKey("Nim.NimbleBuildConfiguration.BuildDirectory"); - m_nimbleBuildSystem = dynamic_cast<NimbleBuildSystem *>(buildSystem()); - QTC_ASSERT(m_nimbleBuildSystem, return); -} + setInitializer([this] { -BuildConfiguration::BuildType NimbleBuildConfiguration::buildType() const -{ - return m_buildType; -} - -void NimbleBuildConfiguration::initialize() -{ - m_buildType = initialBuildType(); + m_buildType = initialBuildType(); - setBuildDirectory(project()->projectDirectory()); + setBuildDirectory(project()->projectDirectory()); - // FIXME: This is the wrong place for this decision, as it depends on - // information that's typically only available after parsing which takes - // the build configuration that is initialized here into account. + // FIXME: This is the wrong place for this decision, as it depends on + // information that's typically only available after parsing which takes + // the build configuration that is initialized here into account. -// // Don't add a nimble build step when the package has no binaries (i.e a library package) -// if (!m_nimbleBuildSystem->metadata().bin.empty()) -// { + // // Don't add a nimble build step when the package has no binaries (i.e a library package) + // m_nimbleBuildSystem = dynamic_cast<NimbleBuildSystem *>(buildSystem()); + // if (!m_nimbleBuildSystem->metadata().bin.empty()) + // { buildSteps()->appendStep(new NimbleBuildStep(buildSteps())); -// } + // } + }); +} + +BuildConfiguration::BuildType NimbleBuildConfiguration::buildType() const +{ + return m_buildType; } bool NimbleBuildConfiguration::fromMap(const QVariantMap &map) diff --git a/src/plugins/nim/project/nimblebuildconfiguration.h b/src/plugins/nim/project/nimblebuildconfiguration.h index f7e7dc4dc7..8990842615 100644 --- a/src/plugins/nim/project/nimblebuildconfiguration.h +++ b/src/plugins/nim/project/nimblebuildconfiguration.h @@ -30,8 +30,6 @@ namespace Nim { -class NimbleBuildSystem; - class NimbleBuildConfiguration : public ProjectExplorer::BuildConfiguration { Q_OBJECT @@ -46,11 +44,7 @@ class NimbleBuildConfiguration : public ProjectExplorer::BuildConfiguration QVariantMap toMap() const override; -protected: - void initialize() override; - private: - NimbleBuildSystem *m_nimbleBuildSystem = nullptr; BuildType m_buildType; }; diff --git a/src/plugins/nim/project/nimbuildconfiguration.cpp b/src/plugins/nim/project/nimbuildconfiguration.cpp index 42f0177ceb..3b429cb550 100644 --- a/src/plugins/nim/project/nimbuildconfiguration.cpp +++ b/src/plugins/nim/project/nimbuildconfiguration.cpp @@ -71,46 +71,47 @@ NimBuildConfiguration::NimBuildConfiguration(Target *target, Core::Id id) setConfigWidgetDisplayName(tr("General")); setConfigWidgetHasFrame(true); setBuildDirectorySettingsKey("Nim.NimBuildConfiguration.BuildDirectory"); -} - -void NimBuildConfiguration::initialize() -{ - // Create the build configuration and initialize it from build info - setBuildDirectory(defaultBuildDirectory(target()->kit(), - project()->projectFilePath(), - displayName(), - buildType())); - - // Add nim compiler build step - { - auto nimCompilerBuildStep = new NimCompilerBuildStep(buildSteps()); - NimCompilerBuildStep::DefaultBuildOptions defaultOption; - switch (initialBuildType()) { - 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); - const Utils::FilePathList nimFiles = project()->files([](const Node *n) { - return Project::AllFiles(n) && n->path().endsWith(".nim"); - }); - if (!nimFiles.isEmpty()) - nimCompilerBuildStep->setTargetNimFile(nimFiles.first()); - buildSteps()->appendStep(nimCompilerBuildStep); - } + setInitializer([this, target] { + // Create the build configuration and initialize it from build info + setBuildDirectory(defaultBuildDirectory(target->kit(), + project()->projectFilePath(), + displayName(), + buildType())); + + // Add nim compiler build step + { + auto nimCompilerBuildStep = new NimCompilerBuildStep(buildSteps()); + NimCompilerBuildStep::DefaultBuildOptions defaultOption; + switch (initialBuildType()) { + 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); + + const Utils::FilePathList nimFiles = project()->files([](const Node *n) { + return Project::AllFiles(n) && n->path().endsWith(".nim"); + }); + + if (!nimFiles.isEmpty()) + nimCompilerBuildStep->setTargetNimFile(nimFiles.first()); + buildSteps()->appendStep(nimCompilerBuildStep); + } - // Add clean step - cleanSteps()->appendStep(Constants::C_NIMCOMPILERCLEANSTEP_ID); + // Add clean step + cleanSteps()->appendStep(Constants::C_NIMCOMPILERCLEANSTEP_ID); + }); } + FilePath NimBuildConfiguration::cacheDirectory() const { return buildDirectory().pathAppended("nimcache"); diff --git a/src/plugins/nim/project/nimbuildconfiguration.h b/src/plugins/nim/project/nimbuildconfiguration.h index d5c4a293e4..a5c7cd23f7 100644 --- a/src/plugins/nim/project/nimbuildconfiguration.h +++ b/src/plugins/nim/project/nimbuildconfiguration.h @@ -39,8 +39,6 @@ class NimBuildConfiguration : public ProjectExplorer::BuildConfiguration friend class ProjectExplorer::BuildConfigurationFactory; NimBuildConfiguration(ProjectExplorer::Target *target, Core::Id id); - void initialize() override; - public: Utils::FilePath cacheDirectory() const; Utils::FilePath outFilePath() const; diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp index 51e46edacf..6f91095748 100644 --- a/src/plugins/projectexplorer/buildconfiguration.cpp +++ b/src/plugins/projectexplorer/buildconfiguration.cpp @@ -84,6 +84,8 @@ public: QString m_configWidgetDisplayName; bool m_configWidgetHasFrame = false; + std::function<void()> m_initializer; + // FIXME: Remove. BuildConfiguration::BuildType m_initialBuildType = BuildConfiguration::Unknown; Utils::FilePath m_initialBuildDirectory; @@ -181,6 +183,28 @@ void BuildConfiguration::addConfigWidgets(const std::function<void(NamedWidget * adder(subConfigWidget); } +void BuildConfiguration::doInitialize(const BuildInfo &info) +{ + setDisplayName(info.displayName); + setDefaultDisplayName(info.displayName); + setBuildDirectory(info.buildDirectory); + + d->m_initialBuildType = info.buildType; + d->m_initialDisplayName = info.displayName; + d->m_initialBuildDirectory = info.buildDirectory; + d->m_extraInfo = info.extraInfo; + + acquaintAspects(); + + if (d->m_initializer) + d->m_initializer(); +} + +void BuildConfiguration::setInitializer(const std::function<void ()> &initializer) +{ + d->m_initializer = initializer; +} + NamedWidget *BuildConfiguration::createConfigWidget() { NamedWidget *named = new NamedWidget(d->m_configWidgetDisplayName); @@ -405,7 +429,7 @@ bool BuildConfiguration::regenerateBuildFiles(Node *node) void BuildConfiguration::restrictNextBuild(const RunConfiguration *rc) { - Q_UNUSED(rc); + Q_UNUSED(rc) } BuildConfiguration::BuildType BuildConfiguration::buildType() const @@ -568,21 +592,10 @@ BuildConfiguration *BuildConfigurationFactory::create(Target *parent, const Buil if (!canHandle(parent)) return nullptr; QTC_ASSERT(m_creator, return nullptr); - BuildConfiguration *bc = m_creator(parent); - if (!bc) - return nullptr; - bc->setDisplayName(info.displayName); - bc->setDefaultDisplayName(info.displayName); - bc->setBuildDirectory(info.buildDirectory); - - bc->d->m_initialBuildType = info.buildType; - bc->d->m_initialDisplayName = info.displayName; - bc->d->m_initialBuildDirectory = info.buildDirectory; - bc->d->m_extraInfo = info.extraInfo; - - bc->acquaintAspects(); - bc->initialize(); + BuildConfiguration *bc = m_creator(parent); + if (bc) + bc->doInitialize(info); return bc; } diff --git a/src/plugins/projectexplorer/buildconfiguration.h b/src/plugins/projectexplorer/buildconfiguration.h index 6981422702..191393842d 100644 --- a/src/plugins/projectexplorer/buildconfiguration.h +++ b/src/plugins/projectexplorer/buildconfiguration.h @@ -55,7 +55,7 @@ protected: explicit BuildConfiguration(Target *target, Core::Id id); public: - ~BuildConfiguration(); + ~BuildConfiguration() override; Utils::FilePath buildDirectory() const; Utils::FilePath rawBuildDirectory() const; @@ -118,6 +118,8 @@ public: void addConfigWidgets(const std::function<void (NamedWidget *)> &adder); + void doInitialize(const BuildInfo &info); + signals: void environmentChanged(); void buildDirectoryChanged(); @@ -125,7 +127,7 @@ signals: void buildTypeChanged(); protected: - virtual void initialize() = 0; + void setInitializer(const std::function<void()> &initializer); private: void emitBuildDirectoryChanged(); diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp index 36ff246a05..38cd4caa59 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp @@ -80,6 +80,47 @@ QbsBuildConfiguration::QbsBuildConfiguration(Target *target, Core::Id id) { setConfigWidgetHasFrame(true); + setInitializer([this, target] { + const Kit *kit = target->kit(); + QVariantMap configData = extraInfo().value<QVariantMap>(); + configData.insert(QLatin1String(Constants::QBS_CONFIG_VARIANT_KEY), + (initialBuildType() == BuildConfiguration::Debug) + ? QLatin1String(Constants::QBS_VARIANT_DEBUG) + : QLatin1String(Constants::QBS_VARIANT_RELEASE)); + + Utils::FilePath buildDir = initialBuildDirectory(); + if (buildDir.isEmpty()) + buildDir = defaultBuildDirectory(target->project()->projectFilePath(), + kit, initialDisplayName(), + initialBuildType()); + setBuildDirectory(buildDir); + + // Add the build configuration. + QVariantMap bd = configData; + QString configName = bd.take("configName").toString(); + if (configName.isEmpty()) { + configName = "qtc_" + kit->fileSystemFriendlyName() + '_' + + Utils::FileUtils::fileSystemFriendlyName(initialDisplayName()); + } + + const QString kitName = kit->displayName(); + const QByteArray kitHash = QCryptographicHash::hash(kitName.toUtf8(), QCryptographicHash::Sha1); + + const QString uniqueConfigName = configName + + '_' + kit->fileSystemFriendlyName().left(8) + + '_' + kitHash.toHex().left(16); + + m_configurationName->setValue(uniqueConfigName); + + auto bs = new QbsBuildStep(buildSteps()); + bs->setQbsConfiguration(bd); + buildSteps()->appendStep(bs); + + cleanSteps()->appendStep(Constants::QBS_CLEANSTEP_ID); + + emit qbsConfigurationChanged(); + }); + m_configurationName = addAspect<BaseStringAspect>(); m_configurationName->setLabelText(tr("Configuration name:")); m_configurationName->setSettingsKey("Qbs.configName"); @@ -124,48 +165,6 @@ BuildSystem *QbsBuildConfiguration::buildSystem() const return m_buildSystem; } -void QbsBuildConfiguration::initialize() -{ - QVariantMap configData = extraInfo().value<QVariantMap>(); - configData.insert(QLatin1String(Constants::QBS_CONFIG_VARIANT_KEY), - (initialBuildType() == BuildConfiguration::Debug) - ? QLatin1String(Constants::QBS_VARIANT_DEBUG) - : QLatin1String(Constants::QBS_VARIANT_RELEASE)); - - Utils::FilePath buildDir = initialBuildDirectory(); - if (buildDir.isEmpty()) - buildDir = defaultBuildDirectory(target()->project()->projectFilePath(), - target()->kit(), initialDisplayName(), - initialBuildType()); - setBuildDirectory(buildDir); - - // Add the build configuration. - QVariantMap bd = configData; - QString configName = bd.take("configName").toString(); - if (configName.isEmpty()) { - configName = "qtc_" + target()->kit()->fileSystemFriendlyName() + '_' - + Utils::FileUtils::fileSystemFriendlyName(initialDisplayName()); - } - - const Kit *kit = target()->kit(); - const QString kitName = kit->displayName(); - const QByteArray kitHash = QCryptographicHash::hash(kitName.toUtf8(), QCryptographicHash::Sha1); - - const QString uniqueConfigName = configName - + '_' + kit->fileSystemFriendlyName().left(8) - + '_' + kitHash.toHex().left(16); - - m_configurationName->setValue(uniqueConfigName); - - auto bs = new QbsBuildStep(buildSteps()); - bs->setQbsConfiguration(bd); - buildSteps()->appendStep(bs); - - cleanSteps()->appendStep(Constants::QBS_CLEANSTEP_ID); - - emit qbsConfigurationChanged(); -} - void QbsBuildConfiguration::triggerReparseIfActive() { if (isActive()) diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h index c92291a0b3..94507080d6 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h +++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h @@ -57,7 +57,6 @@ class QbsBuildConfiguration : public ProjectExplorer::BuildConfiguration public: ProjectExplorer::BuildSystem *buildSystem() const final; - void initialize() final; QbsBuildStep *qbsStep() const; QVariantMap qbsConfiguration() const; diff --git a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp index 1a86fa5522..de5f1cd1f3 100644 --- a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp +++ b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp @@ -109,6 +109,50 @@ QmakeBuildConfiguration::QmakeBuildConfiguration(Target *target, Core::Id id) setConfigWidgetHasFrame(true); m_buildSystem = new QmakeBuildSystem(this); + setInitializer([this, target] { + auto qmakeStep = new QMakeStep(buildSteps()); + buildSteps()->appendStep(qmakeStep); + buildSteps()->appendStep(Constants::MAKESTEP_BS_ID); + + cleanSteps()->appendStep(Constants::MAKESTEP_BS_ID); + + const QmakeExtraBuildInfo qmakeExtra = extraInfo().value<QmakeExtraBuildInfo>(); + BaseQtVersion *version = QtKitAspect::qtVersion(target->kit()); + + BaseQtVersion::QmakeBuildConfigs config = version->defaultBuildConfig(); + if (initialBuildType() == BuildConfiguration::Debug) + config |= BaseQtVersion::DebugBuild; + else + config &= ~BaseQtVersion::DebugBuild; + + QString additionalArguments = qmakeExtra.additionalArguments; + if (!additionalArguments.isEmpty()) + qmakeStep->setUserArguments(additionalArguments); + + aspect<SeparateDebugInfoAspect>()->setSetting(qmakeExtra.config.separateDebugInfo); + aspect<QmlDebuggingAspect>()->setSetting(qmakeExtra.config.linkQmlDebuggingQQ2); + aspect<QtQuickCompilerAspect>()->setSetting(qmakeExtra.config.useQtQuickCompiler); + + setQMakeBuildConfiguration(config); + + FilePath directory = initialBuildDirectory(); + if (directory.isEmpty()) { + directory = shadowBuildDirectory(target->project()->projectFilePath(), + target->kit(), initialDisplayName(), + initialBuildType()); + } + + setBuildDirectory(directory); + + if (DeviceTypeKitAspect::deviceTypeId(target->kit()) + == Android::Constants::ANDROID_DEVICE_TYPE) { + buildSteps()->appendStep(Android::Constants::ANDROID_PACKAGE_INSTALLATION_STEP_ID); + buildSteps()->appendStep(Android::Constants::ANDROID_BUILD_APK_ID); + } + + updateCacheAndEmitEnvironmentChanged(); + }); + connect(target, &Target::kitChanged, this, &QmakeBuildConfiguration::kitChanged); MacroExpander *expander = macroExpander(); @@ -153,51 +197,6 @@ QmakeBuildConfiguration::QmakeBuildConfiguration(Target *target, Core::Id id) }); } -void QmakeBuildConfiguration::initialize() -{ - auto qmakeStep = new QMakeStep(buildSteps()); - buildSteps()->appendStep(qmakeStep); - buildSteps()->appendStep(Constants::MAKESTEP_BS_ID); - - cleanSteps()->appendStep(Constants::MAKESTEP_BS_ID); - - const QmakeExtraBuildInfo qmakeExtra = extraInfo().value<QmakeExtraBuildInfo>(); - BaseQtVersion *version = QtKitAspect::qtVersion(target()->kit()); - - BaseQtVersion::QmakeBuildConfigs config = version->defaultBuildConfig(); - if (initialBuildType() == BuildConfiguration::Debug) - config |= BaseQtVersion::DebugBuild; - else - config &= ~BaseQtVersion::DebugBuild; - - QString additionalArguments = qmakeExtra.additionalArguments; - if (!additionalArguments.isEmpty()) - qmakeStep->setUserArguments(additionalArguments); - - aspect<SeparateDebugInfoAspect>()->setSetting(qmakeExtra.config.separateDebugInfo); - aspect<QmlDebuggingAspect>()->setSetting(qmakeExtra.config.linkQmlDebuggingQQ2); - aspect<QtQuickCompilerAspect>()->setSetting(qmakeExtra.config.useQtQuickCompiler); - - setQMakeBuildConfiguration(config); - - FilePath directory = initialBuildDirectory(); - if (directory.isEmpty()) { - directory = shadowBuildDirectory(target()->project()->projectFilePath(), - target()->kit(), initialDisplayName(), - initialBuildType()); - } - - setBuildDirectory(directory); - - if (DeviceTypeKitAspect::deviceTypeId(target()->kit()) - == Android::Constants::ANDROID_DEVICE_TYPE) { - buildSteps()->appendStep(Android::Constants::ANDROID_PACKAGE_INSTALLATION_STEP_ID); - buildSteps()->appendStep(Android::Constants::ANDROID_BUILD_APK_ID); - } - - updateCacheAndEmitEnvironmentChanged(); -} - QmakeBuildConfiguration::~QmakeBuildConfiguration() { delete m_buildSystem; diff --git a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h index edb2782921..e003d86f7e 100644 --- a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h +++ b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h @@ -53,8 +53,6 @@ public: ProjectExplorer::BuildSystem *buildSystem() const final; - void initialize() override; - void setSubNodeBuild(QmakeProFileNode *node); QmakeProFileNode *subNodeBuild() const; |