Commit 6445c99a authored by Patricia Santana Cruz's avatar Patricia Santana Cruz Committed by hjk

Add AutotoolsProjectManager plugin

Change-Id: Icbc8d105a3ffea2bf705d18e3413f6b3487ccfd3
Reviewed-by: default avatarOswald Buddenhagen <oswald.buddenhagen@nokia.com>
Reviewed-by: default avatarhjk <qthjk@ovi.com>
Reviewed-by: default avatarLeena Miettinen <riitta-leena.miettinen@nokia.com>
parent 442f2d69
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2010-2011 Openismus GmbH.
** Authors: Peter Penz (ppenz@openismus.com)
** Patricia Santana Cruz (patriciasc@openismus.com)
**
** Contact: Nokia Corporation (info@qt.nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at info@qt.nokia.com.
**
**************************************************************************/
/*!
\contentspage index.html
\previouspage creator-project-cmake.html
\page creator-projects-autotools.html
\nextpage creator-project-generic.html
\title Setting Up an Autotools Project
The AutotoolsProjectManager is a plugin for autotools support.
\image qtcreator-autotools-buildrun.png
\image qtcreator-autotools-buildsettings.png
\section1 Opening and Using Autotools Projects
To work with your Autotools project in \QC:
\list 1
\o Select \gui{File > Open File or Project}.
\o Select the Makefile.am from your project. This is the only way a
user can use the autotools plugin. Thus, a Makefile.am must
always exist before hand.
\o Select the build directory. Only in-source building is working
right now.
\o Select \gui Finish.
\QC displays the project tree structure. The root node displays
the project name. All project files are listed below it and you
can open them from the list.
\o Select \gui Run to build and run the application. This will
execute autogen.sh or autoreconf, configure and make. The first
time, when running the application, a dialog will ask you to
choose the executable's location, then, \QC will remember it for
the following times. Ideally, this will be changed in the future,
to be done in a more automated way.
\o To check and edit autotools build steps, select
\gui{Projects > Build Settings}. You can see the typical
autotools build steps: autogen.sh/autoreconf, configure and make.
You may configure some parameters such as adding new configure
parameters or changing the build directory (though, as mentiond
before, only in-source building is working at the moment).
\endlist
*/
......@@ -29,7 +29,7 @@
\contentspage index.html
\previouspage creator-project-wizards.html
\page creator-project-cmake.html
\nextpage creator-project-generic.html
\nextpage creator-projects-autotools.html
\title Setting Up a CMake Project
......
......@@ -27,7 +27,7 @@
/*!
\contentspage index.html
\previouspage creator-project-cmake.html
\previouspage creator-projects-autotools.html
\page creator-project-generic.html
\nextpage creator-version-control.html
......
......@@ -163,6 +163,7 @@
\o \l{Supported Platforms}
\o \l{Adding New Custom Wizards}
\o \l{Setting Up a CMake Project}
\o \l{Setting Up an Autotools Project}
\o \l{Setting Up a Generic Project}
\o \l{Using Version Control Systems}
\o \l{Adding Qt Designer Plugins}
......
This diff is collapsed.
<?xml version="1.0"?>
<mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>
<mime-type type="text/x-makefile">
<sub-class-of type="text/plain"/>
<comment>Automake based Makefile</comment>
<glob weight="10" pattern="Makefile.am"/>
</mime-type>
</mime-info>
<plugin name=\"AutotoolsProjectManager\" version=\"$$QTCREATOR_VERSION\" compatVersion=\"$$QTCREATOR_VERSION\">
<vendor>Openismus GmbH</vendor>
<copyright>(C) 2010 Openismus GmbH</copyright>
<license>GNU Lesser General Public License Usage
This file may be used under the terms of the GNU Lesser General Public
License version 2.1 as published by the Free Software Foundation and
appearing in the file LICENSE.LGPL included in the packaging of this file.
Please review the following information to ensure the GNU Lesser General
Public License version 2.1 requirements will be met:
http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
In addition, as a special exception, Nokia gives you certain additional
rights. These rights are described in the Nokia Qt LGPL Exception
version 1.1, included in the file LGPL_EXCEPTION.txt in this package.</license>
<category>Build Systems</category>
<description>Autotools project integration.</description>
<url>http://qt.nokia.com</url>
<dependencyList>
<dependency name=\"Core\" version=\"$$QTCREATOR_VERSION\"/>
<dependency name=\"ProjectExplorer\" version=\"$$QTCREATOR_VERSION\"/>
<dependency name=\"CppTools\" version=\"$$QTCREATOR_VERSION\"/>
</dependencyList>
</plugin>
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2010-2011 Openismus GmbH.
** Authors: Peter Penz (ppenz@openismus.com)
** Patricia Santana Cruz (patriciasantanacruz@gmail.com)
**
** Contact: Nokia Corporation (info@qt.nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at info@qt.nokia.com.
**
**************************************************************************/
#include "autogenstep.h"
#include "autotoolsproject.h"
#include "autotoolstarget.h"
#include "autotoolsbuildconfiguration.h"
#include "autotoolsprojectconstants.h"
#include <projectexplorer/buildsteplist.h>
#include <projectexplorer/toolchain.h>
#include <projectexplorer/gnumakeparser.h>
#include <projectexplorer/projectexplorer.h>
#include <projectexplorer/projectexplorerconstants.h>
#include <utils/qtcprocess.h>
#include <QtCore/QVariantMap>
#include <QtCore/QDateTime>
#include <QtGui/QLineEdit>
#include <QtGui/QFormLayout>
using namespace AutotoolsProjectManager;
using namespace AutotoolsProjectManager::Internal;
using namespace ProjectExplorer;
namespace {
const char AUTOGEN_ADDITIONAL_ARGUMENTS_KEY[] = "AutotoolsProjectManager.AutogenStep.AdditionalArguments";
const char AUTOGEN_STEP_ID[] = "AutotoolsProjectManager.AutogenStep";
}
/////////////////////////////
// AutogenStepFactory class
/////////////////////////////
AutogenStepFactory::AutogenStepFactory(QObject *parent) :
ProjectExplorer::IBuildStepFactory(parent)
{
}
AutogenStepFactory::~AutogenStepFactory()
{
}
QStringList AutogenStepFactory::availableCreationIds(BuildStepList *parent) const
{
if (parent->target()->project()->id() == QLatin1String(Constants::AUTOTOOLS_PROJECT_ID))
return QStringList() << QLatin1String(AUTOGEN_STEP_ID);
return QStringList();
}
QString AutogenStepFactory::displayNameForId(const QString &id) const
{
if (id == QLatin1String(AUTOGEN_STEP_ID))
return tr("Autogen", "Display name for AutotoolsProjectManager::AutogenStep id.");
return QString();
}
bool AutogenStepFactory::canCreate(BuildStepList *parent, const QString &id) const
{
if (parent->target()->project()->id() != QLatin1String(Constants::AUTOTOOLS_PROJECT_ID))
return false;
if (parent->id() != ProjectExplorer::Constants::BUILDSTEPS_BUILD)
return false;
return QLatin1String(AUTOGEN_STEP_ID) == id;
}
BuildStep *AutogenStepFactory::create(BuildStepList *parent, const QString &id)
{
if (!canCreate(parent, id))
return 0;
return new AutogenStep(parent);
}
bool AutogenStepFactory::canClone(BuildStepList *parent, BuildStep *source) const
{
return canCreate(parent, source->id());
}
BuildStep *AutogenStepFactory::clone(BuildStepList *parent, BuildStep *source)
{
if (!canClone(parent, source))
return 0;
return new AutogenStep(parent, static_cast<AutogenStep *>(source));
}
bool AutogenStepFactory::canRestore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map) const
{
QString id(ProjectExplorer::idFromMap(map));
return canCreate(parent, id);
}
BuildStep *AutogenStepFactory::restore(BuildStepList *parent, const QVariantMap &map)
{
if (!canRestore(parent, map))
return 0;
AutogenStep *bs = new AutogenStep(parent);
if (bs->fromMap(map))
return bs;
delete bs;
return 0;
}
////////////////////////
// AutogenStep class
////////////////////////
AutogenStep::AutogenStep(ProjectExplorer::BuildStepList *bsl) :
AbstractProcessStep(bsl, QLatin1String(AUTOGEN_STEP_ID)),
m_runAutogen(false)
{
ctor();
}
AutogenStep::AutogenStep(ProjectExplorer::BuildStepList *bsl, const QString &id) :
AbstractProcessStep(bsl, id)
{
ctor();
}
AutogenStep::AutogenStep(ProjectExplorer::BuildStepList *bsl, AutogenStep *bs) :
AbstractProcessStep(bsl, bs),
m_additionalArguments(bs->additionalArguments())
{
ctor();
}
void AutogenStep::ctor()
{
setDefaultDisplayName(tr("Autogen"));
}
AutogenStep::~AutogenStep()
{
}
AutotoolsBuildConfiguration *AutogenStep::autotoolsBuildConfiguration() const
{
return static_cast<AutotoolsBuildConfiguration *>(buildConfiguration());
}
bool AutogenStep::init()
{
AutotoolsBuildConfiguration *bc = autotoolsBuildConfiguration();
setEnabled(true);
ProcessParameters *pp = processParameters();
pp->setMacroExpander(bc->macroExpander());
pp->setEnvironment(bc->environment());
pp->setWorkingDirectory(bc->buildDirectory());
pp->setCommand(QLatin1String("autogen.sh"));
pp->setArguments(additionalArguments());
return AbstractProcessStep::init();
}
void AutogenStep::run(QFutureInterface<bool> &interface)
{
AutotoolsBuildConfiguration *bc = autotoolsBuildConfiguration();
// Check wether we need to run autogen.sh
const QFileInfo configureInfo(bc->buildDirectory() + QLatin1String("/configure"));
const QFileInfo configureAcInfo(bc->buildDirectory() + QLatin1String("/configure.ac"));
const QFileInfo makefileAmInfo(bc->buildDirectory() + QLatin1String("/Makefile.am"));
if (!configureInfo.exists()
|| configureInfo.lastModified() < configureAcInfo.lastModified()
|| configureInfo.lastModified() < makefileAmInfo.lastModified()) {
m_runAutogen = true;
}
if (!m_runAutogen) {
emit addOutput(tr("Configuration unchanged, skipping autogen step."), BuildStep::MessageOutput);
interface.reportResult(true);
return;
}
m_runAutogen = false;
AbstractProcessStep::run(interface);
}
ProjectExplorer::BuildStepConfigWidget* AutogenStep::createConfigWidget()
{
return new AutogenStepConfigWidget(this);
}
bool AutogenStep::immutable() const
{
return false;
}
void AutogenStep::setAdditionalArguments(const QString &list)
{
if (list == m_additionalArguments)
return;
m_additionalArguments = list;
m_runAutogen = true;
emit additionalArgumentsChanged(list);
}
QString AutogenStep::additionalArguments() const
{
return m_additionalArguments;
}
QVariantMap AutogenStep::toMap() const
{
QVariantMap map(AbstractProcessStep::toMap());
map.insert(QLatin1String(AUTOGEN_ADDITIONAL_ARGUMENTS_KEY), m_additionalArguments);
return map;
}
bool AutogenStep::fromMap(const QVariantMap &map)
{
m_additionalArguments = map.value(QLatin1String(AUTOGEN_ADDITIONAL_ARGUMENTS_KEY)).toString();
return BuildStep::fromMap(map);
}
//////////////////////////////////
// AutogenStepConfigWidget class
//////////////////////////////////
AutogenStepConfigWidget::AutogenStepConfigWidget(AutogenStep *autogenStep) :
m_autogenStep(autogenStep),
m_summaryText(),
m_additionalArguments(0)
{
QFormLayout *fl = new QFormLayout(this);
fl->setMargin(0);
fl->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow);
setLayout(fl);
m_additionalArguments = new QLineEdit(this);
fl->addRow(tr("Arguments:"), m_additionalArguments);
m_additionalArguments->setText(m_autogenStep->additionalArguments());
updateDetails();
connect(m_additionalArguments, SIGNAL(textChanged(QString)),
autogenStep, SLOT(setAdditionalArguments(QString)));
connect(autogenStep, SIGNAL(additionalArgumentsChanged(QString)),
this, SLOT(updateDetails()));
}
AutogenStepConfigWidget::~AutogenStepConfigWidget()
{
}
QString AutogenStepConfigWidget::displayName() const
{
return tr("Autogen", "AutotoolsProjectManager::AutogenStepConfigWidget display name.");
}
QString AutogenStepConfigWidget::summaryText() const
{
return m_summaryText;
}
void AutogenStepConfigWidget::updateDetails()
{
AutotoolsBuildConfiguration *bc = m_autogenStep->autotoolsBuildConfiguration();
ProcessParameters param;
param.setMacroExpander(bc->macroExpander());
param.setEnvironment(bc->environment());
param.setWorkingDirectory(bc->buildDirectory());
param.setCommand("autogen.sh");
param.setArguments(m_autogenStep->additionalArguments());
m_summaryText = param.summary(displayName());
emit updateSummary();
}
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2010-2011 Openismus GmbH.
** Authors: Peter Penz (ppenz@openismus.com)
** Patricia Santana Cruz (patriciasantanacruz@gmail.com)
**
** Contact: Nokia Corporation (info@qt.nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at info@qt.nokia.com.
**
**************************************************************************/
#ifndef AUTOGENSTEP_H
#define AUTOGENSTEP_H
#include <projectexplorer/abstractprocessstep.h>
QT_BEGIN_NAMESPACE
class QLineEdit;
QT_END_NAMESPACE
namespace AutotoolsProjectManager {
namespace Internal {
class AutotoolsProject;
class AutotoolsBuildConfiguration;
class AutogenStep;
class AutogenStepConfigWidget;
/////////////////////////////
// AutogenStepFactory class
/////////////////////////////
/**
* @brief Implementation of the ProjectExplorer::IBuildStepFactory interface.
*
* This factory is used to create instances of AutogenStep.
*/
class AutogenStepFactory : public ProjectExplorer::IBuildStepFactory
{
Q_OBJECT
public:
AutogenStepFactory(QObject *parent = 0);
~AutogenStepFactory();
QStringList availableCreationIds(ProjectExplorer::BuildStepList *bc) const;
QString displayNameForId(const QString &id) const;
bool canCreate(ProjectExplorer::BuildStepList *parent, const QString &id) const;
ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, const QString &id);
bool canClone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source) const;
ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source);
bool canRestore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map) const;
ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map);
};
///////////////////////
// AutogenStep class
///////////////////////
/**
* @brief Implementation of the ProjectExplorer::AbstractProcessStep interface.
*
* A autogen 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 AutogenStep::createConfigWidget and is
* represented by an instance of the class AutogenStepConfigWidget.
*/
class AutogenStep : public ProjectExplorer::AbstractProcessStep
{
Q_OBJECT
friend class AutogenStepFactory;
friend class AutogenStepConfigWidget;
public:
AutogenStep(ProjectExplorer::BuildStepList *bsl);
~AutogenStep();
AutotoolsBuildConfiguration *autotoolsBuildConfiguration() const;
bool init();
void run(QFutureInterface<bool> &interface);
ProjectExplorer::BuildStepConfigWidget *createConfigWidget();
bool immutable() const;
QString additionalArguments() const;
QVariantMap toMap() const;
public slots:
void setAdditionalArguments(const QString &list);
signals:
void additionalArgumentsChanged(const QString &);
protected:
AutogenStep(ProjectExplorer::BuildStepList *bsl, AutogenStep *bs);
AutogenStep(ProjectExplorer::BuildStepList *bsl, const QString &id);
bool fromMap(const QVariantMap &map);
private:
void ctor();
QString m_additionalArguments;
bool m_runAutogen;
};
//////////////////////////////////
// AutogenStepConfigWidget class
//////////////////////////////////
/**
* @brief Implementation of the ProjectExplorer::BuildStepConfigWidget interface.
*
* Allows to configure a autogen step in the GUI.
*/
class AutogenStepConfigWidget : public ProjectExplorer::BuildStepConfigWidget
{
Q_OBJECT
public:
AutogenStepConfigWidget(AutogenStep *autogenStep);
~AutogenStepConfigWidget();
QString displayName() const;
QString summaryText() const;
private slots:
void updateDetails();
private:
AutogenStep *m_autogenStep;
QString m_summaryText;
QLineEdit *m_additionalArguments;
};
} // namespace Internal
} // namespace AutotoolsProjectManager
#endif // AUTOGENSTEP_H
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2010-2011 Openismus GmbH.
** Authors: Peter Penz (ppenz@openismus.com)
** Patricia Santana Cruz (patriciasantanacruz@gmail.com)
**
** Contact: Nokia Corporation (info@qt.nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at info@qt.nokia.com.
**
**************************************************************************/
#include "autoreconfstep.h"
#include "autotoolsproject.h"
#include "autotoolstarget.h"
#include "autotoolsbuildconfiguration.h"
#include "autotoolsprojectconstants.h"
#include <projectexplorer/buildsteplist.h>