autotoolsbuildconfiguration.cpp 8.53 KB
Newer Older
1
2
/**************************************************************************
**
Eike Ziller's avatar
Eike Ziller committed
3
** Copyright (C) 2015 Openismus GmbH.
hjk's avatar
hjk committed
4
5
** Authors: Peter Penz (ppenz@openismus.com)
**          Patricia Santana Cruz (patriciasantanacruz@gmail.com)
Eike Ziller's avatar
Eike Ziller committed
6
** Contact: http://www.qt.io/licensing
7
**
hjk's avatar
hjk committed
8
** This file is part of Qt Creator.
9
**
hjk's avatar
hjk committed
10
11
12
13
** 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
Eike Ziller's avatar
Eike Ziller committed
14
15
** a written agreement between you and The Qt Company.  For licensing terms and
** conditions see http://www.qt.io/terms-conditions.  For further information
Eike Ziller's avatar
Eike Ziller committed
16
** use the contact form at http://www.qt.io/contact-us.
17
18
**
** GNU Lesser General Public License Usage
hjk's avatar
hjk committed
19
** Alternatively, this file may be used under the terms of the GNU Lesser
Eike Ziller's avatar
Eike Ziller committed
20
21
22
23
24
25
** General Public License version 2.1 or version 3 as published by the Free
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
** LICENSE.LGPLv3 included in the packaging of this file.  Please review the
** following information to ensure the GNU Lesser General Public License
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
hjk's avatar
hjk committed
26
**
Eike Ziller's avatar
Eike Ziller committed
27
28
** In addition, as a special exception, The Qt Company gives you certain additional
** rights.  These rights are described in The Qt Company LGPL Exception
29
30
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
hjk's avatar
hjk committed
31
****************************************************************************/
32
33

#include "autotoolsbuildconfiguration.h"
34
#include "autotoolsbuildsettingswidget.h"
35
36
37
38
39
40
41
#include "makestep.h"
#include "autotoolsproject.h"
#include "autotoolsprojectconstants.h"
#include "autogenstep.h"
#include "autoreconfstep.h"
#include "configurestep.h"

42
43
#include <coreplugin/icore.h>
#include <projectexplorer/buildinfo.h>
44
#include <projectexplorer/buildsteplist.h>
Tobias Hunger's avatar
Tobias Hunger committed
45
#include <projectexplorer/kitinformation.h>
46
#include <projectexplorer/projectexplorerconstants.h>
Tobias Hunger's avatar
Tobias Hunger committed
47
48
#include <projectexplorer/target.h>
#include <projectexplorer/toolchain.h>
49
#include <qtsupport/customexecutablerunconfiguration.h>
Eike Ziller's avatar
Eike Ziller committed
50
#include <utils/mimetypes/mimedatabase.h>
51
52
#include <utils/qtcassert.h>

53
#include <QFileInfo>
54
#include <QInputDialog>
55
56

using namespace AutotoolsProjectManager;
57
using namespace AutotoolsProjectManager::Constants;
58
using namespace Internal;
59
60
using namespace ProjectExplorer;
using namespace ProjectExplorer::Constants;
61
62
63
64

//////////////////////////////////////
// AutotoolsBuildConfiguration class
//////////////////////////////////////
65
AutotoolsBuildConfiguration::AutotoolsBuildConfiguration(Target *parent)
66
    : BuildConfiguration(parent, Core::Id(AUTOTOOLS_BC_ID))
67
{ }
Tobias Hunger's avatar
Tobias Hunger committed
68

69
NamedWidget *AutotoolsBuildConfiguration::createConfigWidget()
Tobias Hunger's avatar
Tobias Hunger committed
70
{
71
    return new AutotoolsBuildSettingsWidget(this);
72
73
}

74
AutotoolsBuildConfiguration::AutotoolsBuildConfiguration(Target *parent, Core::Id id)
75
    : BuildConfiguration(parent, id)
76
{ }
77

78
AutotoolsBuildConfiguration::AutotoolsBuildConfiguration(Target *parent,
Tobias Hunger's avatar
Tobias Hunger committed
79
                                                         AutotoolsBuildConfiguration *source)
80
    : BuildConfiguration(parent, source)
81
82
83
84
85
86
87
88
{
    cloneSteps(source);
}

//////////////////////////////////////
// AutotoolsBuildConfiguration class
//////////////////////////////////////
AutotoolsBuildConfigurationFactory::AutotoolsBuildConfigurationFactory(QObject *parent) :
89
    IBuildConfigurationFactory(parent)
90
91
92
{
}

93
int AutotoolsBuildConfigurationFactory::priority(const Target *parent) const
94
{
95
    return canHandle(parent) ? 0 : -1;
96
97
}

98
QList<BuildInfo *> AutotoolsBuildConfigurationFactory::availableBuilds(const Target *parent) const
99
{
100
    QList<BuildInfo *> result;
101
    result << createBuildInfo(parent->kit(), parent->project()->projectDirectory());
102
    return result;
103
104
}

105
int AutotoolsBuildConfigurationFactory::priority(const Kit *k, const QString &projectPath) const
106
{
Eike Ziller's avatar
Eike Ziller committed
107
108
109
110
    Utils::MimeDatabase mdb;
    if (k && mdb.mimeTypeForFile(projectPath).matchesName(QLatin1String(Constants::MAKEFILE_MIMETYPE)))
        return 0;
    return -1;
111
112
113
114
115
116
117
118
119
120
121
122
123
}

QList<BuildInfo *> AutotoolsBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const
{
    QList<BuildInfo *> result;
    BuildInfo *info = createBuildInfo(k,
                                      Utils::FileName::fromString(AutotoolsProject::defaultBuildDirectory(projectPath)));
    //: The name of the build configuration created by default for a autotools project.
    info->displayName = tr("Default");
    result << info;
    return result;
}

