Merge topic 'cmake-gui-osx-symlink-qt5-plugin'

f2840155 cmake-gui: Teach Qt5 where plugins are when launched through a symlink
This commit is contained in:
Brad King 2016-06-10 09:09:47 -04:00 committed by CMake Topic Stage
commit 1bde72a390
1 changed files with 34 additions and 0 deletions

View File

@ -19,6 +19,7 @@
#include <QApplication>
#include <QDir>
#include <QLocale>
#include <QString>
#include <QTextCodec>
#include <QTranslator>
#include <cmsys/CommandLineArguments.hxx>
@ -40,6 +41,7 @@ static const char* cmDocumentationOptions[][2] = { { 0, 0 } };
#if defined(Q_OS_MAC)
static int cmOSXInstall(std::string dir);
static void cmAddPluginPath();
#endif
int main(int argc, char** argv)
@ -81,6 +83,15 @@ int main(int argc, char** argv)
}
#endif
// When we are on OSX and we are launching cmake-gui from a symlink, the
// application will fail to launch as it can't find the qt.conf file which
// tells it what the name of the plugin folder is. We need to add this path
// BEFORE the application is constructed as that is what triggers the
// searching for the platform plugins
#if defined(Q_OS_MAC)
cmAddPluginPath();
#endif
QApplication app(argc, argv);
setlocale(LC_NUMERIC, "C");
@ -215,4 +226,27 @@ static int cmOSXInstall(std::string dir)
? 0
: 1;
}
// Locate the PlugIns directory and add it to the QApplication library paths.
// We need to resolve all symlinks so we have a known relative path between
// MacOS/CMake and the PlugIns directory.
//
// Note we are using cmSystemTools since Qt can't provide the path to the
// executable before the QApplication is created, and that is when plugin
// searching occurs.
static void cmAddPluginPath()
{
std::string const& path = cmSystemTools::GetCMakeGUICommand();
if (path.empty()) {
return;
}
std::string const& realPath = cmSystemTools::GetRealPath(path);
QFileInfo appPath(QString::fromLocal8Bit(realPath.c_str()));
QDir pluginDir = appPath.dir();
bool const foundPluginDir = pluginDir.cd("../PlugIns");
if (foundPluginDir) {
QApplication::addLibraryPath(pluginDir.path());
}
}
#endif