diff --git a/src/libs/utils/environment.h b/src/libs/utils/environment.h index 795f65e2e4b..3e53c7a3c51 100644 --- a/src/libs/utils/environment.h +++ b/src/libs/utils/environment.h @@ -81,6 +81,9 @@ public: QString value(const_iterator it) const { return m_dict.value(it); } // FIXME: avoid bool isEnabled(const_iterator it) const { return m_dict.isEnabled(it); } // FIXME: avoid + void setCombineWithDeviceEnvironment(bool combine) { m_combineWithDeviceEnvironment = combine; } + bool combineWithDeviceEnvironment() const { return m_combineWithDeviceEnvironment; } + const_iterator constBegin() const { return m_dict.constBegin(); } // FIXME: avoid const_iterator constEnd() const { return m_dict.constEnd(); } // FIXME: avoid const_iterator constFind(const QString &name) const { return m_dict.constFind(name); } // FIXME: avoid @@ -102,6 +105,7 @@ public: private: NameValueDictionary m_dict; + bool m_combineWithDeviceEnvironment = true; }; class QTCREATOR_UTILS_EXPORT EnvironmentChange final diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp index 92717a571bb..80017038b63 100644 --- a/src/libs/utils/qtcprocess.cpp +++ b/src/libs/utils/qtcprocess.cpp @@ -670,11 +670,11 @@ public: Environment fullEnvironment() const { Environment env = m_setup.m_environment; - if (!env.hasChanges()) { -// FIXME: Either switch to using EnvironmentChange instead of full Environments, or -// feed the full environment into the QtcProcess instead of fixing it up here. -// qWarning("QtcProcess::start: Empty environment set when running '%s'.", -// qPrintable(m_setup.m_commandLine.executable().toString())); + if (!env.hasChanges() && env.combineWithDeviceEnvironment()) { + // FIXME: Either switch to using EnvironmentChange instead of full Environments, or + // feed the full environment into the QtcProcess instead of fixing it up here. + // qWarning("QtcProcess::start: Empty environment set when running '%s'.", + // qPrintable(m_setup.m_commandLine.executable().toString())); env = m_setup.m_commandLine.executable().deviceEnvironment(); } // TODO: needs SshSettings diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp index 465c03ed974..95275ba282e 100644 --- a/src/plugins/remotelinux/linuxdevice.cpp +++ b/src/plugins/remotelinux/linuxdevice.cpp @@ -359,6 +359,8 @@ public: RunResult runInShell(const CommandLine &cmdLine, const QByteArray &stdInData) const override; + Environment deviceEnvironment() const override; + LinuxDevicePrivate *m_dev; }; @@ -388,6 +390,19 @@ RunResult LinuxDeviceFileAccess::runInShell(const CommandLine &cmdLine, return m_dev->runInShell(cmdLine, stdInData); } +Environment LinuxDeviceFileAccess::deviceEnvironment() const +{ + QtcProcess getEnvProc; + getEnvProc.setCommand({FilePath("env").onDevice(m_dev->q->rootPath()), {}}); + Environment inEnv; + inEnv.setCombineWithDeviceEnvironment(false); + getEnvProc.setEnvironment(inEnv); + getEnvProc.runBlocking(); + + const QString remoteOutput = getEnvProc.cleanedStdOut(); + return Environment(remoteOutput.split('\n', Qt::SkipEmptyParts), m_dev->q->osType()); +} + // SshProcessImpl class SshProcessInterfacePrivate : public QObject