124
BuildConfiguration *AutotoolsBuildConfigurationFactory::create(Target *parent, const BuildInfo *info) const
125
{
126
127
128
129
    QTC_ASSERT(parent, return 0);
    QTC_ASSERT(info->factory() == this, return 0);
    QTC_ASSERT(info->kitId == parent->kit()->id(), return 0);
    QTC_ASSERT(!info->displayName.isEmpty(), return 0);
130

131
132
133
134
    AutotoolsBuildConfiguration *bc = new AutotoolsBuildConfiguration(parent);
    bc->setDisplayName(info->displayName);
    bc->setDefaultDisplayName(info->displayName);
    bc->setBuildDirectory(info->buildDirectory);
135

136
    BuildStepList *buildSteps = bc->stepList(Core::Id(BUILDSTEPS_BUILD));
137
138
139

    // ### Build Steps Build ###
    // autogen.sh or autoreconf
140
    QFile autogenFile(parent->project()->projectDirectory().toString() + QLatin1String("/autogen.sh"));
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
    if (autogenFile.exists()) {
        AutogenStep *autogenStep = new AutogenStep(buildSteps);
        buildSteps->insertStep(0, autogenStep);
    } else {
        AutoreconfStep *autoreconfStep = new AutoreconfStep(buildSteps);
        autoreconfStep->setAdditionalArguments(QLatin1String("--force --install"));
        buildSteps->insertStep(0, autoreconfStep);
    }

    // ./configure.
    ConfigureStep *configureStep = new ConfigureStep(buildSteps);
    buildSteps->insertStep(1, configureStep);

    // make
    MakeStep *makeStep = new MakeStep(buildSteps);
    buildSteps->insertStep(2, makeStep);
    makeStep->setBuildTarget(QLatin1String("all"),  /*on =*/ true);

    // ### Build Steps Clean ###
160
    BuildStepList *cleanSteps = bc->stepList(Core::Id(BUILDSTEPS_CLEAN));
161
162
163
164
165
166
167
168
    MakeStep *cleanMakeStep = new MakeStep(cleanSteps);
    cleanMakeStep->setAdditionalArguments(QLatin1String("clean"));
    cleanMakeStep->setClean(true);
    cleanSteps->insertStep(0, cleanMakeStep);

    return bc;
}

Tobias Hunger's avatar
Tobias Hunger committed
169
170
bool AutotoolsBuildConfigurationFactory::canHandle(const Target *t) const
{
171
172
    QTC_ASSERT(t, return false);

Tobias Hunger's avatar
Tobias Hunger committed
173
    if (!t->project()->supportsKit(t->kit()))
Tobias Hunger's avatar
Tobias Hunger committed
174
        return false;
175
    return t->project()->id() == Constants::AUTOTOOLS_PROJECT_ID;
Tobias Hunger's avatar
Tobias Hunger committed
176
177
}

178
BuildInfo *AutotoolsBuildConfigurationFactory::createBuildInfo(const Kit *k,
179
180
181
182
183
184
                                                               const Utils::FileName &buildDir) const
{
    BuildInfo *info = new BuildInfo(this);
    info->typeName = tr("Build");
    info->buildDirectory = buildDir;
    info->kitId = k->id();
185
    info->supportsShadowBuild = true; // Works sometimes...
186
187
188
189

    return info;
}

Tobias Hunger's avatar
Tobias Hunger committed
190
bool AutotoolsBuildConfigurationFactory::canClone(const Target *parent, BuildConfiguration *source) const
191
{
192
193
194
    if (!canHandle(parent))
        return false;
    return source->id() == AUTOTOOLS_BC_ID;
195
196
}

197
AutotoolsBuildConfiguration *AutotoolsBuildConfigurationFactory::clone(Target *parent, BuildConfiguration *source)
198
199
200
201
202
{
    if (!canClone(parent, source))
        return 0;

    AutotoolsBuildConfiguration *origin = static_cast<AutotoolsBuildConfiguration *>(source);
Tobias Hunger's avatar
Tobias Hunger committed
203
    return new AutotoolsBuildConfiguration(parent, origin);
204
205
}

Tobias Hunger's avatar
Tobias Hunger committed
206
bool AutotoolsBuildConfigurationFactory::canRestore(const Target *parent, const QVariantMap &map) const
207
{
208
209
210
    if (!canHandle(parent))
        return false;
    return idFromMap(map) == AUTOTOOLS_BC_ID;
211
212
}

213
AutotoolsBuildConfiguration *AutotoolsBuildConfigurationFactory::restore(Target *parent, const QVariantMap &map)
214
215
216
{
    if (!canRestore(parent, map))
        return 0;
Tobias Hunger's avatar
Tobias Hunger committed
217
    AutotoolsBuildConfiguration *bc = new AutotoolsBuildConfiguration(parent);
218
219
220
221
222
223
    if (bc->fromMap(map))
        return bc;
    delete bc;
    return 0;
}

224
BuildConfiguration::BuildType AutotoolsBuildConfiguration::buildType() const
225
226
227
228
{
    // TODO: Should I return something different from Unknown?
    return Unknown;
}
229
230
231
232
233
234

void AutotoolsBuildConfiguration::setBuildDirectory(const Utils::FileName &directory)
{
    if (directory == buildDirectory())
        return;
    BuildConfiguration::setBuildDirectory(directory);
235
    BuildStepList *bsl = stepList(BUILDSTEPS_BUILD);
236
237
238
239
240
241
242
    foreach (BuildStep *bs, bsl->steps()) {
        ConfigureStep *cs = qobject_cast<ConfigureStep *>(bs);
        if (cs) {
            cs->notifyBuildDirectoryChanged();
        }
    }
}