Reputation: 2899
I just added my first Xcode 15, Swift 5.9 macro from an open source package that I'm referencing via Swift Package Manager. The first time I compiled locally, I had to trust the macro's package via a dialog box, which is fine for a local build. However, now my app doesn't build on Xcode Cloud, with the error "Target must be enabled before it can be used."
How do I tell Xcode Cloud to trust the macro's target?
Upvotes: 13
Views: 3819
Reputation: 21478
While others have given partial answers, here's the full copy & passable solution:
ci_scripts
ci_post_clone.sh
#!/bin/sh
# Exit on error (-e), undefined vars (-u), and pipeline failures (-o pipefail)
set -euo pipefail
# Disable Xcode macro fingerprint validation to prevent spurious build errors
defaults write com.apple.dt.Xcode IDESkipMacroFingerprintValidation -bool YES
chmod +x ci_scripts/ci_post_clone.sh
The result should look something like this:
Now Xcode Cloud should no longer complain about macros.
P.S.: I do not think that copying the macros.json
file is any safer than simply enabling all macros. If you can't trust your team and your release workflow, you have bigger problems than macros running in a sandbox Xcode Cloud environment.
Upvotes: 0
Reputation: 78
Cobbled together the answers here and elsewhere to get this working with Xcode Cloud and Xcode v16.2
Easiest way to do this is to
defaults write com.apple.dt.Xcode IDESkipMacroFingerprintValidation -bool YES
Note: there might be more secure (complicated) ways to achieve this but I would argue that a non-trusted library should be caught before it's added to your git repo.
i.e. when a package is added that has a macro, the macro will need to be approved manually. the human adding the package will always be the weak link here
Upvotes: 0
Reputation: 1589
I stumbled across this question after my Bitrise (not Xcode cloud) builds started failing when I integrated Swiftlint via SPM.
The solution for me was to add the following as a Script step in Bitrise:
defaults write com.apple.dt.Xcode IDESkipPackagePluginFingerprintValidatation -bool YES
The following didn't work:
-skipMacroValidation
to the xcodebuild commandIDESkipMacroFingerprintValidation
keySo I wonder if something has changed since the other answers were posted.
Also: IDESkipPackagePluginFingerprintValidatation
is not a typo. I suspect this may be fixed at some point 😅
Upvotes: 0
Reputation: 546
The suggestion provided by slavikus does work, but it poses a security risk because it enables any macro, allowing for the inclusion of malicious code in your Xcode build.
A safer approach could be to inform Xcode Cloud about the Macros you have explicitly enabled in your project, which are stored at ~/Library/org.swift.swiftpm/security/macros.json
, by creating a post-clone
script that copies this file into an internal location within Xcode Cloud.
Here are the steps to implement this solution:
ci_scripts
in your project's root directory.ci_post_clone.sh
with the following content:#!/bin/zsh
mkdir -p ~/Library/org.swift.swiftpm/security/
cp macros.json ~/Library/org.swift.swiftpm/security/
~/Library/org.swift.swiftpm/security/macros.json
into the same folder.This script will be executed after your project is cloned from the repo and before Xcode Cloud starts building the project.
For more details about writing custom scripts to enhance Xcode Cloud workflows: https://developer.apple.com/documentation/xcode/writing-custom-build-scripts
Upvotes: 6
Reputation: 396
I ran into same problem, and quickly discovered an additional defaults key that bypasses macro validation (same as -skipMacroValidation
xcodebuild
command line option):
defaults write com.apple.dt.Xcode IDESkipMacroFingerprintValidation -bool YES
Upvotes: 23