diff --git a/Help/release/dev/cmake-gui-select-toolset.rst b/Help/release/dev/cmake-gui-select-toolset.rst new file mode 100644 index 0000000000..5186f910c8 --- /dev/null +++ b/Help/release/dev/cmake-gui-select-toolset.rst @@ -0,0 +1,6 @@ +cmake-gui-select-toolset +------------------------ + +* The :manual:`cmake-gui(1)` learned an option to set the toolset + to be used with VS IDE and Xcode generators, much like the + existing ``-T`` option to :manual:`cmake(1)`. diff --git a/Source/QtDialog/CMakeSetupDialog.cxx b/Source/QtDialog/CMakeSetupDialog.cxx index 03417f3fe7..748dd7d7e5 100644 --- a/Source/QtDialog/CMakeSetupDialog.cxx +++ b/Source/QtDialog/CMakeSetupDialog.cxx @@ -734,6 +734,7 @@ bool CMakeSetupDialog::setupFirstConfigure() { dialog.saveToSettings(); this->CMakeThread->cmakeInstance()->setGenerator(dialog.getGenerator()); + this->CMakeThread->cmakeInstance()->setToolset(dialog.getToolset()); QCMakeCacheModel* m = this->CacheValues->cacheModel(); diff --git a/Source/QtDialog/FirstConfigure.cxx b/Source/QtDialog/FirstConfigure.cxx index 6de9f00ccb..61aad72e02 100644 --- a/Source/QtDialog/FirstConfigure.cxx +++ b/Source/QtDialog/FirstConfigure.cxx @@ -15,6 +15,11 @@ StartCompilerSetup::StartCompilerSetup(QWidget* p) l->addWidget(new QLabel(tr("Specify the generator for this project"))); this->GeneratorOptions = new QComboBox(this); l->addWidget(this->GeneratorOptions); + + // Add the ability to specify toolset (-T parameter) + ToolsetFrame = CreateToolsetWidgets(); + l->addWidget(ToolsetFrame); + l->addSpacing(6); this->CompilerSetupOptions[0] = new QRadioButton(tr("Use default native compilers"), this); @@ -36,17 +41,51 @@ StartCompilerSetup::StartCompilerSetup(QWidget* p) this, SLOT(onSelectionChanged(bool))); QObject::connect(this->CompilerSetupOptions[3], SIGNAL(toggled(bool)), this, SLOT(onSelectionChanged(bool))); + QObject::connect(GeneratorOptions, + SIGNAL(currentIndexChanged(QString const&)), + this, SLOT(onGeneratorChanged(QString const&))); +} + +QFrame* StartCompilerSetup::CreateToolsetWidgets() +{ + QFrame* frame = new QFrame(this); + QVBoxLayout* l = new QVBoxLayout(frame); + l->setContentsMargins(0, 0, 0, 0); + + ToolsetLabel = new QLabel(tr("Optional toolset to use (-T parameter)")); + l->addWidget(ToolsetLabel); + + Toolset = new QLineEdit(frame); + l->addWidget(Toolset); + + return frame; } StartCompilerSetup::~StartCompilerSetup() { } -void StartCompilerSetup::setGenerators(const QStringList& gens) +void StartCompilerSetup::setGenerators( + std::vector const& gens) { this->GeneratorOptions->clear(); - this->GeneratorOptions->addItems(gens); -}; + + QStringList generator_list; + + std::vector::const_iterator it; + for (it = gens.begin(); it != gens.end(); ++it) + { + generator_list.append(QString::fromLocal8Bit(it->name.c_str())); + + if (it->supportsToolset) + { + this->GeneratorsSupportingToolset.append( + QString::fromLocal8Bit(it->name.c_str())); + } + } + + this->GeneratorOptions->addItems(generator_list); +} void StartCompilerSetup::setCurrentGenerator(const QString& gen) { @@ -62,6 +101,11 @@ QString StartCompilerSetup::getGenerator() const return this->GeneratorOptions->currentText(); }; +QString StartCompilerSetup::getToolset() const +{ + return this->Toolset->text(); +}; + bool StartCompilerSetup::defaultSetup() const { return this->CompilerSetupOptions[0]->isChecked(); @@ -88,6 +132,18 @@ void StartCompilerSetup::onSelectionChanged(bool on) selectionChanged(); } +void StartCompilerSetup::onGeneratorChanged(QString const& name) +{ + if (GeneratorsSupportingToolset.contains(name)) + { + ToolsetFrame->show(); + } + else + { + ToolsetFrame->hide(); + } +} + int StartCompilerSetup::nextId() const { if(compilerSetup()) @@ -325,7 +381,8 @@ FirstConfigure::~FirstConfigure() { } -void FirstConfigure::setGenerators(const QStringList& gens) +void FirstConfigure::setGenerators( + std::vector const& gens) { this->mStartCompilerSetupPage->setGenerators(gens); } @@ -335,6 +392,11 @@ QString FirstConfigure::getGenerator() const return this->mStartCompilerSetupPage->getGenerator(); } +QString FirstConfigure::getToolset() const +{ + return this->mStartCompilerSetupPage->getToolset(); +} + void FirstConfigure::loadFromSettings() { QSettings settings; diff --git a/Source/QtDialog/FirstConfigure.h b/Source/QtDialog/FirstConfigure.h index be390b0fdd..09952b6509 100644 --- a/Source/QtDialog/FirstConfigure.h +++ b/Source/QtDialog/FirstConfigure.h @@ -4,6 +4,7 @@ #include #include +#include "cmake.h" #include "ui_Compilers.h" #include "ui_CrossCompiler.h" @@ -27,9 +28,10 @@ class StartCompilerSetup : public QWizardPage public: StartCompilerSetup(QWidget* p); ~StartCompilerSetup(); - void setGenerators(const QStringList& gens); + void setGenerators(std::vector const& gens); void setCurrentGenerator(const QString& gen); QString getGenerator() const; + QString getToolset() const; bool defaultSetup() const; bool compilerSetup() const; @@ -43,10 +45,18 @@ class StartCompilerSetup : public QWizardPage protected slots: void onSelectionChanged(bool); + void onGeneratorChanged(QString const& name); protected: QComboBox* GeneratorOptions; QRadioButton* CompilerSetupOptions[4]; + QFrame* ToolsetFrame; + QLineEdit* Toolset; + QLabel* ToolsetLabel; + QStringList GeneratorsSupportingToolset; + + private: + QFrame* CreateToolsetWidgets(); }; //! the page that gives basic options for native compilers @@ -140,8 +150,9 @@ public: FirstConfigure(); ~FirstConfigure(); - void setGenerators(const QStringList& gens); + void setGenerators(std::vector const& gens); QString getGenerator() const; + QString getToolset() const; bool defaultSetup() const; bool compilerSetup() const; diff --git a/Source/QtDialog/QCMake.cxx b/Source/QtDialog/QCMake.cxx index 9edbb201b9..1fcb676766 100644 --- a/Source/QtDialog/QCMake.cxx +++ b/Source/QtDialog/QCMake.cxx @@ -15,7 +15,6 @@ #include #include -#include "cmake.h" #include "cmState.h" #include "cmSystemTools.h" #include "cmExternalMakefileProjectGenerator.h" @@ -46,21 +45,23 @@ QCMake::QCMake(QObject* p) cmSystemTools::SetInterruptCallback(QCMake::interruptCallback, this); - std::vector generators; + std::vector generators; this->CMakeInstance->GetRegisteredGenerators(generators); - std::vector::iterator iter; - for(iter = generators.begin(); iter != generators.end(); ++iter) + + std::vector::const_iterator it; + for(it = generators.begin(); it != generators.end(); ++it) { // Skip the generator "KDevelop3", since there is also // "KDevelop3 - Unix Makefiles", which is the full and official name. // The short name is actually only still there since this was the name // in CMake 2.4, to keep "command line argument compatibility", but // this is not necessary in the GUI. - if (*iter == "KDevelop3") + if (it->name == "KDevelop3") { continue; } - this->AvailableGenerators.append(QString::fromLocal8Bit(iter->c_str())); + + this->AvailableGenerators.push_back(*it); } } @@ -96,6 +97,7 @@ void QCMake::setBinaryDirectory(const QString& _dir) emit this->binaryDirChanged(this->BinaryDirectory); cmState* state = this->CMakeInstance->GetState(); this->setGenerator(QString()); + this->setToolset(QString()); if(!this->CMakeInstance->LoadCache( this->BinaryDirectory.toLocal8Bit().data())) { @@ -124,6 +126,12 @@ void QCMake::setBinaryDirectory(const QString& _dir) CreateFullGeneratorName(gen, extraGen? extraGen : ""); this->setGenerator(QString::fromLocal8Bit(curGen.c_str())); } + + const char* toolset = state->GetCacheEntryValue("CMAKE_GENERATOR_TOOLSET"); + if (toolset) + { + this->setToolset(QString::fromLocal8Bit(toolset)); + } } } @@ -137,6 +145,15 @@ void QCMake::setGenerator(const QString& gen) } } +void QCMake::setToolset(const QString& toolset) +{ + if(this->Toolset != toolset) + { + this->Toolset = toolset; + emit this->toolsetChanged(this->Toolset); + } +} + void QCMake::configure() { #ifdef Q_OS_WIN @@ -148,7 +165,7 @@ void QCMake::configure() this->CMakeInstance->SetGlobalGenerator( this->CMakeInstance->CreateGlobalGenerator(this->Generator.toLocal8Bit().data())); this->CMakeInstance->SetGeneratorPlatform(""); - this->CMakeInstance->SetGeneratorToolset(""); + this->CMakeInstance->SetGeneratorToolset(this->Toolset.toLocal8Bit().data()); this->CMakeInstance->LoadCache(); this->CMakeInstance->SetSuppressDevWarnings(this->SuppressDevWarnings); this->CMakeInstance->SetWarnUninitialized(this->WarnUninitializedMode); @@ -396,9 +413,9 @@ QString QCMake::generator() const return this->Generator; } -QStringList QCMake::availableGenerators() const +std::vector const& QCMake::availableGenerators() const { - return this->AvailableGenerators; + return AvailableGenerators; } void QCMake::deleteCache() @@ -409,6 +426,7 @@ void QCMake::deleteCache() this->CMakeInstance->LoadCache(this->BinaryDirectory.toLocal8Bit().data()); // emit no generator and no properties this->setGenerator(QString()); + this->setToolset(QString()); QCMakePropertyList props = this->properties(); emit this->propertiesChanged(props); } diff --git a/Source/QtDialog/QCMake.h b/Source/QtDialog/QCMake.h index d910eb7ed1..2d45da965f 100644 --- a/Source/QtDialog/QCMake.h +++ b/Source/QtDialog/QCMake.h @@ -17,6 +17,8 @@ #pragma warning ( disable : 4512 ) #endif +#include + #include #include #include @@ -25,7 +27,7 @@ #include #include -class cmake; +#include "cmake.h" /// struct to represent cmake properties in Qt /// Value is of type String or Bool @@ -73,6 +75,8 @@ public slots: void setBinaryDirectory(const QString& dir); /// set the desired generator to use void setGenerator(const QString& generator); + /// set the desired generator to use + void setToolset(const QString& toolset); /// do the configure step void configure(); /// generate the files @@ -104,7 +108,7 @@ public: /// get the current generator QString generator() const; /// get the available generators - QStringList availableGenerators() const; + std::vector const& availableGenerators() const; /// get whether to do debug output bool getDebugOutput() const; @@ -130,6 +134,8 @@ signals: void errorMessage(const QString& msg); /// signal when debug output changes void debugOutputChanged(bool); + /// signal when the toolset changes + void toolsetChanged(const QString& toolset); protected: cmake* CMakeInstance; @@ -147,7 +153,8 @@ protected: QString SourceDirectory; QString BinaryDirectory; QString Generator; - QStringList AvailableGenerators; + QString Toolset; + std::vector AvailableGenerators; QString CMakeExecutable; QAtomicInt InterruptFlag; }; diff --git a/Source/cmGlobalGeneratorFactory.h b/Source/cmGlobalGeneratorFactory.h index ebba599af3..18d4324dad 100644 --- a/Source/cmGlobalGeneratorFactory.h +++ b/Source/cmGlobalGeneratorFactory.h @@ -38,6 +38,9 @@ public: /** Get the names of the current registered generators */ virtual void GetGenerators(std::vector& names) const = 0; + + /** Determine whether or not this generator supports toolsets */ + virtual bool SupportsToolset() const = 0; }; template @@ -57,6 +60,9 @@ public: /** Get the names of the current registered generators */ virtual void GetGenerators(std::vector& names) const { names.push_back(T::GetActualName()); } + + /** Determine whether or not this generator supports toolsets */ + virtual bool SupportsToolset() const { return T::SupportsToolset(); } }; #endif diff --git a/Source/cmGlobalGhsMultiGenerator.h b/Source/cmGlobalGhsMultiGenerator.h index 480cd6a9c3..6f86c5d4e3 100644 --- a/Source/cmGlobalGhsMultiGenerator.h +++ b/Source/cmGlobalGhsMultiGenerator.h @@ -35,12 +35,19 @@ public: /// @return the name of this generator. static std::string GetActualName() { return "Green Hills MULTI"; } + ///! Get the name for this generator virtual std::string GetName() const { return this->GetActualName(); } /// Overloaded methods. @see cmGlobalGenerator::GetDocumentation() static void GetDocumentation(cmDocumentationEntry &entry); + /** + * Utilized by the generator factory to determine if this generator + * supports toolsets. + */ + static bool SupportsToolset() { return false; } + /** * Try to determine system information such as shared library * extension, pthreads, byte order etc. diff --git a/Source/cmGlobalNinjaGenerator.h b/Source/cmGlobalNinjaGenerator.h index 46bd5881bb..c494d3672c 100644 --- a/Source/cmGlobalNinjaGenerator.h +++ b/Source/cmGlobalNinjaGenerator.h @@ -73,6 +73,12 @@ public: */ static void WriteComment(std::ostream& os, const std::string& comment); + /** + * Utilized by the generator factory to determine if this generator + * supports toolsets. + */ + static bool SupportsToolset() { return false; } + /** * Write a build statement to @a os with the @a comment using * the @a rule the list of @a outputs files and inputs. diff --git a/Source/cmGlobalUnixMakefileGenerator3.h b/Source/cmGlobalUnixMakefileGenerator3.h index 54fdc0eddb..0591a5a593 100644 --- a/Source/cmGlobalUnixMakefileGenerator3.h +++ b/Source/cmGlobalUnixMakefileGenerator3.h @@ -64,6 +64,12 @@ public: return cmGlobalUnixMakefileGenerator3::GetActualName();} static std::string GetActualName() {return "Unix Makefiles";} + /** + * Utilized by the generator factory to determine if this generator + * supports toolsets. + */ + static bool SupportsToolset() { return false; } + /** Get the documentation entry for this generator. */ static void GetDocumentation(cmDocumentationEntry& entry); diff --git a/Source/cmGlobalVisualStudio10Generator.cxx b/Source/cmGlobalVisualStudio10Generator.cxx index e5687046fa..c49008d79d 100644 --- a/Source/cmGlobalVisualStudio10Generator.cxx +++ b/Source/cmGlobalVisualStudio10Generator.cxx @@ -81,6 +81,8 @@ public: names.push_back(vs10generatorName + std::string(" IA64")); names.push_back(vs10generatorName + std::string(" Win64")); } + + virtual bool SupportsToolset() const { return true; } }; //---------------------------------------------------------------------------- diff --git a/Source/cmGlobalVisualStudio11Generator.cxx b/Source/cmGlobalVisualStudio11Generator.cxx index b9b4fffde2..9522f6ee93 100644 --- a/Source/cmGlobalVisualStudio11Generator.cxx +++ b/Source/cmGlobalVisualStudio11Generator.cxx @@ -96,6 +96,8 @@ public: names.push_back(std::string(vs11generatorName) + " " + *i); } } + + virtual bool SupportsToolset() const { return true; } }; //---------------------------------------------------------------------------- diff --git a/Source/cmGlobalVisualStudio12Generator.cxx b/Source/cmGlobalVisualStudio12Generator.cxx index efa1133929..568d4d7ff6 100644 --- a/Source/cmGlobalVisualStudio12Generator.cxx +++ b/Source/cmGlobalVisualStudio12Generator.cxx @@ -76,6 +76,8 @@ public: names.push_back(vs12generatorName + std::string(" ARM")); names.push_back(vs12generatorName + std::string(" Win64")); } + + virtual bool SupportsToolset() const { return true; } }; //---------------------------------------------------------------------------- diff --git a/Source/cmGlobalVisualStudio14Generator.cxx b/Source/cmGlobalVisualStudio14Generator.cxx index 41825fb150..a05ac24b5d 100644 --- a/Source/cmGlobalVisualStudio14Generator.cxx +++ b/Source/cmGlobalVisualStudio14Generator.cxx @@ -76,6 +76,8 @@ public: names.push_back(vs14generatorName + std::string(" ARM")); names.push_back(vs14generatorName + std::string(" Win64")); } + + virtual bool SupportsToolset() const { return true; } }; //---------------------------------------------------------------------------- diff --git a/Source/cmGlobalVisualStudio6Generator.h b/Source/cmGlobalVisualStudio6Generator.h index 993a48f3f0..ae2988e666 100644 --- a/Source/cmGlobalVisualStudio6Generator.h +++ b/Source/cmGlobalVisualStudio6Generator.h @@ -36,6 +36,12 @@ public: /** Get the documentation entry for this generator. */ static void GetDocumentation(cmDocumentationEntry& entry); + /** + * Utilized by the generator factory to determine if this generator + * supports toolsets. + */ + static bool SupportsToolset() { return false; } + ///! Create a local generator appropriate to this Global Generator virtual cmLocalGenerator *CreateLocalGenerator(cmMakefile* mf); diff --git a/Source/cmGlobalVisualStudio7Generator.h b/Source/cmGlobalVisualStudio7Generator.h index fe6db2e989..de2d35e998 100644 --- a/Source/cmGlobalVisualStudio7Generator.h +++ b/Source/cmGlobalVisualStudio7Generator.h @@ -52,6 +52,12 @@ public: /** Get the documentation entry for this generator. */ static void GetDocumentation(cmDocumentationEntry& entry); + /** + * Utilized by the generator factory to determine if this generator + * supports toolsets. + */ + static bool SupportsToolset() { return false; } + /** * Try to determine system information such as shared library * extension, pthreads, byte order etc. diff --git a/Source/cmGlobalVisualStudio8Generator.cxx b/Source/cmGlobalVisualStudio8Generator.cxx index 5e239b8cd1..3abff6cb51 100644 --- a/Source/cmGlobalVisualStudio8Generator.cxx +++ b/Source/cmGlobalVisualStudio8Generator.cxx @@ -84,6 +84,8 @@ public: names.push_back("Visual Studio 8 2005 " + *i); } } + + virtual bool SupportsToolset() const { return false; } }; //---------------------------------------------------------------------------- diff --git a/Source/cmGlobalVisualStudio9Generator.cxx b/Source/cmGlobalVisualStudio9Generator.cxx index d98793a333..884f7540bf 100644 --- a/Source/cmGlobalVisualStudio9Generator.cxx +++ b/Source/cmGlobalVisualStudio9Generator.cxx @@ -88,6 +88,8 @@ public: names.push_back("Visual Studio 9 2008 " + *i); } } + + virtual bool SupportsToolset() const { return false; } }; //---------------------------------------------------------------------------- diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index 2df07cbfc9..475efa8b6b 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -125,6 +125,8 @@ public: virtual void GetGenerators(std::vector& names) const { names.push_back(cmGlobalXCodeGenerator::GetActualName()); } + + virtual bool SupportsToolset() const { return true; } }; //---------------------------------------------------------------------------- diff --git a/Source/cmake.cxx b/Source/cmake.cxx index d5bc3d2502..ee1e878660 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -957,18 +957,32 @@ void cmake::AddDefaultExtraGenerators() //---------------------------------------------------------------------------- -void cmake::GetRegisteredGenerators(std::vector& names) +void cmake::GetRegisteredGenerators(std::vector& generators) { - for(RegisteredGeneratorsVector::const_iterator i = this->Generators.begin(); - i != this->Generators.end(); ++i) + for (RegisteredGeneratorsVector::const_iterator + i = this->Generators.begin(), e = this->Generators.end(); + i != e; ++i) { + std::vector names; (*i)->GetGenerators(names); + + for (size_t j = 0; j < names.size(); ++j) + { + GeneratorInfo info; + info.supportsToolset = (*i)->SupportsToolset(); + info.name = names[j]; + generators.push_back(info); + } } - for(RegisteredExtraGeneratorsMap::const_iterator - i = this->ExtraGenerators.begin(); - i != this->ExtraGenerators.end(); ++i) + + for (RegisteredExtraGeneratorsMap::const_iterator + i = this->ExtraGenerators.begin(), e = this->ExtraGenerators.end(); + i != e; ++i) { - names.push_back(i->first); + GeneratorInfo info; + info.name = i->first; + info.supportsToolset = false; + generators.push_back(info); } } diff --git a/Source/cmake.h b/Source/cmake.h index 6b0e83f942..c584ad97e3 100644 --- a/Source/cmake.h +++ b/Source/cmake.h @@ -89,6 +89,13 @@ class cmake */ FIND_PACKAGE_MODE }; + + struct GeneratorInfo + { + std::string name; + bool supportsToolset; + }; + typedef std::map InstalledFilesMap; /// Default constructor @@ -161,7 +168,7 @@ class cmake void SetGlobalGenerator(cmGlobalGenerator *); ///! Get the names of the current registered generators - void GetRegisteredGenerators(std::vector& names); + void GetRegisteredGenerators(std::vector& generators); ///! Set the name of the selected generator-specific platform. void SetGeneratorPlatform(std::string const& ts)