R.swift
R.swift copied to clipboard
Can't archive app (macCatalyst): Command PhaseScriptExecution failed with a nonzero exit code
Archiving build for macCatalyst is always failed with error:
PhaseScriptExecution R.swift\ generate\ resources\ for\ application\----/Users/-------/Library/Developer/Xcode/DerivedData/-----cgdjxjbhuvkkviehgyewavizhdoh/Build/Intermediates.noindex/ArchiveIntermediates/----/IntermediateBuildFilesPath/----.build/Release-maccatalyst/----.build/Script-C28EBBAA297DAB5B00847376.sh (in target '----' from project '----')
cd /Users/--------/WorkProjects/----
/bin/sh -c /Users/-------/Library/Developer/Xcode/DerivedData/-----cgdjxjbhuvkkviehgyewavizhdoh/Build/Intermediates.noindex/ArchiveIntermediates/----/IntermediateBuildFilesPath/----.build/Release-maccatalyst/----.build/Script-C28EBBAA297DAB5B00847376.sh
sandbox-exec: execvp() of '//Users/--------/Library/Developer/Xcode/DerivedData/-----cgdjxjbhuvkkviehgyewavizhdoh/Build/Intermediates.noindex/ArchiveIntermediates/----/BuildProductsPath/Release/rswift' failed: No such file or directory
Command PhaseScriptExecution failed with a nonzero exit code
R.swift installed using SPM. M1 pro mac used. The issue is reproducible only for archive builds and only for macCatalyst.
Update: After some research, I found that the reason for the issue is a wrong path to rswift executable. :)
#if canImport(XcodeProjectPlugin)
import XcodeProjectPlugin
extension RswiftGeneratePublicResources: XcodeBuildToolPlugin {
func createBuildCommands(context: XcodePluginContext, target: XcodeTarget) throws -> [Command] {
let resourcesDirectoryPath = context.pluginWorkDirectory
.appending(subpath: target.displayName)
.appending(subpath: "Resources")
try FileManager.default.createDirectory(atPath: resourcesDirectoryPath.string, withIntermediateDirectories: true)
let rswiftPath = resourcesDirectoryPath.appending(subpath: "R.generated.swift")
let description: String
if let product = target.product {
description = "\(product.kind) \(target.displayName)"
} else {
description = target.displayName
}
return [
.buildCommand(
displayName: "R.swift generate resources for \(description)",
executable: try context.tool(named: "rswift").path,
arguments: [
"generate", rswiftPath.string,
"--target", target.displayName,
"--input-type", "xcodeproj",
"--bundle-source", "finder",
"--access-level", "public",
],
outputFiles: [rswiftPath]
),
]
}
}
#endif
As you can see, the path to the executable is produced with context.tool(named: "rswift").path
. And it generates something like this:
...DerivedData/APP_NAME/Build/Intermediates.noindex/.../BuildProductsPath/Release/rswift
And an executable can be found with this path, but only while building for ios.
When archiving for MacCatalyst the right path should be:
...DerivedData/APP_NAME/Build/Intermediates.noindex/.../BuildProductsPath/Release-maccatalyst/rswift
So it seems like it is an SPM bug
From the error message, this looks similar to: https://github.com/mac-cain13/R.swift/issues/798
@antfisher were you able to get past this?
I think it's different to #798 and I am unable to get around this. Here is the sample project with R.swift failing on Archive for Mac Catalyst.
From the error message, this looks similar to: #798
Seems like it is different.
@antfisher were you able to get past this?
@deloitteshalem No. But I've updated my first post. Now it should be easier to create a temporary fix.
Thank you both for doing some more research and providing an example project.
This indeed sounds like an SPM bug.
I'm not quite sure what to do about it. I could try to create some hack to manipulate the path if I can somehow detect that the project is build for MacCatalyst. But a better approach would be to report the bug at SPM, and wait for a bug fix there.
I'm having the same issue too.
I'm encountering the same issue. Does anyone know of any workarounds?
I'm encountering the same issue. Does anyone know of any workarounds?
Since the problem is specifically related to SPM, the first thing that comes to mind is to try an alternative way to install R.swift, for example, using Cocoapods or manually adding the R.swift library to your project.