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,26 +53,25 @@ AutotoolsBuildConfiguration::AutotoolsBuildConfiguration(Target *parent, Core::I
setBuildDirectory(Utils::FilePath::fromString("/<foobar>")); setBuildDirectory(Utils::FilePath::fromString("/<foobar>"));
setBuildDirectoryHistoryCompleter("AutoTools.BuildDir.History"); setBuildDirectoryHistoryCompleter("AutoTools.BuildDir.History");
setConfigWidgetDisplayName(tr("Autotools Manager")); setConfigWidgetDisplayName(tr("Autotools Manager"));
}
void AutotoolsBuildConfiguration::initialize() setInitializer([this] {
{ // ### Build Steps Build ###
// ### Build Steps Build ### // autogen.sh or autoreconf
// autogen.sh or autoreconf QFile autogenFile(target()->project()->projectDirectory().toString() + "/autogen.sh");
QFile autogenFile(target()->project()->projectDirectory().toString() + "/autogen.sh"); if (autogenFile.exists())
if (autogenFile.exists()) buildSteps()->appendStep(Constants::AUTOGEN_STEP_ID);
buildSteps()->appendStep(Constants::AUTOGEN_STEP_ID); else
else buildSteps()->appendStep(Constants::AUTORECONF_STEP_ID);
buildSteps()->appendStep(Constants::AUTORECONF_STEP_ID);
// ./configure. // ./configure.
buildSteps()->appendStep(Constants::CONFIGURE_STEP_ID); buildSteps()->appendStep(Constants::CONFIGURE_STEP_ID);
// make // make
buildSteps()->appendStep(Constants::MAKE_STEP_ID); buildSteps()->appendStep(Constants::MAKE_STEP_ID);
// ### Build Steps Clean ### // ### Build Steps Clean ###
cleanSteps()->appendStep(Constants::MAKE_STEP_ID); cleanSteps()->appendStep(Constants::MAKE_STEP_ID);
});
} }

View File

@@ -38,8 +38,6 @@ class AutotoolsBuildConfiguration : public ProjectExplorer::BuildConfiguration
friend class ProjectExplorer::BuildConfigurationFactory; friend class ProjectExplorer::BuildConfigurationFactory;
AutotoolsBuildConfiguration(ProjectExplorer::Target *parent, Core::Id id); AutotoolsBuildConfiguration(ProjectExplorer::Target *parent, Core::Id id);
void initialize() override;
}; };
class AutotoolsBuildConfigurationFactory : public ProjectExplorer::BuildConfigurationFactory class AutotoolsBuildConfigurationFactory : public ProjectExplorer::BuildConfigurationFactory

View File

