diff options
-rwxr-xr-x | bin/qtcreator.sh | 3 | ||||
-rw-r--r-- | src/app/main.cpp | 31 | ||||
-rw-r--r-- | src/libs/utils/environment.cpp | 31 | ||||
-rw-r--r-- | src/libs/utils/environment.h | 2 |
4 files changed, 36 insertions, 31 deletions
diff --git a/bin/qtcreator.sh b/bin/qtcreator.sh index 80fc4499c9..86826f1e3b 100755 --- a/bin/qtcreator.sh +++ b/bin/qtcreator.sh @@ -39,6 +39,7 @@ if test -d "$qtlibdir"; then qtlibpath=:$qtlibdir fi # Add Qt Creator library path +_ORIGINAL_LD_LIBRARY_PATH=$LD_LIBRARY_PATH LD_LIBRARY_PATH=$libdir:$libdir/qtcreator$qtlibpath${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH} export LD_LIBRARY_PATH -exec "$bindir/qtcreator" ${1+"$@"} +exec "$bindir/qtcreator" -user-library-path "$_ORIGINAL_LD_LIBRARY_PATH" ${1+"$@"} 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")); diff --git a/src/libs/utils/environment.cpp b/src/libs/utils/environment.cpp index 9b77a8b71e..54a5b72317 100644 --- a/src/libs/utils/environment.cpp +++ b/src/libs/utils/environment.cpp @@ -34,30 +34,8 @@ #include <QSet> #include <QCoreApplication> -class SystemEnvironment : public Utils::Environment -{ -public: - SystemEnvironment() - : Environment(QProcessEnvironment::systemEnvironment().toStringList()) - { - if (Utils::HostOsInfo::isLinuxHost()) { - QString ldLibraryPath = value("LD_LIBRARY_PATH"); - QDir lib(QCoreApplication::applicationDirPath()); - lib.cd("../lib"); - QString toReplace = lib.path(); - lib.cd("qtcreator"); - toReplace.append(':'); - toReplace.append(lib.path()); - - if (ldLibraryPath.startsWith(toReplace + ':')) - set("LD_LIBRARY_PATH", ldLibraryPath.remove(0, toReplace.length() + 1)); - else if (ldLibraryPath == toReplace) - unset("LD_LIBRARY_PATH"); - } - } -}; - -Q_GLOBAL_STATIC(SystemEnvironment, staticSystemEnvironment) +Q_GLOBAL_STATIC_WITH_ARGS(Utils::Environment, staticSystemEnvironment, + (QProcessEnvironment::systemEnvironment().toStringList())) static QMap<QString, QString>::iterator findKey(QMap<QString, QString> &input, Utils::OsType osType, const QString &key) @@ -621,6 +599,11 @@ bool Environment::operator==(const Environment &other) const return m_osType == other.m_osType && m_values == other.m_values; } +void Environment::modifySystemEnvironment(const QList<EnvironmentItem> &list) +{ + staticSystemEnvironment->modify(list); +} + /** Expand environment variables in a string. * * Environment variables are accepted in the following forms: diff --git a/src/libs/utils/environment.h b/src/libs/utils/environment.h index 4803dda2a5..43a4ded9be 100644 --- a/src/libs/utils/environment.h +++ b/src/libs/utils/environment.h @@ -139,6 +139,8 @@ public: bool operator!=(const Environment &other) const; bool operator==(const Environment &other) const; + static void modifySystemEnvironment(const QList<EnvironmentItem> &list); // use with care!!! + private: FileName searchInDirectory(const QStringList &execs, const FileName &directory, QSet<FileName> &alreadyChecked) const; |