xamarin / xamarin-macios

.NET for iOS, Mac Catalyst, macOS, and tvOS provide open-source bindings of the Apple SDKs for use with .NET managed languages such as C#
Other
2.47k stars 514 forks source link

Codesign Error with Large Framework #20193

Open mkehoe-Extron opened 8 months ago

mkehoe-Extron commented 8 months ago

We have added a framework with a lot of plugins and libraries to our application. We are seeing periodic build failures on our CI system and on local machines when building the release build.

The error always refers to failing to sign libz.dylib in the framework, which definitely exists. Looking at the verbose logging, it appears that libz.dylib is getting signed and resigned a lot of times. Each library in the framework has a reference to libz.dylib. It appears the signing process tries to follow all the dependencies of each library, which causes libz.dylib to get signed way more than needed.

Removing a bunch of unneeded files from the framework reduced the frequency of error. Passing /m:1 to the dotnet command has no effect on the issue.

Steps to Reproduce

Example command: dotnet publish -f:net7.0-maccatalyst -c:Release BuildIssue.csproj

Expected Behavior

No errors

Actual Behavior

Intermittent error that is returned: Tool /usr/bin/codesign execution finished (exit code = 1).

..libz.dylib: replacing existing signature ..libz.dylib: No such file or directory

Environment

dotnet maui 7 and 8 Tested with XCode 14.3.1, 15.0.1, and 15.1.

Build Logs

msbuild2.binlog.zip

Example Project (If Possible)

rolfbjarne commented 8 months ago

It certainly looks like we should add some deduplication logic to avoid signing the same file multiple times.

As a potential short-term workaround I could implement a way for you to disable signing in parallel - that way the codesign invocation won't step on eachother's toes. Would that work for you? I could probably get this workaround in the next service release.

mkehoe-Extron commented 8 months ago

Any sort of work around in the interim would be great, thanks!

rolfbjarne commented 8 months ago

I've added a property you can set to limit the number of concurrent codesign processes.

Setting it to 1 will effectively disable any concurrent codesigning processes, thus avoiding any race conditions:

<PropertyGroup>
    <CodesignMaxDegreeOfParallelism>1</CodesignMaxDegreeOfParallelism>
</PropertyGroup>

This won't be included in the next service release (too late for that), but it will be in the subsequent one.

mkehoe-Extron commented 8 months ago

@rolfbjarne Thank you for the assistance. Will this fix be available for projects using dotnet maui 7 or will this only be available for dotnet maui 8?

rolfbjarne commented 8 months ago

@rolfbjarne Thank you for the assistance. Will this fix be available for projects using dotnet maui 7 or will this only be available for dotnet maui 8?

Only for .NET 8.