@@ -82,14 +82,82 @@ Q_LOGGING_CATEGORY(cmakeBuildConfigurationLog, "qtc.cmake.bc", QtWarningMsg);
const char CONFIGURATION_KEY[] = "CMake.Configuration"; const char CONFIGURATION_KEY[] = "CMake.Configuration";
CMakeBuildConfiguration::CMakeBuildConfiguration(Target *parent, Core::Id id) CMakeBuildConfiguration::CMakeBuildConfiguration(Target *target, Core::Id id)
: BuildConfiguration(parent, id) : BuildConfiguration(target, id)
{ {
m_buildSystem = new CMakeBuildSystem(this); m_buildSystem = new CMakeBuildSystem(this);
setBuildDirectory(shadowBuildDirectory(project()->projectFilePath(), setBuildDirectory(shadowBuildDirectory(project()->projectFilePath(),
target()->kit(), target->kit(),
displayName(), displayName(),
BuildConfiguration::Unknown)); BuildConfiguration::Unknown));
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()});
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",
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{"CMAKE_FIND_ROOT_PATH", "%{Qt:QT_INSTALL_PREFIX}"});
}
cleanSteps()->appendStep(Constants::CMAKE_BUILD_STEP_ID);
if (initialBuildDirectory().isEmpty()) {
setBuildDirectory(shadowBuildDirectory(target->project()->projectFilePath(),
target->kit(),
initialDisplayName(),
initialBuildType()));
}
auto info = extraInfo().value<CMakeExtraBuildInfo>();
setConfigurationForCMake(info.configuration);
});
} }
CMakeBuildConfiguration::~CMakeBuildConfiguration() CMakeBuildConfiguration::~CMakeBuildConfiguration()
@@ -97,75 +165,6 @@ CMakeBuildConfiguration::~CMakeBuildConfiguration()
delete m_buildSystem; delete m_buildSystem;
} }
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",
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{"CMAKE_FIND_ROOT_PATH", "%{Qt:QT_INSTALL_PREFIX}"});
}
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);
}
QString CMakeBuildConfiguration::disabledReason() const QString CMakeBuildConfiguration::disabledReason() const
{ {

View File

@@ -47,7 +47,7 @@ class CMakeBuildConfiguration : public ProjectExplorer::BuildConfiguration
Q_OBJECT Q_OBJECT
friend class ProjectExplorer::BuildConfigurationFactory; friend class ProjectExplorer::BuildConfigurationFactory;
CMakeBuildConfiguration(ProjectExplorer::Target *parent, Core::Id id); CMakeBuildConfiguration(ProjectExplorer::Target *target, Core::Id id);
~CMakeBuildConfiguration() final; ~CMakeBuildConfiguration() final;
public: public:
@@ -79,7 +79,6 @@ private:
QVariantMap toMap() const override; QVariantMap toMap() const override;
BuildType buildType() const override; BuildType buildType() const override;
void initialize() override;
QString disabledReason() const override; QString disabledReason() const override;
ProjectExplorer::NamedWidget *createConfigWidget() override; ProjectExplorer::NamedWidget *createConfigWidget() override;

View File

@@ -528,11 +528,15 @@ CompilationDatabaseEditorFactory::CompilationDatabaseEditorFactory()
setCodeFoldingSupported(true); setCodeFoldingSupported(true);
} }
CompilationDatabaseBuildConfiguration::CompilationDatabaseBuildConfiguration( class CompilationDatabaseBuildConfiguration : public BuildConfiguration
ProjectExplorer::Target *target, Core::Id id)
: ProjectExplorer::BuildConfiguration(target, id)
{ {
} public:
CompilationDatabaseBuildConfiguration(Target *target, Core::Id id)
: BuildConfiguration(target, id)
{
}
};
CompilationDatabaseBuildConfigurationFactory::CompilationDatabaseBuildConfigurationFactory() CompilationDatabaseBuildConfigurationFactory::CompilationDatabaseBuildConfigurationFactory()
{ {

View File

@@ -95,14 +95,6 @@ public:
CompilationDatabaseEditorFactory(); CompilationDatabaseEditorFactory();
}; };
class CompilationDatabaseBuildConfiguration : public ProjectExplorer::BuildConfiguration
{
Q_OBJECT
public:
CompilationDatabaseBuildConfiguration(ProjectExplorer::Target *target, Core::Id id);
void initialize() final {}
};
class CompilationDatabaseBuildConfigurationFactory class CompilationDatabaseBuildConfigurationFactory
: public ProjectExplorer::BuildConfigurationFactory : public ProjectExplorer::BuildConfigurationFactory
{ {

View File

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

View File

@@ -27,8 +27,6 @@
#include <projectexplorer/buildconfiguration.h> #include <projectexplorer/buildconfiguration.h>
namespace Utils { class FilePath; }
namespace GenericProjectManager { namespace GenericProjectManager {
namespace Internal { namespace Internal {
@@ -39,7 +37,6 @@ class GenericBuildConfiguration : public ProjectExplorer::BuildConfiguration
friend class ProjectExplorer::BuildConfigurationFactory; friend class ProjectExplorer::BuildConfigurationFactory;
GenericBuildConfiguration(ProjectExplorer::Target *parent, Core::Id id); GenericBuildConfiguration(ProjectExplorer::Target *parent, Core::Id id);
void initialize() override;
void addToEnvironment(Utils::Environment &env) const final; void addToEnvironment(Utils::Environment &env) const final;
}; };

View File

@@ -54,8 +54,23 @@ NimbleBuildConfiguration::NimbleBuildConfiguration(Target *target, Core::Id id)
setConfigWidgetHasFrame(true); setConfigWidgetHasFrame(true);
setBuildDirectorySettingsKey("Nim.NimbleBuildConfiguration.BuildDirectory"); setBuildDirectorySettingsKey("Nim.NimbleBuildConfiguration.BuildDirectory");
m_nimbleBuildSystem = dynamic_cast<NimbleBuildSystem *>(buildSystem()); setInitializer([this] {
QTC_ASSERT(m_nimbleBuildSystem, return);
m_buildType = initialBuildType();
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.
// // 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 BuildConfiguration::BuildType NimbleBuildConfiguration::buildType() const
@@ -63,23 +78,6 @@ BuildConfiguration::BuildType NimbleBuildConfiguration::buildType() const
return m_buildType; return m_buildType;
} }
void NimbleBuildConfiguration::initialize()
{
m_buildType = initialBuildType();
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.
// // Don't add a nimble build step when the package has no binaries (i.e a library package)
// if (!m_nimbleBuildSystem->metadata().bin.empty())
// {
buildSteps()->appendStep(new NimbleBuildStep(buildSteps()));
// }
}
bool NimbleBuildConfiguration::fromMap(const QVariantMap &map) bool NimbleBuildConfiguration::fromMap(const QVariantMap &map)
{ {
m_buildType = static_cast<BuildType>(map[Constants::C_NIMBLEBUILDCONFIGURATION_BUILDTYPE].toInt()); m_buildType = static_cast<BuildType>(map[Constants::C_NIMBLEBUILDCONFIGURATION_BUILDTYPE].toInt());

View File

@@ -30,8 +30,6 @@
namespace Nim { namespace Nim {
class NimbleBuildSystem;
class NimbleBuildConfiguration : public ProjectExplorer::BuildConfiguration class NimbleBuildConfiguration : public ProjectExplorer::BuildConfiguration
{ {
Q_OBJECT Q_OBJECT
@@ -46,11 +44,7 @@ class NimbleBuildConfiguration : public ProjectExplorer::BuildConfiguration
QVariantMap toMap() const override; QVariantMap toMap() const override;
protected:
void initialize() override;
private: private:
NimbleBuildSystem *m_nimbleBuildSystem = nullptr;
BuildType m_buildType; BuildType m_buildType;
}; };

View File

@@ -71,46 +71,47 @@ NimBuildConfiguration::NimBuildConfiguration(Target *target, Core::Id id)
setConfigWidgetDisplayName(tr("General")); setConfigWidgetDisplayName(tr("General"));
setConfigWidgetHasFrame(true); setConfigWidgetHasFrame(true);
setBuildDirectorySettingsKey("Nim.NimBuildConfiguration.BuildDirectory"); 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 setInitializer([this, target] {
{ // Create the build configuration and initialize it from build info
auto nimCompilerBuildStep = new NimCompilerBuildStep(buildSteps()); setBuildDirectory(defaultBuildDirectory(target->kit(),
NimCompilerBuildStep::DefaultBuildOptions defaultOption; project()->projectFilePath(),
switch (initialBuildType()) { displayName(),
case BuildConfiguration::Release: buildType()));
defaultOption = NimCompilerBuildStep::DefaultBuildOptions::Release;
break; // Add nim compiler build step
case BuildConfiguration::Debug: {
defaultOption = NimCompilerBuildStep::DefaultBuildOptions::Debug; auto nimCompilerBuildStep = new NimCompilerBuildStep(buildSteps());
break; NimCompilerBuildStep::DefaultBuildOptions defaultOption;
default: switch (initialBuildType()) {
defaultOption = NimCompilerBuildStep::DefaultBuildOptions::Empty; case BuildConfiguration::Release:
break; 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);
} }
nimCompilerBuildStep->setDefaultCompilerOptions(defaultOption);
const Utils::FilePathList nimFiles = project()->files([](const Node *n) { // Add clean step
return Project::AllFiles(n) && n->path().endsWith(".nim"); cleanSteps()->appendStep(Constants::C_NIMCOMPILERCLEANSTEP_ID);
}); });
if (!nimFiles.isEmpty())
nimCompilerBuildStep->setTargetNimFile(nimFiles.first());
buildSteps()->appendStep(nimCompilerBuildStep);
}
// Add clean step
cleanSteps()->appendStep(Constants::C_NIMCOMPILERCLEANSTEP_ID);
} }
FilePath NimBuildConfiguration::cacheDirectory() const FilePath NimBuildConfiguration::cacheDirectory() const
{ {
return buildDirectory().pathAppended("nimcache"); return buildDirectory().pathAppended("nimcache");

View File

@@ -39,8 +39,6 @@ class NimBuildConfiguration : public ProjectExplorer::BuildConfiguration
friend class ProjectExplorer::BuildConfigurationFactory; friend class ProjectExplorer::BuildConfigurationFactory;
NimBuildConfiguration(ProjectExplorer::Target *target, Core::Id id); NimBuildConfiguration(ProjectExplorer::Target *target, Core::Id id);
void initialize() override;
public: public:
Utils::FilePath cacheDirectory() const; Utils::FilePath cacheDirectory() const;
Utils::FilePath outFilePath() const; Utils::FilePath outFilePath() const;

View File

@@ -84,6 +84,8 @@ public:
QString m_configWidgetDisplayName; QString m_configWidgetDisplayName;
bool m_configWidgetHasFrame = false; bool m_configWidgetHasFrame = false;
std::function<void()> m_initializer;
// FIXME: Remove. // FIXME: Remove.
BuildConfiguration::BuildType m_initialBuildType = BuildConfiguration::Unknown; BuildConfiguration::BuildType m_initialBuildType = BuildConfiguration::Unknown;
Utils::FilePath m_initialBuildDirectory; Utils::FilePath m_initialBuildDirectory;
@@ -181,6 +183,28 @@ void BuildConfiguration::addConfigWidgets(const std::function<void(NamedWidget *
adder(subConfigWidget); 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 *BuildConfiguration::createConfigWidget()
{ {
NamedWidget *named = new NamedWidget(d->m_configWidgetDisplayName); NamedWidget *named = new NamedWidget(d->m_configWidgetDisplayName);
@@ -405,7 +429,7 @@ bool BuildConfiguration::regenerateBuildFiles(Node *node)
void BuildConfiguration::restrictNextBuild(const RunConfiguration *rc) void BuildConfiguration::restrictNextBuild(const RunConfiguration *rc)
{ {
Q_UNUSED(rc); Q_UNUSED(rc)
} }
BuildConfiguration::BuildType BuildConfiguration::buildType() const BuildConfiguration::BuildType BuildConfiguration::buildType() const
@@ -568,21 +592,10 @@ BuildConfiguration *BuildConfigurationFactory::create(Target *parent, const Buil
if (!canHandle(parent)) if (!canHandle(parent))
return nullptr; return nullptr;
QTC_ASSERT(m_creator, return nullptr); QTC_ASSERT(m_creator, return nullptr);
BuildConfiguration *bc = m_creator(parent); BuildConfiguration *bc = m_creator(parent);
if (!bc) if (bc)
return nullptr; bc->doInitialize(info);
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();
return bc; return bc;
} }

View File

@@ -55,7 +55,7 @@ protected:
explicit BuildConfiguration(Target *target, Core::Id id); explicit BuildConfiguration(Target *target, Core::Id id);
public: public:
~BuildConfiguration(); ~BuildConfiguration() override;
Utils::FilePath buildDirectory() const; Utils::FilePath buildDirectory() const;
Utils::FilePath rawBuildDirectory() const; Utils::FilePath rawBuildDirectory() const;
@@ -118,6 +118,8 @@ public:
void addConfigWidgets(const std::function<void (NamedWidget *)> &adder); void addConfigWidgets(const std::function<void (NamedWidget *)> &adder);
void doInitialize(const BuildInfo &info);
signals: signals:
void environmentChanged(); void environmentChanged();
void buildDirectoryChanged(); void buildDirectoryChanged();
@@ -125,7 +127,7 @@ signals:
void buildTypeChanged(); void buildTypeChanged();
protected: protected:
virtual void initialize() = 0; void setInitializer(const std::function<void()> &initializer);
private: private:
void emitBuildDirectoryChanged(); void emitBuildDirectoryChanged();

View File

@@ -80,6 +80,47 @@ QbsBuildConfiguration::QbsBuildConfiguration(Target *target, Core::Id id)
{ {
setConfigWidgetHasFrame(true); 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 = addAspect<BaseStringAspect>();
m_configurationName->setLabelText(tr("Configuration name:")); m_configurationName->setLabelText(tr("Configuration name:"));
m_configurationName->setSettingsKey("Qbs.configName"); m_configurationName->setSettingsKey("Qbs.configName");
@@ -124,48 +165,6 @@ BuildSystem *QbsBuildConfiguration::buildSystem() const
return m_buildSystem; 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() void QbsBuildConfiguration::triggerReparseIfActive()
{ {
if (isActive()) if (isActive())

View File

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

View File

@@ -109,6 +109,50 @@ QmakeBuildConfiguration::QmakeBuildConfiguration(Target *target, Core::Id id)
setConfigWidgetHasFrame(true); setConfigWidgetHasFrame(true);
m_buildSystem = new QmakeBuildSystem(this); 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, connect(target, &Target::kitChanged,
this, &QmakeBuildConfiguration::kitChanged); this, &QmakeBuildConfiguration::kitChanged);
MacroExpander *expander = macroExpander(); 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() QmakeBuildConfiguration::~QmakeBuildConfiguration()
{ {
delete m_buildSystem; delete m_buildSystem;

View File

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