diff options
Diffstat (limited to 'src/plugins/qt4projectmanager')
25 files changed, 209 insertions, 247 deletions
diff --git a/src/plugins/qt4projectmanager/makestep.cpp b/src/plugins/qt4projectmanager/makestep.cpp index 400b6ee6b75..7a34273cd08 100644 --- a/src/plugins/qt4projectmanager/makestep.cpp +++ b/src/plugins/qt4projectmanager/makestep.cpp @@ -43,6 +43,7 @@ #include <projectexplorer/gnumakeparser.h> #include <projectexplorer/projectexplorer.h> #include <extensionsystem/pluginmanager.h> +#include <utils/qtcprocess.h> #include <QtCore/QDir> #include <QtCore/QFileInfo> @@ -113,7 +114,7 @@ QVariantMap MakeStep::toMap() const bool MakeStep::fromMap(const QVariantMap &map) { m_makeCmd = map.value(QLatin1String(MAKE_COMMAND_KEY)).toString(); - m_userArgs = map.value(QLatin1String(MAKE_ARGUMENTS_KEY)).toStringList(); + m_userArgs = map.value(QLatin1String(MAKE_ARGUMENTS_KEY)).toString(); m_clean = map.value(QLatin1String(CLEAN_KEY)).toBool(); return ProjectExplorer::AbstractProcessStep::fromMap(map); @@ -150,22 +151,26 @@ bool MakeStep::init() // we should stop the clean queue // That is mostly so that rebuild works on a already clean project setIgnoreReturnValue(m_clean); - QStringList args; + + QString args; ProjectExplorer::ToolChain *toolchain = bc->toolChain(); if (bc->subNodeBuild()){ if(!bc->subNodeBuild()->makefile().isEmpty()) { - args << "-f" << bc->subNodeBuild()->makefile(); + Utils::QtcProcess::addArg(&args, QLatin1String("-f")); + Utils::QtcProcess::addArg(&args, bc->subNodeBuild()->makefile()); } } else if (!bc->makefile().isEmpty()) { - args << "-f" << bc->makefile(); + Utils::QtcProcess::addArg(&args, QLatin1String("-f")); + Utils::QtcProcess::addArg(&args, bc->makefile()); } - args.append(m_userArgs); + Utils::QtcProcess::addArgs(&args, m_userArgs); + if (!m_clean) { if (!bc->defaultMakeTarget().isEmpty()) - args << bc->defaultMakeTarget(); + Utils::QtcProcess::addArg(&args, bc->defaultMakeTarget()); } // -w option enables "Enter"/"Leaving directory" messages, which we need for detecting the // absolute file path @@ -177,7 +182,7 @@ bool MakeStep::init() if (toolchain->type() != ProjectExplorer::ToolChain_MSVC && toolchain->type() != ProjectExplorer::ToolChain_WINCE) { if (m_makeCmd.isEmpty()) - args << "-w"; + Utils::QtcProcess::addArg(&args, QLatin1String("-w")); } } @@ -235,12 +240,12 @@ ProjectExplorer::BuildStepConfigWidget *MakeStep::createConfigWidget() return new MakeStepConfigWidget(this); } -QStringList MakeStep::userArguments() +QString MakeStep::userArguments() { return m_userArgs; } -void MakeStep::setUserArguments(const QStringList &arguments) +void MakeStep::setUserArguments(const QString &arguments) { m_userArgs = arguments; emit userArgumentsChanged(); @@ -314,16 +319,16 @@ void MakeStepConfigWidget::updateDetails() // FIXME doing this without the user having a way to override this is rather bad // so we only do it for unix and if the user didn't override the make command // but for now this is the least invasive change - QStringList args = m_makeStep->userArguments(); + QString args = m_makeStep->userArguments(); ProjectExplorer::ToolChainType t = ProjectExplorer::ToolChain_UNKNOWN; ProjectExplorer::ToolChain *toolChain = bc->toolChain(); if (toolChain) t = toolChain->type(); if (t != ProjectExplorer::ToolChain_MSVC && t != ProjectExplorer::ToolChain_WINCE) { if (m_makeStep->m_makeCmd.isEmpty()) - args << "-w"; + Utils::QtcProcess::addArg(&args, QLatin1String("-w")); } - m_summaryText = tr("<b>Make:</b> %1 %2 in %3").arg(QFileInfo(makeCmd).fileName(), args.join(" "), + m_summaryText = tr("<b>Make:</b> %1 %2 in %3").arg(QFileInfo(makeCmd).fileName(), args, QDir::toNativeSeparators(workingDirectory)); emit updateSummary(); } @@ -342,8 +347,7 @@ void MakeStepConfigWidget::userArgumentsChanged() { if (m_ignoreChange) return; - const QStringList &makeArguments = m_makeStep->userArguments(); - m_ui->makeArgumentsLineEdit->setText(Utils::Environment::joinArgumentList(makeArguments)); + m_ui->makeArgumentsLineEdit->setText(m_makeStep->userArguments()); updateDetails(); } @@ -354,8 +358,7 @@ void MakeStepConfigWidget::init() const QString &makeCmd = m_makeStep->m_makeCmd; m_ui->makePathChooser->setPath(makeCmd); - const QStringList &makeArguments = m_makeStep->userArguments(); - m_ui->makeArgumentsLineEdit->setText(Utils::Environment::joinArgumentList(makeArguments)); + m_ui->makeArgumentsLineEdit->setText(m_makeStep->userArguments()); updateDetails(); } @@ -368,8 +371,7 @@ void MakeStepConfigWidget::makeEdited() void MakeStepConfigWidget::makeArgumentsLineEdited() { m_ignoreChange = true; - m_makeStep->setUserArguments( - Utils::Environment::parseCombinedArgString(m_ui->makeArgumentsLineEdit->text())); + m_makeStep->setUserArguments(m_ui->makeArgumentsLineEdit->text()); m_ignoreChange = false; updateDetails(); } diff --git a/src/plugins/qt4projectmanager/makestep.h b/src/plugins/qt4projectmanager/makestep.h index ee650b41365..0858e55fd9a 100644 --- a/src/plugins/qt4projectmanager/makestep.h +++ b/src/plugins/qt4projectmanager/makestep.h @@ -91,8 +91,8 @@ public: virtual ProjectExplorer::BuildStepConfigWidget *createConfigWidget(); virtual bool immutable() const; - QStringList userArguments(); - void setUserArguments(const QStringList &arguments); + QString userArguments(); + void setUserArguments(const QString &arguments); void setClean(bool clean); QVariantMap toMap() const; @@ -108,7 +108,7 @@ protected: private: void ctor(); bool m_clean; - QStringList m_userArgs; + QString m_userArgs; QString m_makeCmd; ProjectExplorer::GnuMakeParser * m_gnuMakeParser; }; diff --git a/src/plugins/qt4projectmanager/qmakestep.cpp b/src/plugins/qt4projectmanager/qmakestep.cpp index 63753bb4267..82a0ddc2814 100644 --- a/src/plugins/qt4projectmanager/qmakestep.cpp +++ b/src/plugins/qt4projectmanager/qmakestep.cpp @@ -42,6 +42,7 @@ #include <coreplugin/icore.h> #include <utils/qtcassert.h> +#include <utils/qtcprocess.h> #include <QtCore/QDir> #include <QtCore/QFile> @@ -100,29 +101,34 @@ Qt4BuildConfiguration *QMakeStep::qt4BuildConfiguration() const /// config arguemnts /// moreArguments /// user arguments -QStringList QMakeStep::allArguments() +QString QMakeStep::allArguments(bool shorted) { - QStringList additonalArguments = m_userArgs; + QString additonalArguments = m_userArgs; Qt4BuildConfiguration *bc = qt4BuildConfiguration(); QStringList arguments; if (bc->subNodeBuild()) arguments << QDir::toNativeSeparators(bc->subNodeBuild()->path()); + else if (shorted) + arguments << QDir::toNativeSeparators(QFileInfo( + buildConfiguration()->target()->project()->file()->fileName()).fileName()); else arguments << QDir::toNativeSeparators(buildConfiguration()->target()->project()->file()->fileName()); arguments << "-r"; - if (!additonalArguments.contains("-spec")) - arguments << "-spec" << bc->qtVersion()->mkspec(); + for (Utils::QtcProcess::ArgIterator ait(&additonalArguments); ait.next(); ) + if (ait.value() == QLatin1String("-spec")) + goto haveSpec; + arguments << "-spec" << bc->qtVersion()->mkspec(); + haveSpec: // Find out what flags we pass on to qmake arguments << bc->configCommandLineArguments(); - if (!additonalArguments.isEmpty()) - arguments << additonalArguments; - arguments << moreArguments(); - return arguments; + QString args = Utils::QtcProcess::joinArgs(arguments); + Utils::QtcProcess::addArgs(&args, additonalArguments); + return args; } /// @@ -164,7 +170,7 @@ bool QMakeStep::init() Qt4BuildConfiguration *qt4bc = qt4BuildConfiguration(); const QtVersion *qtVersion = qt4bc->qtVersion(); - QStringList args = allArguments(); + QString args = allArguments(); QString workingDirectory; if (qt4bc->subNodeBuild()) @@ -286,7 +292,7 @@ bool QMakeStep::processSucceeded(int exitCode, QProcess::ExitStatus status) return result; } -void QMakeStep::setUserArguments(const QStringList &arguments) +void QMakeStep::setUserArguments(const QString &arguments) { if (m_userArgs == arguments) return; @@ -301,14 +307,13 @@ void QMakeStep::setUserArguments(const QStringList &arguments) QStringList QMakeStep::parserArguments() { QStringList result; - foreach (const QString &str, allArguments()) { - if (str.contains("=")) - result << str; - } + for (Utils::QtcProcess::ConstArgIterator ait(allArguments()); ait.next(); ) + if (ait.value().contains(QLatin1Char('='))) + result << ait.value(); return result; } -QStringList QMakeStep::userArguments() +QString QMakeStep::userArguments() { return m_userArgs; } @@ -322,7 +327,7 @@ QVariantMap QMakeStep::toMap() const bool QMakeStep::fromMap(const QVariantMap &map) { - m_userArgs = map.value(QLatin1String(QMAKE_ARGUMENTS_KEY)).toStringList(); + m_userArgs = map.value(QLatin1String(QMAKE_ARGUMENTS_KEY)).toString(); return BuildStep::fromMap(map); } @@ -349,8 +354,7 @@ QMakeStepConfigWidget::QMakeStepConfigWidget(QMakeStep *step) void QMakeStepConfigWidget::init() { - QString qmakeArgs = Utils::Environment::joinArgumentList(m_step->userArguments()); - m_ui.qmakeAdditonalArgumentsLineEdit->setText(qmakeArgs); + m_ui.qmakeAdditonalArgumentsLineEdit->setText(m_step->userArguments()); qmakeBuildConfigChanged(); @@ -393,8 +397,7 @@ void QMakeStepConfigWidget::userArgumentsChanged() { if (m_ignoreChange) return; - QString qmakeArgs = Utils::Environment::joinArgumentList(m_step->userArguments()); - m_ui.qmakeAdditonalArgumentsLineEdit->setText(qmakeArgs); + m_ui.qmakeAdditonalArgumentsLineEdit->setText(m_step->userArguments()); updateSummaryLabel(); updateEffectiveQMakeCall(); } @@ -402,8 +405,7 @@ void QMakeStepConfigWidget::userArgumentsChanged() void QMakeStepConfigWidget::qmakeArgumentsLineEdited() { m_ignoreChange = true; - m_step->setUserArguments( - Utils::Environment::parseCombinedArgString(m_ui.qmakeAdditonalArgumentsLineEdit->text())); + m_step->setUserArguments(m_ui.qmakeAdditonalArgumentsLineEdit->text()); m_ignoreChange = false; updateSummaryLabel(); @@ -446,16 +448,11 @@ void QMakeStepConfigWidget::updateSummaryLabel() return; } - QStringList args = m_step->allArguments(); // We don't want the full path to the .pro file - const QString projectFileName = m_step->buildConfiguration()->target()->project()->file()->fileName(); - int index = args.indexOf(projectFileName); - if (index != -1) - args[index] = QFileInfo(projectFileName).fileName(); - + QString args = m_step->allArguments(true); // And we only use the .pro filename not the full path QString program = QFileInfo(qtVersion->qmakeCommand()).fileName(); - m_summaryText = tr("<b>qmake:</b> %1 %2").arg(program, args.join(QString(QLatin1Char(' ')))); + m_summaryText = tr("<b>qmake:</b> %1 %2").arg(program, args); emit updateSummary(); } @@ -465,7 +462,7 @@ void QMakeStepConfigWidget::updateEffectiveQMakeCall() Qt4BuildConfiguration *qt4bc = m_step->qt4BuildConfiguration(); const QtVersion *qtVersion = qt4bc->qtVersion(); QString program = QFileInfo(qtVersion->qmakeCommand()).fileName(); - m_ui.qmakeArgumentsEdit->setPlainText(program + QLatin1Char(' ') + Utils::Environment::joinArgumentList(m_step->allArguments())); + m_ui.qmakeArgumentsEdit->setPlainText(program + QLatin1Char(' ') + m_step->allArguments()); } //// diff --git a/src/plugins/qt4projectmanager/qmakestep.h b/src/plugins/qt4projectmanager/qmakestep.h index 0f3c00c3ee9..09befadf738 100644 --- a/src/plugins/qt4projectmanager/qmakestep.h +++ b/src/plugins/qt4projectmanager/qmakestep.h @@ -86,11 +86,11 @@ public: bool forced(); // TODO clean up those functions - QStringList allArguments(); + QString allArguments(bool shorted = false); QStringList moreArguments(); QStringList parserArguments(); - QStringList userArguments(); - void setUserArguments(const QStringList &arguments); + QString userArguments(); + void setUserArguments(const QString &arguments); QVariantMap toMap() const; @@ -112,7 +112,7 @@ private: QStringList m_lastEnv; bool m_forced; bool m_needToRunQMake; // set in init(), read in run() - QStringList m_userArgs; + QString m_userArgs; bool m_scriptTemplate; QList<ProjectExplorer::Task> m_tasks; }; diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodebugsupport.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemodebugsupport.cpp index 4b2ac4e5b92..2c2e6156a89 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemodebugsupport.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemodebugsupport.cpp @@ -270,7 +270,7 @@ void MaemoDebugSupport::startDebugging() const QString cmdPrefix = MaemoGlobal::remoteCommandPrefix(remoteExe); const QString env = environment(m_debuggingType, m_runner->userEnvChanges()); - const QString args = m_runner->arguments().join(QLatin1String(" ")); + const QString args = m_runner->arguments(); const QString remoteCommandLine = m_debuggingType == MaemoRunConfiguration::DebugQmlOnly ? QString::fromLocal8Bit("%1 %2 %3 %4").arg(cmdPrefix).arg(env) diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp index 39e74db3390..fe118baee0f 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp @@ -49,6 +49,7 @@ #include <qt4projectmanager/qt4project.h> #include <utils/qtcassert.h> +#include <utils/qtcprocess.h> #include <QtCore/QStringBuilder> @@ -185,7 +186,7 @@ bool MaemoRunConfiguration::fromMap(const QVariantMap &map) if (!RunConfiguration::fromMap(map)) return false; - m_arguments = map.value(ArgumentsKey).toStringList(); + m_arguments = map.value(ArgumentsKey).toString(); const QDir dir = QDir(target()->project()->projectDirectory()); m_proFilePath = dir.filePath(map.value(ProFileKey).toString()); m_useRemoteGdb = map.value(UseRemoteGdbKey, DefaultUseRemoteGdbValue).toBool(); @@ -262,7 +263,7 @@ const QString MaemoRunConfiguration::targetRoot() const return QString(); } -const QStringList MaemoRunConfiguration::arguments() const +const QString MaemoRunConfiguration::arguments() const { return m_arguments; } @@ -334,7 +335,7 @@ bool MaemoRunConfiguration::useRemoteGdb() const return m_useRemoteGdb && toolchain()->allowsRemoteMounts(); } -void MaemoRunConfiguration::setArguments(const QStringList &args) +void MaemoRunConfiguration::setArguments(const QString &args) { m_arguments = args; } diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h index 0288b08a82b..883fef516a6 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h +++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h @@ -92,8 +92,8 @@ public: QString remoteExecutableFilePath() const; const QString sysRoot() const; const QString targetRoot() const; - const QStringList arguments() const; - void setArguments(const QStringList &args); + const QString arguments() const; + void setArguments(const QString &args); MaemoDeviceConfig deviceConfig() const; MaemoPortList freePorts() const; bool useRemoteGdb() const; @@ -149,7 +149,7 @@ private: QString m_proFilePath; mutable QString m_gdbPath; MaemoRemoteMountsModel *m_remoteMounts; - QStringList m_arguments; + QString m_arguments; bool m_useRemoteGdb; BaseEnvironmentBase m_baseEnvironmentBase; diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfigurationwidget.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfigurationwidget.cpp index d2a8799e924..1b1f6eea491 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfigurationwidget.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfigurationwidget.cpp @@ -137,7 +137,7 @@ void MaemoRunConfigurationWidget::addGenericWidgets(QVBoxLayout *mainLayout) formLayout->addRow(tr("Executable on host:"), m_localExecutableLabel); m_remoteExecutableLabel = new QLabel; formLayout->addRow(tr("Executable on device:"), m_remoteExecutableLabel); - m_argsLineEdit = new QLineEdit(m_runConfiguration->arguments().join(" ")); + m_argsLineEdit = new QLineEdit(m_runConfiguration->arguments()); formLayout->addRow(tr("Arguments:"), m_argsLineEdit); QHBoxLayout * const debugButtonsLayout = new QHBoxLayout; @@ -293,7 +293,7 @@ void MaemoRunConfigurationWidget::addEnvironmentWidgets(QVBoxLayout *mainLayout) void MaemoRunConfigurationWidget::argumentsEdited(const QString &text) { - m_runConfiguration->setArguments(text.split(' ', QString::SkipEmptyParts)); + m_runConfiguration->setArguments(text); } void MaemoRunConfigurationWidget::updateTargetInformation() diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemoruncontrol.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemoruncontrol.cpp index aabc0c2c249..388450e41c7 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemoruncontrol.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemoruncontrol.cpp @@ -104,7 +104,7 @@ void MaemoRunControl::startExecution() .arg(MaemoGlobal::remoteCommandPrefix(m_runner->remoteExecutable())) .arg(MaemoGlobal::remoteEnvironment(m_runner->userEnvChanges())) .arg(m_runner->remoteExecutable()) - .arg(m_runner->arguments().join(QLatin1String(" "))).toUtf8()); + .arg(m_runner->arguments()).toUtf8()); } void MaemoRunControl::handleRemoteProcessFinished(qint64 exitCode) diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemosshrunner.h b/src/plugins/qt4projectmanager/qt-maemo/maemosshrunner.h index 94828e5385d..dba27d2e18a 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemosshrunner.h +++ b/src/plugins/qt4projectmanager/qt-maemo/maemosshrunner.h @@ -74,7 +74,7 @@ public: MaemoPortList *freePorts() { return &m_freePorts; } MaemoDeviceConfig deviceConfig() const { return m_devConfig; } QString remoteExecutable() const { return m_remoteExecutable; } - QStringList arguments() const { return m_appArguments; } + QString arguments() const { return m_appArguments; } QList<Utils::EnvironmentItem> userEnvChanges() const { return m_userEnvChanges; } static const qint64 InvalidExitCode; @@ -118,7 +118,7 @@ private: MaemoUsedPortsGatherer * const m_portsGatherer; const MaemoDeviceConfig m_devConfig; const QString m_remoteExecutable; - const QStringList m_appArguments; + const QString m_appArguments; const QList<Utils::EnvironmentItem> m_userEnvChanges; const MaemoPortList m_initialFreePorts; QList<MaemoMountSpecification> m_mountSpecs; diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp index 8958d5686e0..128a96347e9 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp @@ -225,7 +225,7 @@ bool S60DeviceRunConfiguration::fromMap(const QVariantMap &map) const QDir projectDir = QDir(target()->project()->projectDirectory()); m_proFilePath = projectDir.filePath(map.value(QLatin1String(PRO_FILE_KEY)).toString()); - m_commandLineArguments = map.value(QLatin1String(COMMAND_LINE_ARGUMENTS_KEY)).toStringList(); + m_commandLineArguments = map.value(QLatin1String(COMMAND_LINE_ARGUMENTS_KEY)).toString(); if (m_proFilePath.isEmpty()) return false; @@ -368,12 +368,12 @@ QString S60DeviceRunConfiguration::projectFilePath() const return m_proFilePath; } -QStringList S60DeviceRunConfiguration::commandLineArguments() const +QString S60DeviceRunConfiguration::commandLineArguments() const { return m_commandLineArguments; } -void S60DeviceRunConfiguration::setCommandLineArguments(const QStringList &args) +void S60DeviceRunConfiguration::setCommandLineArguments(const QString &args) { m_commandLineArguments = args; } diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h index bee69b71ecd..8e0b479febd 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h @@ -77,8 +77,8 @@ public: ProjectExplorer::OutputFormatter *createOutputFormatter() const; - QStringList commandLineArguments() const; - void setCommandLineArguments(const QStringList &args); + QString commandLineArguments() const; + void setCommandLineArguments(const QString &args); QString projectFilePath() const; @@ -112,7 +112,7 @@ private: void handleParserState(bool sucess); QString m_proFilePath; - QStringList m_commandLineArguments; + QString m_commandLineArguments; bool m_validParse; }; @@ -184,7 +184,7 @@ private: QString m_serialPortName; QString m_serialPortFriendlyName; QString m_targetName; - QStringList m_commandLineArguments; + QString m_commandLineArguments; QString m_executableFileName; QString m_qtDir; QString m_qtBinPath; diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfigurationwidget.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfigurationwidget.cpp index 339343dfac8..7aa0c2d7050 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfigurationwidget.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfigurationwidget.cpp @@ -46,7 +46,7 @@ S60DeviceRunConfigurationWidget::S60DeviceRunConfigurationWidget( : QWidget(parent), m_runConfiguration(runConfiguration), m_detailsWidget(new Utils::DetailsWidget), - m_argumentsLineEdit(new QLineEdit(m_runConfiguration->commandLineArguments().join(QString(QLatin1Char(' '))))) + m_argumentsLineEdit(new QLineEdit(m_runConfiguration->commandLineArguments())) { m_detailsWidget->setState(Utils::DetailsWidget::NoSummary); QVBoxLayout *mainBoxLayout = new QVBoxLayout(); @@ -76,13 +76,7 @@ S60DeviceRunConfigurationWidget::S60DeviceRunConfigurationWidget( void S60DeviceRunConfigurationWidget::argumentsEdited(const QString &text) { - const QString trimmed = text.trimmed(); - if (trimmed.isEmpty()) { - m_runConfiguration->setCommandLineArguments(QStringList()); - } else { - m_runConfiguration->setCommandLineArguments(trimmed.split(QLatin1Char(' '), - QString::SkipEmptyParts)); - } + m_runConfiguration->setCommandLineArguments(text.trimmed()); } void S60DeviceRunConfigurationWidget::runConfigurationEnabledChange(bool enabled) diff --git a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp index d01a3686537..2fb2d1c6fe1 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp @@ -327,7 +327,7 @@ S60EmulatorRunControl::S60EmulatorRunControl(S60EmulatorRunConfiguration *runCon // stuff like the EPOCROOT and EPOCDEVICE env variable Utils::Environment env = Utils::Environment::systemEnvironment(); runConfiguration->qt4Target()->activeBuildConfiguration()->toolChain()->addToEnvironment(env); - m_applicationLauncher.setEnvironment(env.toStringList()); + m_applicationLauncher.setEnvironment(env); m_executable = runConfiguration->executable(); connect(&m_applicationLauncher, SIGNAL(applicationError(QString)), @@ -342,7 +342,7 @@ S60EmulatorRunControl::S60EmulatorRunControl(S60EmulatorRunConfiguration *runCon void S60EmulatorRunControl::start() { - m_applicationLauncher.start(ApplicationLauncher::Gui, m_executable, QStringList()); + m_applicationLauncher.start(ApplicationLauncher::Gui, m_executable, QString()); emit started(); emit appendMessage(this, tr("Starting %1...").arg(QDir::toNativeSeparators(m_executable)), false); diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp index d19abc99fa4..54cb7f82946 100644 --- a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp @@ -37,6 +37,7 @@ #include "makestep.h" #include <utils/qtcassert.h> +#include <utils/qtcprocess.h> #include <limits> #include <projectexplorer/buildsteplist.h> #include <projectexplorer/projectexplorerconstants.h> @@ -494,7 +495,7 @@ bool Qt4BuildConfiguration::compareToImportFrom(const QString &makefile) QtVersion *version = qtVersion(); if (version->qmakeCommand() == qmakePath) { // same qtversion - QPair<QtVersion::QmakeBuildConfigs, QStringList> result = + QPair<QtVersion::QmakeBuildConfigs, QString> result = QtVersionManager::scanMakeFile(makefile, version->defaultBuildConfig()); if (qmakeBuildConfiguration() == result.first) { // The qmake Build Configuration are the same, @@ -502,18 +503,18 @@ bool Qt4BuildConfiguration::compareToImportFrom(const QString &makefile) // we have to compare without the spec/platform cmd argument // and compare that on its own QString workingDirectory = QFileInfo(makefile).absolutePath(); - QString actualSpec = extractSpecFromArgumentList(qs->userArguments(), workingDirectory, version); + QString userArgs = qs->userArguments(); + QStringList actualArgs; + QString actualSpec = extractSpecFromArguments(&userArgs, workingDirectory, version, &actualArgs); if (actualSpec.isEmpty()) { // Easy one: the user has chosen not to override the settings actualSpec = version->mkspec(); } + actualArgs += qs->moreArguments(); - - QString parsedSpec = extractSpecFromArgumentList(result.second, workingDirectory, version); - QStringList actualArgs = qs->moreArguments(); - actualArgs << qs->userArguments(); - actualArgs = removeSpecFromArgumentList(actualArgs); - QStringList parsedArgs = removeSpecFromArgumentList(result.second); + QString qmakeArgs = result.second; + QStringList parsedArgs; + QString parsedSpec = extractSpecFromArguments(&qmakeArgs, workingDirectory, version, &parsedArgs); if (debug) { qDebug()<<"Actual args:"<<actualArgs; @@ -558,59 +559,53 @@ bool Qt4BuildConfiguration::compareToImportFrom(const QString &makefile) return false; } -QStringList Qt4BuildConfiguration::removeQMLInspectorFromArgumentList(const QStringList &old) +void Qt4BuildConfiguration::removeQMLInspectorFromArguments(QString *args) { - QStringList result; - foreach (const QString &str, old) - if (!str.startsWith(QLatin1String(Constants::QMAKEVAR_QMLJSDEBUGGER_PATH))) - result << str; - return result; + for (Utils::QtcProcess::ArgIterator ait(args); ait.next(); ) + if (ait.value().startsWith(QLatin1String(Constants::QMAKEVAR_QMLJSDEBUGGER_PATH))) + ait.deleteArg(); } -// We match -spec and -platfrom separetly -// We ignore -cache, because qmake contained a bug that it didn't -// mention the -cache in the Makefile -// That means changing the -cache option in the additional arguments -// does not automatically rerun qmake. Alas, we could try more -// intelligent matching for -cache, but i guess people rarely -// do use that. - -QStringList Qt4BuildConfiguration::removeSpecFromArgumentList(const QStringList &old) +QString Qt4BuildConfiguration::extractSpecFromArguments(QString *args, + const QString &directory, const QtVersion *version, + QStringList *outArgs) { - if (!old.contains("-spec") && !old.contains("-platform") && !old.contains("-cache")) - return old; - QStringList newList; + QString parsedSpec; + bool ignoreNext = false; - foreach(const QString &item, old) { + bool nextIsSpec = false; + for (Utils::QtcProcess::ArgIterator ait(args); ait.next(); ) { if (ignoreNext) { ignoreNext = false; - } else if (item == "-spec" || item == "-platform" || item == "-cache") { + ait.deleteArg(); + } else if (nextIsSpec) { + nextIsSpec = false; + parsedSpec = QDir::cleanPath(ait.value()); + ait.deleteArg(); + } else if (ait.value() == QLatin1String("-spec") || ait.value() == QLatin1String("-platform")) { + nextIsSpec = true; + ait.deleteArg(); + } else if (ait.value() == QLatin1String("-cache")) { + // We ignore -cache, because qmake contained a bug that it didn't + // mention the -cache in the Makefile. + // That means changing the -cache option in the additional arguments + // does not automatically rerun qmake. Alas, we could try more + // intelligent matching for -cache, but i guess people rarely + // do use that. ignoreNext = true; - } else { - newList << item; + ait.deleteArg(); + } else if (outArgs && ait.isSimple()) { + outArgs->append(ait.value()); } } - return newList; -} - -QString Qt4BuildConfiguration::extractSpecFromArgumentList(const QStringList &list, QString directory, QtVersion *version) -{ - int index = list.indexOf("-spec"); - if (index == -1) - index = list.indexOf("-platform"); - if (index == -1) - return QString(); - - ++index; - if (index >= list.length()) + if (parsedSpec.isEmpty()) return QString(); QString baseMkspecDir = version->versionInfo().value("QMAKE_MKSPECS"); if (baseMkspecDir.isEmpty()) baseMkspecDir = version->versionInfo().value("QT_INSTALL_DATA") + "/mkspecs"; - QString parsedSpec = QDir::cleanPath(list.at(index)); #ifdef Q_OS_WIN baseMkspecDir = baseMkspecDir.toLower(); parsedSpec = parsedSpec.toLower(); @@ -753,12 +748,12 @@ BuildConfiguration *Qt4BuildConfigurationFactory::create(ProjectExplorer::Target qt4Target->addQt4BuildConfiguration(tr("%1 Debug").arg(buildConfigurationName), version, (version->defaultBuildConfig() | QtVersion::DebugBuild), - QStringList(), QString()); + QString(), QString()); BuildConfiguration *bc = qt4Target->addQt4BuildConfiguration(tr("%1 Release").arg(buildConfigurationName), version, (version->defaultBuildConfig() & ~QtVersion::DebugBuild), - QStringList(), QString()); + QString(), QString()); return bc; } diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.h b/src/plugins/qt4projectmanager/qt4buildconfiguration.h index 956c95e73c2..2a1940bbfec 100644 --- a/src/plugins/qt4projectmanager/qt4buildconfiguration.h +++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.h @@ -109,9 +109,10 @@ public: QString makefile() const; bool compareToImportFrom(const QString &makefile); - static QStringList removeQMLInspectorFromArgumentList(const QStringList &old); - static QStringList removeSpecFromArgumentList(const QStringList &old); - static QString extractSpecFromArgumentList(const QStringList &list, QString directory, QtVersion *version); + static void removeQMLInspectorFromArguments(QString *args); + static QString extractSpecFromArguments(QString *arguments, + const QString &directory, const QtVersion *version, + QStringList *outArgs = 0); QVariantMap toMap() const; diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp index 081a20d2ae2..1056bf935d2 100644 --- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp +++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp @@ -43,6 +43,7 @@ #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/buildconfiguration.h> #include <utils/qtcassert.h> +#include <utils/qtcprocess.h> #include <extensionsystem/pluginmanager.h> #include <QtGui/QFileDialog> @@ -416,20 +417,22 @@ void Qt4ProjectConfigWidget::importLabelClicked() vm->addVersion(version); } - QPair<QtVersion::QmakeBuildConfigs, QStringList> result = + QPair<QtVersion::QmakeBuildConfigs, QString> result = QtVersionManager::scanMakeFile(directory, version->defaultBuildConfig()); QtVersion::QmakeBuildConfigs qmakeBuildConfig = result.first; - QStringList additionalArguments = Qt4BuildConfiguration::removeSpecFromArgumentList(result.second); - QString parsedSpec = Qt4BuildConfiguration::extractSpecFromArgumentList(result.second, directory, version); + + QString aa = result.second; + QString parsedSpec = Qt4BuildConfiguration::extractSpecFromArguments(&aa, directory, version); QString versionSpec = version->mkspec(); + QString additionalArguments; if (parsedSpec.isEmpty() || parsedSpec == versionSpec || parsedSpec == "default") { // using the default spec, don't modify additional arguments } else { - additionalArguments.prepend(parsedSpec); - additionalArguments.prepend("-spec"); + additionalArguments = "-spec " + Utils::QtcProcess::quoteArg(parsedSpec); } + Utils::QtcProcess::addArgs(&additionalArguments, aa); - additionalArguments = Qt4BuildConfiguration::removeQMLInspectorFromArgumentList(additionalArguments); + Qt4BuildConfiguration::removeQMLInspectorFromArguments(&additionalArguments); // So we got all the information now apply it... m_buildConfiguration->setQtVersion(version); @@ -443,16 +446,25 @@ void Qt4ProjectConfigWidget::importLabelClicked() // If we are switching to BuildAll we want "release" in there and no "debug" // or "debug" in there and no "release" // If we are switching to not BuildAl we want neither "release" nor "debug" in there - QStringList makeCmdArguments = makeStep->userArguments(); bool debug = qmakeBuildConfig & QtVersion::DebugBuild; - if (qmakeBuildConfig & QtVersion::BuildAll) { - makeCmdArguments.removeAll(debug ? "release" : "debug"); - if (!makeCmdArguments.contains(debug ? "debug" : "release")) - makeCmdArguments.append(debug ? "debug" : "release"); - } else { - makeCmdArguments.removeAll("debug"); - makeCmdArguments.removeAll("release"); + bool haveTag = !(qmakeBuildConfig & QtVersion::BuildAll); + QString makeCmdArguments = makeStep->userArguments(); + Utils::QtcProcess::ArgIterator ait(&makeCmdArguments); + while (ait.next()) { + if (ait.value() == QLatin1String("debug")) { + if (!haveTag && debug) + haveTag = true; + else + ait.deleteArg(); + } else if (ait.value() == QLatin1String("release")) { + if (!haveTag && !debug) + haveTag = true; + else + ait.deleteArg(); + } } + if (!haveTag) + ait.appendArg(QLatin1String(debug ? "debug" : "release")); makeStep->setUserArguments(makeCmdArguments); } } diff --git a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp index 132d7be6bd4..5866a02e56d 100644 --- a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp @@ -47,6 +47,7 @@ #include <projectexplorer/environmenteditmodel.h> #include <projectexplorer/persistentsettings.h> #include <utils/qtcassert.h> +#include <utils/qtcprocess.h> #include <utils/pathchooser.h> #include <utils/detailswidget.h> #include <utils/debuggerlanguagechooser.h> @@ -220,7 +221,7 @@ Qt4RunConfigurationWidget::Qt4RunConfigurationWidget(Qt4RunConfiguration *qt4Run toplayout->addRow(tr("Executable:"), m_executableLineEdit); QLabel *argumentsLabel = new QLabel(tr("Arguments:"), this); - m_argumentsLineEdit = new QLineEdit(Utils::Environment::joinArgumentList(qt4RunConfiguration->baseCommandLineArguments()), this); + m_argumentsLineEdit = new QLineEdit(qt4RunConfiguration->commandLineArguments(), this); argumentsLabel->setBuddy(m_argumentsLineEdit); toplayout->addRow(argumentsLabel, m_argumentsLineEdit); @@ -326,7 +327,7 @@ Qt4RunConfigurationWidget::Qt4RunConfigurationWidget(Qt4RunConfiguration *qt4Run connect(qt4RunConfiguration, SIGNAL(baseWorkingDirectoryChanged(QString)), this, SLOT(workingDirectoryChanged(QString))); - connect(qt4RunConfiguration, SIGNAL(baseCommandLineArgumentsChanged(QString)), + connect(qt4RunConfiguration, SIGNAL(commandLineArgumentsChanged(QString)), this, SLOT(commandLineArgumentsChanged(QString))); connect(qt4RunConfiguration, SIGNAL(runModeChanged(ProjectExplorer::LocalApplicationRunConfiguration::RunMode)), this, SLOT(runModeChanged(ProjectExplorer::LocalApplicationRunConfiguration::RunMode))); @@ -424,7 +425,7 @@ void Qt4RunConfigurationWidget::workingDirectoryReseted() void Qt4RunConfigurationWidget::argumentsEdited(const QString &args) { m_ignoreChange = true; - m_qt4RunConfiguration->setBaseCommandLineArguments(args); + m_qt4RunConfiguration->setCommandLineArguments(args); m_ignoreChange = false; } @@ -514,7 +515,7 @@ QVariantMap Qt4RunConfiguration::toMap() const bool Qt4RunConfiguration::fromMap(const QVariantMap &map) { const QDir projectDir = QDir(target()->project()->projectDirectory()); - m_commandLineArguments = map.value(QLatin1String(COMMAND_LINE_ARGUMENTS_KEY)).toStringList(); + m_commandLineArguments = map.value(QLatin1String(COMMAND_LINE_ARGUMENTS_KEY)).toString(); m_proFilePath = projectDir.filePath(map.value(QLatin1String(PRO_FILE_KEY)).toString()); m_runMode = map.value(QLatin1String(USE_TERMINAL_KEY), false).toBool() ? Console : Gui; m_isUsingDyldImageSuffix = map.value(QLatin1String(USE_DYLD_IMAGE_SUFFIX_KEY), false).toBool(); @@ -573,12 +574,7 @@ QString Qt4RunConfiguration::baseWorkingDirectory() const return ti.workingDir; } -QStringList Qt4RunConfiguration::commandLineArguments() const -{ - return environment().expandVariables(baseCommandLineArguments()); -} - -QStringList Qt4RunConfiguration::baseCommandLineArguments() const +QString Qt4RunConfiguration::commandLineArguments() const { return m_commandLineArguments; } @@ -651,10 +647,10 @@ void Qt4RunConfiguration::setBaseWorkingDirectory(const QString &wd) emit baseWorkingDirectoryChanged(newWorkingDirectory); } -void Qt4RunConfiguration::setBaseCommandLineArguments(const QString &argumentsString) +void Qt4RunConfiguration::setCommandLineArguments(const QString &argumentsString) { - m_commandLineArguments = Utils::Environment::parseCombinedArgString(argumentsString); - emit baseCommandLineArgumentsChanged(argumentsString); + m_commandLineArguments = argumentsString; + emit commandLineArgumentsChanged(argumentsString); } void Qt4RunConfiguration::setRunMode(RunMode runMode) diff --git a/src/plugins/qt4projectmanager/qt4runconfiguration.h b/src/plugins/qt4projectmanager/qt4runconfiguration.h index 413f214253e..3a57cc87f40 100644 --- a/src/plugins/qt4projectmanager/qt4runconfiguration.h +++ b/src/plugins/qt4projectmanager/qt4runconfiguration.h @@ -84,7 +84,7 @@ public: virtual QString executable() const; virtual RunMode runMode() const; virtual QString workingDirectory() const; - virtual QStringList commandLineArguments() const; + virtual QString commandLineArguments() const; virtual Utils::Environment environment() const; virtual QString dumperLibrary() const; virtual QStringList dumperLibraryLocations() const; @@ -101,7 +101,7 @@ public: ProjectExplorer::OutputFormatter *createOutputFormatter() const; signals: - void baseCommandLineArgumentsChanged(const QString&); + void commandLineArgumentsChanged(const QString&); void baseWorkingDirectoryChanged(const QString&); void runModeChanged(ProjectExplorer::LocalApplicationRunConfiguration::RunMode runMode); void usingDyldImageSuffixChanged(bool); @@ -124,8 +124,7 @@ private: void setRunMode(RunMode runMode); void setBaseWorkingDirectory(const QString &workingDirectory); QString baseWorkingDirectory() const; - void setBaseCommandLineArguments(const QString &argumentsString); - QStringList baseCommandLineArguments() const; + void setCommandLineArguments(const QString &argumentsString); enum BaseEnvironmentBase { CleanEnvironmentBase = 0, SystemEnvironmentBase = 1, BuildEnvironmentBase = 2 }; @@ -141,7 +140,7 @@ private: QList<Utils::EnvironmentItem> userEnvironmentChanges() const; void updateTarget(); - QStringList m_commandLineArguments; + QString m_commandLineArguments; QString m_proFilePath; // Full path to the Application Pro File // Cached startup sub project information diff --git a/src/plugins/qt4projectmanager/qt4target.cpp b/src/plugins/qt4projectmanager/qt4target.cpp index ccdbbc6b228..e154d20ae7a 100644 --- a/src/plugins/qt4projectmanager/qt4target.cpp +++ b/src/plugins/qt4projectmanager/qt4target.cpp @@ -274,7 +274,7 @@ Qt4Project *Qt4Target::qt4Project() const Qt4BuildConfiguration *Qt4Target::addQt4BuildConfiguration(QString displayName, QtVersion *qtversion, QtVersion::QmakeBuildConfigs qmakeBuildConfiguration, - QStringList additionalArguments, + QString additionalArguments, QString directory) { Q_ASSERT(qtversion); @@ -297,14 +297,14 @@ Qt4BuildConfiguration *Qt4Target::addQt4BuildConfiguration(QString displayName, MakeStep* cleanStep = new MakeStep(cleanSteps); cleanStep->setClean(true); - cleanStep->setUserArguments(QStringList() << "clean"); + cleanStep->setUserArguments("clean"); cleanSteps->insertStep(0, cleanStep); if (!additionalArguments.isEmpty()) qmakeStep->setUserArguments(additionalArguments); // set some options for qmake and make if (qmakeBuildConfiguration & QtVersion::BuildAll) // debug_and_release => explicit targets - makeStep->setUserArguments(QStringList() << (debug ? "debug" : "release")); + makeStep->setUserArguments(debug ? "debug" : "release"); bc->setQMakeBuildConfiguration(qmakeBuildConfiguration); diff --git a/src/plugins/qt4projectmanager/qt4target.h b/src/plugins/qt4projectmanager/qt4target.h index fa5c1cca857..d6df4457c5a 100644 --- a/src/plugins/qt4projectmanager/qt4target.h +++ b/src/plugins/qt4projectmanager/qt4target.h @@ -47,12 +47,12 @@ class Qt4DeployConfigurationFactory; struct BuildConfigurationInfo { explicit BuildConfigurationInfo(QtVersion *v = 0, QtVersion::QmakeBuildConfigs bc = QtVersion::QmakeBuildConfig(0), - const QStringList &aa = QStringList(), const QString &d = QString()) : + const QString &aa = QString(), const QString &d = QString()) : version(v), buildConfig(bc), additionalArguments(aa), directory(d) { } QtVersion *version; QtVersion::QmakeBuildConfigs buildConfig; - QStringList additionalArguments; + QString additionalArguments; QString directory; }; @@ -71,7 +71,7 @@ public: Internal::Qt4BuildConfiguration *addQt4BuildConfiguration(QString displayName, QtVersion *qtversion, QtVersion::QmakeBuildConfigs qmakeBuildConfiguration, - QStringList additionalArguments, + QString additionalArguments, QString directory); void addRunConfigurationForPath(const QString &proFilePath); diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp index ff9fb7ad4d0..16867f72787 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.cpp +++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp @@ -49,6 +49,7 @@ #include <coreplugin/helpmanager.h> #include <extensionsystem/pluginmanager.h> #include <utils/qtcassert.h> +#include <utils/qtcprocess.h> #ifdef Q_OS_WIN # include <utils/winutils.h> #endif @@ -884,25 +885,21 @@ bool QtVersionManager::makefileIsFor(const QString &makefile, const QString &pro return srcFileInfo == proFileInfo; } -QPair<QtVersion::QmakeBuildConfigs, QStringList> QtVersionManager::scanMakeFile(const QString &makefile, QtVersion::QmakeBuildConfigs defaultBuildConfig) +QPair<QtVersion::QmakeBuildConfigs, QString> QtVersionManager::scanMakeFile(const QString &makefile, QtVersion::QmakeBuildConfigs defaultBuildConfig) { if (debug) qDebug()<<"ScanMakeFile, the gory details:"; QtVersion::QmakeBuildConfigs result = defaultBuildConfig; - QStringList result2; + QString result2; QString line = findQMakeLine(makefile, QLatin1String("# Command:")); if (!line.isEmpty()) { if (debug) qDebug()<<"Found line"<<line; line = trimLine(line); - QStringList parts = splitLine(line); - if (debug) - qDebug()<<"Split into"<<parts; QList<QMakeAssignment> assignments; QList<QMakeAssignment> afterAssignments; - QStringList additionalArguments; - parseParts(parts, &assignments, &afterAssignments, &additionalArguments); + parseArgs(line, &assignments, &afterAssignments, &result2); if (debug) { dumpQMakeAssignments(assignments); @@ -918,13 +915,12 @@ QPair<QtVersion::QmakeBuildConfigs, QStringList> QtVersionManager::scanMakeFile( if (debug) dumpQMakeAssignments(assignments); - result2.append(additionalArguments); foreach(const QMakeAssignment &qa, assignments) - result2.append(qa.variable + qa.op + qa.value); + Utils::QtcProcess::addArg(&result2, qa.variable + qa.op + qa.value); if (!afterAssignments.isEmpty()) { - result2.append("-after"); + Utils::QtcProcess::addArg(&result2, QLatin1String("-after")); foreach(const QMakeAssignment &qa, afterAssignments) - result2.append(qa.variable + qa.op + qa.value); + Utils::QtcProcess::addArg(&result2, qa.variable + qa.op + qa.value); } } @@ -965,55 +961,23 @@ QString QtVersionManager::trimLine(const QString line) return line.mid(firstSpace).trimmed(); } -QStringList QtVersionManager::splitLine(const QString &line) -{ - // Split on each " ", except on those which are escaped - // On Unix also remove all escaping - // On Windows also, but different escaping - bool escape = false; - QString currentWord; - QStringList results; - int length = line.length(); - for (int i=0; i<length; ++i) { -#ifdef Q_OS_WIN - if (line.at(i) == '"') { - escape = !escape; - } else if (escape || line.at(i) != ' ') { - currentWord += line.at(i); - } else { - results << currentWord; - currentWord.clear();; - } -#else - if (escape) { - currentWord += line.at(i); - escape = false; - } else if (line.at(i) == ' ') { - results << currentWord; - currentWord.clear(); - } else if (line.at(i) == '\\') { - escape = true; - } else { - currentWord += line.at(i); - } -#endif - } - return results; -} - -void QtVersionManager::parseParts(const QStringList &parts, QList<QMakeAssignment> *assignments, QList<QMakeAssignment> *afterAssignments, QStringList *additionalArguments) +void QtVersionManager::parseArgs(const QString &args, QList<QMakeAssignment> *assignments, QList<QMakeAssignment> *afterAssignments, QString *additionalArguments) { QRegExp regExp("([^\\s\\+-]*)\\s*(\\+=|=|-=|~=)(.*)"); bool after = false; bool ignoreNext = false; - foreach (const QString &part, parts) { + *additionalArguments = args; + Utils::QtcProcess::ArgIterator ait(additionalArguments); + while (ait.next()) { if (ignoreNext) { // Ignoring ignoreNext = false; - } else if (part == "-after") { + ait.deleteArg(); + } else if (ait.value() == QLatin1String("-after")) { after = true; - } else if(part.contains('=')) { - if (regExp.exactMatch(part)) { + ait.deleteArg(); + } else if (ait.value().contains(QLatin1Char('='))) { + if (regExp.exactMatch(ait.value())) { QMakeAssignment qa; qa.variable = regExp.cap(1); qa.op = regExp.cap(2); @@ -1025,21 +989,23 @@ void QtVersionManager::parseParts(const QStringList &parts, QList<QMakeAssignmen } else { qDebug()<<"regexp did not match"; } - } else if (part == "-o") { + ait.deleteArg(); + } else if (ait.value() == QLatin1String("-o")) { ignoreNext = true; - } else { - additionalArguments->append(part); - } - } + ait.deleteArg(); #if defined(Q_OS_WIN32) - additionalArguments->removeAll("-win32"); + } else if (ait.value() == QLatin1String("-win32")) { #elif defined(Q_OS_MAC) - additionalArguments->removeAll("-macx"); + } else if (ait.value() == QLatin1String("-macx")) { #elif defined(Q_OS_QNX6) - additionalArguments->removeAll("-qnx6"); + } else if (ait.value() == QLatin1String("-qnx6")) { #else - additionalArguments->removeAll("-unix"); + } else if (ait.value() == QLatin1String("-unix")) { #endif + ait.deleteArg(); + } + } + ait.deleteArg(); // The .pro file is always the last arg } /// This function extracts all the CONFIG+=debug, CONFIG+=release diff --git a/src/plugins/qt4projectmanager/qtversionmanager.h b/src/plugins/qt4projectmanager/qtversionmanager.h index 90d52c95ab2..9462a7ffb4d 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.h +++ b/src/plugins/qt4projectmanager/qtversionmanager.h @@ -265,9 +265,9 @@ public: // Static Methods static bool makefileIsFor(const QString &makefile, const QString &proFile); - static QPair<QtVersion::QmakeBuildConfigs, QStringList> scanMakeFile(const QString &makefile, - QtVersion::QmakeBuildConfigs defaultBuildConfig); - static QString findQMakeBinaryFromMakefile(const QString &makefile); + static QPair<QtVersion::QmakeBuildConfigs, QString> scanMakeFile(const QString &makefile, + QtVersion::QmakeBuildConfigs defaultBuildConfig); + static QString findQMakeBinaryFromMakefile(const QString &directory); bool isValidId(int id) const; signals: @@ -281,11 +281,10 @@ private: static bool equals(QtVersion *a, QtVersion *b); static QString findQMakeLine(const QString &directory, const QString &key); static QString trimLine(const QString line); - static QStringList splitLine(const QString &line); - static void parseParts(const QStringList &parts, - QList<QMakeAssignment> *assignments, - QList<QMakeAssignment> *afterAssignments, - QStringList *additionalArguments); + static void parseArgs(const QString &args, + QList<QMakeAssignment> *assignments, + QList<QMakeAssignment> *afterAssignments, + QString *additionalArguments); static QtVersion::QmakeBuildConfigs qmakeBuildConfigFromCmdArgs(QList<QMakeAssignment> *assignments, QtVersion::QmakeBuildConfigs defaultBuildConfig); // Used by QtOptionsPage diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp index 227b0b5946f..601472054e5 100644 --- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp +++ b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp @@ -40,6 +40,7 @@ #include <projectexplorer/task.h> #include <projectexplorer/taskhub.h> #include <utils/qtcassert.h> +#include <utils/qtcprocess.h> #include <QtGui/QAction> #include <QtGui/QFileDialog> @@ -415,21 +416,20 @@ TargetSetupPage::recursivelyCheckDirectoryForBuild(const QString &directory, con info.isTemporary = true; } - QPair<QtVersion::QmakeBuildConfigs, QStringList> result = + QPair<QtVersion::QmakeBuildConfigs, QString> result = QtVersionManager::scanMakeFile(directory + "/Makefile", info.version->defaultBuildConfig()); info.buildConfig = result.first; - info.additionalArguments = Qt4BuildConfiguration::removeSpecFromArgumentList(result.second); - - QString parsedSpec = Qt4BuildConfiguration::extractSpecFromArgumentList(result.second, directory, info.version); + QString aa = result.second; + QString parsedSpec = Qt4BuildConfiguration::extractSpecFromArguments(&aa, directory, info.version); QString versionSpec = info.version->mkspec(); // Compare mkspecs and add to additional arguments if (parsedSpec.isEmpty() || parsedSpec == versionSpec || parsedSpec == "default") { // using the default spec, don't modify additional arguments } else { - info.additionalArguments.prepend(parsedSpec); - info.additionalArguments.prepend("-spec"); + info.additionalArguments = "-spec " + Utils::QtcProcess::quoteArg(parsedSpec); } + Utils::QtcProcess::addArgs(&info.additionalArguments, aa); results.append(info); return results; diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.h b/src/plugins/qt4projectmanager/wizards/targetsetuppage.h index e29b9343b71..e354e6a243c 100644 --- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.h +++ b/src/plugins/qt4projectmanager/wizards/targetsetuppage.h @@ -87,7 +87,7 @@ public: QtVersion *version; bool isTemporary; QtVersion::QmakeBuildConfigs buildConfig; - QStringList additionalArguments; + QString additionalArguments; QString directory; bool isExistingBuild; bool isShadowBuild; |