how to inhibit -fprofile-instr-generate passed to linker

I'm struggling to build a driver for iPadOS in a particular project configuration. If I put the driver code and dext target into the same Xcode project which contains the iPad app, all is well. This is the way the Xcode driver template does it.

However, I'd like to build and debug the dext on macOS, while eventually deploying on iPadOS. So I put the dext into a different project, which has a macOS target, a minimal iPadOS target and a DriverKit target.

I made a workspace which contains both projects. I dragged the macOS project into the iPadOS project so that I can refer to the products of the macOS project (specifically, its driver target) as a dependency of the iPadOS target.

Note that the main iPad app target depends on the driver target.

So the workspace organization looks like this:

Workspace
  iPad project
      main iPad app target (depends on driver)
      test project reference
  test project
     test macOS/iPad app target
     DriverKit dext target

When I build the iPadOS target, it builds the dependent driver target in the macOS project, but it fails to link because Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/15.0.0/lib/darwin/libclang_rt.profile_driverkit.a is not found.

If I just build the driver target directly in Xcode, there is no such complaint.

I looked closely at the build logs, and I see for the failed link, there are these two linker flags set which are not set in the successful case

-debug_variant
-fprofile-instr-generate

I can't seem to control the generation of this flag. I tried turning off the Profile switch in the Scheme editor for the driver, but is makes no difference. When I directly build the driver target, no -fprofile-instr-generate is set and it compiles and links. When i build the driver as a dependency of another target, -fprofile-instr-generate is passed to the linker, which fails.

The obvious workaround is to put the driver source code into a separate driver target in the iPadOS project, but I'd rather have just one DriverKit driver for both platforms, with a few settings (such as bundle ID) controlled by a configuration file. Has anyone else encountered this problem, and know of a workaround?

Yes, I am having the same issue. Please let me know how to fix it if some one knows it.

It is caused by code coverage being injected by test plan that is autogenerated in scheme. Disabling code coverage for driver target and deleting test scheme will fix the problem. However, you might want to have testing with your project. But it looks like any test plan inside same project will inject profile-instr-generate. Not sure how to have testing for main app, and no code coverage flag injected for driver. Seems like bug in Xcode.

It is actually possible to have a tests but no code coverage. In test plan find Configurations. And there is a section "Code coverage". Default it is ON. Uncheck "Gather code coverage" to swift it OFF. Now it is a bit better. You can have a tests, but no code coverage.

how to inhibit -fprofile-instr-generate passed to linker
 
 
Q