summaryrefslogtreecommitdiffstats
path: root/qmake/library/ioutils.cpp
diff options
context:
space:
mode:
authorEdward Welbourne <edward.welbourne@qt.io>2017-07-28 13:25:27 +0200
committerOswald Buddenhagen <oswald.buddenhagen@qt.io>2018-01-18 13:46:54 +0000
commite86f3c018833141776db2d15772ba53995656eac (patch)
tree2375bf7d4276968c783fe02e3d4482683937d194 /qmake/library/ioutils.cpp
parent3149d0fb13bacc20b75ad8ca650c71df9edd8734 (diff)
qmake: require a drive in a DOS path for it to be absolute
For Q_OS_WIN, a path is only truly absolute if it includes a drive letter; merely starting with a slash is not enough. (We can't support UNC paths, so don't even try: qmake runs various commands in the source directory using CMD.exe, which doesn't support UNC as PWD.) This requires, when resolving a path relative to a root, transcribing the root's drive to such not-quite-absolute paths. Changed QMakeGlobals, $$absolute_path() and $$relative_path() to now use IoUtils::resolvePath() rather than delegating to QDir's absolute path method, since that doesn't correctly recognize the need for a drive letter (and qmake did run into problems with some paths, from splitPathList and a failing test, as a result). Moved existing ioUtils tests for handling of relative / absolute paths out into separate functions and expanded significantly. Fixed some existing tests to use an absolute path where one is needed; added two tests involving driveless (but rooted) paths; and fixed the test init to set a value for QT_HOST_DATA/src property (the lack of which lead to an assertion failure with this fix). Task-number: QTBUG-50839 Change-Id: I2bfc13c1bfbe1ae09997274622ea55cb3de31b43 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
Diffstat (limited to 'qmake/library/ioutils.cpp')
-rw-r--r--qmake/library/ioutils.cpp23
1 files changed, 15 insertions, 8 deletions
diff --git a/qmake/library/ioutils.cpp b/qmake/library/ioutils.cpp
index 684bcb9a37..afd41912fe 100644
--- a/qmake/library/ioutils.cpp
+++ b/qmake/library/ioutils.cpp
@@ -66,21 +66,22 @@ IoUtils::FileType IoUtils::fileType(const QString &fileName)
bool IoUtils::isRelativePath(const QString &path)
{
- if (path.startsWith(QLatin1Char('/')))
- return false;
#ifdef QMAKE_BUILTIN_PRFS
if (path.startsWith(QLatin1String(":/")))
return false;
#endif
#ifdef Q_OS_WIN
- if (path.startsWith(QLatin1Char('\\')))
- return false;
- // Unlike QFileInfo, this won't accept a relative path with a drive letter.
- // Such paths result in a royal mess anyway ...
+ // Unlike QFileInfo, this considers only paths with both a drive prefix and
+ // a subsequent (back-)slash absolute:
if (path.length() >= 3 && path.at(1) == QLatin1Char(':') && path.at(0).isLetter()
- && (path.at(2) == QLatin1Char('/') || path.at(2) == QLatin1Char('\\')))
+ && (path.at(2) == QLatin1Char('/') || path.at(2) == QLatin1Char('\\'))) {
return false;
-#endif
+ }
+ // (... unless, of course, they're UNC, which qmake fails on anyway)
+#else
+ if (path.startsWith(QLatin1Char('/')))
+ return false;
+#endif // Q_OS_WIN
return true;
}
@@ -100,6 +101,12 @@ QString IoUtils::resolvePath(const QString &baseDir, const QString &fileName)
return QString();
if (isAbsolutePath(fileName))
return QDir::cleanPath(fileName);
+#ifdef Q_OS_WIN // Add drive to otherwise-absolute path:
+ if (fileName.at(0).unicode() == '/' || fileName.at(0).unicode() == '\\') {
+ Q_ASSERT(isAbsolutePath(baseDir));
+ return QDir::cleanPath(baseDir.left(2) + fileName);
+ }
+#endif // Q_OS_WIN
return QDir::cleanPath(baseDir + QLatin1Char('/') + fileName);
}