summaryrefslogtreecommitdiffstats
path: root/qmake/generators/unix/unixmake.cpp
diff options
context:
space:
mode:
authorJake Petroules <jake.petroules@qt.io>2016-08-23 15:16:42 -0700
committerJake Petroules <jake.petroules@qt.io>2016-09-02 08:25:31 +0000
commit73331eebf885ba8918447d26ba37bef2208bdb5e (patch)
tree0a00f66f844616f5ff55bdc0d5a0ce966f7c8c9a /qmake/generators/unix/unixmake.cpp
parent443240b5120af72b261d7a99812066258a6d74f3 (diff)
Enable precompiled headers on iOS, tvOS, watchOS
The actual blocker for precompiled headers is not the iOS/tvOS/watchOS platforms, but the way qmake handled multiple-architecture builds on Apple platforms. This patch allows multi-arch builds to be performed while using precompiled headers. Since df91ef3d6c55692a0236f67b6c6b134a3bf84098 (April 2009), Clang has had support for PCH files in the driver, which allows to use the -include flag to automatically translate to -include-pch. We can then take advantage of the fact that the -include option is allowed to not be separate from its argument, which lets us take advantage of -Xarch to specify a per-architecture precompiled header file. This is done through some magic in the qmake Makefile generator which "multiplexes" the PCH creation rule across multiple architectures and replaces a series of tokens with the proper precompiled header paths and architecture flags at usage point. Change-Id: I76c8dc9cda7e218869c2919f023d9b04f311c6fd Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
Diffstat (limited to 'qmake/generators/unix/unixmake.cpp')
-rw-r--r--qmake/generators/unix/unixmake.cpp26
1 files changed, 23 insertions, 3 deletions
diff --git a/qmake/generators/unix/unixmake.cpp b/qmake/generators/unix/unixmake.cpp
index b0f7593fbe..349dcd2f40 100644
--- a/qmake/generators/unix/unixmake.cpp
+++ b/qmake/generators/unix/unixmake.cpp
@@ -194,6 +194,18 @@ UnixMakefileGenerator::init()
if (!language.isEmpty()) {
pchFlags.replace(QLatin1String("${QMAKE_PCH_OUTPUT}"),
escapeFilePath(pchBaseName + language + headerSuffix));
+ const ProStringList pchArchs = project->values("QMAKE_PCH_ARCHS");
+ for (const ProString &arch : pchArchs) {
+ QString suffix = headerSuffix;
+ suffix.replace(QLatin1String("${QMAKE_PCH_ARCH}"), arch.toQString());
+ if (project->isActiveConfig("clang_pch_style")
+ && (suffix.endsWith(QLatin1String(".pch"))
+ || suffix.endsWith(QLatin1String(".gch")))) {
+ suffix.chop(4); // must omit header suffix for -include to recognize the PCH
+ }
+ pchFlags.replace(QLatin1String("${QMAKE_PCH_OUTPUT_") + arch + QLatin1Char('}'),
+ escapeFilePath(pchBaseName + language + suffix));
+ }
}
}
@@ -351,9 +363,17 @@ QStringList
if (!file.endsWith(extension.toQString()))
continue;
- QString precompiledHeader = header_prefix + language + header_suffix;
- if (!ret.contains(precompiledHeader))
- ret += precompiledHeader;
+ ProStringList pchArchs = project->values("QMAKE_PCH_ARCHS");
+ if (pchArchs.isEmpty())
+ pchArchs << ProString(); // normal single-arch PCH
+ for (const ProString &arch : qAsConst(pchArchs)) {
+ QString suffix = header_suffix;
+ if (!arch.isEmpty())
+ suffix.replace(QLatin1String("${QMAKE_PCH_ARCH}"), arch.toQString());
+ QString precompiledHeader = header_prefix + language + suffix;
+ if (!ret.contains(precompiledHeader))
+ ret += precompiledHeader;
+ }
goto foundPrecompiledDependency;
}