forked from qt-creator/qt-creator
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:
@@ -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);
|
||||
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);
|
||||
// ./configure.
|
||||
buildSteps()->appendStep(Constants::CONFIGURE_STEP_ID);
|
||||
|
||||
// make
|
||||
buildSteps()->appendStep(Constants::MAKE_STEP_ID);
|
||||
// make
|
||||
buildSteps()->appendStep(Constants::MAKE_STEP_ID);
|
||||
|
||||
// ### Build Steps Clean ###
|
||||
cleanSteps()->appendStep(Constants::MAKE_STEP_ID);
|
||||
// ### Build Steps Clean ###
|
||||
cleanSteps()->appendStep(Constants::MAKE_STEP_ID);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -82,14 +82,82 @@ 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));
|
||||
|
||||
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()
|
||||
@@ -97,75 +165,6 @@ CMakeBuildConfiguration::~CMakeBuildConfiguration()
|
||||
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
|
||||
{
|
||||
|
@@ -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;
|
||||
|
@@ -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()
|
||||
{
|
||||
|
@@ -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
|
||||
{
|
||||
|
@@ -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();
|
||||
}
|
||||
|
@@ -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;
|
||||
};
|
||||
|
||||
|
@@ -54,8 +54,23 @@ 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] {
|
||||
|
||||
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
|
||||
@@ -63,23 +78,6 @@ BuildConfiguration::BuildType NimbleBuildConfiguration::buildType() const
|
||||
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)
|
||||
{
|
||||
m_buildType = static_cast<BuildType>(map[Constants::C_NIMBLEBUILDCONFIGURATION_BUILDTYPE].toInt());
|
||||
|
@@ -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;
|
||||
};
|
||||
|
||||
|
@@ -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;
|
||||
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);
|
||||
}
|
||||
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");
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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();
|
||||
|
@@ -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())
|
||||
|
@@ -57,7 +57,6 @@ class QbsBuildConfiguration : public ProjectExplorer::BuildConfiguration
|
||||
|
||||
public:
|
||||
ProjectExplorer::BuildSystem *buildSystem() const final;
|
||||
void initialize() final;
|
||||
|
||||
QbsBuildStep *qbsStep() const;
|
||||
QVariantMap qbsConfiguration() const;
|
||||
|
@@ -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;
|
||||
|
@@ -53,8 +53,6 @@ public:
|
||||
|
||||
ProjectExplorer::BuildSystem *buildSystem() const final;
|
||||
|
||||
void initialize() override;
|
||||
|
||||
void setSubNodeBuild(QmakeProFileNode *node);
|
||||
QmakeProFileNode *subNodeBuild() const;
|
||||
|
||||
|
Reference in New Issue
Block a user