diff options
author | hjk <hjk@qt.io> | 2020-10-02 13:45:54 +0200 |
---|---|---|
committer | Kai Koehne <kai.koehne@qt.io> | 2020-10-05 14:36:55 +0000 |
commit | ee5feb4939007a1114c420dcac808b4398c19855 (patch) | |
tree | 860e42b878ecd6402361a72a8a97cb128167f92b /src/plugins/conan | |
parent | 82d64ea49fb93485bd8128e62e060911fa9dd8a4 (diff) |
Conan: Use Utils::Aspects in build step implementation
Task-number: QTCREATORBUG-21785
Change-Id: I5b2dbcc16a2504efe9fdc9e31fa2ef14bba7c33c
Reviewed-by: Kai Koehne <kai.koehne@qt.io>
Diffstat (limited to 'src/plugins/conan')
-rw-r--r-- | src/plugins/conan/conaninstallstep.cpp | 249 | ||||
-rw-r--r-- | src/plugins/conan/conaninstallstep.h | 61 |
2 files changed, 66 insertions, 244 deletions
diff --git a/src/plugins/conan/conaninstallstep.cpp b/src/plugins/conan/conaninstallstep.cpp index 53770859e9..d651a2cb87 100644 --- a/src/plugins/conan/conaninstallstep.cpp +++ b/src/plugins/conan/conaninstallstep.cpp @@ -25,68 +25,90 @@ #include "conaninstallstep.h" -#include <projectexplorer/buildsteplist.h> +#include <projectexplorer/abstractprocessstep.h> #include <projectexplorer/buildconfiguration.h> -#include <projectexplorer/project.h> -#include <projectexplorer/target.h> -#include <projectexplorer/toolchain.h> +#include <projectexplorer/buildsteplist.h> #include <projectexplorer/gnumakeparser.h> #include <projectexplorer/kitinformation.h> #include <projectexplorer/processparameters.h> -#include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorerconstants.h> -#include <qtsupport/qtkitinformation.h> -#include <qtsupport/qtparser.h> -#include <utils/qtcprocess.h> - -#include <QVariantMap> -#include <QLineEdit> -#include <QFormLayout> +#include <projectexplorer/project.h> +#include <projectexplorer/target.h> +#include <projectexplorer/task.h> +#include <projectexplorer/toolchain.h> using namespace ProjectExplorer; -using namespace ProjectExplorer::Constants; using namespace Utils; namespace ConanPackageManager { namespace Internal { -const char INSTALL_STEP_ID[] = "ConanPackageManager.InstallStep"; -const char INSTALL_STEP_CONANFILE_SUBDIR_KEY[] = "ConanPackageManager.InstallStep.ConanfileSubdir"; -const char INSTALL_STEP_ADDITIONAL_ARGUMENTS_KEY[] = "ConanPackageManager.InstallStep.AdditionalArguments"; +// ConanInstallStep -ConanInstallStepFactory::ConanInstallStepFactory() +class ConanInstallStep final : public AbstractProcessStep { - registerStep<ConanInstallStep>(INSTALL_STEP_ID); - setDisplayName(ConanInstallStep::tr("conan install", "Install packages specified in Conanfile.txt")); -} + Q_DECLARE_TR_FUNCTIONS(ConanPackageManager::Internal::ConanInstallStep) + +public: + ConanInstallStep(BuildStepList *bsl, Id id); -ConanInstallStep::ConanInstallStep(BuildStepList *bsl, Utils::Id id) : AbstractProcessStep(bsl, id) +private: + bool init() final; + void setupOutputFormatter(OutputFormatter *formatter) final; +}; + +ConanInstallStep::ConanInstallStep(BuildStepList *bsl, Id id) + : AbstractProcessStep(bsl, id) { - setDefaultDisplayName(tr("conan install")); + setUseEnglishOutput(); + setDisplayName(ConanInstallStep::tr("Conan install")); + + auto conanFile = addAspect<StringAspect>(); + conanFile->setSettingsKey("ConanPackageManager.InstallStep.ConanFile"); + conanFile->setFilePath(project()->projectDirectory() / "conanfile.txt"); + conanFile->setLabelText(tr("Conan file:")); + conanFile->setToolTip(tr("Enter location of conanfile.txt or conanfile.py")); + conanFile->setDisplayStyle(StringAspect::PathChooserDisplay); + conanFile->setExpectedKind(PathChooser::File); + + auto additionalArguments = addAspect<StringAspect>(); + additionalArguments->setSettingsKey("ConanPackageManager.InstallStep.AdditionalArguments"); + additionalArguments->setLabelText(tr("Additional arguments:")); + additionalArguments->setDisplayStyle(StringAspect::LineEditDisplay); + + setCommandLineProvider([this, conanFile, additionalArguments] { + BuildConfiguration::BuildType bt = buildConfiguration()->buildType(); + const QString buildType = bt == BuildConfiguration::Release ? QString("Release") + : QString("Debug"); + CommandLine cmd("conan"); + cmd.addArgs({"install", "-s", "build_type=" + buildType, conanFile->value()}); + cmd.addArgs(additionalArguments->value(), CommandLine::Raw); + return cmd; + }); + + setSummaryUpdater([this]() -> QString { + QList<ToolChain *> tcList = ToolChainKitAspect::toolChains(target()->kit()); + if (tcList.isEmpty()) + return "<b>" + ToolChainKitAspect::msgNoToolChainInTarget() + "</b>"; + ProcessParameters param; + setupProcessParameters(¶m); + return param.summary(displayName()); + }); } bool ConanInstallStep::init() { - BuildConfiguration *bc = buildConfiguration(); - QTC_ASSERT(bc, return false); + if (!AbstractProcessStep::init()) + return false; - QList<ToolChain *> tcList = ToolChainKitAspect::toolChains(target()->kit()); - if (tcList.isEmpty()) + const QList<ToolChain *> tcList = ToolChainKitAspect::toolChains(target()->kit()); + if (tcList.isEmpty()) { emit addTask(Task::compilerMissingTask()); - - if (tcList.isEmpty() || !bc) { emitFaultyConfigurationMessage(); return false; } - ProcessParameters *pp = processParameters(); - Utils::Environment env = bc->environment(); - Utils::Environment::setupEnglishOutput(&env); - pp->setEnvironment(env); - pp->setWorkingDirectory(bc->buildDirectory()); - pp->setCommandLine(Utils::CommandLine("conan", arguments())); - - return AbstractProcessStep::init(); + return true; } void ConanInstallStep::setupOutputFormatter(OutputFormatter *formatter) @@ -97,156 +119,13 @@ void ConanInstallStep::setupOutputFormatter(OutputFormatter *formatter) AbstractProcessStep::setupOutputFormatter(formatter); } -BuildStepConfigWidget *ConanInstallStep::createConfigWidget() -{ - return new ConanInstallStepConfigWidget(this); -} - -bool ConanInstallStep::immutable() const -{ - return false; -} - -QStringList ConanInstallStep::arguments() const -{ - BuildConfiguration *bc = buildConfiguration(); - if (!bc) - bc = target()->activeBuildConfiguration(); - - if (!bc) - return {}; - - const Utils::FilePath conanFileDir = relativeSubdir().isEmpty() - ? bc->buildDirectory() - : bc->buildDirectory().pathAppended(relativeSubdir()); - - const QString buildType = bc->buildType() == BuildConfiguration::Release ? QString("Release") - : QString("Debug"); - const QString relativePath - = bc->project()->projectDirectory().relativeChildPath(conanFileDir).toString(); - QStringList installArguments; - installArguments << "install"; - if (!relativePath.isEmpty()) - installArguments << relativePath; - installArguments << "-s"; - installArguments << "build_type=" + buildType; - installArguments << conanFileDir.toString(); - installArguments << additionalArguments(); - return installArguments; -} - -QString ConanInstallStep::relativeSubdir() const -{ - return m_relativeSubdir; -} +// ConanInstallStepFactory -QStringList ConanInstallStep::additionalArguments() const -{ - return Utils::QtcProcess::splitArgs(m_additionalArguments); -} - -void ConanInstallStep::setRelativeSubdir(const QString &subdir) -{ - if (subdir == m_relativeSubdir) - return; - - m_relativeSubdir = subdir; - emit relativeSubdirChanged(subdir); -} - -void ConanInstallStep::setAdditionalArguments(const QString &list) -{ - if (list == m_additionalArguments) - return; - - m_additionalArguments = list; - - emit additionalArgumentsChanged(list); -} - -QVariantMap ConanInstallStep::toMap() const -{ - QVariantMap map = AbstractProcessStep::toMap(); - - map.insert(INSTALL_STEP_CONANFILE_SUBDIR_KEY, m_relativeSubdir); - map.insert(INSTALL_STEP_ADDITIONAL_ARGUMENTS_KEY, m_additionalArguments); - return map; -} - -bool ConanInstallStep::fromMap(const QVariantMap &map) -{ - m_relativeSubdir = map.value(INSTALL_STEP_CONANFILE_SUBDIR_KEY).toString(); - m_additionalArguments = map.value(INSTALL_STEP_ADDITIONAL_ARGUMENTS_KEY).toString(); - - return BuildStep::fromMap(map); -} - -/////////////////////////////// -// ConanInstallStepConfigWidget class -/////////////////////////////// -ConanInstallStepConfigWidget::ConanInstallStepConfigWidget(ConanInstallStep *installStep) - : ProjectExplorer::BuildStepConfigWidget(installStep) - , m_installStep(installStep) - , m_summaryText() - , m_relativeSubdir(nullptr) - , m_additionalArguments(nullptr) -{ - QFormLayout *fl = new QFormLayout(this); - fl->setMargin(0); - fl->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow); - setLayout(fl); - - m_relativeSubdir = new QLineEdit(this); - fl->addRow(tr("conanfile.txt subdirectory:"), m_relativeSubdir); - m_relativeSubdir->setText(m_installStep->relativeSubdir()); - - m_additionalArguments = new QLineEdit(this); - fl->addRow(tr("Additional arguments:"), m_additionalArguments); - m_additionalArguments->setText(Utils::QtcProcess::joinArgs(m_installStep->additionalArguments())); - - updateDetails(); - - connect(m_relativeSubdir, &QLineEdit::textChanged, - m_installStep, &ConanInstallStep::setRelativeSubdir); - connect(m_additionalArguments, &QLineEdit::textChanged, - m_installStep, &ConanInstallStep::setAdditionalArguments); - - connect(m_installStep, &ConanInstallStep::relativeSubdirChanged, - this, &ConanInstallStepConfigWidget::updateDetails); - connect(m_installStep, &ConanInstallStep::additionalArgumentsChanged, - this, &ConanInstallStepConfigWidget::updateDetails); - connect(installStep->buildConfiguration(), &BuildConfiguration::environmentChanged, - this, &ConanInstallStepConfigWidget::updateDetails); -} - -QString ConanInstallStepConfigWidget::displayName() const -{ - return tr("conan install", "ConanInstallStep::ConanInstallStepConfigWidget display name."); -} - -QString ConanInstallStepConfigWidget::summaryText() const -{ - return m_summaryText; -} - -void ConanInstallStepConfigWidget::updateDetails() +ConanInstallStepFactory::ConanInstallStepFactory() { - BuildConfiguration *bc = m_installStep->buildConfiguration(); - if (!bc) - bc = m_installStep->target()->activeBuildConfiguration(); - QList<ToolChain *> tcList = ToolChainKitAspect::toolChains(m_installStep->target()->kit()); - - if (!tcList.isEmpty()) { - QString arguments = Utils::QtcProcess::joinArgs(m_installStep->arguments() - + m_installStep->additionalArguments()); - m_summaryText = "<b>conan install</b>: conan " + arguments; - setSummaryText(m_summaryText); - } else { - m_summaryText = "<b>" + ToolChainKitAspect::msgNoToolChainInTarget() + "</b>"; - } - - emit updateSummary(); + registerStep<ConanInstallStep>("ConanPackageManager.InstallStep"); + setDisplayName(ConanInstallStep::tr("Run conan install")); } -} // namespace Internal -} // namespace ConanPackageManager +} // Internal +} // ConanPackageManager diff --git a/src/plugins/conan/conaninstallstep.h b/src/plugins/conan/conaninstallstep.h index d6dad5201d..f4deb02dd4 100644 --- a/src/plugins/conan/conaninstallstep.h +++ b/src/plugins/conan/conaninstallstep.h @@ -25,73 +25,16 @@ #pragma once -#include <projectexplorer/abstractprocessstep.h> -#include <projectexplorer/task.h> - -QT_FORWARD_DECLARE_CLASS(QLineEdit) +#include <projectexplorer/buildstep.h> namespace ConanPackageManager { namespace Internal { -class AutotoolsProject; -class ConanInstallStep; -class ConanInstallStepFactory : public ProjectExplorer::BuildStepFactory +class ConanInstallStepFactory final : public ProjectExplorer::BuildStepFactory { public: ConanInstallStepFactory(); }; -class ConanInstallStep : public ProjectExplorer::AbstractProcessStep -{ - Q_OBJECT - friend class ConanInstallStepFactory; - -public: - ConanInstallStep(ProjectExplorer::BuildStepList *bsl, Utils::Id id); - - bool init() override; - ProjectExplorer::BuildStepConfigWidget *createConfigWidget() override; - bool immutable() const; - QStringList arguments() const; - QString relativeSubdir() const; - QStringList additionalArguments() const; - QVariantMap toMap() const override; - - void setRelativeSubdir(const QString &subdir); - void setAdditionalArguments(const QString &list); - - void setupOutputFormatter(Utils::OutputFormatter *formatter) final; - -signals: - void relativeSubdirChanged(const QString &); - void additionalArgumentsChanged(const QString &); - -private: - bool fromMap(const QVariantMap &map) override; - - QString m_arguments; - QString m_relativeSubdir; - QString m_additionalArguments; -}; - -class ConanInstallStepConfigWidget : public ProjectExplorer::BuildStepConfigWidget -{ - Q_OBJECT - -public: - ConanInstallStepConfigWidget(ConanInstallStep *installStep); - - QString displayName() const; - QString summaryText() const; - -private: - void updateDetails(); - - ConanInstallStep *m_installStep; - QString m_summaryText; - QLineEdit *m_relativeSubdir; - QLineEdit *m_additionalArguments; -}; - } // namespace Internal } // namespace ConanPackageManager |