PCH: -fembed-bitcode on iOS causes compiler to fail
At https://codereview.qt-project.org/c/qt/qtbase/+/311842 we can see that if -fembed-bitcode
is added as a compiler flag the PCH generation fails with errors like:
FAILED: src/corelib/CMakeFiles/Core.dir/cmake_pch_arm64.objcxx.hxx.pch
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -DGLES_SILENCE_DEPRECATION -DPCRE2_CODE_UNIT_WIDTH=16 -DQT_ASCII_CAST_WARNINGS -DQT_BUILDING_QT -DQT_BUILD_CORE_LIB -DQT_COMPILER_SUPPORTS_SSE2 -DQT_CORE_LIB -DQT_CORE_QOBJECT_LIB -DQT_DEPRECATED_WARNINGS -DQT_MOC_COMPAT -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_NO_FOREACH -DQT_NO_USING_NAMESPACE -DQT_USE_QSTRINGBUILDER -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -Ddeprecations -Isrc/corelib/Core_autogen/include -Iinclude -Iinclude/QtCore -I/Users/cristian/Projects/Qt/repo/qtbase/src/corelib -Isrc/corelib -Isrc/corelib/global -I/Users/cristian/Projects/Qt/repo/qtbase/src/corelib/../3rdparty/tinycbor/src -Iinclude/QtCore/6.0.0 -Iinclude/QtCore/6.0.0/QtCore -I/Users/cristian/Projects/Qt/repo/qtbase/src/corelib/../3rdparty/double-conversion/.. -I/Users/cristian/Projects/Qt/repo/qtbase/src/corelib/../3rdparty/double-conversion/include -Isrc/corelib/.rcc -I/Users/cristian/Projects/Qt/repo/qtbase/mkspecs/macx-clang -I/Users/cristian/Projects/Qt/repo/qtbase/src/3rdparty/pcre2/src -DNDEBUG -O2 -arch arm64 -Xarch_arm64 -isysroot/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.6.sdk -miphoneos-version-min=12.0 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wextra -msse2 -fapplication-extension -fembed-bitcode -std=c++17 -Winvalid-pch -Xclang -emit-pch -Xclang -include -Xclang /Users/cristian/Projects/Qt/build-ios/src/corelib/CMakeFiles/Core.dir/cmake_pch_arm64.objcxx.hxx -MD -MT src/corelib/CMakeFiles/Core.dir/cmake_pch_arm64.objcxx.hxx.pch -MF src/corelib/CMakeFiles/Core.dir/cmake_pch_arm64.objcxx.hxx.pch.d -x objective-c++ -o src/corelib/CMakeFiles/Core.dir/cmake_pch_arm64.objcxx.hxx.pch -c src/corelib/CMakeFiles/Core.dir/cmake_pch_arm64.objcxx.hxx.mm
clang: warning: argument unused during compilation: '-msse2' [-Wunused-command-line-argument]
/var/folders/h7/r7ns5y512yj9164w3vccrxwc0000gn/T/cmake_pch_arm64-2b243f.bc:1:1: error: expected top-level entity
CPCH<U+0001><U+0008><U+0000><U+0000><E2>
^
This works with qmake, so it should work with CMake too.
The only difference is that CMake is using -emit-pch
to generate the precompile header artifact while compiling a c|cxx|m|mm
file, while qmake is using -x <lang>-header
.
The -x <lang>-header
approach is used by GNU style PCH, adding it to Clang shouldn't hurt and it fixes this peculiar case on iOS.