cmake-gui: set generator field defaults from environment

Fixes: #20251
This commit is contained in:
Code Smith
2020-02-04 20:34:35 -06:00
committed by Brad King
parent b49e5344e7
commit 9a71fa46e7
3 changed files with 59 additions and 3 deletions
@@ -0,0 +1,8 @@
cmake-gui-env-platform-defaults
-------------------------------
* :manual:`cmake-gui(1)` now populates its generator selection
widget default value from the :envvar:`CMAKE_GENERATOR` environment
variable. Additionally, environment variables
:envvar:`CMAKE_GENERATOR_PLATFORM` and :envvar:`CMAKE_GENERATOR_TOOLSET`
are used to populate their respective widget defaults.
+47 -2
View File
@@ -10,8 +10,12 @@
#include "Compilers.h" #include "Compilers.h"
StartCompilerSetup::StartCompilerSetup(QWidget* p) StartCompilerSetup::StartCompilerSetup(QString defaultGeneratorPlatform,
QString defaultGeneratorToolset,
QWidget* p)
: QWizardPage(p) : QWizardPage(p)
, DefaultGeneratorPlatform(std::move(defaultGeneratorPlatform))
, DefaultGeneratorToolset(std::move(defaultGeneratorToolset))
{ {
QVBoxLayout* l = new QVBoxLayout(this); QVBoxLayout* l = new QVBoxLayout(this);
l->addWidget(new QLabel(tr("Specify the generator for this project"))); l->addWidget(new QLabel(tr("Specify the generator for this project")));
@@ -68,6 +72,10 @@ QFrame* StartCompilerSetup::CreateToolsetWidgets()
Toolset = new QLineEdit(frame); Toolset = new QLineEdit(frame);
l->addWidget(Toolset); l->addWidget(Toolset);
// Default to CMAKE_GENERATOR_TOOLSET env var if set
if (!DefaultGeneratorToolset.isEmpty()) {
this->Toolset->setText(DefaultGeneratorToolset);
}
return frame; return frame;
} }
@@ -199,6 +207,14 @@ void StartCompilerSetup::onGeneratorChanged(QString const& name)
this->PlatformOptions->addItems(platform_list); this->PlatformOptions->addItems(platform_list);
PlatformFrame->show(); PlatformFrame->show();
// Default to generator platform from environment
if (!DefaultGeneratorPlatform.isEmpty()) {
int platform_index = platforms.indexOf(DefaultGeneratorPlatform);
if (platform_index != -1) {
this->PlatformOptions->setCurrentIndex(platform_index);
}
}
} else { } else {
PlatformFrame->hide(); PlatformFrame->hide();
} }
@@ -421,8 +437,26 @@ void ToolchainCompilerSetup::setToolchainFile(const QString& t)
FirstConfigure::FirstConfigure() FirstConfigure::FirstConfigure()
{ {
const char* env_generator = std::getenv("CMAKE_GENERATOR");
const char* env_generator_platform = nullptr;
const char* env_generator_toolset = nullptr;
if (env_generator && std::strlen(env_generator)) {
mDefaultGenerator = env_generator;
env_generator_platform = std::getenv("CMAKE_GENERATOR_PLATFORM");
env_generator_toolset = std::getenv("CMAKE_GENERATOR_TOOLSET");
}
if (!env_generator_platform) {
env_generator_platform = "";
}
if (!env_generator_toolset) {
env_generator_toolset = "";
}
// this->setOption(QWizard::HaveFinishButtonOnEarlyPages, true); // this->setOption(QWizard::HaveFinishButtonOnEarlyPages, true);
this->mStartCompilerSetupPage = new StartCompilerSetup(this); this->mStartCompilerSetupPage = new StartCompilerSetup(
env_generator_platform, env_generator_toolset, this);
this->setPage(Start, this->mStartCompilerSetupPage); this->setPage(Start, this->mStartCompilerSetupPage);
QObject::connect(this->mStartCompilerSetupPage, SIGNAL(selectionChanged()), QObject::connect(this->mStartCompilerSetupPage, SIGNAL(selectionChanged()),
this, SLOT(restart())); this, SLOT(restart()));
@@ -504,6 +538,17 @@ void FirstConfigure::loadFromSettings()
this->mCrossCompilerSetupPage->setIncludeMode( this->mCrossCompilerSetupPage->setIncludeMode(
settings.value("IncludeMode", 0).toInt()); settings.value("IncludeMode", 0).toInt());
settings.endGroup(); settings.endGroup();
// environment variables take precedence over application settings because...
// - they're harder to set
// - settings always exist after the program is run once, so the environment
// variables would never be used otherwise
// - platform and toolset are populated only from environment variables, so
// this prevents them from being taken from environment, while the
// generator is taken from application settings
if (!mDefaultGenerator.isEmpty()) {
this->mStartCompilerSetupPage->setCurrentGenerator(mDefaultGenerator);
}
} }
void FirstConfigure::saveToSettings() void FirstConfigure::saveToSettings()
+4 -1
View File
@@ -29,7 +29,8 @@ class StartCompilerSetup : public QWizardPage
{ {
Q_OBJECT Q_OBJECT
public: public:
StartCompilerSetup(QWidget* p); StartCompilerSetup(QString defaultGeneratorPlatform,
QString defaultGeneratorToolset, QWidget* p);
~StartCompilerSetup(); ~StartCompilerSetup();
void setGenerators(std::vector<cmake::GeneratorInfo> const& gens); void setGenerators(std::vector<cmake::GeneratorInfo> const& gens);
void setCurrentGenerator(const QString& gen); void setCurrentGenerator(const QString& gen);
@@ -64,6 +65,7 @@ protected:
QStringList GeneratorsSupportingPlatform; QStringList GeneratorsSupportingPlatform;
QMultiMap<QString, QString> GeneratorSupportedPlatforms; QMultiMap<QString, QString> GeneratorSupportedPlatforms;
QMap<QString, QString> GeneratorDefaultPlatform; QMap<QString, QString> GeneratorDefaultPlatform;
QString DefaultGeneratorPlatform, DefaultGeneratorToolset;
private: private:
QFrame* CreateToolsetWidgets(); QFrame* CreateToolsetWidgets();
@@ -197,6 +199,7 @@ protected:
NativeCompilerSetup* mNativeCompilerSetupPage; NativeCompilerSetup* mNativeCompilerSetupPage;
CrossCompilerSetup* mCrossCompilerSetupPage; CrossCompilerSetup* mCrossCompilerSetupPage;
ToolchainCompilerSetup* mToolchainCompilerSetupPage; ToolchainCompilerSetup* mToolchainCompilerSetupPage;
QString mDefaultGenerator;
}; };
#endif // FirstConfigure_h #endif // FirstConfigure_h