From b95a4bbe84e5216d8dba9a0c077062fbb0efb30b Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Fri, 11 Jan 2019 11:27:19 +0100 Subject: MakefileGenerator: deduplicate code Factor out a resolveDependency method. We will enhance it in a subsequent commit. Change-Id: I4eead8bd03066c2ccbc9d9276acbc9f6c3bc6b97 Reviewed-by: Edward Welbourne --- qmake/generators/makefile.cpp | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) (limited to 'qmake/generators/makefile.cpp') diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp index 99455e7cb5..45684b5225 100644 --- a/qmake/generators/makefile.cpp +++ b/qmake/generators/makefile.cpp @@ -1839,6 +1839,18 @@ static QStringList splitDeps(const QString &indeps, bool lineMode) return deps; } +QString MakefileGenerator::resolveDependency(const QDir &outDir, const QString &file) +{ + const QList &depdirs = QMakeSourceFileInfo::dependencyPaths(); + for (const auto &depdir : depdirs) { + const QString &local = depdir.local(); + QString lf = outDir.absoluteFilePath(local + '/' + file); + if (exists(lf)) + return lf; + } + return {}; +} + void MakefileGenerator::writeExtraCompilerTargets(QTextStream &t) { @@ -1991,16 +2003,7 @@ MakefileGenerator::writeExtraCompilerTargets(QTextStream &t) } else if (exists(absFile)) { file = absFile; } else { - QString localFile; - QList depdirs = QMakeSourceFileInfo::dependencyPaths(); - for (QList::Iterator dit = depdirs.begin(); - dit != depdirs.end(); ++dit) { - QString lf = outDir.absoluteFilePath((*dit).local() + '/' + file); - if (exists(lf)) { - localFile = lf; - break; - } - } + QString localFile = resolveDependency(outDir, file); if (localFile.isEmpty()) { if (exists(file)) warn_msg(WarnDeprecated, ".depend_command for extra compiler %s" @@ -2088,16 +2091,7 @@ MakefileGenerator::writeExtraCompilerTargets(QTextStream &t) } else if (exists(absFile)) { file = absFile; } else { - QString localFile; - QList depdirs = QMakeSourceFileInfo::dependencyPaths(); - for (QList::Iterator dit = depdirs.begin(); - dit != depdirs.end(); ++dit) { - QString lf = outDir.absoluteFilePath((*dit).local() + '/' + file); - if (exists(lf)) { - localFile = lf; - break; - } - } + QString localFile = resolveDependency(outDir, file); if (localFile.isEmpty()) { if (exists(file)) warn_msg(WarnDeprecated, ".depend_command for extra compiler %s" -- cgit v1.2.3 From c6bd9082f4c6b53b30ef6badb7169df31a052305 Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Fri, 11 Jan 2019 11:31:24 +0100 Subject: Resolve macOS framework headers for extra compiler depend_command On macOS, if an extra compiler returns a framework include via its depend_command, we must resolve it properly. For example, the uic extra compiler might return an include "QtQuickWidget/QQuickWidget", but the actual header file is located in "QtQuickWidget.framework/Headers/QQuickWidget". Fixes: QTBUG-72641 Change-Id: I42f11c74d01c88db8a32025b7f04d9ad50b2d08b Reviewed-by: Edward Welbourne Reviewed-by: Kai Koehne --- qmake/generators/makefile.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'qmake/generators/makefile.cpp') diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp index 45684b5225..f824f12bce 100644 --- a/qmake/generators/makefile.cpp +++ b/qmake/generators/makefile.cpp @@ -424,6 +424,9 @@ MakefileGenerator::init() } incs.append(project->specDir()); + const auto platform = v["QMAKE_PLATFORM"]; + resolveDependenciesInFrameworks = platform.contains("darwin"); + const char * const cacheKeys[] = { "_QMAKE_STASH_", "_QMAKE_SUPER_CACHE_", nullptr }; for (int i = 0; cacheKeys[i]; ++i) { if (v[cacheKeys[i]].isEmpty()) @@ -1847,6 +1850,21 @@ QString MakefileGenerator::resolveDependency(const QDir &outDir, const QString & QString lf = outDir.absoluteFilePath(local + '/' + file); if (exists(lf)) return lf; + + if (resolveDependenciesInFrameworks) { + // Given a file like "QtWidgets/QWidget", try to resolve it + // as framework header "QtWidgets.framework/Headers/QWidget". + int cut = file.indexOf('/'); + if (cut < 0 || cut + 1 >= file.size()) + continue; + QStringRef framework = file.leftRef(cut); + QStringRef include = file.midRef(cut + 1); + if (local.endsWith('/' + framework + ".framework/Headers")) { + lf = outDir.absoluteFilePath(local + '/' + include); + if (exists(lf)) + return lf; + } + } } return {}; } -- cgit v1.2.3