summaryrefslogtreecommitdiffstats
path: root/qmake/library/ioutils.cpp
diff options
context:
space:
mode:
authorAlexey Edelev <alexey.edelev@qt.io>2021-02-26 17:01:51 +0100
committerAlexey Edelev <alexey.edelev@qt.io>2021-03-01 17:37:03 +0100
commit5dab1e931d20f87fb35812fb64f6a2e344290cfa (patch)
treebffa7f9b7a5251680db03d6e3abf0787c158c03a /qmake/library/ioutils.cpp
parentd1101c460e173e3554fa4e5c800ab3e82ddc3aad (diff)
Improve QMakeLibraryInfo encapsulation
QMakeLibraryInfo uses external data to produce paths. This causes issues when trying to use it out of the existing qmake environment. Add data fields that contain the path to the binary that uses QMakeLibraryInfo and manually specified qtconf. Task-number: QTBUG-75870 Change-Id: Ic6fa274ede3a9287826ff66c79f155b10d0d455c Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Diffstat (limited to 'qmake/library/ioutils.cpp')
-rw-r--r--qmake/library/ioutils.cpp34
1 files changed, 34 insertions, 0 deletions
diff --git a/qmake/library/ioutils.cpp b/qmake/library/ioutils.cpp
index 3a93298ffa..719d3b514a 100644
--- a/qmake/library/ioutils.cpp
+++ b/qmake/library/ioutils.cpp
@@ -49,6 +49,40 @@ QT_BEGIN_NAMESPACE
using namespace QMakeInternal;
+QString IoUtils::binaryAbsLocation(const QString &argv0)
+{
+ QString ret;
+ if (!argv0.isEmpty() && isAbsolutePath(argv0)) {
+ ret = argv0;
+ } else if (argv0.contains(QLatin1Char('/'))
+#ifdef Q_OS_WIN
+ || argv0.contains(QLatin1Char('\\'))
+#endif
+ ) { // relative PWD
+ ret = QDir::current().absoluteFilePath(argv0);
+ } else { // in the PATH
+ QByteArray pEnv = qgetenv("PATH");
+ QDir currentDir = QDir::current();
+#ifdef Q_OS_WIN
+ QStringList paths = QString::fromLocal8Bit(pEnv).split(QLatin1String(";"));
+ paths.prepend(QLatin1String("."));
+#else
+ QStringList paths = QString::fromLocal8Bit(pEnv).split(QLatin1String(":"));
+#endif
+ for (QStringList::const_iterator p = paths.constBegin(); p != paths.constEnd(); ++p) {
+ if ((*p).isEmpty())
+ continue;
+ QString candidate = currentDir.absoluteFilePath(*p + QLatin1Char('/') + argv0);
+ if (QFile::exists(candidate)) {
+ ret = candidate;
+ break;
+ }
+ }
+ }
+
+ return QDir::cleanPath(ret);
+}
+
IoUtils::FileType IoUtils::fileType(const QString &fileName)
{
Q_ASSERT(fileName.isEmpty() || isAbsolutePath(fileName));