CMakeProjectManager: Support for multi-config generators

CMake has multi-config generators like:

  * Visual Studio
  * Xcode
  * Ninja Multi-Config

The first two have different special targets for "all", "install",
"package", "test" namely: "ALL_BUILD", "INSTALL", "PACKAGE",
"RUN_TESTS".

All of them need to get the build type passed via "--config <build-
type>" and not via "CMAKE_BUILD_TYPE".

The multi-config generators will use only one build directory.

Fixes: QTCREATORBUG-24984
Change-Id: I8aa7ff73ce2af1e163b21a6504d26fcf95530edf
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Cristian Adam
2021-01-14 16:38:55 +01:00
parent f3d7717b31
commit 6cbdae8070
22 changed files with 238 additions and 140 deletions

View File

@@ -390,6 +390,13 @@ CommandLine CMakeBuildStep::cmakeCommand() const
return s;
}));
auto bs = qobject_cast<CMakeBuildSystem*>(buildSystem());
auto bc = qobject_cast<CMakeBuildConfiguration*>(buildConfiguration());
if (bc && bs && bs->isMultiConfig()) {
cmd.addArg("--config");
cmd.addArg(bc->cmakeBuildType());
}
if (!m_cmakeArguments->value().isEmpty())
cmd.addArgs(m_cmakeArguments->value(), CommandLine::Raw);
@@ -401,40 +408,27 @@ CommandLine CMakeBuildStep::cmakeCommand() const
return cmd;
}
QString CMakeBuildStep::cleanTarget()
QString CMakeBuildStep::cleanTarget() const
{
return QString("clean");
}
QString CMakeBuildStep::allTarget()
QString CMakeBuildStep::allTarget() const
{
return QString("all");
return m_allTarget;
}
QString CMakeBuildStep::installTarget()
QString CMakeBuildStep::installTarget() const
{
return QString("install");
return m_installTarget;
}
QString CMakeBuildStep::installStripTarget()
QStringList CMakeBuildStep::specialTargets(bool allCapsTargets)
{
return QString("install/strip");
}
QString CMakeBuildStep::packageTarget()
{
return QString("package");
}
QString CMakeBuildStep::testTarget()
{
return QString("test");
}
QStringList CMakeBuildStep::specialTargets()
{
return { allTarget(), cleanTarget(), installTarget(), installStripTarget(),
packageTarget(), testTarget() };
if (!allCapsTargets)
return {"all", "clean", "install", "install/strip", "package", "test"};
else
return {"ALL_BUILD", "clean", "INSTALL", "PACKAGE", "RUN_TESTS"};
}
QString CMakeBuildStep::activeRunConfigTarget() const
@@ -523,12 +517,26 @@ void CMakeBuildStep::recreateBuildTargetsModel()
auto bs = qobject_cast<CMakeBuildSystem *>(buildSystem());
QStringList targetList = bs ? bs->buildTargetTitles() : QStringList();
bool usesAllCapsTargets = bs ? bs->usesAllCapsTargets() : false;
if (usesAllCapsTargets) {
m_allTarget = "ALL_BUILD";
m_installTarget = "INSTALL";
int idx = m_buildTargets.indexOf(QString("all"));
if (idx != -1)
m_buildTargets[idx] = QString("ALL_BUILD");
idx = m_buildTargets.indexOf(QString("install"));
if (idx != -1)
m_buildTargets[idx] = QString("INSTALL");
}
targetList.sort();
targetList.removeDuplicates();
addItem(QString(), true);
for (const QString &buildTarget : qAsConst(targetList))
addItem(buildTarget, specialTargets().contains(buildTarget));
addItem(buildTarget, specialTargets(usesAllCapsTargets).contains(buildTarget));
updateBuildTargetsModel();
}