Xcode 9 and Carthage - stripping out llvm instrument symbols
Like any other year the new Xcode GM came out and everybody started rushing to submit their apps. This year, I was also one of these early adopters. Things were going relatively smoothly, except for a weird issue with
xattr when trying to export archives. Regardless, I uploaded the build and was ready to see it processed... And then...
Invalid Bundle - Disallowed LLVM instrumentation. Do not submit apps with LLVM profiling instrumentation or coverage collection enabled. Turn off LLVM profiling or code coverage, rebuild your app and resubmit the app.
LLVM instrumentation? What? I thought that gets striped out on Archive?
Well it turns out, that it does get stripped out, but only for the main application. I use Carthage for dependency management and Carthage doesn't build targets with the Archive action (or rather it can't) and Xcode 9 enables code coverage by default:
xcodebuild flags don't seem to affect this issue, meaning that every framework developer that makes their libraries available through Carthage will have to manually change this setting.
For the time being you'll have to checkout all of the dependencies and manually change
NO for every dependency before building them with
Survival through Tooling§
I've made a little script that streamlines checking for LLVM instrument symbols. Change your working directory to the root of your project and you can pipe this script straight into bash (if you dare):
curl -fsSL https://gist.githubusercontent.com/carlossless/9492d8e20938cfd1ee8163d7cdbfab9b/raw | bash
Hopefully we'll see improvements in later versions of Xcode and
xcodebuild, but for now we'll have to live with this.
- Apple Developer Docs - Technical Q&A QA1964: Resolving App Rejections for GCC and LLVM Instrumentation
- GitHub Issues - Carthage - Targets built with coverage data in Xcode 9 #2056