forked from qt-creator/qt-creator
Qmake: Make proper use of BuildDirectoryAspect
Change-Id: I439496c85f7e0f402ab038de6a8171dd2f7d2ffd Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
@@ -203,7 +203,8 @@ DebuggerRunConfigurationAspect::DebuggerRunConfigurationAspect(Target *target)
|
|||||||
|
|
||||||
m_multiProcessAspect = new BaseBoolAspect;
|
m_multiProcessAspect = new BaseBoolAspect;
|
||||||
m_multiProcessAspect->setSettingsKey("RunConfiguration.UseMultiProcess");
|
m_multiProcessAspect->setSettingsKey("RunConfiguration.UseMultiProcess");
|
||||||
m_multiProcessAspect->setLabel(tr("Enable Debugging of Subprocesses"));
|
m_multiProcessAspect->setLabel(tr("Enable Debugging of Subprocesses"),
|
||||||
|
BaseBoolAspect::LabelPlacement::AtCheckBox);
|
||||||
|
|
||||||
m_overrideStartupAspect = new BaseStringAspect;
|
m_overrideStartupAspect = new BaseStringAspect;
|
||||||
m_overrideStartupAspect->setSettingsKey("RunConfiguration.OverrideDebuggerStartup");
|
m_overrideStartupAspect->setSettingsKey("RunConfiguration.OverrideDebuggerStartup");
|
||||||
|
@@ -51,7 +51,6 @@ BuildDirectoryAspect::BuildDirectoryAspect() : d(new Private)
|
|||||||
setLabelText(tr("Build directory:"));
|
setLabelText(tr("Build directory:"));
|
||||||
setDisplayStyle(PathChooserDisplay);
|
setDisplayStyle(PathChooserDisplay);
|
||||||
setExpectedKind(Utils::PathChooser::Directory);
|
setExpectedKind(Utils::PathChooser::Directory);
|
||||||
setUncheckedSemantics(UncheckedSemantics::ReadOnly);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BuildDirectoryAspect::~BuildDirectoryAspect()
|
BuildDirectoryAspect::~BuildDirectoryAspect()
|
||||||
@@ -62,7 +61,7 @@ BuildDirectoryAspect::~BuildDirectoryAspect()
|
|||||||
void BuildDirectoryAspect::allowInSourceBuilds(const FilePath &sourceDir)
|
void BuildDirectoryAspect::allowInSourceBuilds(const FilePath &sourceDir)
|
||||||
{
|
{
|
||||||
d->sourceDir = sourceDir;
|
d->sourceDir = sourceDir;
|
||||||
makeCheckable(tr("Shadow Build"), QString());
|
makeCheckable(CheckBoxPlacement::Top, tr("Shadow build:"), QString());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BuildDirectoryAspect::isShadowBuild() const
|
bool BuildDirectoryAspect::isShadowBuild() const
|
||||||
@@ -108,7 +107,8 @@ void BuildDirectoryAspect::addToLayout(LayoutBuilder &builder)
|
|||||||
if (!d->sourceDir.isEmpty()) {
|
if (!d->sourceDir.isEmpty()) {
|
||||||
connect(this, &BaseStringAspect::checkedChanged, builder.layout(), [this] {
|
connect(this, &BaseStringAspect::checkedChanged, builder.layout(), [this] {
|
||||||
if (isChecked()) {
|
if (isChecked()) {
|
||||||
setFilePath(d->savedShadowBuildDir);
|
setFilePath(d->savedShadowBuildDir.isEmpty()
|
||||||
|
? d->sourceDir : d->savedShadowBuildDir);
|
||||||
} else {
|
} else {
|
||||||
d->savedShadowBuildDir = filePath();
|
d->savedShadowBuildDir = filePath();
|
||||||
setFilePath(d->sourceDir);
|
setFilePath(d->sourceDir);
|
||||||
|
@@ -57,6 +57,7 @@ namespace Internal {
|
|||||||
class BaseBoolAspectPrivate
|
class BaseBoolAspectPrivate
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
BaseBoolAspect::LabelPlacement m_labelPlacement = BaseBoolAspect::LabelPlacement::AtCheckBox;
|
||||||
bool m_value = false;
|
bool m_value = false;
|
||||||
bool m_defaultValue = false;
|
bool m_defaultValue = false;
|
||||||
QString m_label;
|
QString m_label;
|
||||||
@@ -85,8 +86,10 @@ class BaseStringAspectPrivate
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
BaseStringAspect::DisplayStyle m_displayStyle = BaseStringAspect::LabelDisplay;
|
BaseStringAspect::DisplayStyle m_displayStyle = BaseStringAspect::LabelDisplay;
|
||||||
|
BaseStringAspect::CheckBoxPlacement m_checkBoxPlacement
|
||||||
|
= BaseStringAspect::CheckBoxPlacement::Right;
|
||||||
BaseStringAspect::UncheckedSemantics m_uncheckedSemantics
|
BaseStringAspect::UncheckedSemantics m_uncheckedSemantics
|
||||||
= BaseStringAspect::UncheckedSemantics::ReadOnly;
|
= BaseStringAspect::UncheckedSemantics::Disabled;
|
||||||
QString m_labelText;
|
QString m_labelText;
|
||||||
std::function<QString(const QString &)> m_displayFilter;
|
std::function<QString(const QString &)> m_displayFilter;
|
||||||
std::unique_ptr<BaseBoolAspect> m_checker;
|
std::unique_ptr<BaseBoolAspect> m_checker;
|
||||||
@@ -292,6 +295,12 @@ void BaseStringAspect::setUncheckedSemantics(BaseStringAspect::UncheckedSemantic
|
|||||||
void BaseStringAspect::addToLayout(LayoutBuilder &builder)
|
void BaseStringAspect::addToLayout(LayoutBuilder &builder)
|
||||||
{
|
{
|
||||||
QTC_CHECK(!d->m_label);
|
QTC_CHECK(!d->m_label);
|
||||||
|
|
||||||
|
if (d->m_checker && d->m_checkBoxPlacement == CheckBoxPlacement::Top) {
|
||||||
|
d->m_checker->addToLayout(builder);
|
||||||
|
builder.startNewRow();
|
||||||
|
}
|
||||||
|
|
||||||
d->m_label = new QLabel;
|
d->m_label = new QLabel;
|
||||||
d->m_label->setTextInteractionFlags(Qt::TextSelectableByMouse);
|
d->m_label->setTextInteractionFlags(Qt::TextSelectableByMouse);
|
||||||
d->m_label->setText(d->m_labelText);
|
d->m_label->setText(d->m_labelText);
|
||||||
@@ -353,7 +362,7 @@ void BaseStringAspect::addToLayout(LayoutBuilder &builder)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (d->m_checker)
|
if (d->m_checker && d->m_checkBoxPlacement == CheckBoxPlacement::Right)
|
||||||
d->m_checker->addToLayout(builder);
|
d->m_checker->addToLayout(builder);
|
||||||
|
|
||||||
update();
|
update();
|
||||||
@@ -391,11 +400,15 @@ void BaseStringAspect::update()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaseStringAspect::makeCheckable(const QString &checkerLabel, const QString &checkerKey)
|
void BaseStringAspect::makeCheckable(CheckBoxPlacement checkBoxPlacement,
|
||||||
|
const QString &checkerLabel, const QString &checkerKey)
|
||||||
{
|
{
|
||||||
QTC_ASSERT(!d->m_checker, return);
|
QTC_ASSERT(!d->m_checker, return);
|
||||||
|
d->m_checkBoxPlacement = checkBoxPlacement;
|
||||||
d->m_checker.reset(new BaseBoolAspect);
|
d->m_checker.reset(new BaseBoolAspect);
|
||||||
d->m_checker->setLabel(checkerLabel);
|
d->m_checker->setLabel(checkerLabel, checkBoxPlacement == CheckBoxPlacement::Top
|
||||||
|
? BaseBoolAspect::LabelPlacement::InExtraLabel
|
||||||
|
: BaseBoolAspect::LabelPlacement::AtCheckBox);
|
||||||
d->m_checker->setSettingsKey(checkerKey);
|
d->m_checker->setSettingsKey(checkerKey);
|
||||||
|
|
||||||
connect(d->m_checker.get(), &BaseBoolAspect::changed, this, &BaseStringAspect::update);
|
connect(d->m_checker.get(), &BaseBoolAspect::changed, this, &BaseStringAspect::update);
|
||||||
@@ -420,10 +433,16 @@ BaseBoolAspect::~BaseBoolAspect() = default;
|
|||||||
void BaseBoolAspect::addToLayout(LayoutBuilder &builder)
|
void BaseBoolAspect::addToLayout(LayoutBuilder &builder)
|
||||||
{
|
{
|
||||||
QTC_CHECK(!d->m_checkBox);
|
QTC_CHECK(!d->m_checkBox);
|
||||||
d->m_checkBox = new QCheckBox(d->m_label);
|
d->m_checkBox = new QCheckBox();
|
||||||
|
if (d->m_labelPlacement == LabelPlacement::AtCheckBox) {
|
||||||
|
d->m_checkBox->setText(d->m_label);
|
||||||
|
builder.addItem(QString());
|
||||||
|
} else {
|
||||||
|
builder.addItem(d->m_label);
|
||||||
|
}
|
||||||
d->m_checkBox->setChecked(d->m_value);
|
d->m_checkBox->setChecked(d->m_value);
|
||||||
d->m_checkBox->setToolTip(d->m_tooltip);
|
d->m_checkBox->setToolTip(d->m_tooltip);
|
||||||
builder.addItems(QString(), d->m_checkBox.data());
|
builder.addItem(d->m_checkBox.data());
|
||||||
connect(d->m_checkBox.data(), &QAbstractButton::clicked, this, [this] {
|
connect(d->m_checkBox.data(), &QAbstractButton::clicked, this, [this] {
|
||||||
d->m_value = d->m_checkBox->isChecked();
|
d->m_value = d->m_checkBox->isChecked();
|
||||||
emit changed();
|
emit changed();
|
||||||
@@ -463,9 +482,10 @@ void BaseBoolAspect::setValue(bool value)
|
|||||||
d->m_checkBox->setChecked(d->m_value);
|
d->m_checkBox->setChecked(d->m_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaseBoolAspect::setLabel(const QString &label)
|
void BaseBoolAspect::setLabel(const QString &label, LabelPlacement labelPlacement)
|
||||||
{
|
{
|
||||||
d->m_label = label;
|
d->m_label = label;
|
||||||
|
d->m_labelPlacement = labelPlacement;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaseBoolAspect::setToolTip(const QString &tooltip)
|
void BaseBoolAspect::setToolTip(const QString &tooltip)
|
||||||
|
@@ -63,7 +63,8 @@ public:
|
|||||||
bool defaultValue() const;
|
bool defaultValue() const;
|
||||||
void setDefaultValue(bool defaultValue);
|
void setDefaultValue(bool defaultValue);
|
||||||
|
|
||||||
void setLabel(const QString &label);
|
enum class LabelPlacement { AtCheckBox, InExtraLabel };
|
||||||
|
void setLabel(const QString &label, LabelPlacement labelPlacement);
|
||||||
void setToolTip(const QString &tooltip);
|
void setToolTip(const QString &tooltip);
|
||||||
|
|
||||||
void fromMap(const QVariantMap &map) override;
|
void fromMap(const QVariantMap &map) override;
|
||||||
@@ -132,10 +133,12 @@ public:
|
|||||||
void setMacroExpanderProvider(const Utils::MacroExpanderProvider &expanderProvider);
|
void setMacroExpanderProvider(const Utils::MacroExpanderProvider &expanderProvider);
|
||||||
|
|
||||||
enum class UncheckedSemantics { Disabled, ReadOnly };
|
enum class UncheckedSemantics { Disabled, ReadOnly };
|
||||||
|
enum class CheckBoxPlacement { Top, Right };
|
||||||
void setUncheckedSemantics(UncheckedSemantics semantics);
|
void setUncheckedSemantics(UncheckedSemantics semantics);
|
||||||
bool isChecked() const;
|
bool isChecked() const;
|
||||||
void setChecked(bool checked);
|
void setChecked(bool checked);
|
||||||
void makeCheckable(const QString &optionalLabel, const QString &optionalBaseKey);
|
void makeCheckable(CheckBoxPlacement checkBoxPlacement, const QString &optionalLabel,
|
||||||
|
const QString &optionalBaseKey);
|
||||||
|
|
||||||
enum DisplayStyle {
|
enum DisplayStyle {
|
||||||
LabelDisplay,
|
LabelDisplay,
|
||||||
|
@@ -436,7 +436,8 @@ void ExecutableAspect::makeOverridable(const QString &overridingKey, const QStri
|
|||||||
m_alternativeExecutable->setDisplayStyle(BaseStringAspect::LineEditDisplay);
|
m_alternativeExecutable->setDisplayStyle(BaseStringAspect::LineEditDisplay);
|
||||||
m_alternativeExecutable->setLabelText(tr("Alternate executable on device:"));
|
m_alternativeExecutable->setLabelText(tr("Alternate executable on device:"));
|
||||||
m_alternativeExecutable->setSettingsKey(overridingKey);
|
m_alternativeExecutable->setSettingsKey(overridingKey);
|
||||||
m_alternativeExecutable->makeCheckable(tr("Use this command instead"), useOverridableKey);
|
m_alternativeExecutable->makeCheckable(BaseStringAspect::CheckBoxPlacement::Right,
|
||||||
|
tr("Use this command instead"), useOverridableKey);
|
||||||
connect(m_alternativeExecutable, &BaseStringAspect::changed,
|
connect(m_alternativeExecutable, &BaseStringAspect::changed,
|
||||||
this, &ExecutableAspect::changed);
|
this, &ExecutableAspect::changed);
|
||||||
}
|
}
|
||||||
@@ -501,12 +502,15 @@ UseLibraryPathsAspect::UseLibraryPathsAspect()
|
|||||||
{
|
{
|
||||||
setId("UseLibraryPath");
|
setId("UseLibraryPath");
|
||||||
setSettingsKey("RunConfiguration.UseLibrarySearchPath");
|
setSettingsKey("RunConfiguration.UseLibrarySearchPath");
|
||||||
if (HostOsInfo::isMacHost())
|
if (HostOsInfo::isMacHost()) {
|
||||||
setLabel(tr("Add build library search path to DYLD_LIBRARY_PATH and DYLD_FRAMEWORK_PATH"));
|
setLabel(tr("Add build library search path to DYLD_LIBRARY_PATH and DYLD_FRAMEWORK_PATH:"),
|
||||||
else if (HostOsInfo::isWindowsHost())
|
LabelPlacement::InExtraLabel);
|
||||||
setLabel(tr("Add build library search path to PATH"));
|
} else if (HostOsInfo::isWindowsHost()) {
|
||||||
else
|
setLabel(tr("Add build library search path to PATH"), LabelPlacement::InExtraLabel);
|
||||||
setLabel(tr("Add build library search path to LD_LIBRARY_PATH"));
|
} else {
|
||||||
|
setLabel(tr("Add build library search path to LD_LIBRARY_PATH:"),
|
||||||
|
LabelPlacement::InExtraLabel);
|
||||||
|
}
|
||||||
setValue(ProjectExplorerPlugin::projectExplorerSettings().addLibraryPathsToRunEnv);
|
setValue(ProjectExplorerPlugin::projectExplorerSettings().addLibraryPathsToRunEnv);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -518,7 +522,8 @@ UseDyldSuffixAspect::UseDyldSuffixAspect()
|
|||||||
{
|
{
|
||||||
setId("UseDyldSuffix");
|
setId("UseDyldSuffix");
|
||||||
setSettingsKey("RunConfiguration.UseDyldImageSuffix");
|
setSettingsKey("RunConfiguration.UseDyldImageSuffix");
|
||||||
setLabel(tr("Use debug version of frameworks (DYLD_IMAGE_SUFFIX=_debug)"));
|
setLabel(tr("Use debug version of frameworks (DYLD_IMAGE_SUFFIX=_debug):"),
|
||||||
|
LabelPlacement::InExtraLabel);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace ProjectExplorer
|
} // namespace ProjectExplorer
|
||||||
|
@@ -56,11 +56,11 @@ QbsCleanStep::QbsCleanStep(ProjectExplorer::BuildStepList *bsl) :
|
|||||||
|
|
||||||
m_dryRunAspect = addAspect<BaseBoolAspect>();
|
m_dryRunAspect = addAspect<BaseBoolAspect>();
|
||||||
m_dryRunAspect->setSettingsKey("Qbs.DryRun");
|
m_dryRunAspect->setSettingsKey("Qbs.DryRun");
|
||||||
m_dryRunAspect->setLabel(tr("Dry run"));
|
m_dryRunAspect->setLabel(tr("Dry run:"), BaseBoolAspect::LabelPlacement::InExtraLabel);
|
||||||
|
|
||||||
m_keepGoingAspect = addAspect<BaseBoolAspect>();
|
m_keepGoingAspect = addAspect<BaseBoolAspect>();
|
||||||
m_keepGoingAspect->setSettingsKey("Qbs.DryKeepGoing");
|
m_keepGoingAspect->setSettingsKey("Qbs.DryKeepGoing");
|
||||||
m_keepGoingAspect->setLabel(tr("Keep going"));
|
m_keepGoingAspect->setLabel(tr("Keep going:"), BaseBoolAspect::LabelPlacement::InExtraLabel);
|
||||||
|
|
||||||
auto effectiveCommandAspect = addAspect<BaseStringAspect>();
|
auto effectiveCommandAspect = addAspect<BaseStringAspect>();
|
||||||
effectiveCommandAspect->setDisplayStyle(BaseStringAspect::TextEditDisplay);
|
effectiveCommandAspect->setDisplayStyle(BaseStringAspect::TextEditDisplay);
|
||||||
|
@@ -31,7 +31,6 @@ add_qtc_plugin(QmakeProjectManager
|
|||||||
qmakeparser.cpp qmakeparser.h
|
qmakeparser.cpp qmakeparser.h
|
||||||
qmakeparsernodes.cpp qmakeparsernodes.h
|
qmakeparsernodes.cpp qmakeparsernodes.h
|
||||||
qmakeproject.cpp qmakeproject.h
|
qmakeproject.cpp qmakeproject.h
|
||||||
qmakeprojectconfigwidget.cpp qmakeprojectconfigwidget.h
|
|
||||||
qmakeprojectimporter.cpp qmakeprojectimporter.h
|
qmakeprojectimporter.cpp qmakeprojectimporter.h
|
||||||
qmakeprojectmanager.cpp qmakeprojectmanager.h
|
qmakeprojectmanager.cpp qmakeprojectmanager.h
|
||||||
qmakeprojectmanager.qrc
|
qmakeprojectmanager.qrc
|
||||||
|
@@ -28,7 +28,6 @@
|
|||||||
#include "qmakebuildinfo.h"
|
#include "qmakebuildinfo.h"
|
||||||
#include "qmakekitinformation.h"
|
#include "qmakekitinformation.h"
|
||||||
#include "qmakeproject.h"
|
#include "qmakeproject.h"
|
||||||
#include "qmakeprojectconfigwidget.h"
|
|
||||||
#include "qmakeprojectmanagerconstants.h"
|
#include "qmakeprojectmanagerconstants.h"
|
||||||
#include "qmakenodes.h"
|
#include "qmakenodes.h"
|
||||||
#include "qmakesettings.h"
|
#include "qmakesettings.h"
|
||||||
@@ -42,6 +41,7 @@
|
|||||||
#include <coreplugin/documentmanager.h>
|
#include <coreplugin/documentmanager.h>
|
||||||
#include <coreplugin/icore.h>
|
#include <coreplugin/icore.h>
|
||||||
|
|
||||||
|
#include <projectexplorer/buildaspects.h>
|
||||||
#include <projectexplorer/buildinfo.h>
|
#include <projectexplorer/buildinfo.h>
|
||||||
#include <projectexplorer/buildmanager.h>
|
#include <projectexplorer/buildmanager.h>
|
||||||
#include <projectexplorer/buildsteplist.h>
|
#include <projectexplorer/buildsteplist.h>
|
||||||
@@ -106,6 +106,8 @@ enum { debug = 0 };
|
|||||||
QmakeBuildConfiguration::QmakeBuildConfiguration(Target *target, Core::Id id)
|
QmakeBuildConfiguration::QmakeBuildConfiguration(Target *target, Core::Id id)
|
||||||
: BuildConfiguration(target, id)
|
: BuildConfiguration(target, id)
|
||||||
{
|
{
|
||||||
|
setConfigWidgetDisplayName(tr("General"));
|
||||||
|
setConfigWidgetHasFrame(true);
|
||||||
m_buildSystem = new QmakeBuildSystem(this);
|
m_buildSystem = new QmakeBuildSystem(this);
|
||||||
|
|
||||||
connect(target, &Target::kitChanged,
|
connect(target, &Target::kitChanged,
|
||||||
@@ -117,6 +119,17 @@ QmakeBuildConfiguration::QmakeBuildConfiguration(Target *target, Core::Id id)
|
|||||||
return file;
|
return file;
|
||||||
return QLatin1String("Makefile");
|
return QLatin1String("Makefile");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
buildDirectoryAspect()->allowInSourceBuilds(target->project()->projectDirectory());
|
||||||
|
connect(this, &BuildConfiguration::buildDirectoryChanged,
|
||||||
|
this, &QmakeBuildConfiguration::updateProblemLabel);
|
||||||
|
connect(this, &QmakeBuildConfiguration::qmakeBuildConfigurationChanged,
|
||||||
|
this, &QmakeBuildConfiguration::updateProblemLabel);
|
||||||
|
connect(&QmakeSettings::instance(), &QmakeSettings::settingsChanged,
|
||||||
|
this, &QmakeBuildConfiguration::updateProblemLabel);
|
||||||
|
connect(target, &Target::parsingFinished, this, &QmakeBuildConfiguration::updateProblemLabel);
|
||||||
|
connect(target, &Target::kitChanged, this, &QmakeBuildConfiguration::updateProblemLabel);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void QmakeBuildConfiguration::initialize()
|
void QmakeBuildConfiguration::initialize()
|
||||||
@@ -202,16 +215,112 @@ void QmakeBuildConfiguration::kitChanged()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QmakeBuildConfiguration::updateProblemLabel()
|
||||||
|
{
|
||||||
|
ProjectExplorer::Kit * const k = target()->kit();
|
||||||
|
const QString proFileName = target()->project()->projectFilePath().toString();
|
||||||
|
|
||||||
|
// Check for Qt version:
|
||||||
|
QtSupport::BaseQtVersion *version = QtSupport::QtKitAspect::qtVersion(k);
|
||||||
|
if (!version) {
|
||||||
|
buildDirectoryAspect()->setProblem(tr("This kit cannot build this project since it "
|
||||||
|
"does not define a Qt version."));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto bs = qmakeBuildSystem();
|
||||||
|
if (bs->rootProFile()->parseInProgress() || !bs->rootProFile()->validParse()) {
|
||||||
|
buildDirectoryAspect()->setProblem({});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool targetMismatch = false;
|
||||||
|
bool incompatibleBuild = false;
|
||||||
|
bool allGood = false;
|
||||||
|
// we only show if we actually have a qmake and makestep
|
||||||
|
QString errorString;
|
||||||
|
if (qmakeStep() && makeStep()) {
|
||||||
|
QString makefile = buildDirectory().toString() + QLatin1Char('/');
|
||||||
|
if (this->makefile().isEmpty())
|
||||||
|
makefile.append(QLatin1String("Makefile"));
|
||||||
|
else
|
||||||
|
makefile.append(this->makefile());
|
||||||
|
|
||||||
|
switch (compareToImportFrom(makefile, &errorString)) {
|
||||||
|
case QmakeBuildConfiguration::MakefileMatches:
|
||||||
|
allGood = true;
|
||||||
|
break;
|
||||||
|
case QmakeBuildConfiguration::MakefileMissing:
|
||||||
|
allGood = true;
|
||||||
|
break;
|
||||||
|
case QmakeBuildConfiguration::MakefileIncompatible:
|
||||||
|
incompatibleBuild = true;
|
||||||
|
break;
|
||||||
|
case QmakeBuildConfiguration::MakefileForWrongProject:
|
||||||
|
targetMismatch = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const bool unalignedBuildDir = QmakeSettings::warnAgainstUnalignedBuildDir()
|
||||||
|
&& !isBuildDirAtSafeLocation();
|
||||||
|
if (unalignedBuildDir)
|
||||||
|
allGood = false;
|
||||||
|
|
||||||
|
if (allGood) {
|
||||||
|
Tasks issues;
|
||||||
|
issues = version->reportIssues(proFileName, buildDirectory().toString());
|
||||||
|
Utils::sort(issues);
|
||||||
|
|
||||||
|
if (!issues.isEmpty()) {
|
||||||
|
QString text = QLatin1String("<nobr>");
|
||||||
|
foreach (const ProjectExplorer::Task &task, issues) {
|
||||||
|
QString type;
|
||||||
|
switch (task.type) {
|
||||||
|
case ProjectExplorer::Task::Error:
|
||||||
|
type = tr("Error:");
|
||||||
|
type += QLatin1Char(' ');
|
||||||
|
break;
|
||||||
|
case ProjectExplorer::Task::Warning:
|
||||||
|
type = tr("Warning:");
|
||||||
|
type += QLatin1Char(' ');
|
||||||
|
break;
|
||||||
|
case ProjectExplorer::Task::Unknown:
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!text.endsWith(QLatin1String("br>")))
|
||||||
|
text.append(QLatin1String("<br>"));
|
||||||
|
text.append(type + task.description);
|
||||||
|
}
|
||||||
|
buildDirectoryAspect()->setProblem(text);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if (targetMismatch) {
|
||||||
|
buildDirectoryAspect()->setProblem(tr("A build for a different project exists in %1, "
|
||||||
|
"which will be overwritten.",
|
||||||
|
"%1 build directory")
|
||||||
|
.arg(buildDirectory().toUserOutput()));
|
||||||
|
return;
|
||||||
|
} else if (incompatibleBuild) {
|
||||||
|
buildDirectoryAspect()->setProblem(tr("%1 The build in %2 will be overwritten.",
|
||||||
|
"%1 error message, %2 build directory")
|
||||||
|
.arg(errorString)
|
||||||
|
.arg(buildDirectory().toUserOutput()));
|
||||||
|
return;
|
||||||
|
} else if (unalignedBuildDir) {
|
||||||
|
buildDirectoryAspect()->setProblem(unalignedBuildDirWarning());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
buildDirectoryAspect()->setProblem({});
|
||||||
|
}
|
||||||
|
|
||||||
BuildSystem *QmakeBuildConfiguration::buildSystem() const
|
BuildSystem *QmakeBuildConfiguration::buildSystem() const
|
||||||
{
|
{
|
||||||
return m_buildSystem;
|
return m_buildSystem;
|
||||||
}
|
}
|
||||||
|
|
||||||
NamedWidget *QmakeBuildConfiguration::createConfigWidget()
|
|
||||||
{
|
|
||||||
return new QmakeProjectConfigWidget(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// If only a sub tree should be build this function returns which sub node
|
/// If only a sub tree should be build this function returns which sub node
|
||||||
/// should be build
|
/// should be build
|
||||||
/// \see QMakeBuildConfiguration::setSubNodeBuild
|
/// \see QMakeBuildConfiguration::setSubNodeBuild
|
||||||
|
@@ -50,7 +50,6 @@ public:
|
|||||||
ProjectExplorer::BuildSystem *buildSystem() const final;
|
ProjectExplorer::BuildSystem *buildSystem() const final;
|
||||||
|
|
||||||
void initialize() override;
|
void initialize() override;
|
||||||
ProjectExplorer::NamedWidget *createConfigWidget() override;
|
|
||||||
|
|
||||||
void setSubNodeBuild(QmakeProFileNode *node);
|
void setSubNodeBuild(QmakeProFileNode *node);
|
||||||
QmakeProFileNode *subNodeBuild() const;
|
QmakeProFileNode *subNodeBuild() const;
|
||||||
@@ -109,6 +108,7 @@ private:
|
|||||||
void kitChanged();
|
void kitChanged();
|
||||||
void toolChainUpdated(ProjectExplorer::ToolChain *tc);
|
void toolChainUpdated(ProjectExplorer::ToolChain *tc);
|
||||||
void qtVersionsChanged(const QList<int> &, const QList<int> &, const QList<int> &changed);
|
void qtVersionsChanged(const QList<int> &, const QList<int> &, const QList<int> &changed);
|
||||||
|
void updateProblemLabel();
|
||||||
|
|
||||||
class LastKitState
|
class LastKitState
|
||||||
{
|
{
|
||||||
|
@@ -1,342 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2016 The Qt Company Ltd.
|
|
||||||
** Contact: https://www.qt.io/licensing/
|
|
||||||
**
|
|
||||||
** This file is part of Qt Creator.
|
|
||||||
**
|
|
||||||
** Commercial License Usage
|
|
||||||
** Licensees holding valid commercial Qt licenses may use this file in
|
|
||||||
** accordance with the commercial license agreement provided with the
|
|
||||||
** Software or, alternatively, in accordance with the terms contained in
|
|
||||||
** a written agreement between you and The Qt Company. For licensing terms
|
|
||||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
|
||||||
** information use the contact form at https://www.qt.io/contact-us.
|
|
||||||
**
|
|
||||||
** GNU General Public License Usage
|
|
||||||
** Alternatively, this file may be used under the terms of the GNU
|
|
||||||
** General Public License version 3 as published by the Free Software
|
|
||||||
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
|
||||||
** included in the packaging of this file. Please review the following
|
|
||||||
** information to ensure the GNU General Public License requirements will
|
|
||||||
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qmakeprojectconfigwidget.h"
|
|
||||||
|
|
||||||
#include "qmakeproject.h"
|
|
||||||
#include "qmakebuildconfiguration.h"
|
|
||||||
#include "qmakenodes.h"
|
|
||||||
#include "qmakesettings.h"
|
|
||||||
|
|
||||||
#include <QBoxLayout>
|
|
||||||
#include <coreplugin/coreicons.h>
|
|
||||||
#include <coreplugin/variablechooser.h>
|
|
||||||
#include <projectexplorer/target.h>
|
|
||||||
#include <qtsupport/qtkitinformation.h>
|
|
||||||
|
|
||||||
#include <utils/algorithm.h>
|
|
||||||
#include <utils/detailswidget.h>
|
|
||||||
#include <utils/utilsicons.h>
|
|
||||||
|
|
||||||
using namespace QmakeProjectManager;
|
|
||||||
using namespace QmakeProjectManager::Internal;
|
|
||||||
using namespace ProjectExplorer;
|
|
||||||
|
|
||||||
/// returns whether this is a shadow build configuration or not
|
|
||||||
/// note, even if shadowBuild() returns true, it might be using the
|
|
||||||
/// source directory as the shadow build directory, thus it
|
|
||||||
/// still is a in-source build
|
|
||||||
static bool isShadowBuild(BuildConfiguration *bc)
|
|
||||||
{
|
|
||||||
return bc->buildDirectory() != bc->target()->project()->projectDirectory();
|
|
||||||
}
|
|
||||||
|
|
||||||
QmakeProjectConfigWidget::QmakeProjectConfigWidget(QmakeBuildConfiguration *bc)
|
|
||||||
: NamedWidget(tr("General")),
|
|
||||||
m_buildConfiguration(bc)
|
|
||||||
{
|
|
||||||
Project *project = bc->target()->project();
|
|
||||||
|
|
||||||
m_defaultShadowBuildDir
|
|
||||||
= QmakeBuildConfiguration::shadowBuildDirectory(project->projectFilePath(),
|
|
||||||
bc->target()->kit(),
|
|
||||||
Utils::FileUtils::qmakeFriendlyName(bc->displayName()),
|
|
||||||
bc->buildType());
|
|
||||||
|
|
||||||
m_detailsContainer = new Utils::DetailsWidget(this);
|
|
||||||
m_detailsContainer->setState(Utils::DetailsWidget::NoSummary);
|
|
||||||
|
|
||||||
auto vbox = new QVBoxLayout(this);
|
|
||||||
vbox->setContentsMargins(0, 0, 0, 0);
|
|
||||||
vbox->addWidget(m_detailsContainer);
|
|
||||||
|
|
||||||
auto details = new QWidget(m_detailsContainer);
|
|
||||||
m_detailsContainer->setWidget(details);
|
|
||||||
|
|
||||||
shadowBuildLabel = new QLabel(details);
|
|
||||||
shadowBuildLabel->setText(tr("Shadow build:"));
|
|
||||||
|
|
||||||
shadowBuildCheckBox = new QCheckBox(details);
|
|
||||||
shadowBuildCheckBox->setChecked(isShadowBuild(m_buildConfiguration));
|
|
||||||
|
|
||||||
buildDirLabel = new QLabel(details);
|
|
||||||
buildDirLabel->setText(tr("Build directory:"));
|
|
||||||
|
|
||||||
shadowBuildDirEdit = new Utils::PathChooser(details);
|
|
||||||
|
|
||||||
inSourceBuildDirEdit = new Utils::PathChooser(details);
|
|
||||||
|
|
||||||
warningLabel = new QLabel(details);
|
|
||||||
warningLabel->setPixmap(Utils::Icons::WARNING.pixmap());
|
|
||||||
|
|
||||||
problemLabel = new QLabel(details);
|
|
||||||
QSizePolicy sizePolicy2(QSizePolicy::Preferred, QSizePolicy::Preferred);
|
|
||||||
sizePolicy2.setHorizontalStretch(10);
|
|
||||||
sizePolicy2.setVerticalStretch(0);
|
|
||||||
problemLabel->setSizePolicy(sizePolicy2);
|
|
||||||
problemLabel->setWordWrap(true);
|
|
||||||
|
|
||||||
auto horizontalLayout_2 = new QHBoxLayout();
|
|
||||||
horizontalLayout_2->addWidget(warningLabel);
|
|
||||||
horizontalLayout_2->addWidget(problemLabel);
|
|
||||||
|
|
||||||
auto horizontalLayout = new QHBoxLayout();
|
|
||||||
horizontalLayout->addWidget(shadowBuildDirEdit);
|
|
||||||
horizontalLayout->addWidget(inSourceBuildDirEdit);
|
|
||||||
|
|
||||||
auto layout = new QGridLayout(details);
|
|
||||||
layout->setContentsMargins(0, 0, 0, 0);
|
|
||||||
layout->addWidget(shadowBuildLabel, 0, 0, 1, 1);
|
|
||||||
layout->addWidget(shadowBuildCheckBox, 0, 1, 1, 1);
|
|
||||||
layout->addWidget(buildDirLabel, 1, 0, 1, 1);
|
|
||||||
layout->addLayout(horizontalLayout, 1, 1, 1, 1);
|
|
||||||
layout->addLayout(horizontalLayout_2, 2, 1, 1, 1);
|
|
||||||
|
|
||||||
problemLabel->setText(tr("problemLabel"));
|
|
||||||
|
|
||||||
m_browseButton = shadowBuildDirEdit->buttonAtIndex(0);
|
|
||||||
|
|
||||||
shadowBuildDirEdit->setPromptDialogTitle(tr("Shadow Build Directory"));
|
|
||||||
shadowBuildDirEdit->setExpectedKind(Utils::PathChooser::ExistingDirectory);
|
|
||||||
shadowBuildDirEdit->setHistoryCompleter(QLatin1String("Qmake.BuildDir.History"));
|
|
||||||
shadowBuildDirEdit->setEnvironment(bc->environment());
|
|
||||||
shadowBuildDirEdit->setBaseFileName(project->projectDirectory());
|
|
||||||
if (isShadowBuild(m_buildConfiguration)) {
|
|
||||||
shadowBuildDirEdit->setPath(bc->rawBuildDirectory().toString());
|
|
||||||
inSourceBuildDirEdit->setVisible(false);
|
|
||||||
} else {
|
|
||||||
shadowBuildDirEdit->setPath(m_defaultShadowBuildDir);
|
|
||||||
shadowBuildDirEdit->setVisible(false);
|
|
||||||
}
|
|
||||||
inSourceBuildDirEdit->setFileName(project->projectDirectory());
|
|
||||||
inSourceBuildDirEdit->setReadOnly(true);
|
|
||||||
inSourceBuildDirEdit->setEnabled(false);
|
|
||||||
|
|
||||||
auto chooser = new Core::VariableChooser(this);
|
|
||||||
chooser->addSupportedWidget(shadowBuildDirEdit->lineEdit());
|
|
||||||
|
|
||||||
connect(shadowBuildCheckBox, &QAbstractButton::clicked,
|
|
||||||
this, &QmakeProjectConfigWidget::shadowBuildClicked);
|
|
||||||
|
|
||||||
connect(shadowBuildDirEdit, &Utils::PathChooser::beforeBrowsing,
|
|
||||||
this, &QmakeProjectConfigWidget::onBeforeBeforeShadowBuildDirBrowsed);
|
|
||||||
|
|
||||||
connect(shadowBuildDirEdit, &Utils::PathChooser::rawPathChanged,
|
|
||||||
this, &QmakeProjectConfigWidget::shadowBuildEdited);
|
|
||||||
|
|
||||||
connect(bc, &BuildConfiguration::enabledChanged,
|
|
||||||
this, &QmakeProjectConfigWidget::environmentChanged);
|
|
||||||
|
|
||||||
connect(bc->target(), &Target::parsingFinished,
|
|
||||||
this, &QmakeProjectConfigWidget::updateProblemLabel);
|
|
||||||
connect(&QmakeSettings::instance(), &QmakeSettings::settingsChanged,
|
|
||||||
this, &QmakeProjectConfigWidget::updateProblemLabel);
|
|
||||||
|
|
||||||
connect(bc->target(), &Target::kitChanged, this, &QmakeProjectConfigWidget::updateProblemLabel);
|
|
||||||
|
|
||||||
connect(m_buildConfiguration, &BuildConfiguration::buildDirectoryChanged,
|
|
||||||
this, &QmakeProjectConfigWidget::buildDirectoryChanged);
|
|
||||||
connect(m_buildConfiguration, &QmakeBuildConfiguration::qmakeBuildConfigurationChanged,
|
|
||||||
this, &QmakeProjectConfigWidget::updateProblemLabel);
|
|
||||||
|
|
||||||
updateDetails();
|
|
||||||
updateProblemLabel();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QmakeProjectConfigWidget::updateDetails()
|
|
||||||
{
|
|
||||||
m_detailsContainer->setSummaryText(
|
|
||||||
tr("building in <b>%1</b>")
|
|
||||||
.arg(m_buildConfiguration->buildDirectory().toUserOutput()));
|
|
||||||
}
|
|
||||||
|
|
||||||
void QmakeProjectConfigWidget::setProblemLabel(const QString &text)
|
|
||||||
{
|
|
||||||
warningLabel->setVisible(!text.isEmpty());
|
|
||||||
problemLabel->setVisible(!text.isEmpty());
|
|
||||||
problemLabel->setText(text);
|
|
||||||
}
|
|
||||||
|
|
||||||
void QmakeProjectConfigWidget::environmentChanged()
|
|
||||||
{
|
|
||||||
shadowBuildDirEdit->setEnvironment(m_buildConfiguration->environment());
|
|
||||||
}
|
|
||||||
|
|
||||||
void QmakeProjectConfigWidget::buildDirectoryChanged()
|
|
||||||
{
|
|
||||||
if (m_ignoreChange)
|
|
||||||
return;
|
|
||||||
|
|
||||||
bool shadowBuild = shadowBuildCheckBox->isChecked();
|
|
||||||
inSourceBuildDirEdit->setVisible(!shadowBuild);
|
|
||||||
|
|
||||||
shadowBuildDirEdit->setVisible(shadowBuild);
|
|
||||||
shadowBuildDirEdit->setEnabled(shadowBuild);
|
|
||||||
m_browseButton->setEnabled(shadowBuild);
|
|
||||||
|
|
||||||
shadowBuildDirEdit->setPath(m_buildConfiguration->rawBuildDirectory().toString());
|
|
||||||
|
|
||||||
updateDetails();
|
|
||||||
updateProblemLabel();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QmakeProjectConfigWidget::onBeforeBeforeShadowBuildDirBrowsed()
|
|
||||||
{
|
|
||||||
Utils::FilePath initialDirectory = m_buildConfiguration->target()->project()->projectDirectory();
|
|
||||||
if (!initialDirectory.isEmpty())
|
|
||||||
shadowBuildDirEdit->setInitialBrowsePathBackup(initialDirectory.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
void QmakeProjectConfigWidget::shadowBuildClicked(bool checked)
|
|
||||||
{
|
|
||||||
shadowBuildDirEdit->setEnabled(checked);
|
|
||||||
m_browseButton->setEnabled(checked);
|
|
||||||
|
|
||||||
shadowBuildDirEdit->setVisible(checked);
|
|
||||||
inSourceBuildDirEdit->setVisible(!checked);
|
|
||||||
|
|
||||||
m_ignoreChange = true;
|
|
||||||
if (checked)
|
|
||||||
m_buildConfiguration->setBuildDirectory(Utils::FilePath::fromString(shadowBuildDirEdit->rawPath()));
|
|
||||||
else
|
|
||||||
m_buildConfiguration->setBuildDirectory(Utils::FilePath::fromString(inSourceBuildDirEdit->rawPath()));
|
|
||||||
m_ignoreChange = false;
|
|
||||||
|
|
||||||
updateDetails();
|
|
||||||
updateProblemLabel();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QmakeProjectConfigWidget::shadowBuildEdited()
|
|
||||||
{
|
|
||||||
if (m_buildConfiguration->rawBuildDirectory().toString() == shadowBuildDirEdit->rawPath())
|
|
||||||
return;
|
|
||||||
|
|
||||||
m_ignoreChange = true;
|
|
||||||
m_buildConfiguration->setBuildDirectory(Utils::FilePath::fromString(shadowBuildDirEdit->rawPath()));
|
|
||||||
m_ignoreChange = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QmakeProjectConfigWidget::updateProblemLabel()
|
|
||||||
{
|
|
||||||
shadowBuildDirEdit->triggerChanged();
|
|
||||||
ProjectExplorer::Kit *k = m_buildConfiguration->target()->kit();
|
|
||||||
const QString proFileName = m_buildConfiguration->target()->project()->projectFilePath().toString();
|
|
||||||
|
|
||||||
// Check for Qt version:
|
|
||||||
QtSupport::BaseQtVersion *version = QtSupport::QtKitAspect::qtVersion(k);
|
|
||||||
if (!version) {
|
|
||||||
setProblemLabel(tr("This kit cannot build this project since it does not define a Qt version."));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto bs = m_buildConfiguration->qmakeBuildSystem();
|
|
||||||
if (bs->rootProFile()->parseInProgress() || !bs->rootProFile()->validParse()) {
|
|
||||||
setProblemLabel(QString());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool targetMismatch = false;
|
|
||||||
bool incompatibleBuild = false;
|
|
||||||
bool allGood = false;
|
|
||||||
// we only show if we actually have a qmake and makestep
|
|
||||||
QString errorString;
|
|
||||||
if (m_buildConfiguration->qmakeStep() && m_buildConfiguration->makeStep()) {
|
|
||||||
QString makefile = m_buildConfiguration->buildDirectory().toString() + QLatin1Char('/');
|
|
||||||
if (m_buildConfiguration->makefile().isEmpty())
|
|
||||||
makefile.append(QLatin1String("Makefile"));
|
|
||||||
else
|
|
||||||
makefile.append(m_buildConfiguration->makefile());
|
|
||||||
|
|
||||||
switch (m_buildConfiguration->compareToImportFrom(makefile, &errorString)) {
|
|
||||||
case QmakeBuildConfiguration::MakefileMatches:
|
|
||||||
allGood = true;
|
|
||||||
break;
|
|
||||||
case QmakeBuildConfiguration::MakefileMissing:
|
|
||||||
allGood = true;
|
|
||||||
break;
|
|
||||||
case QmakeBuildConfiguration::MakefileIncompatible:
|
|
||||||
incompatibleBuild = true;
|
|
||||||
break;
|
|
||||||
case QmakeBuildConfiguration::MakefileForWrongProject:
|
|
||||||
targetMismatch = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const bool unalignedBuildDir = QmakeSettings::warnAgainstUnalignedBuildDir()
|
|
||||||
&& !m_buildConfiguration->isBuildDirAtSafeLocation();
|
|
||||||
if (unalignedBuildDir)
|
|
||||||
allGood = false;
|
|
||||||
|
|
||||||
if (allGood) {
|
|
||||||
QString buildDirectory = m_buildConfiguration->target()->project()->projectDirectory().toString();
|
|
||||||
if (isShadowBuild(m_buildConfiguration))
|
|
||||||
buildDirectory = m_buildConfiguration->buildDirectory().toString();
|
|
||||||
Tasks issues;
|
|
||||||
issues = version->reportIssues(proFileName, buildDirectory);
|
|
||||||
Utils::sort(issues);
|
|
||||||
|
|
||||||
if (!issues.isEmpty()) {
|
|
||||||
QString text = QLatin1String("<nobr>");
|
|
||||||
foreach (const ProjectExplorer::Task &task, issues) {
|
|
||||||
QString type;
|
|
||||||
switch (task.type) {
|
|
||||||
case ProjectExplorer::Task::Error:
|
|
||||||
type = tr("Error:");
|
|
||||||
type += QLatin1Char(' ');
|
|
||||||
break;
|
|
||||||
case ProjectExplorer::Task::Warning:
|
|
||||||
type = tr("Warning:");
|
|
||||||
type += QLatin1Char(' ');
|
|
||||||
break;
|
|
||||||
case ProjectExplorer::Task::Unknown:
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!text.endsWith(QLatin1String("br>")))
|
|
||||||
text.append(QLatin1String("<br>"));
|
|
||||||
text.append(type + task.description);
|
|
||||||
}
|
|
||||||
setProblemLabel(text);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else if (targetMismatch) {
|
|
||||||
setProblemLabel(tr("A build for a different project exists in %1, which will be overwritten.",
|
|
||||||
"%1 build directory")
|
|
||||||
.arg(m_buildConfiguration->buildDirectory().toUserOutput()));
|
|
||||||
return;
|
|
||||||
} else if (incompatibleBuild) {
|
|
||||||
setProblemLabel(tr("%1 The build in %2 will be overwritten.",
|
|
||||||
"%1 error message, %2 build directory")
|
|
||||||
.arg(errorString)
|
|
||||||
.arg(m_buildConfiguration->buildDirectory().toUserOutput()));
|
|
||||||
return;
|
|
||||||
} else if (unalignedBuildDir) {
|
|
||||||
setProblemLabel(m_buildConfiguration->unalignedBuildDirWarning());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
setProblemLabel(QString());
|
|
||||||
}
|
|
@@ -1,82 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2016 The Qt Company Ltd.
|
|
||||||
** Contact: https://www.qt.io/licensing/
|
|
||||||
**
|
|
||||||
** This file is part of Qt Creator.
|
|
||||||
**
|
|
||||||
** Commercial License Usage
|
|
||||||
** Licensees holding valid commercial Qt licenses may use this file in
|
|
||||||
** accordance with the commercial license agreement provided with the
|
|
||||||
** Software or, alternatively, in accordance with the terms contained in
|
|
||||||
** a written agreement between you and The Qt Company. For licensing terms
|
|
||||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
|
||||||
** information use the contact form at https://www.qt.io/contact-us.
|
|
||||||
**
|
|
||||||
** GNU General Public License Usage
|
|
||||||
** Alternatively, this file may be used under the terms of the GNU
|
|
||||||
** General Public License version 3 as published by the Free Software
|
|
||||||
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
|
||||||
** included in the packaging of this file. Please review the following
|
|
||||||
** information to ensure the GNU General Public License requirements will
|
|
||||||
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <projectexplorer/namedwidget.h>
|
|
||||||
|
|
||||||
#include <utils/pathchooser.h>
|
|
||||||
|
|
||||||
#include <QCheckBox>
|
|
||||||
#include <QLabel>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
class QAbstractButton;
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
namespace Utils { class DetailsWidget; }
|
|
||||||
|
|
||||||
namespace QmakeProjectManager {
|
|
||||||
class QmakeBuildConfiguration;
|
|
||||||
|
|
||||||
namespace Internal {
|
|
||||||
|
|
||||||
class QmakeProjectConfigWidget : public ProjectExplorer::NamedWidget
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
QmakeProjectConfigWidget(QmakeBuildConfiguration *bc);
|
|
||||||
|
|
||||||
private:
|
|
||||||
// User changes in our widgets
|
|
||||||
void shadowBuildClicked(bool checked);
|
|
||||||
void onBeforeBeforeShadowBuildDirBrowsed();
|
|
||||||
void shadowBuildEdited();
|
|
||||||
|
|
||||||
// Changes triggered from creator
|
|
||||||
void buildDirectoryChanged();
|
|
||||||
void updateProblemLabel();
|
|
||||||
void environmentChanged();
|
|
||||||
|
|
||||||
void updateDetails();
|
|
||||||
void setProblemLabel(const QString &text);
|
|
||||||
|
|
||||||
QAbstractButton *m_browseButton;
|
|
||||||
QmakeBuildConfiguration *m_buildConfiguration;
|
|
||||||
Utils::DetailsWidget *m_detailsContainer;
|
|
||||||
QString m_defaultShadowBuildDir;
|
|
||||||
bool m_ignoreChange = false;
|
|
||||||
|
|
||||||
QLabel *shadowBuildLabel;
|
|
||||||
QCheckBox *shadowBuildCheckBox;
|
|
||||||
QLabel *buildDirLabel;
|
|
||||||
Utils::PathChooser *shadowBuildDirEdit;
|
|
||||||
Utils::PathChooser *inSourceBuildDirEdit;
|
|
||||||
QLabel *warningLabel;
|
|
||||||
QLabel *problemLabel;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace Internal
|
|
||||||
} // namespace QmakeProjectManager
|
|
@@ -26,7 +26,6 @@ HEADERS += \
|
|||||||
wizards/simpleprojectwizard.h \
|
wizards/simpleprojectwizard.h \
|
||||||
qmakeprojectmanagerconstants.h \
|
qmakeprojectmanagerconstants.h \
|
||||||
qmakestep.h \
|
qmakestep.h \
|
||||||
qmakeprojectconfigwidget.h \
|
|
||||||
externaleditors.h \
|
externaleditors.h \
|
||||||
qmakebuildconfiguration.h \
|
qmakebuildconfiguration.h \
|
||||||
qmakeparser.h \
|
qmakeparser.h \
|
||||||
@@ -57,7 +56,6 @@ SOURCES += \
|
|||||||
wizards/subdirsprojectwizarddialog.cpp \
|
wizards/subdirsprojectwizarddialog.cpp \
|
||||||
wizards/simpleprojectwizard.cpp \
|
wizards/simpleprojectwizard.cpp \
|
||||||
qmakestep.cpp \
|
qmakestep.cpp \
|
||||||
qmakeprojectconfigwidget.cpp \
|
|
||||||
externaleditors.cpp \
|
externaleditors.cpp \
|
||||||
qmakebuildconfiguration.cpp \
|
qmakebuildconfiguration.cpp \
|
||||||
qmakeparser.cpp \
|
qmakeparser.cpp \
|
||||||
|
@@ -46,7 +46,6 @@ Project {
|
|||||||
"qmakenodes.cpp", "qmakenodes.h",
|
"qmakenodes.cpp", "qmakenodes.h",
|
||||||
"qmakenodetreebuilder.cpp", "qmakenodetreebuilder.h",
|
"qmakenodetreebuilder.cpp", "qmakenodetreebuilder.h",
|
||||||
"qmakeproject.cpp", "qmakeproject.h",
|
"qmakeproject.cpp", "qmakeproject.h",
|
||||||
"qmakeprojectconfigwidget.cpp", "qmakeprojectconfigwidget.h",
|
|
||||||
"qmakeprojectmanager.cpp", "qmakeprojectmanager.h",
|
"qmakeprojectmanager.cpp", "qmakeprojectmanager.h",
|
||||||
"qmakeprojectmanager.qrc",
|
"qmakeprojectmanager.qrc",
|
||||||
"qmakeprojectmanager_global.h",
|
"qmakeprojectmanager_global.h",
|
||||||
|
@@ -42,13 +42,14 @@ GenericDirectUploadStep::GenericDirectUploadStep(BuildStepList *bsl)
|
|||||||
|
|
||||||
auto incremental = addAspect<BaseBoolAspect>();
|
auto incremental = addAspect<BaseBoolAspect>();
|
||||||
incremental->setSettingsKey("RemoteLinux.GenericDirectUploadStep.Incremental");
|
incremental->setSettingsKey("RemoteLinux.GenericDirectUploadStep.Incremental");
|
||||||
incremental->setLabel(tr("Incremental deployment"));
|
incremental->setLabel(tr("Incremental deployment"), BaseBoolAspect::LabelPlacement::AtCheckBox);
|
||||||
incremental->setValue(true);
|
incremental->setValue(true);
|
||||||
incremental->setDefaultValue(true);
|
incremental->setDefaultValue(true);
|
||||||
|
|
||||||
auto ignoreMissingFiles = addAspect<BaseBoolAspect>();
|
auto ignoreMissingFiles = addAspect<BaseBoolAspect>();
|
||||||
ignoreMissingFiles->setSettingsKey("RemoteLinux.GenericDirectUploadStep.IgnoreMissingFiles");
|
ignoreMissingFiles->setSettingsKey("RemoteLinux.GenericDirectUploadStep.IgnoreMissingFiles");
|
||||||
ignoreMissingFiles->setLabel(tr("Ignore missing files"));
|
ignoreMissingFiles->setLabel(tr("Ignore missing files"),
|
||||||
|
BaseBoolAspect::LabelPlacement::AtCheckBox);
|
||||||
ignoreMissingFiles->setValue(false);
|
ignoreMissingFiles->setValue(false);
|
||||||
|
|
||||||
setInternalInitializer([incremental, ignoreMissingFiles, service] {
|
setInternalInitializer([incremental, ignoreMissingFiles, service] {
|
||||||
|
@@ -76,7 +76,8 @@ MakeInstallStep::MakeInstallStep(BuildStepList *parent) : MakeStep(parent, stepI
|
|||||||
const auto cleanInstallRootAspect = addAspect<BaseBoolAspect>();
|
const auto cleanInstallRootAspect = addAspect<BaseBoolAspect>();
|
||||||
cleanInstallRootAspect->setId(CleanInstallRootAspectId);
|
cleanInstallRootAspect->setId(CleanInstallRootAspectId);
|
||||||
cleanInstallRootAspect->setSettingsKey(CleanInstallRootAspectId);
|
cleanInstallRootAspect->setSettingsKey(CleanInstallRootAspectId);
|
||||||
cleanInstallRootAspect->setLabel(tr("Clean install root first"));
|
cleanInstallRootAspect->setLabel(tr("Clean install root first"),
|
||||||
|
BaseBoolAspect::LabelPlacement::AtCheckBox);
|
||||||
cleanInstallRootAspect->setValue(false);
|
cleanInstallRootAspect->setValue(false);
|
||||||
|
|
||||||
const auto commandLineAspect = addAspect<BaseStringAspect>();
|
const auto commandLineAspect = addAspect<BaseStringAspect>();
|
||||||
|
@@ -40,7 +40,8 @@ X11ForwardingAspect::X11ForwardingAspect()
|
|||||||
setDisplayStyle(LineEditDisplay);
|
setDisplayStyle(LineEditDisplay);
|
||||||
setId("X11ForwardingAspect");
|
setId("X11ForwardingAspect");
|
||||||
setSettingsKey("RunConfiguration.X11Forwarding");
|
setSettingsKey("RunConfiguration.X11Forwarding");
|
||||||
makeCheckable(tr("Forward to local display"), "RunConfiguration.UseX11Forwarding");
|
makeCheckable(CheckBoxPlacement::Right, tr("Forward to local display"),
|
||||||
|
"RunConfiguration.UseX11Forwarding");
|
||||||
setValue(defaultDisplay());
|
setValue(defaultDisplay());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -190,7 +190,8 @@ RsyncDeployStep::RsyncDeployStep(BuildStepList *bsl)
|
|||||||
|
|
||||||
auto ignoreMissingFiles = addAspect<BaseBoolAspect>();
|
auto ignoreMissingFiles = addAspect<BaseBoolAspect>();
|
||||||
ignoreMissingFiles->setSettingsKey("RemoteLinux.RsyncDeployStep.IgnoreMissingFiles");
|
ignoreMissingFiles->setSettingsKey("RemoteLinux.RsyncDeployStep.IgnoreMissingFiles");
|
||||||
ignoreMissingFiles->setLabel(tr("Ignore missing files"));
|
ignoreMissingFiles->setLabel(tr("Ignore missing files:"),
|
||||||
|
BaseBoolAspect::LabelPlacement::InExtraLabel);
|
||||||
ignoreMissingFiles->setValue(false);
|
ignoreMissingFiles->setValue(false);
|
||||||
|
|
||||||
setDefaultDisplayName(displayName());
|
setDefaultDisplayName(displayName());
|
||||||
|
@@ -76,11 +76,13 @@ TarPackageCreationStep::TarPackageCreationStep(BuildStepList *bsl)
|
|||||||
setDefaultDisplayName(displayName());
|
setDefaultDisplayName(displayName());
|
||||||
|
|
||||||
m_ignoreMissingFilesAspect = addAspect<BaseBoolAspect>();
|
m_ignoreMissingFilesAspect = addAspect<BaseBoolAspect>();
|
||||||
m_ignoreMissingFilesAspect->setLabel(tr("Ignore missing files"));
|
m_ignoreMissingFilesAspect->setLabel(tr("Ignore missing files"),
|
||||||
|
BaseBoolAspect::LabelPlacement::AtCheckBox);
|
||||||
m_ignoreMissingFilesAspect->setSettingsKey(IgnoreMissingFilesKey);
|
m_ignoreMissingFilesAspect->setSettingsKey(IgnoreMissingFilesKey);
|
||||||
|
|
||||||
m_incrementalDeploymentAspect = addAspect<BaseBoolAspect>();
|
m_incrementalDeploymentAspect = addAspect<BaseBoolAspect>();
|
||||||
m_incrementalDeploymentAspect->setLabel(tr("Package modified files only"));
|
m_incrementalDeploymentAspect->setLabel(tr("Package modified files only"),
|
||||||
|
BaseBoolAspect::LabelPlacement::AtCheckBox);
|
||||||
m_incrementalDeploymentAspect->setSettingsKey(IncrementalDeploymentKey);
|
m_incrementalDeploymentAspect->setSettingsKey(IncrementalDeploymentKey);
|
||||||
|
|
||||||
setSummaryUpdater([this] {
|
setSummaryUpdater([this] {
|
||||||
|
@@ -40,7 +40,8 @@ namespace Internal {
|
|||||||
UninstallAfterStopAspect::UninstallAfterStopAspect()
|
UninstallAfterStopAspect::UninstallAfterStopAspect()
|
||||||
: BaseBoolAspect("WinRtRunConfigurationUninstallAfterStopId")
|
: BaseBoolAspect("WinRtRunConfigurationUninstallAfterStopId")
|
||||||
{
|
{
|
||||||
setLabel(WinRtRunConfiguration::tr("Uninstall package after application stops"));
|
setLabel(WinRtRunConfiguration::tr("Uninstall package after application stops"),
|
||||||
|
LabelPlacement::AtCheckBox);
|
||||||
}
|
}
|
||||||
|
|
||||||
// LoopbackExemptClientAspect
|
// LoopbackExemptClientAspect
|
||||||
@@ -48,8 +49,8 @@ UninstallAfterStopAspect::UninstallAfterStopAspect()
|
|||||||
LoopbackExemptClientAspect::LoopbackExemptClientAspect()
|
LoopbackExemptClientAspect::LoopbackExemptClientAspect()
|
||||||
: BaseBoolAspect("WinRtRunConfigurationLoopbackExemptClient")
|
: BaseBoolAspect("WinRtRunConfigurationLoopbackExemptClient")
|
||||||
{
|
{
|
||||||
setLabel(WinRtRunConfiguration::tr("Enable localhost communication for "
|
setLabel(WinRtRunConfiguration::tr("Enable localhost communication for clients"),
|
||||||
"clients"));
|
LabelPlacement::AtCheckBox);
|
||||||
}
|
}
|
||||||
|
|
||||||
// LoopbackExemptServerAspect
|
// LoopbackExemptServerAspect
|
||||||
@@ -58,7 +59,8 @@ LoopbackExemptServerAspect::LoopbackExemptServerAspect()
|
|||||||
: BaseBoolAspect("WinRtRunConfigurationLoopbackExemptServer")
|
: BaseBoolAspect("WinRtRunConfigurationLoopbackExemptServer")
|
||||||
{
|
{
|
||||||
setLabel(WinRtRunConfiguration::tr("Enable localhost communication for "
|
setLabel(WinRtRunConfiguration::tr("Enable localhost communication for "
|
||||||
"servers (requires elevated rights)"));
|
"servers (requires elevated rights)"),
|
||||||
|
LabelPlacement::AtCheckBox);
|
||||||
}
|
}
|
||||||
|
|
||||||
// WinRtRunConfiguration
|
// WinRtRunConfiguration
|
||||||
|
Reference in New Issue
Block a user