diff options
author | Eike Ziller <eike.ziller@qt.io> | 2018-08-09 11:31:41 +0200 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2018-08-21 08:48:21 +0000 |
commit | d35638df56b741bc7bc3cac228075040cdd8a931 (patch) | |
tree | 01941b6bae22b931f180cb224c397ae540d9cfee /src/app/main.cpp | |
parent | 2c0554c187adb4ef886affd193b8149afa199d13 (diff) | |
download | qt-creator-d35638df56b741bc7bc3cac228075040cdd8a931.tar.gz |
Do not modify environment for user applications
We used to set QT_OPENGL, currently set LD_LIBRARY_PATH when qtcreator.sh
is used, and might set other variables in the future,
but these environment modifications should not be passed on
to user applications or when we run tools that are not shipped with
Qt Creator.
For LD_LIBRARY_PATH there already was a hack for
Environment::systemEnvironment.
For environment variables that we might set in main()
in the future, this patch caches the system environment for
Environment::systemEnvironment early before any modifications are made.
The previous hack for LD_LIBRARY_PATH no longer works, since it
used QCoreApplication::applicationDirPath() which cannot be used at that
point in time (before the QApplication has been created). Instead pass
the correct user LD_LIBRARY_PATH directly from qtcreator.sh to
Qt Creator through a command line option, which is cleaner anyhow.
Task-number: QTCREATORBUG-20808
Change-Id: I6674a5e0537e1b37fd7dcbff371b542fa24bce69
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
Diffstat (limited to 'src/app/main.cpp')
-rw-r--r-- | src/app/main.cpp | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/src/app/main.cpp b/src/app/main.cpp index c498db3759..045add4fbe 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -32,8 +32,10 @@ #include <extensionsystem/pluginspec.h> #include <qtsingleapplication.h> +#include <utils/environment.h> #include <utils/fileutils.h> #include <utils/hostosinfo.h> +#include <utils/optional.h> #include <utils/temporarydirectory.h> #include <QDebug> @@ -95,6 +97,7 @@ const char TEST_OPTION[] = "-test"; const char PID_OPTION[] = "-pid"; const char BLOCK_OPTION[] = "-block"; const char PLUGINPATH_OPTION[] = "-pluginpath"; +const char USER_LIBRARY_PATH_OPTION[] = "-user-library-path"; // hidden option for qtcreator.sh typedef QList<PluginSpec *> PluginSpecSet; @@ -343,6 +346,7 @@ struct Options QString installSettingsPath; QStringList customPluginPaths; std::vector<char *> appArguments; + Utils::optional<QString> userLibraryPath; bool hasTestOption = false; }; @@ -365,6 +369,9 @@ Options parseCommandLine(int argc, char *argv[]) } else if (arg == PLUGINPATH_OPTION && hasNext) { ++it; options.customPluginPaths += QDir::fromNativeSeparators(nextArg); + } else if (arg == USER_LIBRARY_PATH_OPTION && hasNext) { + ++it; + options.userLibraryPath = nextArg; } else { // arguments that are still passed on to the application if (arg == TEST_OPTION) options.hasTestOption = true; @@ -377,6 +384,24 @@ Options parseCommandLine(int argc, char *argv[]) int main(int argc, char **argv) { + Utils::Environment::systemEnvironment(); // cache system environment before we do any changes + + // Manually determine various command line options + // We can't use the regular way of the plugin manager, + // because settings can change the way plugin manager behaves + Options options = parseCommandLine(argc, argv); + applicationDirPath(argv[0]); + + if (options.userLibraryPath) { + if ((*options.userLibraryPath).isEmpty()) { + Utils::Environment::modifySystemEnvironment( + {{"LD_LIBRARY_PATH", "", Utils::EnvironmentItem::Unset}}); + } else { + Utils::Environment::modifySystemEnvironment( + {{"LD_LIBRARY_PATH", *options.userLibraryPath, Utils::EnvironmentItem::Set}}); + } + } + #ifdef Q_OS_WIN if (!qEnvironmentVariableIsSet("QT_OPENGL")) QCoreApplication::setAttribute(Qt::AA_UseOpenGLES); @@ -400,12 +425,6 @@ int main(int argc, char **argv) setrlimit(RLIMIT_NOFILE, &rl); #endif - // Manually determine various command line options - // We can't use the regular way of the plugin manager, - // because settings can change the way plugin manager behaves - Options options = parseCommandLine(argc, argv); - applicationDirPath(argv[0]); - QScopedPointer<Utils::TemporaryDirectory> temporaryCleanSettingsDir; if (options.settingsPath.isEmpty() && options.hasTestOption) { temporaryCleanSettingsDir.reset(new Utils::TemporaryDirectory("qtc-test-settings")); |