Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
17 changes: 17 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,19 @@ jobs:
uses: mymindstorm/setup-emsdk@v14
with:
actions-cache-folder: 'emsdk-cache'

- name: Setup Android NDK
if: matrix.os == 'macos-13'
uses: nttld/setup-ndk@v1
with:
ndk-version: r25c
link-to-sdk: true

- name: Set Android NDK variables
if: matrix.os == 'macos-13'
shell: bash
run: |
echo "ANDROID_NDK_HOME=$ANDROID_NDK_HOME" >> $GITHUB_ENV

- name: Restore Dependencies
shell: bash
Expand Down Expand Up @@ -101,6 +114,8 @@ jobs:
dotnet build -c Debug -r iossimulator-x64
dotnet build -c Debug -r iossimulator-arm64
dotnet build -c Debug -r ios-arm64
dotnet build -c Debug -r android-arm64
dotnet build -c Debug -r android-x64

dotnet build -c Release -r linux-x64
dotnet build -c Release -r linux-arm64
Expand All @@ -112,6 +127,8 @@ jobs:
dotnet build -c Release -r iossimulator-x64
dotnet build -c Release -r iossimulator-arm64
dotnet build -c Release -r ios-arm64
dotnet build -c Release -r android-arm64
dotnet build -c Release -r android-x64

- name: Run Tests
shell: bash
Expand Down
37 changes: 32 additions & 5 deletions src/Flecs.NET.Native/Flecs.NET.Native.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,9 @@
<ItemGroup>
<None Pack="true" Include="buildTransitive/Flecs.NET.Native.props" PackagePath="buildTransitive/$(PackageId).props"/>
<None Pack="true" Include="buildTransitive/Flecs.NET.Native.targets" PackagePath="buildTransitive/$(PackageId).targets"/>
<None Pack="true" Include="$(OutputPath)runtimes/**/*.a;$(OutputPath)runtimes/**/*.lib" PackagePath="static/" />
<None Pack="true" Include="$(OutputPath)runtimes/**/*.a;$(OutputPath)runtimes/**/*.lib" PackagePath="static/"/>

<Content Include="$(OutputPath)runtimes/**/**" Exclude="$(OutputPath)runtimes/**/*.a;$(OutputPath)runtimes/**/*.lib" Link="%(Filename)%(Extension)" >
<Content Include="$(OutputPath)runtimes/**/**" Exclude="$(OutputPath)runtimes/**/*.a;$(OutputPath)runtimes/**/*.lib" Link="%(Filename)%(Extension)">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<PackagePath>runtimes/</PackagePath>
</Content>
Expand All @@ -58,77 +58,105 @@
<When Condition="$(RuntimeIdentifier) == 'win-x64'">
<PropertyGroup>
<ZigIdentifier>x86_64-windows-gnu</ZigIdentifier>
<ZigLibraryType>Shared</ZigLibraryType>
</PropertyGroup>
</When>
<When Condition="$(RuntimeIdentifier) == 'win-x86'">
<PropertyGroup>
<ZigIdentifier>x86-windows-gnu</ZigIdentifier>
<ZigLibraryType>Shared</ZigLibraryType>
</PropertyGroup>
</When>
<When Condition="$(RuntimeIdentifier) == 'win-arm'">
<PropertyGroup>
<ZigIdentifier>arm-windows-gnu</ZigIdentifier>
<ZigLibraryType>Shared</ZigLibraryType>
</PropertyGroup>
</When>
<When Condition="$(RuntimeIdentifier) == 'win-arm64'">
<PropertyGroup>
<ZigIdentifier>aarch64-windows-gnu</ZigIdentifier>
<ZigLibraryType>Shared</ZigLibraryType>
</PropertyGroup>
</When>
<When Condition="$(RuntimeIdentifier) == 'linux-x64'">
<PropertyGroup>
<ZigIdentifier>x86_64-linux-gnu</ZigIdentifier>
<ZigLibraryType>Shared</ZigLibraryType>
</PropertyGroup>
</When>
<When Condition="$(RuntimeIdentifier) == 'linux-x86'">
<PropertyGroup>
<ZigIdentifier>x86-linux-gnu</ZigIdentifier>
<ZigLibraryType>Shared</ZigLibraryType>
</PropertyGroup>
</When>
<When Condition="$(RuntimeIdentifier) == 'linux-arm'">
<PropertyGroup>
<ZigIdentifier>arm-linux-gnueabihf</ZigIdentifier>
<ZigLibraryType>Shared</ZigLibraryType>
</PropertyGroup>
</When>
<When Condition="$(RuntimeIdentifier) == 'linux-arm64'">
<PropertyGroup>
<ZigIdentifier>aarch64-linux-gnu</ZigIdentifier>
<ZigLibraryType>Shared</ZigLibraryType>
</PropertyGroup>
</When>
<When Condition="$(RuntimeIdentifier) == 'osx-x64'">
<PropertyGroup>
<ZigIdentifier>x86_64-macos</ZigIdentifier>
<ZigLibraryType>Shared</ZigLibraryType>
</PropertyGroup>
</When>
<When Condition="$(RuntimeIdentifier) == 'osx-arm64'">
<PropertyGroup>
<ZigIdentifier>aarch64-macos</ZigIdentifier>
<ZigLibraryType>Shared</ZigLibraryType>
</PropertyGroup>
</When>
</When>
<When Condition="$(RuntimeIdentifier) == 'iossimulator-x64'">
<PropertyGroup>
<ZigIdentifier>x86_64-ios-simulator</ZigIdentifier>
<ZigLibraryType>Shared</ZigLibraryType>
<ZigArgs>--sysroot $(IOS_SIMULATOR_SDK)</ZigArgs>
</PropertyGroup>
</When>
<When Condition="$(RuntimeIdentifier) == 'iossimulator-arm64'">
<PropertyGroup>
<ZigIdentifier>aarch64-ios-simulator</ZigIdentifier>
<ZigLibraryType>Shared</ZigLibraryType>
<ZigArgs>--sysroot $(IOS_SIMULATOR_SDK)</ZigArgs>
</PropertyGroup>
</When>
<When Condition="$(RuntimeIdentifier) == 'ios-arm64'">
<PropertyGroup>
<ZigIdentifier>aarch64-ios</ZigIdentifier>
<ZigLibraryType>Shared</ZigLibraryType>
<ZigArgs>--sysroot $(IOS_SDK)</ZigArgs>
</PropertyGroup>
</When>
<When Condition="$(RuntimeIdentifier) == 'browser-wasm'">
<PropertyGroup>
<ZigIdentifier>wasm32-emscripten</ZigIdentifier>
<ZigLibraryType>Static</ZigLibraryType>
<ZigArgs>--sysroot "$(EMSDK)/upstream/emscripten"</ZigArgs>
</PropertyGroup>
</When>
<When Condition="$(RuntimeIdentifier) == 'android-arm64'">
<PropertyGroup>
<ZigIdentifier>aarch64-linux-android</ZigIdentifier>
<ZigLibraryType>Shared</ZigLibraryType>
<ZigArgs>--sysroot $(ANDROID_NDK_HOME)</ZigArgs>
</PropertyGroup>
</When>
<When Condition="$(RuntimeIdentifier) == 'android-x64'">
<PropertyGroup>
<ZigIdentifier>x86_64-linux-android</ZigIdentifier>
<ZigLibraryType>Shared</ZigLibraryType>
<ZigArgs>--sysroot $(ANDROID_NDK_HOME)</ZigArgs>
</PropertyGroup>
</When>
<Otherwise>
<PropertyGroup>
<ZigIdentifier>$(RuntimeIdentifier)</ZigIdentifier>
Expand Down Expand Up @@ -157,7 +185,6 @@
<Message Importance="High" Text="Build Target: $(RuntimeIdentifier) $(Configuration)"/>
<Message Importance="High" Text="Build Zig Target: $(ZigIdentifier) $(ZigConfiguration)"/>
<Message Importance="High" Text="Build Zig Args: $(ZigArgs)"/>
<Exec Command="$(BuildCommand) -Dlibrary-type=Shared" Condition="'$(RuntimeIdentifier)' != 'browser-wasm'"/>
<Exec Command="$(BuildCommand) -Dlibrary-type=Static"/>
<Exec Command="$(BuildCommand) -Dlibrary-type=$(ZigLibraryType)"/>
Comment thread
BeanCheeseBurrito marked this conversation as resolved.
Outdated
</Target>
</Project>
54 changes: 53 additions & 1 deletion src/Flecs.NET.Native/build.zig
Original file line number Diff line number Diff line change
@@ -1,8 +1,16 @@
const std = @import("std");
const builtin = @import("builtin");
const Build = std.Build;

