Merge remote-tracking branch 'origin/4.15'

Conflicts:
	src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
	src/plugins/debugger/gdb/gdboptionspage.cpp

Change-Id: I4149e860b6842ea63bff3a7eb9632b7a6c2919d8
This commit is contained in:
Eike Ziller
2021-03-22 09:52:14 +01:00
117 changed files with 9092 additions and 5452 deletions

View File

@@ -76,16 +76,6 @@ BuildDirParameters::BuildDirParameters(CMakeBuildConfiguration *bc)
buildDirectory = bc->buildDirectory();
cmakeBuildType = bc->cmakeBuildType();
if (cmakeBuildType.isEmpty()) {
// The empty build type might be just a case of loading of an existing project
// that doesn't have the "CMake.Build.Type" aspect saved
const CMakeConfig config = CMakeConfigItem::itemsFromArguments(initialCMakeArguments);
if (!config.isEmpty()) {
cmakeBuildType = QString::fromLatin1(CMakeConfigItem::valueOf("CMAKE_BUILD_TYPE", config));
if (!cmakeBuildType.isEmpty())
bc->setCMakeBuildType(cmakeBuildType);
}
}
environment = bc->environment();
// Disable distributed building for configuration runs. CMake does not do those in parallel,

View File

@@ -178,6 +178,16 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc)
m_configModel->flush(); // clear out config cache...;
});
auto buildTypeAspect = bc->aspect<BuildTypeAspect>();
connect(buildTypeAspect, &BaseAspect::changed, this, [this, buildTypeAspect]() {
if (!m_buildConfiguration->isMultiConfig()) {
CMakeConfig config;
config << CMakeConfigItem("CMAKE_BUILD_TYPE", buildTypeAspect->value().toUtf8());
m_configModel->setBatchEditConfiguration(config);
}
});
auto qmlDebugAspect = bc->aspect<QtSupport::QmlDebuggingAspect>();
connect(qmlDebugAspect, &QtSupport::QmlDebuggingAspect::changed, this, [this]() {
updateButtonState();
@@ -298,6 +308,7 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc)
Form {
buildDirAspect, Break(),
bc->aspect<InitialCMakeArgumentsAspect>(), Break(),
bc->aspect<BuildTypeAspect>(), Break(),
qmlDebugAspect
},
Space(10),
@@ -740,7 +751,7 @@ static QStringList defaultInitialCMakeArguments(const Kit *k, const QString buil
// CMAKE_BUILD_TYPE:
if (!buildType.isEmpty() && !CMakeGeneratorKitAspect::isMultiConfigGenerator(k)) {
initialArgs.append(QString::fromLatin1("-DCMAKE_BUILD_TYPE:String=%1").arg(buildType));
initialArgs.append(QString::fromLatin1("-DCMAKE_BUILD_TYPE:STRING=%1").arg(buildType));
}
Internal::CMakeSpecificSettings *settings
@@ -1246,12 +1257,56 @@ FilePath CMakeBuildConfiguration::sourceDirectory() const
QString CMakeBuildConfiguration::cmakeBuildType() const
{
return aspect<BuildTypeAspect>()->value();
if (!isMultiConfig()) {
auto configChanges = configurationChanges();
auto it = std::find_if(configChanges.begin(), configChanges.end(),
[](const CMakeConfigItem &item) { return item.key == "CMAKE_BUILD_TYPE";});
if (it != configChanges.end())
const_cast<CMakeBuildConfiguration*>(this)
->setCMakeBuildType(QString::fromUtf8(it->value));
}
QString cmakeBuildType = aspect<BuildTypeAspect>()->value();
const Utils::FilePath cmakeCacheTxt = buildDirectory().pathAppended("CMakeCache.txt");
const bool hasCMakeCache = QFile::exists(cmakeCacheTxt.toString());
CMakeConfig config;
if (cmakeBuildType == "Unknown") {
// The "Unknown" type is the case of loading of an existing project
// that doesn't have the "CMake.Build.Type" aspect saved
if (hasCMakeCache) {
QString errorMessage;
config = CMakeBuildSystem::parseCMakeCacheDotTxt(cmakeCacheTxt, &errorMessage);
} else {
config = CMakeConfigItem::itemsFromArguments(initialCMakeArguments());
}
} else if (!hasCMakeCache) {
config = CMakeConfigItem::itemsFromArguments(initialCMakeArguments());
}
if (!config.isEmpty()) {
cmakeBuildType = QString::fromUtf8(CMakeConfigItem::valueOf("CMAKE_BUILD_TYPE", config));
const_cast<CMakeBuildConfiguration*>(this)
->setCMakeBuildType(cmakeBuildType);
}
return cmakeBuildType;
}
void CMakeBuildConfiguration::setCMakeBuildType(const QString &cmakeBuildType)
void CMakeBuildConfiguration::setCMakeBuildType(const QString &cmakeBuildType, bool quiet)
{
aspect<BuildTypeAspect>()->setValue(cmakeBuildType);
if (quiet) {
aspect<BuildTypeAspect>()->setValueQuietly(cmakeBuildType);
aspect<BuildTypeAspect>()->update();
} else {
aspect<BuildTypeAspect>()->setValue(cmakeBuildType);
}
}
bool CMakeBuildConfiguration::isMultiConfig() const
{
return m_buildSystem->isMultiConfig();
}
namespace Internal {
@@ -1282,6 +1337,9 @@ SourceDirectoryAspect::SourceDirectoryAspect()
BuildTypeAspect::BuildTypeAspect()
{
setSettingsKey("CMake.Build.Type");
setLabelText(tr("Build type:"));
setDisplayStyle(LineEditDisplay);
setDefaultValue("Unknown");
}
} // namespace Internal

View File

@@ -75,7 +75,9 @@ public:
Utils::FilePath sourceDirectory() const;
QString cmakeBuildType() const;
void setCMakeBuildType(const QString &cmakeBuildType);
void setCMakeBuildType(const QString &cmakeBuildType, bool quiet = false);
bool isMultiConfig() const;
signals:
void errorOccurred(const QString &message);
@@ -163,6 +165,7 @@ class BuildTypeAspect final : public Utils::StringAspect
public:
BuildTypeAspect();
using Utils::StringAspect::update;
};
} // namespace Internal

