Description
There's a check to verify that RuntimeIdentifier is set when PublishAot=true:
Unfortunately this check is not valid when building universal apps for macOS and Mac Catalyst (the netX-macos
and netX-maccatalyst
target frameworks).
When building a universal app, the project file will set RuntimeIdentifiers (plural):
<TargetFramework>net8.0-macos</TargetFramework>
<RuntimeIdentifiers>osx-x64;osx-arm</RuntimeIdentifiers>
and then during the build, the macOS SDK will run two inner builds, with RuntimeIdentifiers unset, and RuntimeIdentifier set to each of the rids.
The problem is that the outer build, where RuntimeIdentifiers is set, but RuntimeIdentifier isn't, triggers the above-mentioned verification, and that fails the build.
I attempted to unset PublishAot for the outer build, but that doesn't work for two reasons:
- It can't be unset if customers pass /p:PublishAot=true on the command line.
- The package restore won't restore the NativeAOT packages nor include them in the build, and thus effectively NativeAOT is turned off for the inner builds as well, even if we set PublishAot=true for them.
This workaround worked around the second point:
<Target Name="EnablePublishAot" BeforeTargets="ProcessFrameworkReferences">
<PropertyGroup>
<_OriginalPublishAot>$(PublishAot)</_OriginalPublishAot>
<PublishAot>true</PublishAot>
</PropertyGroup>
</Target>
<Target Name="RestorePublishAot" AfterTargets="ProcessFrameworkReferences">
<PropertyGroup>
<PublishAot>$(_OriginalPublishAot)</PublishAot>
</PropertyGroup>
</Target>
but it's on the uglier side of ugly, and not a complete solution anyways (point 1 is still a problem).
I see two potential fixes:
a. Add a property to skip this check, and set this property in the macOS SDK:
<NETSdkError Condition="'$(PublishAot)' == 'true' and '$(RuntimeIdentifier)' == '' and '$(_IsPublishing)' == 'true' and '$(AllowPublishAotWithoutRuntimeIdentifier)' != 'true'"
ResourceName="ImplicitRuntimeIdentifierResolutionForPublishPropertyFailed"
FormatArguments="PublishAot"/>
b. Check for RuntimeIdentifiers (plural) as well:
<NETSdkError Condition="'$(PublishAot)' == 'true' and '$(RuntimeIdentifier)' == '' and '$(RuntimeIdentifiers)' != 'true' and '$(_IsPublishing)' == 'true'"
ResourceName="ImplicitRuntimeIdentifierResolutionForPublishPropertyFailed"
FormatArguments="PublishAot"/>