This project demonstrates how to statically compile an Avalonia application on Alpine Linux.
Please install the following dependencies first:
apk add dotnet9-sdk build-base clang cmake
apk add freetype-static fontconfig-static expat-static bzip2-static libx11-static libxcb-static libxdmcp-dev libxau-dev libsm-dev libice-static icu-static icu-dev openssl-dev openssl-libs-static
Add the following content to your csproj file:
<ItemGroup Condition="'$(RuntimeIdentifier)' == 'linux-musl-x64'">
<DirectPInvoke Include="libc" />
<DirectPInvoke Include="libSkiaSharp" />
<NativeLibrary Include="runtimes\linux-x64\native\libSkiaSharp.a" /> <!-- Adjust the path as needed -->
<DirectPInvoke Include="libHarfBuzzSharp" />
<NativeLibrary Include="runtimes\linux-x64\native\libHarfBuzzSharp.a" /> <!-- Adjust the path as needed -->
<DirectPInvoke Include="libX11.so.6" />
<NativeLibrary Include="/usr/lib/libX11.a" />
<NativeLibrary Include="/usr/lib/libxcb.a" />
<NativeLibrary Include="/usr/lib/libxcb-composite.a" />
<NativeLibrary Include="/usr/lib/libxcb-damage.a" />
<NativeLibrary Include="/usr/lib/libxcb-dbe.a" />
<NativeLibrary Include="/usr/lib/libxcb-dpms.a" />
<NativeLibrary Include="/usr/lib/libxcb-dri2.a" />
<NativeLibrary Include="/usr/lib/libxcb-dri3.a" />
<NativeLibrary Include="/usr/lib/libxcb-glx.a" />
<NativeLibrary Include="/usr/lib/libxcb-present.a" />
<NativeLibrary Include="/usr/lib/libxcb-randr.a" />
<NativeLibrary Include="/usr/lib/libxcb-record.a" />
<NativeLibrary Include="/usr/lib/libxcb-render.a" />
<NativeLibrary Include="/usr/lib/libxcb-res.a" />
<NativeLibrary Include="/usr/lib/libxcb-screensaver.a" />
<NativeLibrary Include="/usr/lib/libxcb-shape.a" />
<NativeLibrary Include="/usr/lib/libxcb-shm.a" />
<NativeLibrary Include="/usr/lib/libxcb-sync.a" />
<NativeLibrary Include="/usr/lib/libxcb-xf86dri.a" />
<NativeLibrary Include="/usr/lib/libxcb-xfixes.a" />
<NativeLibrary Include="/usr/lib/libxcb-xinerama.a" />
<NativeLibrary Include="/usr/lib/libxcb-xinput.a" />
<NativeLibrary Include="/usr/lib/libxcb-xkb.a" />
<NativeLibrary Include="/usr/lib/libxcb-xtest.a" />
<NativeLibrary Include="/usr/lib/libxcb-xv.a" />
<NativeLibrary Include="/usr/lib/libxcb-xvmc.a" />
<NativeLibrary Include="/usr/lib/libXau.a" />
<NativeLibrary Include="/usr/lib/libXdmcp.a" />
<DirectPInvoke Include="libSM.so.6" />
<NativeLibrary Include="/usr/lib/libSM.a" />
<DirectPInvoke Include="libICE.so.6" />
<NativeLibrary Include="/usr/lib/libICE.a" />
<NativeLibrary Include="/usr/lib/libfontconfig.a" />
<NativeLibrary Include="/usr/lib/libfreetype.a" />
<NativeLibrary Include="/usr/lib/libexpat.a" />
<NativeLibrary Include="/usr/lib/libbz2.a" />
</ItemGroup>
dotnet publish -p:PublishAot=true -p:StaticOpenSslLinking=true -p:StaticExecutable=true -p:StaticICULinking=true
You can use the preview version of the Microsoft.DotNet.ILCompiler NuGet package with option -p:EmbedIcuDataPath=/usr/share/icu/74.2/icudt74l.dat
(see docs).
If you do not need ICU, you can use -p:InvariantGlobalization=true
.
Extract SampleBrowser.Desktop.7z
or Semi.Avalonia.Demo.Desktop.7z
.
Extract icudt74l.7z
and copy it to /usr/share/icu/74.2/icudt74l.dat
(I did not use the EmbedIcuDataPath option).
Run the sample application.