summaryrefslogtreecommitdiff
path: root/src/plugins/autotoolsprojectmanager/configurestep.cpp
blob: 6975a1cd91a0874fd77ef5e2fba7c210666c811e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
// Copyright (C) 2016 Openismus GmbH.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0

#include "configurestep.h"

#include "autotoolsprojectconstants.h"
#include "autotoolsprojectmanagertr.h"

#include <projectexplorer/abstractprocessstep.h>
#include <projectexplorer/processparameters.h>
#include <projectexplorer/project.h>
#include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/target.h>

#include <utils/aspects.h>

#include <QDateTime>

using namespace ProjectExplorer;
using namespace Utils;

namespace AutotoolsProjectManager::Internal {

// ConfigureStep

///**
// * @brief Implementation of the ProjectExplorer::AbstractProcessStep interface.
// *
// * A configure step can be configured by selecting the "Projects" button of Qt
// * Creator (in the left hand side menu) and under "Build Settings".
// *
// * It is possible for the user to specify custom arguments. The corresponding
// * configuration widget is created by MakeStep::createConfigWidget and is
// * represented by an instance of the class MakeStepConfigWidget.
// */

class ConfigureStep final : public AbstractProcessStep
{
public:
    ConfigureStep(BuildStepList *bsl, Id id);

    void setAdditionalArguments(const QString &list);

private:
    void doRun() final;

    CommandLine getCommandLine(const QString &arguments);

    bool m_runConfigure = false;
};

ConfigureStep::ConfigureStep(BuildStepList *bsl, Id id)
    : AbstractProcessStep(bsl, id)
{
    auto arguments = addAspect<StringAspect>();
    arguments->setDisplayStyle(StringAspect::LineEditDisplay);
    arguments->setSettingsKey("AutotoolsProjectManager.ConfigureStep.AdditionalArguments");
    arguments->setLabelText(Tr::tr("Arguments:"));
    arguments->setHistoryCompleter("AutotoolsPM.History.ConfigureArgs");

    connect(arguments, &BaseAspect::changed, this, [this] {
        m_runConfigure = true;
    });

    setCommandLineProvider([this, arguments] {
        return getCommandLine(arguments->value());
    });

    setSummaryUpdater([this] {
        ProcessParameters param;
        setupProcessParameters(&param);

        return param.summaryInWorkdir(displayName());
    });
}

CommandLine ConfigureStep::getCommandLine(const QString &arguments)
{
    return {project()->projectDirectory() / "configure", arguments, CommandLine::Raw};
}

void ConfigureStep::doRun()
{
    // Check whether we need to run configure
    const FilePath configure = project()->projectDirectory() / "configure";
    const FilePath configStatus = buildDirectory() / "config.status";

    if (!configStatus.exists() || configStatus.lastModified() < configure.lastModified())
        m_runConfigure = true;

    if (!m_runConfigure) {
        emit addOutput(Tr::tr("Configuration unchanged, skipping configure step."), OutputFormat::NormalMessage);
        emit finished(true);
        return;
    }

    ProcessParameters *param = processParameters();
    if (!param->effectiveCommand().exists()) {
        param->setCommandLine(getCommandLine(param->command().arguments()));
        setSummaryText(param->summaryInWorkdir(displayName()));
    }

    m_runConfigure = false;
    AbstractProcessStep::doRun();
}

// ConfigureStepFactory

/**
 * @brief Implementation of the ProjectExplorer::IBuildStepFactory interface.
 *
 * The factory is used to create instances of ConfigureStep.
 */

ConfigureStepFactory::ConfigureStepFactory()
{
    registerStep<ConfigureStep>(Constants::CONFIGURE_STEP_ID);
    setDisplayName(Tr::tr("Configure", "Display name for AutotoolsProjectManager::ConfigureStep id."));
    setSupportedProjectType(Constants::AUTOTOOLS_PROJECT_ID);
    setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
}

} // AutotoolsProjectManager::Internal