View File

@@ -846,12 +846,20 @@ void CMakeBuildSystem::wireUpConnections()
// No CMakeCache? Run with initial arguments!
qCDebug(cmakeBuildSystemLog) << "Requesting parse due to build directory change";
const BuildDirParameters parameters(cmakeBuildConfiguration());
const bool hasCMakeCache = QFile::exists(
(parameters.buildDirectory / "CMakeCache.txt").toString());
const FilePath cmakeCacheTxt = parameters.buildDirectory.pathAppended("CMakeCache.txt");
const bool hasCMakeCache = QFile::exists(cmakeCacheTxt.toString());
const auto options = ReparseParameters(
hasCMakeCache
? REPARSE_DEFAULT
: (REPARSE_FORCE_INITIAL_CONFIGURATION | REPARSE_FORCE_CMAKE_RUN));
if (hasCMakeCache) {
QString errorMessage;
const CMakeConfig config = CMakeBuildSystem::parseCMakeCacheDotTxt(cmakeCacheTxt, &errorMessage);
if (!config.isEmpty() && errorMessage.isEmpty()) {
QByteArray cmakeBuildTypeName = CMakeConfigItem::valueOf("CMAKE_BUILD_TYPE", config);
cmakeBuildConfiguration()->setCMakeBuildType(QString::fromUtf8(cmakeBuildTypeName), true);
}
}
setParametersAndRequestParse(BuildDirParameters(cmakeBuildConfiguration()), options);
});