ProjectExplorer: Use function object for special build config init

Change-Id: I5da0f28ee1a64f8d9a3145f059019be702bee463
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
hjk
2019-12-09 12:59:38 +01:00
parent b82add7813
commit 041a86c8c7
18 changed files with 269 additions and 282 deletions

View File

@@ -53,10 +53,8 @@ AutotoolsBuildConfiguration::AutotoolsBuildConfiguration(Target *parent, Core::I
setBuildDirectory(Utils::FilePath::fromString("/<foobar>"));
setBuildDirectoryHistoryCompleter("AutoTools.BuildDir.History");
setConfigWidgetDisplayName(tr("Autotools Manager"));
}
void AutotoolsBuildConfiguration::initialize()
{
setInitializer([this] {
// ### Build Steps Build ###
// autogen.sh or autoreconf
QFile autogenFile(target()->project()->projectDirectory().toString() + "/autogen.sh");
@@ -73,6 +71,7 @@ void AutotoolsBuildConfiguration::initialize()
// ### Build Steps Clean ###
cleanSteps()->appendStep(Constants::MAKE_STEP_ID);
});
}

View File

@@ -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

View File

@@ -82,26 +82,19 @@ 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;
}
void CMakeBuildConfiguration::initialize()
{
setInitializer([this, target] {
buildSteps()->appendStep(Constants::CMAKE_BUILD_STEP_ID);
if (DeviceTypeKitAspect::deviceTypeId(target()->kit())
if (DeviceTypeKitAspect::deviceTypeId(target->kit())
== Android::Constants::ANDROID_DEVICE_TYPE) {
buildSteps()->appendStep(Android::Constants::ANDROID_BUILD_APK_ID);
const auto &bs = buildSteps()->steps().constLast();
@@ -136,7 +129,7 @@ void CMakeBuildConfiguration::initialize()
preferredAbi.toLatin1(),
androidAbis});
QtSupport::BaseQtVersion *qt = QtSupport::QtKitAspect::qtVersion(target()->kit());
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",
@@ -157,16 +150,22 @@ void CMakeBuildConfiguration::initialize()
cleanSteps()->appendStep(Constants::CMAKE_BUILD_STEP_ID);
if (initialBuildDirectory().isEmpty()) {
auto project = target()->project();
setBuildDirectory(CMakeBuildConfiguration::shadowBuildDirectory(project->projectFilePath(),
target()->kit(),
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();

View File

@@ -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;

View File

@@ -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()
{

View File

@@ -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
{

View File

@@ -55,13 +55,11 @@ GenericBuildConfiguration::GenericBuildConfiguration(Target *parent, Core::Id id
setConfigWidgetDisplayName(tr("Generic Manager"));
setBuildDirectoryHistoryCompleter("Generic.BuildDir.History");
updateCacheAndEmitEnvironmentChanged();
}
void GenericBuildConfiguration::initialize()
{
setInitializer([this] {
buildSteps()->appendStep(Constants::GENERIC_MS_ID);
cleanSteps()->appendStep(Constants::GENERIC_MS_ID);
updateCacheAndEmitEnvironmentChanged();
});
updateCacheAndEmitEnvironmentChanged();
}

View File

@@ -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;
};

View File

@@ -54,17 +54,8 @@ 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();
setBuildDirectory(project()->projectDirectory());
@@ -73,11 +64,18 @@ void NimbleBuildConfiguration::initialize()
// 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)

View File

@@ -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;
};

View File

@@ -71,12 +71,11 @@ NimBuildConfiguration::NimBuildConfiguration(Target *target, Core::Id id)
setConfigWidgetDisplayName(tr("General"));
setConfigWidgetHasFrame(true);
setBuildDirectorySettingsKey("Nim.NimBuildConfiguration.BuildDirectory");
}
void NimBuildConfiguration::initialize()
{
setInitializer([this, target] {
// Create the build configuration and initialize it from build info
setBuildDirectory(defaultBuildDirectory(target()->kit(),
setBuildDirectory(defaultBuildDirectory(target->kit(),
project()->projectFilePath(),
displayName(),
buildType()));
@@ -109,8 +108,10 @@ void NimBuildConfiguration::initialize()
// Add clean step
cleanSteps()->appendStep(Constants::C_NIMCOMPILERCLEANSTEP_ID);
});
}
FilePath NimBuildConfiguration::cacheDirectory() const
{
return buildDirectory().pathAppended("nimcache");

View File

@@ -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;

View File

@@ -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();
if (bc)
bc->doInitialize(info);
return bc;
}

View File

@@ -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();

View File

@@ -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())

View File

@@ -57,7 +57,6 @@ class QbsBuildConfiguration : public ProjectExplorer::BuildConfiguration
public:
ProjectExplorer::BuildSystem *buildSystem() const final;
void initialize() final;
QbsBuildStep *qbsStep() const;
QVariantMap qbsConfiguration() const;

View File

@@ -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;

View File

@@ -53,8 +53,6 @@ public:
ProjectExplorer::BuildSystem *buildSystem() const final;
void initialize() override;
void setSubNodeBuild(QmakeProFileNode *node);
QmakeProFileNode *subNodeBuild() const;