pub const LibraryType = enum { Shared, Static };

const BuildOptions = struct {
optimize: std.builtin.OptimizeMode,
target: Build.ResolvedTarget,
library_type: LibraryType,
compiler_rt_path: ?[]const u8,
};

const src_flags = [_][]const u8{
"-std=c99",
"-fno-sanitize=undefined",
Expand Down Expand Up @@ -134,7 +142,7 @@ const src_files = [_][]const u8{
"../../native/flecs/src/storage/table.c",
};

pub fn compileFlecs(b: *Build, options: anytype) void {
pub fn compileFlecs(b: *Build, options: BuildOptions) void {
const lib = switch (options.library_type) {
.Shared => b.addSharedLibrary(.{
.name = "flecs",
Expand Down Expand Up @@ -190,6 +198,50 @@ pub fn compileFlecs(b: *Build, options: anytype) void {
dir.close();
lib.addIncludePath(.{ .cwd_relative = cache_include });
},
.linux => {
if (options.target.result.abi == .android) {
if (b.sysroot == null) {
@panic("A --sysroot path to an Android NDK needs to be provided when compiling for Android.");
}

const host_tuple = switch (builtin.target.os.tag) {
.linux => "linux-x86_64",
.windows => "windows-x86_64",
.macos => "darwin-x86_64",
else => @panic("unsupported host OS"),
};

const triple = switch (options.target.result.cpu.arch) {
.aarch64 => "aarch64-linux-android",
.x86_64 => "x86_64-linux-android",
else => @panic("Unsupported Android architecture"),
};
const android_api_level: []const u8 = "21";

const android_sysroot = b.pathJoin(&.{ b.sysroot.?, "/toolchains/llvm/prebuilt/", host_tuple, "/sysroot" });
const android_lib_path = b.pathJoin(&.{ android_sysroot, "/usr/lib/", triple, android_api_level });
const android_include_path = b.pathJoin(&.{ android_sysroot, "/usr/include" });
const android_system_include_path = b.pathJoin(&.{ android_sysroot, "/usr/include/", triple });

lib.addLibraryPath(.{ .cwd_relative = android_lib_path });

const libc_file_name = "android-libc.conf";
var libc_content = std.ArrayList(u8).init(b.allocator);
errdefer libc_content.deinit();

const writer = libc_content.writer();
const libc_installation = std.zig.LibCInstallation{
.include_dir = android_include_path,
.sys_include_dir = android_system_include_path,
.crt_dir = android_lib_path,
};
libc_installation.render(writer) catch @panic("Failed to render libc");
const libc_path = b.addWriteFiles().add(libc_file_name, libc_content.items);

lib.setLibCFile(libc_path);
lib.libc_file.?.addStepDependencies(&lib.step);
}
},
else => {},
}

Expand Down