From 8a81e48aa9a3baca8c50eba61efe21ea7607a2c2 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Fri, 25 Oct 2024 00:51:07 +0200 Subject: [PATCH] Rework how natives are built and add emscripten support - Simplifies how natives are built and how they are structured. - Adds support for auto linking static library when in WASM or NativeAOT mode - Adds support for emscripten WASM builds Signed-off-by: Tomas Slusny --- .github/workflows/ci.yml | 55 +++- README.md | 5 +- .../Flecs.NET.Benchmarks.csproj | 2 - .../Flecs.NET.Examples.csproj | 2 - src/Flecs.NET.Native/Flecs.NET.Native.csproj | 289 ++++++++++-------- src/Flecs.NET.Native/Flecs.NET.Native.props | 28 -- src/Flecs.NET.Native/Flecs.NET.Native.targets | 31 -- src/Flecs.NET.Native/Program.cs | 7 + src/Flecs.NET.Native/build.zig | 15 +- .../buildTransitive/Flecs.NET.Native.props | 29 +- .../buildTransitive/Flecs.NET.Native.targets | 22 +- src/Flecs.NET.Tests/Flecs.NET.Tests.csproj | 2 - 12 files changed, 246 insertions(+), 241 deletions(-) delete mode 100644 src/Flecs.NET.Native/Flecs.NET.Native.props delete mode 100644 src/Flecs.NET.Native/Flecs.NET.Native.targets create mode 100644 src/Flecs.NET.Native/Program.cs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f5433f91..16d93500 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -66,6 +66,12 @@ jobs: echo "IOS_SDK=$IOS_SDK" >> $GITHUB_ENV echo "IOS_SIMULATOR_SDK=$IOS_SIMULATOR_SDK" >> $GITHUB_ENV + - name: Setup EMSDK + if: matrix.os == 'macos-13' + uses: mymindstorm/setup-emsdk@v14 + with: + actions-cache-folder: 'emsdk-cache' + - name: Restore Dependencies shell: bash run: dotnet restore @@ -77,27 +83,52 @@ jobs: - name: Build Projects shell: bash run: | - if [ '${{ matrix.os }}' == 'macos-13' ]; then - dotnet build -c Debug --property:IosSdkPath=$IOS_SDK --property:IosSimulatorSdkPath=$IOS_SIMULATOR_SDK - dotnet build -c Release --property:IosSdkPath=$IOS_SDK --property:IosSimulatorSdkPath=$IOS_SIMULATOR_SDK - else - dotnet build -c Debug - dotnet build -c Release - fi + dotnet build -c Debug + dotnet build -c Release + + - name: Build Natives + shell: bash + if: matrix.os == 'macos-13' + working-directory: src/Flecs.NET.Native + run: | + dotnet build -c Debug -r linux-x64 + dotnet build -c Release -r linux-x64 + dotnet build -c Debug -r linux-arm64 + dotnet build -c Release -r linux-arm64 + + dotnet build -c Debug -r osx-x64 + dotnet build -c Release -r osx-x64 + dotnet build -c Debug -r osx-arm64 + dotnet build -c Release -r osx-arm64 + + dotnet build -c Debug -r win-x64 + dotnet build -c Release -r win-x64 + dotnet build -c Debug -r win-arm64 + dotnet build -c Release -r win-arm64 + + dotnet build -c Debug -r browser-wasm + dotnet build -c Release -r browser-wasm + + dotnet build -c Debug -r iossimulator-x64 + dotnet build -c Release -r iossimulator-x64 + dotnet build -c Debug -r iossimulator-arm64 + dotnet build -c Release -r iossimulator-arm64 + dotnet build -c Debug -r ios-arm64 + dotnet build -c Release -r ios-arm64 - name: Run Tests shell: bash - run: dotnet test --no-build + run: dotnet test -p:SkipNatives=true - name: Pack Nuget Packages shell: bash run: | if [ '${{ github.event.inputs.nuget-registry }}' == 'NuGet' ]; then - dotnet pack --property:VersionSuffix=$FlecsVersionSuffix -c Debug - dotnet pack --property:VersionSuffix=$FlecsVersionSuffix -c Release + dotnet pack --property:VersionSuffix=$FlecsVersionSuffix -p:SkipNatives=true -c Debug + dotnet pack --property:VersionSuffix=$FlecsVersionSuffix -p:SkipNatives=true -c Release else - dotnet pack --property:VersionSuffix=$FlecsVersionSuffix --property:FlecsPackPdb=true -c Debug - dotnet pack --property:VersionSuffix=$FlecsVersionSuffix --property:FlecsPackPdb=true -c Release + dotnet pack --property:VersionSuffix=$FlecsVersionSuffix --property:FlecsPackPdb=true -p:SkipNatives=true -c Debug + dotnet pack --property:VersionSuffix=$FlecsVersionSuffix --property:FlecsPackPdb=true -p:SkipNatives=true -c Release fi - name: Upload Artifacts diff --git a/README.md b/README.md index 63e349f5..06ecc22f 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,8 @@ public record struct Velocity(float X, float Y); - Fully blittable interface with no runtime marshalling **Flecs.NET.Native - Precompiled native libraries** -- Provides both shared and static libraries for Windows, MacOS, and Linux +- Provides both shared and static libraries for Windows, MacOS, Linux, iOS, and WASM +- Static libraries are automatically linked in PublishAOT and browser builds - Packaged with Zig for dependency free cross-compilation everywhere ## NuGet @@ -172,8 +173,6 @@ Reference the project and import the native libraries. You should now be able to net8.0 - - diff --git a/src/Flecs.NET.Benchmarks/Flecs.NET.Benchmarks.csproj b/src/Flecs.NET.Benchmarks/Flecs.NET.Benchmarks.csproj index c918b7e9..4cff973f 100644 --- a/src/Flecs.NET.Benchmarks/Flecs.NET.Benchmarks.csproj +++ b/src/Flecs.NET.Benchmarks/Flecs.NET.Benchmarks.csproj @@ -8,8 +8,6 @@ $(NoWarn);CS8618 - - diff --git a/src/Flecs.NET.Examples/Flecs.NET.Examples.csproj b/src/Flecs.NET.Examples/Flecs.NET.Examples.csproj index 293dbd96..c3bbae69 100644 --- a/src/Flecs.NET.Examples/Flecs.NET.Examples.csproj +++ b/src/Flecs.NET.Examples/Flecs.NET.Examples.csproj @@ -14,8 +14,6 @@ $(DefineConstants);$(Example) - - diff --git a/src/Flecs.NET.Native/Flecs.NET.Native.csproj b/src/Flecs.NET.Native/Flecs.NET.Native.csproj index d1583730..16b19e2a 100644 --- a/src/Flecs.NET.Native/Flecs.NET.Native.csproj +++ b/src/Flecs.NET.Native/Flecs.NET.Native.csproj @@ -1,25 +1,27 @@ - + Library netstandard2.1 - $(NoWarn);NU5128 + + + false + false + false + false + false + false + false true - true - false 4.0.2 - Flecs.NET.Native.Debug - Flecs.NET.Native.Release BeanCheeseBurrito BeanCheeseBurrito Native libraries for flecs - $(Title) https://github.com/BeanCheeseBurrito/Flecs.NET https://raw.githubusercontent.com/SanderMertens/flecs/master/docs/img/logo_small.png - icon.png MIT https://github.com/BeanCheeseBurrito/Flecs.NET Github @@ -27,132 +29,173 @@ - true - true - true - - $([System.Runtime.InteropServices.RuntimeInformation]::ProcessArchitecture) + $([System.Runtime.InteropServices.RuntimeInformation]::ProcessArchitecture) + - $(FlecsCompileOptions)-Dsoft-assert=true + + + + + Flecs.NET.Native.Debug + $(PackageId) + Debug + + + + + Flecs.NET.Native.Release + $(PackageId) + ReleaseFast + + + + + + + + + win-x64 + win-arm64 + + + + + linux-x64 + linux-arm64 + + + + + osx-x64 + osx-arm64 + + + + + + + $(HostRuntime) + - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - + + + + + + PreserveNewest + runtimes/ + + - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - + + + + + x86_64-windows-gnu + + + + + x86-windows-gnu + + + + + arm-windows-gnu + + + + + aarch64-windows-gnu + + + + + x86_64-linux-gnu + + + + + x86-linux-gnu + + + + + arm-linux-gnueabihf + + + + + aarch64-linux-gnu + + + + + x86_64-macos + + + + + aarch64-macos + + + + + x86_64-ios-simulator + --sysroot $(IOS_SIMULATOR_SDK) + + + + + aarch64-ios-simulator + --sysroot $(IOS_SIMULATOR_SDK) + + + + + aarch64-ios + --sysroot $(IOS_SDK) + + + + + wasm32-emscripten + --sysroot "$(EMSDK)/upstream/emscripten" + + + + + $(RuntimeIdentifier) + + + + + + + $(ZigArgs)-Dsoft-assert=true + - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + diff --git a/src/Flecs.NET.Native/Flecs.NET.Native.props b/src/Flecs.NET.Native/Flecs.NET.Native.props deleted file mode 100644 index 155863c2..00000000 --- a/src/Flecs.NET.Native/Flecs.NET.Native.props +++ /dev/null @@ -1,28 +0,0 @@ - - - $([MSBuild]::NormalizeDirectory('$(MSBuildThisFileDirectory)debug')) - $([MSBuild]::NormalizeDirectory('$(MSBuildThisFileDirectory)release')) - - $([MSBuild]::NormalizePath('$(FlecsStaticLibraryFolder)linux-x64/libflecs.a')) - $([MSBuild]::NormalizePath('$(FlecsStaticLibraryFolder)osx-x64/libflecs.a')) - $([MSBuild]::NormalizePath('$(FlecsStaticLibraryFolder)win-x64/flecs.lib')) - $([MSBuild]::NormalizePath('$(FlecsStaticLibraryFolder)iossimulator-x64/libflecs.a')) - - $([MSBuild]::NormalizePath('$(FlecsStaticLibraryFolder)linux-arm64/libflecs.a')) - $([MSBuild]::NormalizePath('$(FlecsStaticLibraryFolder)osx-arm64/libflecs.a')) - $([MSBuild]::NormalizePath('$(FlecsStaticLibraryFolder)win-arm64/flecs.lib')) - $([MSBuild]::NormalizePath('$(FlecsStaticLibraryFolder)ios-arm64/libflecs.a')) - $([MSBuild]::NormalizePath('$(FlecsStaticLibraryFolder)iossimulator-arm64/libflecs.a')) - - $(FlecsStaticLibrary_linux-x64) - $(FlecsStaticLibrary_osx-x64) - $(FlecsStaticLibrary_win-x64) - $(FlecsStaticLibrary_iossimulator-x64) - - $(FlecsStaticLibrary_linux-arm64) - $(FlecsStaticLibrary_osx-arm64) - $(FlecsStaticLibrary_win-arm64) - $(FlecsStaticLibrary_ios-arm64 - $(FlecsStaticLibrary_iossimulator-arm64) - - diff --git a/src/Flecs.NET.Native/Flecs.NET.Native.targets b/src/Flecs.NET.Native/Flecs.NET.Native.targets deleted file mode 100644 index 61098b32..00000000 --- a/src/Flecs.NET.Native/Flecs.NET.Native.targets +++ /dev/null @@ -1,31 +0,0 @@ - - - - %(Filename)%(Extension) - Always - false - - - - %(Filename)%(Extension) - Always - false - - - - %(Filename)%(Extension) - Always - false - - - - %(Filename)%(Extension) - Always - false - - - diff --git a/src/Flecs.NET.Native/Program.cs b/src/Flecs.NET.Native/Program.cs new file mode 100644 index 00000000..8abe706a --- /dev/null +++ b/src/Flecs.NET.Native/Program.cs @@ -0,0 +1,7 @@ +class Program +{ + // Dummy entry point to enable building for WASM + static void Main(string[] args) + { + } +} diff --git a/src/Flecs.NET.Native/build.zig b/src/Flecs.NET.Native/build.zig index 154c5002..8880ffdf 100644 --- a/src/Flecs.NET.Native/build.zig +++ b/src/Flecs.NET.Native/build.zig @@ -40,6 +40,16 @@ pub fn compileFlecs(options: anytype, b: *Build, lib_type: LibType) void { lib.addSystemIncludePath(.{ .cwd_relative = b.pathJoin(&.{ b.sysroot.?, "/usr/include" }) }); lib.addLibraryPath(.{ .cwd_relative = b.pathJoin(&.{ b.sysroot.?, "/usr/lib" }) }); }, + .emscripten => { + if (b.sysroot == null) { + @panic("Pass '--sysroot \"$EMSDK/upstream/emscripten\"'"); + } + + const cache_include = b.pathJoin(&.{ b.sysroot.?, "cache", "sysroot", "include" }); + var dir = std.fs.openDirAbsolute(cache_include, std.fs.Dir.OpenDirOptions{ .access_sub_paths = true, .no_follow = true }) catch @panic("No emscripten cache. Generate it!"); + dir.close(); + lib.addIncludePath(.{ .cwd_relative = cache_include }); + }, else => {}, } @@ -53,6 +63,9 @@ pub fn build(b: *Build) void { .soft_assert = b.option(bool, "soft-assert", "Compile with the FLECS_SOFT_ASSERT define.") orelse false, }; - compileFlecs(options, b, LibType.Shared); + if (options.target.result.os.tag != .emscripten) { + compileFlecs(options, b, LibType.Shared); + } + compileFlecs(options, b, LibType.Static); } diff --git a/src/Flecs.NET.Native/buildTransitive/Flecs.NET.Native.props b/src/Flecs.NET.Native/buildTransitive/Flecs.NET.Native.props index 0c1a168e..9d48ea53 100644 --- a/src/Flecs.NET.Native/buildTransitive/Flecs.NET.Native.props +++ b/src/Flecs.NET.Native/buildTransitive/Flecs.NET.Native.props @@ -1,27 +1,6 @@ - - $([MSBuild]::NormalizeDirectory('$(MSBuildThisFileDirectory)../static_libraries')) - - $([MSBuild]::NormalizePath('$(FlecsStaticLibraryFolder)linux-x64/libflecs.a')) - $([MSBuild]::NormalizePath('$(FlecsStaticLibraryFolder)win-x64/flecs.lib')) - $([MSBuild]::NormalizePath('$(FlecsStaticLibraryFolder)osx-x64/libflecs.a')) - $([MSBuild]::NormalizePath('$(FlecsStaticLibraryFolder)iossimulator-x64/libflecs.a')) - - $([MSBuild]::NormalizePath('$(FlecsStaticLibraryFolder)linux-arm64/libflecs.a')) - $([MSBuild]::NormalizePath('$(FlecsStaticLibraryFolder)osx-arm64/libflecs.a')) - $([MSBuild]::NormalizePath('$(FlecsStaticLibraryFolder)win-arm64/flecs.lib')) - $([MSBuild]::NormalizePath('$(FlecsStaticLibraryFolder)ios-arm64/libflecs.a')) - $([MSBuild]::NormalizePath('$(FlecsStaticLibraryFolder)iossimulator-arm64/libflecs.a')) - - $(FlecsStaticLibrary_linux-x64) - $(FlecsStaticLibrary_osx-x64) - $(FlecsStaticLibrary_win-x64) - $(FlecsStaticLibrary_iossimulator-x64) - - $(FlecsStaticLibrary_linux-arm64) - $(FlecsStaticLibrary_osx-arm64) - $(FlecsStaticLibrary_win-arm64) - $(FlecsStaticLibrary_ios-arm64 - $(FlecsStaticLibrary_iossimulator-arm64) - + + $([MSBuild]::NormalizeDirectory('$(MSBuildThisFileDirectory)../static/$(RuntimeIdentifier)/native/')) + true + diff --git a/src/Flecs.NET.Native/buildTransitive/Flecs.NET.Native.targets b/src/Flecs.NET.Native/buildTransitive/Flecs.NET.Native.targets index d83c1cdf..9c7ce738 100644 --- a/src/Flecs.NET.Native/buildTransitive/Flecs.NET.Native.targets +++ b/src/Flecs.NET.Native/buildTransitive/Flecs.NET.Native.targets @@ -1,14 +1,12 @@ - - $(FlecsStaticLibrary_linux-x64) - $(FlecsStaticLibrary_osx-x64) - $(FlecsStaticLibrary_win-x64) - $(FlecsStaticLibrary_iossimulator-x64) - - $(FlecsStaticLibrary_linux-arm64) - $(FlecsStaticLibrary_osx-arm64) - $(FlecsStaticLibrary_win-arm64) - $(FlecsStaticLibrary_ios-arm64 - $(FlecsStaticLibrary_iossimulator-arm64) - + + + + + + + + + + diff --git a/src/Flecs.NET.Tests/Flecs.NET.Tests.csproj b/src/Flecs.NET.Tests/Flecs.NET.Tests.csproj index e6e6bc63..72084c5e 100644 --- a/src/Flecs.NET.Tests/Flecs.NET.Tests.csproj +++ b/src/Flecs.NET.Tests/Flecs.NET.Tests.csproj @@ -8,8 +8,6 @@ $(NoWarn);xUnit2013;CS8500 - -