Skip to content

Commit e6727d0

Browse files
ikws4BeanCheeseBurrito
authored andcommitted
feat: android build support
feat: add type for build options feat: android build feat: android build feat: android build feat: android build feat: android build
1 parent 092b151 commit e6727d0

File tree

3 files changed

+102
-6
lines changed

3 files changed

+102
-6
lines changed

.github/workflows/ci.yml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,19 @@ jobs:
7171
uses: mymindstorm/setup-emsdk@v14
7272
with:
7373
actions-cache-folder: 'emsdk-cache'
74+
75+
- name: Setup Android NDK
76+
if: matrix.os == 'macos-13'
77+
uses: nttld/setup-ndk@v1
78+
with:
79+
ndk-version: r25c
80+
link-to-sdk: true
81+
82+
- name: Set Android NDK variables
83+
if: matrix.os == 'macos-13'
84+
shell: bash
85+
run: |
86+
echo "ANDROID_NDK_HOME=$ANDROID_NDK_HOME" >> $GITHUB_ENV
7487
7588
- name: Restore Dependencies
7689
shell: bash
@@ -101,6 +114,8 @@ jobs:
101114
dotnet build -c Debug -r iossimulator-x64
102115
dotnet build -c Debug -r iossimulator-arm64
103116
dotnet build -c Debug -r ios-arm64
117+
dotnet build -c Debug -r android-arm64
118+
dotnet build -c Debug -r android-x64
104119
105120
dotnet build -c Release -r linux-x64
106121
dotnet build -c Release -r linux-arm64
@@ -112,6 +127,8 @@ jobs:
112127
dotnet build -c Release -r iossimulator-x64
113128
dotnet build -c Release -r iossimulator-arm64
114129
dotnet build -c Release -r ios-arm64
130+
dotnet build -c Release -r android-arm64
131+
dotnet build -c Release -r android-x64
115132
116133
- name: Run Tests
117134
shell: bash

src/Flecs.NET.Native/Flecs.NET.Native.csproj

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@
4545
<ItemGroup>
4646
<None Pack="true" Include="buildTransitive/Flecs.NET.Native.props" PackagePath="buildTransitive/$(PackageId).props"/>
4747
<None Pack="true" Include="buildTransitive/Flecs.NET.Native.targets" PackagePath="buildTransitive/$(PackageId).targets"/>
48-
<None Pack="true" Include="$(OutputPath)runtimes/**/*.a;$(OutputPath)runtimes/**/*.lib" PackagePath="static/" />
48+
<None Pack="true" Include="$(OutputPath)runtimes/**/*.a;$(OutputPath)runtimes/**/*.lib" PackagePath="static/"/>
4949

