CMakeProjectManager: Provide generators

Task-number: QTCREATORBUG-28149
Change-Id: Iaebc04d729ccb3ec14496ae74ca6aa3d9aca8bac
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
Christian Kandeler
2022-12-06 17:07:52 +01:00
parent 68b7276f86
commit ca4af940b1
2 changed files with 90 additions and 0 deletions

View File

@@ -19,6 +19,7 @@
#include <android/androidconstants.h> #include <android/androidconstants.h>
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <coreplugin/messagemanager.h>
#include <coreplugin/progressmanager/progressmanager.h> #include <coreplugin/progressmanager/progressmanager.h>
#include <cppeditor/cppeditorconstants.h> #include <cppeditor/cppeditorconstants.h>
@@ -1335,4 +1336,90 @@ MakeInstallCommand CMakeBuildSystem::makeInstallCommand(const FilePath &installR
return cmd; return cmd;
} }
QList<QPair<Id, QString>> CMakeBuildSystem::generators() const
{
if (!buildConfiguration())
return {};
const CMakeTool * const cmakeTool
= CMakeKitAspect::cmakeTool(buildConfiguration()->target()->kit());
if (!cmakeTool)
return {};
QList<QPair<Id, QString>> result;
const QList<CMakeTool::Generator> &generators = cmakeTool->supportedGenerators();
for (const CMakeTool::Generator &generator : generators) {
result << qMakePair(Id::fromSetting(generator.name),
Tr::tr("%1 (via cmake)").arg(generator.name));
for (const QString &extraGenerator : generator.extraGenerators) {
const QString displayName = extraGenerator + " - " + generator.name;
result << qMakePair(Id::fromSetting(displayName),
Tr::tr("%1 (via cmake)").arg(displayName));
}
}
return result;
}
void CMakeBuildSystem::runGenerator(Utils::Id id)
{
QTC_ASSERT(cmakeBuildConfiguration(), return);
const auto showError = [](const QString &detail) {
Core::MessageManager::writeDisrupting(Tr::tr("cmake generator failed: %1.").arg(detail));
};
const CMakeTool * const cmakeTool
= CMakeKitAspect::cmakeTool(buildConfiguration()->target()->kit());
if (!cmakeTool) {
showError(Tr::tr("Kit does not have a cmake binary set"));
return;
}
const QString generator = id.toSetting().toString();
const FilePath outDir = buildConfiguration()->buildDirectory()
/ ("qtc_" + FileUtils::fileSystemFriendlyName(generator));
if (!outDir.ensureWritableDir()) {
showError(Tr::tr("Cannot create output directory \"%1\"").arg(outDir.toString()));
return;
}
CommandLine cmdLine(cmakeTool->cmakeExecutable(), {"-S", buildConfiguration()->target()
->project()->projectDirectory().toUserOutput(), "-G", generator});
if (!cmdLine.executable().isExecutableFile()) {
showError(Tr::tr("No valid cmake executable"));
return;
}
const auto itemFilter = [](const CMakeConfigItem &item) {
return !item.isNull()
&& item.type != CMakeConfigItem::STATIC
&& item.type != CMakeConfigItem::INTERNAL
&& !item.key.contains("GENERATOR");
};
QList<CMakeConfigItem> configItems = Utils::filtered(m_configurationChanges.toList(),
itemFilter);
const QList<CMakeConfigItem> initialConfigItems
= Utils::filtered(initialCMakeConfiguration().toList(), itemFilter);
for (const CMakeConfigItem &item : std::as_const(initialConfigItems)) {
if (!Utils::contains(configItems, [&item](const CMakeConfigItem &existingItem) {
return existingItem.key == item.key;
})) {
configItems << item;
}
}
for (const CMakeConfigItem &item : std::as_const(configItems))
cmdLine.addArg(item.toArgument(buildConfiguration()->macroExpander()));
if (const auto optionsAspect = buildConfiguration()->aspect<AdditionalCMakeOptionsAspect>();
optionsAspect && !optionsAspect->value().isEmpty()) {
cmdLine.addArgs(optionsAspect->value(), CommandLine::Raw);
}
const auto proc = new QtcProcess(this);
connect(proc, &QtcProcess::done, proc, &QtcProcess::deleteLater);
connect(proc, &QtcProcess::readyReadStandardOutput, this, [proc] {
Core::MessageManager::writeFlashing(QString::fromLocal8Bit(proc->readAllStandardOutput()));
});
connect(proc, &QtcProcess::readyReadStandardError, this, [proc] {
Core::MessageManager::writeDisrupting(QString::fromLocal8Bit(proc->readAllStandardError()));
});
proc->setWorkingDirectory(outDir);
proc->setEnvironment(buildConfiguration()->environment());
proc->setCommand(cmdLine);
Core::MessageManager::writeFlashing(Tr::tr("Running in %1: %2")
.arg(outDir.toUserOutput(), cmdLine.toUserOutput()));
proc->start();
}
} // CMakeProjectManager::Internal } // CMakeProjectManager::Internal

View File

@@ -120,6 +120,9 @@ signals:
void warningOccurred(const QString &message); void warningOccurred(const QString &message);
private: private:
QList<QPair<Utils::Id, QString>> generators() const override;
void runGenerator(Utils::Id id) override;
enum ForceEnabledChanged { False, True }; enum ForceEnabledChanged { False, True };
void clearError(ForceEnabledChanged fec = ForceEnabledChanged::False); void clearError(ForceEnabledChanged fec = ForceEnabledChanged::False);