Fix precompiled headers on Apple platforms, with multiple architectures

The original commit only added support for GCC and Clang, but not ICC.

Amends 73331eeb

Change-Id: Id7638cf1b538edb1008fb3aa10754c1f517a994f
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
This commit is contained in:
Jake Petroules 2017-04-11 14:54:53 -07:00
parent eca6f5492c
commit 097073fa67
4 changed files with 74 additions and 40 deletions

View File

@ -157,13 +157,23 @@ macx-xcode {
# Enable precompiled headers for multiple architectures # Enable precompiled headers for multiple architectures
QMAKE_CFLAGS_USE_PRECOMPILE = QMAKE_CFLAGS_USE_PRECOMPILE =
for (arch, VALID_ARCHS) { for (arch, VALID_ARCHS) {
icc_pch_style: \
use_flag = "-pch-use "
else: \
use_flag = -include
QMAKE_CFLAGS_USE_PRECOMPILE += \ QMAKE_CFLAGS_USE_PRECOMPILE += \
-Xarch_$${arch} \ -Xarch_$${arch} \
-include${QMAKE_PCH_OUTPUT_$${arch}} $${use_flag}${QMAKE_PCH_OUTPUT_$${arch}}
}
icc_pch_style {
QMAKE_CXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE -include ${QMAKE_PCH_INPUT}
QMAKE_CFLAGS_USE_PRECOMPILE =
} else {
QMAKE_CXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
QMAKE_OBJCFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
QMAKE_OBJCXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
} }
QMAKE_CXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
QMAKE_OBJCFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
QMAKE_OBJCXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
QMAKE_PCH_OUTPUT_EXT = _${QMAKE_PCH_ARCH}$${QMAKE_PCH_OUTPUT_EXT} QMAKE_PCH_OUTPUT_EXT = _${QMAKE_PCH_ARCH}$${QMAKE_PCH_OUTPUT_EXT}
} }

View File

@ -94,6 +94,8 @@ QMAKE_CXXFLAGS_HIDESYMS += $$QMAKE_CFLAGS_HIDESYMS -fvisibility-inlines-hidden
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.10 QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.10
QMAKE_APPLE_DEVICE_ARCHS = x86_64
include(../common/macx.conf) include(../common/macx.conf)
load(qt_config) load(qt_config)

View File