50-
<Content Include="$(OutputPath)runtimes/**/**" Exclude="$(OutputPath)runtimes/**/*.a;$(OutputPath)runtimes/**/*.lib" Link="%(Filename)%(Extension)" >
50+
<Content Include="$(OutputPath)runtimes/**/**" Exclude="$(OutputPath)runtimes/**/*.a;$(OutputPath)runtimes/**/*.lib" Link="%(Filename)%(Extension)">
5151
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
5252
<PackagePath>runtimes/</PackagePath>
5353
</Content>
@@ -58,77 +58,105 @@
5858
<When Condition="$(RuntimeIdentifier) == 'win-x64'">
5959
<PropertyGroup>
6060
<ZigIdentifier>x86_64-windows-gnu</ZigIdentifier>
61+
<ZigLibraryType>Shared</ZigLibraryType>
6162
</PropertyGroup>
6263
</When>
6364
<When Condition="$(RuntimeIdentifier) == 'win-x86'">
6465
<PropertyGroup>
6566
<ZigIdentifier>x86-windows-gnu</ZigIdentifier>
67+
<ZigLibraryType>Shared</ZigLibraryType>
6668
</PropertyGroup>
6769
</When>
6870
<When Condition="$(RuntimeIdentifier) == 'win-arm'">
6971
<PropertyGroup>
7072
<ZigIdentifier>arm-windows-gnu</ZigIdentifier>
73+
<ZigLibraryType>Shared</ZigLibraryType>
7174
</PropertyGroup>
7275
</When>
7376
<When Condition="$(RuntimeIdentifier) == 'win-arm64'">
7477
<PropertyGroup>
7578
<ZigIdentifier>aarch64-windows-gnu</ZigIdentifier>
79+
<ZigLibraryType>Shared</ZigLibraryType>
7680
</PropertyGroup>
7781
</When>
7882
<When Condition="$(RuntimeIdentifier) == 'linux-x64'">
7983
<PropertyGroup>
8084
<ZigIdentifier>x86_64-linux-gnu</ZigIdentifier>
85+
<ZigLibraryType>Shared</ZigLibraryType>
8186
</PropertyGroup>
8287
</When>
8388
<When Condition="$(RuntimeIdentifier) == 'linux-x86'">
8489
<PropertyGroup>
8590
<ZigIdentifier>x86-linux-gnu</ZigIdentifier>
91+
<ZigLibraryType>Shared</ZigLibraryType>
8692
</PropertyGroup>
8793
</When>
8894
<When Condition="$(RuntimeIdentifier) == 'linux-arm'">
8995
<PropertyGroup>
9096
<ZigIdentifier>arm-linux-gnueabihf</ZigIdentifier>
97+
<ZigLibraryType>Shared</ZigLibraryType>
9198
</PropertyGroup>
9299
</When>
93100
<When Condition="$(RuntimeIdentifier) == 'linux-arm64'">
94101
<PropertyGroup>
95102
<ZigIdentifier>aarch64-linux-gnu</ZigIdentifier>
103+
<ZigLibraryType>Shared</ZigLibraryType>
96104
</PropertyGroup>
97105
</When>
98106
<When Condition="$(RuntimeIdentifier) == 'osx-x64'">
99107
<PropertyGroup>
100108
<ZigIdentifier>x86_64-macos</ZigIdentifier>
109+
<ZigLibraryType>Shared</ZigLibraryType>
101110
</PropertyGroup>
102111
</When>
103112
<When Condition="$(RuntimeIdentifier) == 'osx-arm64'">
104113
<PropertyGroup>
105114
<ZigIdentifier>aarch64-macos</ZigIdentifier>
115+
<ZigLibraryType>Shared</ZigLibraryType>
106116
</PropertyGroup>
107-
</When>
117+
</When>
108118
<When Condition="$(RuntimeIdentifier) == 'iossimulator-x64'">
109119
<PropertyGroup>
110120
<ZigIdentifier>x86_64-ios-simulator</ZigIdentifier>
121+
<ZigLibraryType>Shared</ZigLibraryType>
111122
<ZigArgs>--sysroot $(IOS_SIMULATOR_SDK)</ZigArgs>
112123
</PropertyGroup>
113124
</When>
114125
<When Condition="$(RuntimeIdentifier) == 'iossimulator-arm64'">
115126
<PropertyGroup>
116127
<ZigIdentifier>aarch64-ios-simulator</ZigIdentifier>
128+
<ZigLibraryType>Shared</ZigLibraryType>
117129
<ZigArgs>--sysroot $(IOS_SIMULATOR_SDK)</ZigArgs>
118130
</PropertyGroup>
119131
</When>
120132
<When Condition="$(RuntimeIdentifier) == 'ios-arm64'">
121133
<PropertyGroup>
122134
<ZigIdentifier>aarch64-ios</ZigIdentifier>
135+
<ZigLibraryType>Shared</ZigLibraryType>
123136
<ZigArgs>--sysroot $(IOS_SDK)</ZigArgs>
124137
</PropertyGroup>
125138
</When>
126139
<When Condition="$(RuntimeIdentifier) == 'browser-wasm'">
127140
<PropertyGroup>
128141
<ZigIdentifier>wasm32-emscripten</ZigIdentifier>
142+
<ZigLibraryType>Static</ZigLibraryType>
129143
<ZigArgs>--sysroot "$(EMSDK)/upstream/emscripten"</ZigArgs>
130144
</PropertyGroup>
131145
</When>
146+
<When Condition="$(RuntimeIdentifier) == 'android-arm64'">
147+
<PropertyGroup>
148+
<ZigIdentifier>aarch64-linux-android</ZigIdentifier>
149+
<ZigLibraryType>Shared</ZigLibraryType>
150+
<ZigArgs>--sysroot $(ANDROID_NDK_HOME)</ZigArgs>
151+
</PropertyGroup>
152+
</When>
153+
<When Condition="$(RuntimeIdentifier) == 'android-x64'">
154+
<PropertyGroup>
155+
<ZigIdentifier>x86_64-linux-android</ZigIdentifier>
156+
<ZigLibraryType>Shared</ZigLibraryType>
157+
<ZigArgs>--sysroot $(ANDROID_NDK_HOME)</ZigArgs>
158+
</PropertyGroup>
159+
</When>
132160
<Otherwise>
133161
<PropertyGroup>
134162
<ZigIdentifier>$(RuntimeIdentifier)</ZigIdentifier>
@@ -157,7 +185,6 @@
157185
<Message Importance="High" Text="Build Target: $(RuntimeIdentifier) $(Configuration)"/>
158186
<Message Importance="High" Text="Build Zig Target: $(ZigIdentifier) $(ZigConfiguration)"/>
159187
<Message Importance="High" Text="Build Zig Args: $(ZigArgs)"/>
160-
<Exec Command="$(BuildCommand) -Dlibrary-type=Shared" Condition="'$(RuntimeIdentifier)' != 'browser-wasm'"/>
161-
<Exec Command="$(BuildCommand) -Dlibrary-type=Static"/>
188+
<Exec Command="$(BuildCommand) -Dlibrary-type=$(ZigLibraryType)"/>
162189
</Target>
163190
</Project>

