CMake: Add CMakeGeneratorKitInformation

Change-Id: I877c248c7b93268281fc68e814e479d24b844d5f
Reviewed-by: Tim Jenssen <tim.jenssen@theqtcompany.com>
This commit is contained in:
Tobias Hunger
2016-01-22 17:17:36 +01:00
parent c3aac7624c
commit a764bb49d8
6 changed files with 245 additions and 1 deletions

View File

@@ -50,6 +50,10 @@ static Core::Id defaultCMakeToolId()
static const char TOOL_ID[] = "CMakeProjectManager.CMakeKitInformation";
// --------------------------------------------------------------------
// CMakeKitInformation:
// --------------------------------------------------------------------
CMakeKitInformation::CMakeKitInformation()
{
setObjectName(QLatin1String("CMakeKitInformation"));
@@ -118,4 +122,120 @@ KitConfigWidget *CMakeKitInformation::createConfigWidget(Kit *k) const
return new Internal::CMakeKitConfigWidget(k, this);
}
// --------------------------------------------------------------------
// CMakeGeneratorKitInformation:
// --------------------------------------------------------------------
static const char GENERATOR_ID[] = "CMake.GeneratorKitInformation";
CMakeGeneratorKitInformation::CMakeGeneratorKitInformation()
{
setObjectName(QLatin1String("CMakeGeneratorKitInformation"));
setId(GENERATOR_ID);
setPriority(19000);
}
QString CMakeGeneratorKitInformation::generator(const Kit *k)
{
if (!k)
return QString();
return k->value(GENERATOR_ID).toString();
}
void CMakeGeneratorKitInformation::setGenerator(Kit *k, const QString &generator)
{
if (!k)
return;
k->setValue(GENERATOR_ID, generator);
}
QString CMakeGeneratorKitInformation::generatorArgument(const Kit *k)
{
QString tmp = generator(k);
if (tmp.isEmpty())
return QString::fromLatin1("-G") + tmp;
return tmp;
}
QVariant CMakeGeneratorKitInformation::defaultValue(const Kit *k) const
{
CMakeTool *tool = CMakeKitInformation::cmakeTool(k);
if (!tool)
return QString();
QStringList known = tool->supportedGenerators();
auto it = std::find_if(known.constBegin(), known.constEnd(),
[](const QString &s) { return s == QLatin1String("CodeBlocks - Ninja"); });
if (it == known.constEnd())
it = std::find_if(known.constBegin(), known.constEnd(),
[](const QString &s) { return s == QLatin1String("CodeBlocks - Unix Makefiles"); });
if (it == known.constEnd())
it = std::find_if(known.constBegin(), known.constEnd(),
[](const QString &s) { return s == QLatin1String("CodeBlocks - NMake Makefiles"); });
if (it == known.constEnd())
it = known.constBegin(); // Fallback to the first generator...
if (it != known.constEnd())
return *it;
return QString();
}
QList<Task> CMakeGeneratorKitInformation::validate(const Kit *k) const
{
CMakeTool *tool = CMakeKitInformation::cmakeTool(k);
QString generator = CMakeGeneratorKitInformation::generator(k);
QList<Task> result;
if (!tool) {
if (!generator.isEmpty()) {
result << Task(Task::Warning, tr("No CMake Tool configured, CMake generator will be ignored."),
Utils::FileName(), -1, Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM));
}
} else {
if (!tool->isValid()) {
result << Task(Task::Warning, tr("CMake Tool is unconfigured, CMake generator will be ignored."),
Utils::FileName(), -1, Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM));
} else {
QStringList known = tool->supportedGenerators();
if (!known.contains(generator)) {
result << Task(Task::Error, tr("CMake Tool does not support the configured generator."),
Utils::FileName(), -1, Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM));
}
if (!generator.startsWith(QLatin1String("CodeBlocks -"))) {
result << Task(Task::Warning, tr("CMake generator does not generate CodeBlocks file. "
"Qt Creator will not be able to parse the CMake project."),
Utils::FileName(), -1, Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM));
}
}
}
return result;
}
void CMakeGeneratorKitInformation::setup(Kit *k)
{
CMakeGeneratorKitInformation::setGenerator(k, defaultValue(k).toString());
}
void CMakeGeneratorKitInformation::fix(Kit *k)
{
const CMakeTool *tool = CMakeKitInformation::cmakeTool(k);
const QString generator = CMakeGeneratorKitInformation::generator(k);
if (!tool)
return;
QStringList known = tool->supportedGenerators();
if (generator.isEmpty() || !known.contains(generator))
CMakeGeneratorKitInformation::setGenerator(k, defaultValue(k).toString());
}
KitInformation::ItemList CMakeGeneratorKitInformation::toUserOutput(const Kit *k) const
{
const QString generator = CMakeGeneratorKitInformation::generator(k);
return ItemList() << qMakePair(tr("CMake Generator"),
generator.isEmpty() ? tr("<Use Default Generator>") : generator);
}
KitConfigWidget *CMakeGeneratorKitInformation::createConfigWidget(Kit *k) const
{
return new Internal::CMakeGeneratorKitConfigWidget(k, this);
}
} // namespace CMakeProjectManager