@ -180,6 +180,13 @@ UnixMakefileGenerator::init()
// icc style // icc style
pchFlags.replace(QLatin1String("${QMAKE_PCH_OUTPUT}"), pchFlags.replace(QLatin1String("${QMAKE_PCH_OUTPUT}"),
escapeFilePath(pchBaseName + project->first("QMAKE_PCH_OUTPUT_EXT"))); escapeFilePath(pchBaseName + project->first("QMAKE_PCH_OUTPUT_EXT")));
const ProStringList pchArchs = project->values("QMAKE_PCH_ARCHS");
for (const ProString &arch : pchArchs) {
QString suffix = project->first("QMAKE_PCH_OUTPUT_EXT").toQString();
suffix.replace(QLatin1String("${QMAKE_PCH_ARCH}"), arch.toQString());
pchFlags.replace(QLatin1String("${QMAKE_PCH_OUTPUT_") + arch + QLatin1Char('}'),
escapeFilePath(pchBaseName + suffix));
}
} else { } else {
// gcc style (including clang_pch_style) // gcc style (including clang_pch_style)
QString headerSuffix; QString headerSuffix;
@ -334,10 +341,19 @@ QStringList
header_prefix += project->first("QMAKE_PCH_OUTPUT_EXT").toQString(); header_prefix += project->first("QMAKE_PCH_OUTPUT_EXT").toQString();
if (project->isActiveConfig("icc_pch_style")) { if (project->isActiveConfig("icc_pch_style")) {
// icc style // icc style
for(QStringList::Iterator it = Option::cpp_ext.begin(); it != Option::cpp_ext.end(); ++it) { ProStringList pchArchs = project->values("QMAKE_PCH_ARCHS");
if(file.endsWith(*it)) { if (pchArchs.isEmpty())
ret += header_prefix; pchArchs << ProString(); // normal single-arch PCH
break; for (const ProString &arch : qAsConst(pchArchs)) {
auto pfx = header_prefix;
if (!arch.isEmpty())
pfx.replace(QLatin1String("${QMAKE_PCH_ARCH}"), arch.toQString());
for (QStringList::Iterator it = Option::cpp_ext.begin();
it != Option::cpp_ext.end(); ++it) {
if (file.endsWith(*it)) {
ret += pfx;
break;
}
} }
} }
} else { } else {

View File

@ -1006,14 +1006,22 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
if (project->isActiveConfig("icc_pch_style")) { if (project->isActiveConfig("icc_pch_style")) {
// icc style // icc style
ProString pchBaseName = project->first("QMAKE_ORIG_TARGET"); ProString pchBaseName = project->first("QMAKE_ORIG_TARGET");
ProString pchOutput; ProStringList pchArchs = project->values("QMAKE_PCH_ARCHS");
if(!project->isEmpty("PRECOMPILED_DIR")) if (pchArchs.isEmpty())
pchOutput = project->first("PRECOMPILED_DIR"); pchArchs << ProString(); // normal single-arch PCH
pchOutput += pchBaseName + project->first("QMAKE_PCH_OUTPUT_EXT"); for (const ProString &arch : qAsConst(pchArchs)) {
ProString sourceFile = pchOutput + Option::cpp_ext.first(); ProString pchOutput;
ProString objectFile = createObjectList(ProStringList(sourceFile)).first(); if (!project->isEmpty("PRECOMPILED_DIR"))
pchOutput = project->first("PRECOMPILED_DIR");
pchOutput += pchBaseName + project->first("QMAKE_PCH_OUTPUT_EXT");
if (!arch.isEmpty())
pchOutput = ProString(pchOutput.toQString().replace(
QStringLiteral("${QMAKE_PCH_ARCH}"), arch.toQString()));
precomp_files << precomph_out_dir << sourceFile << objectFile; ProString sourceFile = pchOutput + Option::cpp_ext.first();
ProString objectFile = createObjectList(ProStringList(sourceFile)).first();
precomp_files << precomph_out_dir << sourceFile << objectFile;
}
} else { } else {
// gcc style (including clang_pch_style) // gcc style (including clang_pch_style)
precomph_out_dir += Option::dir_sep; precomph_out_dir += Option::dir_sep;
@ -1115,19 +1123,7 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
if (!project->isActiveConfig("clang_pch_style")) if (!project->isActiveConfig("clang_pch_style"))
pchOutput += project->first("QMAKE_PCH_OUTPUT_EXT"); pchOutput += project->first("QMAKE_PCH_OUTPUT_EXT");
if (project->isActiveConfig("icc_pch_style")) { if (!project->isActiveConfig("icc_pch_style")) {
// icc style
QString sourceFile = pchOutput + Option::cpp_ext.first();
QString sourceFile_f = escapeFilePath(sourceFile);
QString objectFile = createObjectList(ProStringList(sourceFile)).first().toQString();
t << escapeDependencyPath(pchOutput) << ": " << escapeDependencyPath(pchInput) << ' '
<< escapeDependencyPaths(findDependencies(pchInput)).join(" \\\n\t\t")
<< "\n\techo \"// Automatically generated, do not modify\" > " << sourceFile_f
<< "\n\trm -f " << escapeFilePath(pchOutput);
pchFlags.replace(QLatin1String("${QMAKE_PCH_TEMP_SOURCE}"), sourceFile_f)
.replace(QLatin1String("${QMAKE_PCH_TEMP_OBJECT}"), escapeFilePath(objectFile));
} else {
// gcc style (including clang_pch_style) // gcc style (including clang_pch_style)
ProString header_prefix = project->first("QMAKE_PRECOMP_PREFIX"); ProString header_prefix = project->first("QMAKE_PRECOMP_PREFIX");
ProString header_suffix = project->isActiveConfig("clang_pch_style") ProString header_suffix = project->isActiveConfig("clang_pch_style")
@ -1148,18 +1144,28 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
if (!arch.isEmpty()) if (!arch.isEmpty())
pchArchOutput.replace(QStringLiteral("${QMAKE_PCH_ARCH}"), arch.toQString()); pchArchOutput.replace(QStringLiteral("${QMAKE_PCH_ARCH}"), arch.toQString());
if (!project->isActiveConfig("icc_pch_style")) { const auto pchFilePath_d = escapeDependencyPath(pchArchOutput);
const auto pchFilePath_d = escapeDependencyPath(pchArchOutput); if (!arch.isEmpty()) {
if (!arch.isEmpty()) { t << pchFilePath_d << ": " << "EXPORT_ARCH_ARGS = -arch " << arch << "\n\n";
t << pchFilePath_d << ": " << "EXPORT_ARCH_ARGS = -arch " << arch << "\n\n"; t << pchFilePath_d << ": "
t << pchFilePath_d << ": " << "EXPORT_QMAKE_XARCH_CFLAGS = $(EXPORT_QMAKE_XARCH_CFLAGS_" << arch << ")" << "\n\n";
<< "EXPORT_QMAKE_XARCH_CFLAGS = $(EXPORT_QMAKE_XARCH_CFLAGS_" << arch << ")" << "\n\n"; t << pchFilePath_d << ": "
t << pchFilePath_d << ": " << "EXPORT_QMAKE_XARCH_LFLAGS = $(EXPORT_QMAKE_XARCH_LFLAGS_" << arch << ")" << "\n\n";
<< "EXPORT_QMAKE_XARCH_LFLAGS = $(EXPORT_QMAKE_XARCH_LFLAGS_" << arch << ")" << "\n\n"; }
} t << pchFilePath_d << ": " << escapeDependencyPath(pchInput) << ' '
t << pchFilePath_d << ": " << escapeDependencyPath(pchInput) << ' ' << escapeDependencyPaths(findDependencies(pchInput)).join(" \\\n\t\t");
<< escapeDependencyPaths(findDependencies(pchInput)).join(" \\\n\t\t") if (project->isActiveConfig("icc_pch_style")) {
<< "\n\t" << mkdir_p_asstring(pchOutputDir); QString sourceFile = pchArchOutput + Option::cpp_ext.first();
QString sourceFile_f = escapeFilePath(sourceFile);
QString objectFile = createObjectList(ProStringList(sourceFile)).first().toQString();
pchFlags.replace(QLatin1String("${QMAKE_PCH_TEMP_SOURCE}"), sourceFile_f)
.replace(QLatin1String("${QMAKE_PCH_TEMP_OBJECT}"), escapeFilePath(objectFile));
t << "\n\techo \"// Automatically generated, do not modify\" > " << sourceFile_f
<< "\n\trm -f " << escapeFilePath(pchArchOutput);
} else {
t << "\n\t" << mkdir_p_asstring(pchOutputDir);
} }
auto pchArchFlags = pchFlags; auto pchArchFlags = pchFlags;