| 
									
										
										
										
											2010-11-12 17:23:55 +01:00
										 |  |  | /**************************************************************************
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** This file is part of Qt Creator | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2011-01-11 16:28:15 +01:00
										 |  |  | ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). | 
					
						
							| 
									
										
										
										
											2010-11-12 17:23:55 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2011-04-13 08:42:33 +02:00
										 |  |  | ** Contact: Nokia Corporation (info@qt.nokia.com) | 
					
						
							| 
									
										
										
										
											2010-11-12 17:23:55 +01:00
										 |  |  | ** | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** GNU Lesser General Public License Usage | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2011-04-13 08:42:33 +02:00
										 |  |  | ** 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.
 | 
					
						
							| 
									
										
										
										
											2010-11-12 17:23:55 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2010-12-17 17:14:20 +01:00
										 |  |  | ** In addition, as a special exception, Nokia gives you certain additional | 
					
						
							| 
									
										
										
										
											2011-04-13 08:42:33 +02:00
										 |  |  | ** rights. These rights are described in the Nokia Qt LGPL Exception | 
					
						
							| 
									
										
										
										
											2010-12-17 17:14:20 +01:00
										 |  |  | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2011-04-13 08:42:33 +02:00
										 |  |  | ** 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. | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2010-12-17 17:14:20 +01:00
										 |  |  | ** If you have questions regarding the use of this file, please contact | 
					
						
							| 
									
										
										
										
											2011-05-06 15:05:37 +02:00
										 |  |  | ** Nokia at info@qt.nokia.com. | 
					
						
							| 
									
										
										
										
											2010-11-12 17:23:55 +01:00
										 |  |  | ** | 
					
						
							|  |  |  | **************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "processparameters.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <utils/stringutils.h>
 | 
					
						
							|  |  |  | #include <utils/qtcprocess.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <QtCore/QFileInfo>
 | 
					
						
							|  |  |  | #include <QtCore/QDir>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-14 12:58:14 +02:00
										 |  |  | /*!
 | 
					
						
							|  |  |  |     \class ProjectExplorer::ProcessParameters | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \brief ProcessParameters aggregates all parameters needed to start a process. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     It offers a set of functions which expand macros and environment variables | 
					
						
							|  |  |  |     inside the raw parameters to obtain final values for starting a process | 
					
						
							|  |  |  |     or for display purposes. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \sa ProjectExplorer::AbstractProcessStep | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-12 17:23:55 +01:00
										 |  |  | using namespace ProjectExplorer; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ProcessParameters::ProcessParameters() : | 
					
						
							|  |  |  |     m_macroExpander(0), | 
					
						
							|  |  |  |     m_commandMissing(false) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-14 12:58:14 +02:00
										 |  |  | /*!
 | 
					
						
							|  |  |  |     \brief Sets the executable to run. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-12 17:23:55 +01:00
										 |  |  | void ProcessParameters::setCommand(const QString &cmd) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_command = cmd; | 
					
						
							|  |  |  |     m_effectiveCommand.clear(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-14 12:58:14 +02:00
										 |  |  | /*!
 | 
					
						
							|  |  |  |     \brief Sets the command line arguments used by the process | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-12 17:23:55 +01:00
										 |  |  | void ProcessParameters::setArguments(const QString &arguments) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_arguments = arguments; | 
					
						
							|  |  |  |     m_effectiveArguments.clear(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-14 12:58:14 +02:00
										 |  |  | /*!
 | 
					
						
							|  |  |  |     \brief Sets the workingDirectory for the process for a buildConfiguration | 
					
						
							|  |  |  |     should be called from init() | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-12 17:23:55 +01:00
										 |  |  | void ProcessParameters::setWorkingDirectory(const QString &workingDirectory) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_workingDirectory = workingDirectory; | 
					
						
							|  |  |  |     m_effectiveWorkingDirectory.clear(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-14 12:58:14 +02:00
										 |  |  | /*!
 | 
					
						
							|  |  |  |     \fn void ProjectExplorer::ProcessParameters::setEnvironment(const Utils::Environment &env) | 
					
						
							|  |  |  |     \brief Set the Environment for running the command | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Should be called from init() | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*!
 | 
					
						
							|  |  |  |    \fn  void ProjectExplorer::ProcessParameters::setMacroExpander(Utils::AbstractMacroExpander *mx) | 
					
						
							|  |  |  |    \brief Set the macro expander to use on the command, arguments and working dir. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Note that the caller retains ownership of the object. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*!
 | 
					
						
							|  |  |  |     \brief Get the fully expanded working directory. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-12 17:23:55 +01:00
										 |  |  | QString ProcessParameters::effectiveWorkingDirectory() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (m_effectiveWorkingDirectory.isEmpty()) { | 
					
						
							|  |  |  |         QString wds = m_workingDirectory; | 
					
						
							|  |  |  |         if (m_macroExpander) | 
					
						
							|  |  |  |             Utils::expandMacros(&wds, m_macroExpander); | 
					
						
							|  |  |  |         m_effectiveWorkingDirectory = QDir::cleanPath(m_environment.expandVariables(wds)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return m_effectiveWorkingDirectory; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-14 12:58:14 +02:00
										 |  |  | /*!
 | 
					
						
							|  |  |  |     \brief Get the fully expanded command name to run | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-12 17:23:55 +01:00
										 |  |  | QString ProcessParameters::effectiveCommand() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (m_effectiveCommand.isEmpty()) { | 
					
						
							|  |  |  |         QString cmd = m_command; | 
					
						
							|  |  |  |         if (m_macroExpander) | 
					
						
							|  |  |  |             Utils::expandMacros(&cmd, m_macroExpander); | 
					
						
							|  |  |  |         m_effectiveCommand = QDir::cleanPath(m_environment.searchInPath( | 
					
						
							|  |  |  |                     cmd, QStringList() << effectiveWorkingDirectory())); | 
					
						
							|  |  |  |         m_commandMissing = m_effectiveCommand.isEmpty(); | 
					
						
							|  |  |  |         if (m_commandMissing) | 
					
						
							|  |  |  |             m_effectiveCommand = cmd; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return m_effectiveCommand; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-14 12:58:14 +02:00
										 |  |  | /*!
 | 
					
						
							|  |  |  |     \brief True if effectiveCommand() would return only a fallback. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-12 17:23:55 +01:00
										 |  |  | bool ProcessParameters::commandMissing() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     effectiveCommand(); | 
					
						
							|  |  |  |     return m_commandMissing; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QString ProcessParameters::effectiveArguments() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (m_effectiveArguments.isEmpty()) { | 
					
						
							|  |  |  |         m_effectiveArguments = m_arguments; | 
					
						
							|  |  |  |         if (m_macroExpander) | 
					
						
							|  |  |  |             Utils::expandMacros(&m_effectiveArguments, m_macroExpander); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return m_effectiveArguments; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QString ProcessParameters::prettyCommand() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QString cmd = m_command; | 
					
						
							|  |  |  |     if (m_macroExpander) | 
					
						
							|  |  |  |         Utils::expandMacros(&cmd, m_macroExpander); | 
					
						
							|  |  |  |     return QFileInfo(cmd).fileName(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QString ProcessParameters::prettyArguments() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QString margs = effectiveArguments(); | 
					
						
							|  |  |  |     QString workDir = effectiveWorkingDirectory(); | 
					
						
							|  |  |  | #ifdef Q_OS_WIN
 | 
					
						
							|  |  |  |     QString args; | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |     QStringList args; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     Utils::QtcProcess::SplitError err; | 
					
						
							|  |  |  |     args = Utils::QtcProcess::prepareArgs(margs, &err, &m_environment, &workDir); | 
					
						
							|  |  |  |     if (err != Utils::QtcProcess::SplitOk) | 
					
						
							|  |  |  |         return margs; // Sorry, too complex - just fall back.
 | 
					
						
							|  |  |  | #ifdef Q_OS_WIN
 | 
					
						
							|  |  |  |     return args; | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |     return Utils::QtcProcess::joinArgs(args); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QString ProcessParameters::summary(const QString &displayName) const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return QString::fromLatin1("<b>%1:</b> %2 %3") | 
					
						
							|  |  |  |             .arg(displayName, | 
					
						
							|  |  |  |                  Utils::QtcProcess::quoteArg(prettyCommand()), | 
					
						
							|  |  |  |                  prettyArguments()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QString ProcessParameters::summaryInWorkdir(const QString &displayName) const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return QString::fromLatin1("<b>%1:</b> %2 %3 in %4") | 
					
						
							|  |  |  |             .arg(displayName, | 
					
						
							|  |  |  |                  Utils::QtcProcess::quoteArg(prettyCommand()), | 
					
						
							|  |  |  |                  prettyArguments(), | 
					
						
							|  |  |  |                  QDir::toNativeSeparators(effectiveWorkingDirectory())); | 
					
						
							|  |  |  | } |