forked from qt-creator/qt-creator
overhaul process argument handling
get away from argument stringlists. instead, use native shell command lines which support quoting/splitting, environment variable expansion and redirections with well-understood semantics. Task-number: QTCREATORBUG-542 Task-number: QTCREATORBUG-1564
This commit is contained in:
@@ -243,7 +243,7 @@ CMakeBuildConfiguration *CMakeBuildConfigurationFactory::create(ProjectExplorer:
|
||||
|
||||
MakeStep *cleanMakeStep = new MakeStep(cleanSteps);
|
||||
cleanSteps->insertStep(0, cleanMakeStep);
|
||||
cleanMakeStep->setAdditionalArguments(QStringList() << "clean");
|
||||
cleanMakeStep->setAdditionalArguments("clean");
|
||||
cleanMakeStep->setClean(true);
|
||||
|
||||
CMakeOpenProjectWizard copw(cmtarget->cmakeProject()->projectManager(),
|
||||
|
||||
@@ -202,12 +202,12 @@ void CMakeOpenProjectWizard::setMsvcVersion(const QString &version)
|
||||
m_msvcVersion = version;
|
||||
}
|
||||
|
||||
QStringList CMakeOpenProjectWizard::arguments() const
|
||||
QString CMakeOpenProjectWizard::arguments() const
|
||||
{
|
||||
return m_arguments;
|
||||
}
|
||||
|
||||
void CMakeOpenProjectWizard::setArguments(const QStringList &args)
|
||||
void CMakeOpenProjectWizard::setArguments(const QString &args)
|
||||
{
|
||||
m_arguments = args;
|
||||
}
|
||||
@@ -426,7 +426,6 @@ void CMakeRunPage::runCMake()
|
||||
{
|
||||
m_runCMake->setEnabled(false);
|
||||
m_argumentsLineEdit->setEnabled(false);
|
||||
QStringList arguments = Utils::Environment::parseCombinedArgString(m_argumentsLineEdit->text());
|
||||
CMakeManager *cmakeManager = m_cmakeWizard->cmakeManager();
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
@@ -464,11 +463,11 @@ void CMakeRunPage::runCMake()
|
||||
m_output->clear();
|
||||
|
||||
if (m_cmakeWizard->cmakeManager()->isCMakeExecutableValid()) {
|
||||
m_cmakeProcess = new QProcess();
|
||||
m_cmakeProcess = new Utils::QtcProcess();
|
||||
connect(m_cmakeProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(cmakeReadyReadStandardOutput()));
|
||||
connect(m_cmakeProcess, SIGNAL(readyReadStandardError()), this, SLOT(cmakeReadyReadStandardError()));
|
||||
connect(m_cmakeProcess, SIGNAL(finished(int)), this, SLOT(cmakeFinished()));
|
||||
cmakeManager->createXmlFile(m_cmakeProcess, arguments, m_cmakeWizard->sourceDirectory(), m_buildDirectory, env, generator);
|
||||
cmakeManager->createXmlFile(m_cmakeProcess, m_argumentsLineEdit->text(), m_cmakeWizard->sourceDirectory(), m_buildDirectory, env, generator);
|
||||
} else {
|
||||
m_runCMake->setEnabled(true);
|
||||
m_argumentsLineEdit->setEnabled(true);
|
||||
@@ -522,7 +521,7 @@ void CMakeRunPage::cmakeFinished()
|
||||
}
|
||||
m_cmakeProcess->deleteLater();
|
||||
m_cmakeProcess = 0;
|
||||
m_cmakeWizard->setArguments(Utils::Environment::parseCombinedArgString(m_argumentsLineEdit->text()));
|
||||
m_cmakeWizard->setArguments(m_argumentsLineEdit->text());
|
||||
//TODO Actually test that running cmake was finished, for setting this bool
|
||||
emit completeChanged();
|
||||
}
|
||||
|
||||
@@ -32,8 +32,8 @@
|
||||
|
||||
#include <utils/environment.h>
|
||||
#include <utils/wizard.h>
|
||||
#include <utils/qtcprocess.h>
|
||||
|
||||
#include <QtCore/QProcess>
|
||||
#include <QtGui/QPushButton>
|
||||
#include <QtGui/QComboBox>
|
||||
#include <QtGui/QLineEdit>
|
||||
@@ -81,8 +81,8 @@ public:
|
||||
QString sourceDirectory() const;
|
||||
void setBuildDirectory(const QString &directory);
|
||||
CMakeManager *cmakeManager() const;
|
||||
QStringList arguments() const;
|
||||
void setArguments(const QStringList &args);
|
||||
QString arguments() const;
|
||||
void setArguments(const QString &args);
|
||||
Utils::Environment environment() const;
|
||||
QString msvcVersion() const;
|
||||
void setMsvcVersion(const QString &version);
|
||||
@@ -93,7 +93,7 @@ private:
|
||||
CMakeManager *m_cmakeManager;
|
||||
QString m_buildDirectory;
|
||||
QString m_sourceDirectory;
|
||||
QStringList m_arguments;
|
||||
QString m_arguments;
|
||||
QString m_msvcVersion;
|
||||
bool m_creatingCbpFiles;
|
||||
Utils::Environment m_environment;
|
||||
@@ -140,7 +140,7 @@ private:
|
||||
CMakeOpenProjectWizard *m_cmakeWizard;
|
||||
QPlainTextEdit *m_output;
|
||||
QPushButton *m_runCMake;
|
||||
QProcess *m_cmakeProcess;
|
||||
Utils::QtcProcess *m_cmakeProcess;
|
||||
QLineEdit *m_argumentsLineEdit;
|
||||
Utils::PathChooser *m_cmakeExecutable;
|
||||
QComboBox *m_generatorComboBox;
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
#include "cmakeproject.h"
|
||||
|
||||
#include <utils/synchronousprocess.h>
|
||||
#include <utils/qtcprocess.h>
|
||||
|
||||
#include <coreplugin/icore.h>
|
||||
#include <coreplugin/uniqueidmanager.h>
|
||||
@@ -102,7 +103,7 @@ bool CMakeManager::hasCodeBlocksMsvcGenerator() const
|
||||
// we probably want the process instead of this function
|
||||
// cmakeproject then could even run the cmake process in the background, adding the files afterwards
|
||||
// sounds like a plan
|
||||
void CMakeManager::createXmlFile(QProcess *proc, const QStringList &arguments,
|
||||
void CMakeManager::createXmlFile(Utils::QtcProcess *proc, const QString &arguments,
|
||||
const QString &sourceDirectory, const QDir &buildDirectory,
|
||||
const Utils::Environment &env, const QString &generator)
|
||||
{
|
||||
@@ -117,11 +118,16 @@ void CMakeManager::createXmlFile(QProcess *proc, const QStringList &arguments,
|
||||
QString buildDirectoryPath = buildDirectory.absolutePath();
|
||||
buildDirectory.mkpath(buildDirectoryPath);
|
||||
proc->setWorkingDirectory(buildDirectoryPath);
|
||||
proc->setEnvironment(env.toStringList());
|
||||
proc->setEnvironment(env);
|
||||
|
||||
const QString srcdir = buildDirectory.exists(QLatin1String("CMakeCache.txt")) ?
|
||||
QString(QLatin1Char('.')) : sourceDirectory;
|
||||
proc->start(cmakeExecutable(), QStringList() << srcdir << arguments << generator);
|
||||
QString args;
|
||||
Utils::QtcProcess::addArg(&args, srcdir);
|
||||
Utils::QtcProcess::addArgs(&args, arguments);
|
||||
Utils::QtcProcess::addArg(&args, generator);
|
||||
proc->setCommand(cmakeExecutable(), args);
|
||||
proc->start();
|
||||
}
|
||||
|
||||
QString CMakeManager::findCbpFile(const QDir &directory)
|
||||
|
||||
@@ -44,6 +44,10 @@
|
||||
QT_FORWARD_DECLARE_CLASS(QProcess)
|
||||
QT_FORWARD_DECLARE_CLASS(QLabel)
|
||||
|
||||
namespace Utils {
|
||||
class QtcProcess;
|
||||
}
|
||||
|
||||
namespace CMakeProjectManager {
|
||||
namespace Internal {
|
||||
|
||||
@@ -66,8 +70,8 @@ public:
|
||||
|
||||
void setCMakeExecutable(const QString &executable);
|
||||
|
||||
void createXmlFile(QProcess *process,
|
||||
const QStringList &arguments,
|
||||
void createXmlFile(Utils::QtcProcess *process,
|
||||
const QString &arguments,
|
||||
const QString &sourceDirectory,
|
||||
const QDir &buildDirectory,
|
||||
const Utils::Environment &env,
|
||||
|
||||
@@ -141,14 +141,9 @@ QString CMakeRunConfiguration::baseWorkingDirectory() const
|
||||
return m_workingDirectory;
|
||||
}
|
||||
|
||||
QStringList CMakeRunConfiguration::commandLineArguments() const
|
||||
QString CMakeRunConfiguration::commandLineArguments() const
|
||||
{
|
||||
return environment().expandVariables(baseCommandLineArguments());
|
||||
}
|
||||
|
||||
QStringList CMakeRunConfiguration::baseCommandLineArguments() const
|
||||
{
|
||||
return Utils::Environment::parseCombinedArgString(m_arguments);
|
||||
return m_arguments;
|
||||
}
|
||||
|
||||
QString CMakeRunConfiguration::title() const
|
||||
@@ -329,7 +324,7 @@ CMakeRunConfigurationWidget::CMakeRunConfigurationWidget(CMakeRunConfiguration *
|
||||
fl->setMargin(0);
|
||||
fl->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow);
|
||||
QLineEdit *argumentsLineEdit = new QLineEdit();
|
||||
argumentsLineEdit->setText(Utils::Environment::joinArgumentList(cmakeRunConfiguration->baseCommandLineArguments()));
|
||||
argumentsLineEdit->setText(cmakeRunConfiguration->commandLineArguments());
|
||||
connect(argumentsLineEdit, SIGNAL(textChanged(QString)),
|
||||
this, SLOT(setArguments(QString)));
|
||||
fl->addRow(tr("Arguments:"), argumentsLineEdit);
|
||||
|
||||
@@ -68,7 +68,7 @@ public:
|
||||
QString executable() const;
|
||||
RunMode runMode() const;
|
||||
QString workingDirectory() const;
|
||||
QStringList commandLineArguments() const;
|
||||
QString commandLineArguments() const;
|
||||
Utils::Environment environment() const;
|
||||
QWidget *createConfigurationWidget();
|
||||
|
||||
@@ -104,7 +104,6 @@ protected:
|
||||
private:
|
||||
void setUserWorkingDirectory(const QString &workingDirectory);
|
||||
QString baseWorkingDirectory() const;
|
||||
QStringList baseCommandLineArguments() const;
|
||||
void ctor();
|
||||
|
||||
enum BaseEnvironmentBase { CleanEnvironmentBase = 0,
|
||||
|
||||
@@ -209,7 +209,7 @@ CMakeTarget *CMakeTargetFactory::create(ProjectExplorer::Project *parent, const
|
||||
|
||||
MakeStep *cleanMakeStep = new MakeStep(cleanSteps);
|
||||
cleanSteps->insertStep(0, cleanMakeStep);
|
||||
cleanMakeStep->setAdditionalArguments(QStringList() << "clean");
|
||||
cleanMakeStep->setAdditionalArguments("clean");
|
||||
cleanMakeStep->setClean(true);
|
||||
|
||||
t->addBuildConfiguration(bc);
|
||||
|
||||
@@ -39,6 +39,8 @@
|
||||
#include <projectexplorer/projectexplorer.h>
|
||||
#include <projectexplorer/gnumakeparser.h>
|
||||
|
||||
#include <utils/qtcprocess.h>
|
||||
|
||||
#include <QtGui/QFormLayout>
|
||||
#include <QtGui/QGroupBox>
|
||||
#include <QtGui/QCheckBox>
|
||||
@@ -78,7 +80,7 @@ MakeStep::MakeStep(BuildStepList *bsl, MakeStep *bs) :
|
||||
m_clean(bs->m_clean),
|
||||
m_futureInterface(0),
|
||||
m_buildTargets(bs->m_buildTargets),
|
||||
m_additionalArguments(bs->m_buildTargets)
|
||||
m_additionalArguments(Utils::QtcProcess::joinArgs(bs->m_buildTargets))
|
||||
{
|
||||
ctor();
|
||||
}
|
||||
@@ -117,7 +119,7 @@ bool MakeStep::fromMap(const QVariantMap &map)
|
||||
{
|
||||
m_clean = map.value(QLatin1String(CLEAN_KEY)).toBool();
|
||||
m_buildTargets = map.value(QLatin1String(BUILD_TARGETS_KEY)).toStringList();
|
||||
m_additionalArguments = map.value(QLatin1String(ADDITIONAL_ARGUMENTS_KEY)).toStringList();
|
||||
m_additionalArguments = map.value(QLatin1String(ADDITIONAL_ARGUMENTS_KEY)).toString();
|
||||
|
||||
return BuildStep::fromMap(map);
|
||||
}
|
||||
@@ -132,8 +134,8 @@ bool MakeStep::init()
|
||||
|
||||
setCommand(bc->toolChain()->makeCommand());
|
||||
|
||||
QStringList arguments = m_buildTargets;
|
||||
arguments << additionalArguments();
|
||||
QString arguments = Utils::QtcProcess::joinArgs(m_buildTargets);
|
||||
Utils::QtcProcess::addArgs(&arguments, additionalArguments());
|
||||
setArguments(arguments);
|
||||
setEnvironment(bc->environment());
|
||||
setIgnoreReturnValue(m_clean);
|
||||
@@ -191,12 +193,12 @@ void MakeStep::setBuildTarget(const QString &buildTarget, bool on)
|
||||
m_buildTargets = old;
|
||||
}
|
||||
|
||||
QStringList MakeStep::additionalArguments() const
|
||||
QString MakeStep::additionalArguments() const
|
||||
{
|
||||
return m_additionalArguments;
|
||||
}
|
||||
|
||||
void MakeStep::setAdditionalArguments(const QStringList &list)
|
||||
void MakeStep::setAdditionalArguments(const QString &list)
|
||||
{
|
||||
m_additionalArguments = list;
|
||||
}
|
||||
@@ -239,7 +241,7 @@ MakeStepConfigWidget::MakeStepConfigWidget(MakeStep *makeStep)
|
||||
|
||||
void MakeStepConfigWidget::additionalArgumentsEdited()
|
||||
{
|
||||
m_makeStep->setAdditionalArguments(Utils::Environment::parseCombinedArgString(m_additionalArguments->text()));
|
||||
m_makeStep->setAdditionalArguments(m_additionalArguments->text());
|
||||
updateDetails();
|
||||
}
|
||||
|
||||
@@ -266,7 +268,7 @@ void MakeStepConfigWidget::init()
|
||||
// and connect again
|
||||
connect(m_buildTargetsList, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(itemChanged(QListWidgetItem*)));
|
||||
|
||||
m_additionalArguments->setText(Utils::Environment::joinArgumentList(m_makeStep->additionalArguments()));
|
||||
m_additionalArguments->setText(m_makeStep->additionalArguments());
|
||||
updateDetails();
|
||||
|
||||
CMakeProject *pro = m_makeStep->cmakeBuildConfiguration()->cmakeTarget()->cmakeProject();
|
||||
@@ -290,13 +292,13 @@ void MakeStepConfigWidget::buildTargetsChanged()
|
||||
|
||||
void MakeStepConfigWidget::updateDetails()
|
||||
{
|
||||
QStringList arguments = m_makeStep->m_buildTargets;
|
||||
arguments << m_makeStep->additionalArguments();
|
||||
QString arguments = Utils::QtcProcess::joinArgs(m_makeStep->m_buildTargets);
|
||||
Utils::QtcProcess::addArgs(&arguments, m_makeStep->additionalArguments());
|
||||
|
||||
CMakeBuildConfiguration *bc = m_makeStep->cmakeBuildConfiguration();
|
||||
ProjectExplorer::ToolChain *tc = bc->toolChain();
|
||||
if (tc)
|
||||
m_summaryText = tr("<b>Make:</b> %1 %2").arg(tc->makeCommand(), arguments.join(QString(QLatin1Char(' '))));
|
||||
m_summaryText = tr("<b>Make:</b> %1 %2").arg(tc->makeCommand(), arguments);
|
||||
else
|
||||
m_summaryText = tr("<b>Unknown Toolchain</b>");
|
||||
emit updateSummary();
|
||||
|
||||
@@ -65,8 +65,8 @@ public:
|
||||
virtual bool immutable() const;
|
||||
bool buildsBuildTarget(const QString &target) const;
|
||||
void setBuildTarget(const QString &target, bool on);
|
||||
QStringList additionalArguments() const;
|
||||
void setAdditionalArguments(const QStringList &list);
|
||||
QString additionalArguments() const;
|
||||
void setAdditionalArguments(const QString &list);
|
||||
|
||||
void setClean(bool clean);
|
||||
|
||||
@@ -88,7 +88,7 @@ private:
|
||||
QRegExp m_percentProgress;
|
||||
QFutureInterface<bool> *m_futureInterface;
|
||||
QStringList m_buildTargets;
|
||||
QStringList m_additionalArguments;
|
||||
QString m_additionalArguments;
|
||||
};
|
||||
|
||||
class MakeStepConfigWidget :public ProjectExplorer::BuildStepConfigWidget
|
||||
|
||||
Reference in New Issue
Block a user