src/Flecs.NET.Native/build.zig

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,16 @@
11
const std = @import("std");
2+
const builtin = @import("builtin");
23
const Build = std.Build;
34

45
pub const LibraryType = enum { Shared, Static };
56

7+
const BuildOptions = struct {
8+
optimize: std.builtin.OptimizeMode,
9+
target: Build.ResolvedTarget,
10+
library_type: LibraryType,
11+
compiler_rt_path: ?[]const u8,
12+
};
13+
614
const src_flags = [_][]const u8{
715
"-std=c99",
816
"-fno-sanitize=undefined",
@@ -134,7 +142,7 @@ const src_files = [_][]const u8{
134142
"../../native/flecs/src/storage/table.c",
135143
};
136144

137-
pub fn compileFlecs(b: *Build, options: anytype) void {
145+
pub fn compileFlecs(b: *Build, options: BuildOptions) void {
138146
const lib = switch (options.library_type) {
139147
.Shared => b.addSharedLibrary(.{
140148
.name = "flecs",
@@ -190,6 +198,50 @@ pub fn compileFlecs(b: *Build, options: anytype) void {
190198
dir.close();
191199
lib.addIncludePath(.{ .cwd_relative = cache_include });
192200
},
201+
.linux => {
202+
if (options.target.result.abi == .android) {
203+
if (b.sysroot == null) {
204+
@panic("A --sysroot path to an Android NDK needs to be provided when compiling for Android.");
205+
}
206+
207+
const host_tuple = switch (builtin.target.os.tag) {
208+
.linux => "linux-x86_64",
209+
.windows => "windows-x86_64",
210+
.macos => "darwin-x86_64",
211+
else => @panic("unsupported host OS"),
212+
};
213+
214+
const triple = switch (options.target.result.cpu.arch) {
215+
.aarch64 => "aarch64-linux-android",
216+
.x86_64 => "x86_64-linux-android",
217+
else => @panic("Unsupported Android architecture"),
218+
};
219+
const android_api_level: []const u8 = "21";
220+
221+
const android_sysroot = b.pathJoin(&.{ b.sysroot.?, "/toolchains/llvm/prebuilt/", host_tuple, "/sysroot" });
222+
const android_lib_path = b.pathJoin(&.{ android_sysroot, "/usr/lib/", triple, android_api_level });
223+
const android_include_path = b.pathJoin(&.{ android_sysroot, "/usr/include" });
224+
const android_system_include_path = b.pathJoin(&.{ android_sysroot, "/usr/include/", triple });
225+
226+
lib.addLibraryPath(.{ .cwd_relative = android_lib_path });
227+
228+
const libc_file_name = "android-libc.conf";
229+
var libc_content = std.ArrayList(u8).init(b.allocator);
230+
errdefer libc_content.deinit();
231+
232+
const writer = libc_content.writer();
233+
const libc_installation = std.zig.LibCInstallation{
234+
.include_dir = android_include_path,
235+
.sys_include_dir = android_system_include_path,
236+
.crt_dir = android_lib_path,
237+
};
238+
libc_installation.render(writer) catch @panic("Failed to render libc");
239+
const libc_path = b.addWriteFiles().add(libc_file_name, libc_content.items);
240+
241+
lib.setLibCFile(libc_path);
242+
lib.libc_file.?.addStepDependencies(&lib.step);
243+
}
244+
},
193245
else => {},
194246
}
195247

0 commit comments

Comments
 (0)