Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 30 additions & 1 deletion src/Avalonia.Native/Avalonia.Native.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,13 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<UseMicroComGeneratorRoslyn>true</UseMicroComGeneratorRoslyn>

<BuildAvaloniaNativeXcodeProject Condition="'$(BuildAvaloniaNativeXcodeProject)' == ''">$([MSBuild]::IsOSPlatform(OSX))</BuildAvaloniaNativeXcodeProject>
<AvaloniaNativeSourceDir>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)../../native/Avalonia.Native))</AvaloniaNativeSourceDir>
<AvaloniaNativeXcodeProject>$(AvaloniaNativeSourceDir)/src/OSX/Avalonia.Native.OSX.xcodeproj</AvaloniaNativeXcodeProject>
<AvaloniaNativeBuildDir>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)../../Build/Products/$(Configuration)))</AvaloniaNativeBuildDir>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this seems to be pointing to /build which contains our .targets/.props, am I reading this right?


<!-- Include libAvaloniaNative.dylib, only if we are on macOS host or dylib was manually copied -->
<AvaloniaNativeDylibPath>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)../../Build/Products/Release/libAvalonia.Native.OSX.dylib))</AvaloniaNativeDylibPath>
<AvaloniaNativeDylibPath>$(AvaloniaNativeBuildDir)/libAvalonia.Native.OSX.dylib</AvaloniaNativeDylibPath>
<IncludeAvaloniaDylib Condition="'$(IncludeAvaloniaDylib)' == '' AND Exists($(AvaloniaNativeDylibPath))">true</IncludeAvaloniaDylib>
<IncludeAvaloniaDylib Condition="'$(IncludeAvaloniaDylib)' == ''">$([MSBuild]::IsOSPlatform(OSX))</IncludeAvaloniaDylib>

Expand All @@ -24,6 +29,30 @@
</Content>
</ItemGroup>

<!-- On macOS, build the underlying Xcode project whenever one of its sources changed -->
<ItemGroup Condition="'$(BuildAvaloniaNativeXcodeProject)' == 'true'">
<AvaloniaNativeSource Include="$(AvaloniaNativeSourceDir)/**/*.mm;$(AvaloniaNativeSourceDir)/**/*.h" />

@kekekeks kekekeks Sep 7, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Conciser blanket $(AvaloniaNativeSourceDir)/**/* excluding avn.h (if it's built by the same target). Otherwise us adding .cpp file or someting else will break it.

<AvaloniaNativeSource Include="$(AvaloniaNativeXcodeProject)/**/*" Exclude="$(AvaloniaNativeXcodeProject)/**/xcuserdata/**/*" />
</ItemGroup>

<Target Name="CompileAvaloniaNativeXcodeProject"
Condition="'$(BuildAvaloniaNativeXcodeProject)' == 'true'"
BeforeTargets="DispatchToInnerBuilds;BeforeBuild"
Inputs="@(AvaloniaNativeSource)"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please, use "inputs cache file" approach (see

<Target Name="_GenerateAvaloniaResourcesDependencyCache" BeforeTargets="GenerateAvaloniaResources">
<PropertyGroup>
<_AvaloniaResourcesInputsCacheFilePath>$(IntermediateOutputPath)/Avalonia/Resources.Inputs.cache</_AvaloniaResourcesInputsCacheFilePath>
</PropertyGroup>
<ItemGroup>
<CustomAdditionalGenerateAvaloniaResourcesInputs Include="$(_AvaloniaResourcesInputsCacheFilePath)" />
</ItemGroup>
<Hash ItemsToHash="@(AvaloniaResource);@(AvaloniaXaml);$(MSBuildAllProjects)">
<Output TaskParameter="HashResult" PropertyName="AvaloniaResourcesDependencyHash" />
</Hash>
<MakeDir Directories="$(IntermediateOutputPath)/Avalonia" />
<WriteLinesToFile Overwrite="true" File="$(_AvaloniaResourcesInputsCacheFilePath)" Lines="$(AvaloniaResourcesDependencyHash)" WriteOnlyWhenDifferent="True" />
<ItemGroup>
<FileWrites Include="$(_AvaloniaResourcesInputsCacheFilePath)" />
</ItemGroup>
</Target>
).

Outputs="$(AvaloniaNativeDylibPath)">
<Message Importance="high" Text="Building native library $([System.IO.Path]::GetFileName($(AvaloniaNativeDylibPath)))" />
Comment on lines +38 to +43

@maxkatz6 maxkatz6 Sep 5, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should be able to reuse the same task for CompileNative nuke target. I.e. dotnet msbuild -t:CompileAvaloniaNativeXcodeProject.

Keeping xcodeproj/CONFIGURATION_BUILD_DIR paths defined in one place (this csproj).

You might need to extract this target to be executable without BeforeTargets - shared one that can be called from the nuke.
And add a second one that depends on a shared CompileAvaloniaNativeXcodeProject and runs before BeforeBuild.

<!-- TODO: Don't ignore xcode warnings, fix them instead -->
<Exec Command="xcodebuild -quiet -project &quot;$(AvaloniaNativeXcodeProject)&quot; -configuration $(Configuration) CONFIGURATION_BUILD_DIR=&quot;$(AvaloniaNativeBuildDir)&quot; GCC_WARN_INHIBIT_ALL_WARNINGS=YES ONLY_ACTIVE_ARCH=NO"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doesn't re-generate native headers. Nuke target does.

ConsoleToMSBuild="true"
IgnoreExitCode="false"
IgnoreStandardErrorWarningFormat="false"
StandardOutputImportance="low"
StandardErrorImportance="low"
EchoOff="true" />
<!-- Make sure the dylib is newer than its inputs, so the incremental check above doesn't run xcodebuild again -->
<Touch Files="$(AvaloniaNativeDylibPath)" Condition="Exists($(AvaloniaNativeDylibPath))" />
</Target>

<ItemGroup>
<ProjectReference Include="..\..\packages\Avalonia\Avalonia.csproj" />
<ProjectReference Include="..\Avalonia.Dialogs\Avalonia.Dialogs.csproj" />
Expand Down