|
6 | 6 |
|
7 | 7 | const std = @import("std"); |
8 | 8 | const builtin = @import("builtin"); |
| 9 | +const log = std.log.scoped(.build); |
9 | 10 |
|
10 | 11 | const android = @import("android"); |
11 | 12 |
|
| 13 | +/// Make sure this is a stable version of Zig |
| 14 | +const is_latest_stable_zig = builtin.zig_version.pre == null and |
| 15 | + builtin.zig_version.major == 0 and builtin.zig_version.minor >= 16; |
| 16 | + |
12 | 17 | pub fn build(b: *std.Build) void { |
13 | 18 | const exe_name: []const u8 = "build_test"; |
14 | 19 | const root_target = b.standardTargetOptions(.{}); |
15 | 20 | const optimize = b.standardOptimizeOption(.{}); |
16 | 21 | const android_targets = android.standardTargets(b, root_target); |
17 | 22 |
|
18 | | - // NOTE(jae): 2026-04-12 |
19 | | - // Run it *after* the "standardTargets" call |
20 | | - testLazyImportAndResolveTargets(b, root_target); |
21 | | - |
22 | 23 | var root_target_single = [_]std.Build.ResolvedTarget{root_target}; |
23 | 24 | const targets: []std.Build.ResolvedTarget = if (android_targets.len == 0) |
24 | 25 | root_target_single[0..] |
@@ -46,77 +47,91 @@ pub fn build(b: *std.Build) void { |
46 | 47 | }; |
47 | 48 |
|
48 | 49 | for (targets) |target| { |
| 50 | + if (!target.result.abi.isAndroid()) { |
| 51 | + std.debug.panic("For testing Android builds only. Target(s) should be Android not: {t}", .{target.result.abi}); |
| 52 | + } |
| 53 | + |
| 54 | + const translate_c_vendored_mod = testTranslateCVendor(b, target, optimize) orelse return; |
| 55 | + |
49 | 56 | const app_module = b.createModule(.{ |
50 | 57 | .target = target, |
51 | 58 | .optimize = optimize, |
52 | 59 | .root_source_file = b.path("src/build_test_main.zig"), |
| 60 | + .imports = &.{ |
| 61 | + .{ |
| 62 | + .name = "translate_c_internal", |
| 63 | + .module = translate_c_vendored_mod, |
| 64 | + }, |
| 65 | + }, |
53 | 66 | }); |
54 | 67 |
|
55 | | - var exe: *std.Build.Step.Compile = if (target.result.abi.isAndroid()) b.addLibrary(.{ |
| 68 | + const libmain = b.addLibrary(.{ |
56 | 69 | .name = "main", |
57 | 70 | .root_module = app_module, |
58 | 71 | .linkage = .dynamic, |
59 | | - }) else b.addExecutable(.{ |
60 | | - .name = exe_name, |
61 | | - .root_module = app_module, |
62 | 72 | }); |
63 | 73 |
|
64 | | - // if building as library for Android, add this target |
65 | | - // NOTE: Android has different CPU targets so you need to build a version of your |
66 | | - // code for x86, x86_64, arm, arm64 and more |
67 | | - if (target.result.abi.isAndroid()) { |
68 | | - const apk: *android.Apk = android_apk orelse @panic("Android APK should be initialized"); |
69 | | - const android_dep = b.dependency("android", .{ |
70 | | - .optimize = optimize, |
71 | | - .target = target, |
72 | | - }); |
73 | | - exe.root_module.addImport("android", android_dep.module("android")); |
74 | | - |
75 | | - apk.addArtifact(exe); |
76 | | - } else { |
77 | | - b.installArtifact(exe); |
78 | | - |
79 | | - // If only 1 target, add "run" step |
80 | | - if (targets.len == 1) { |
81 | | - const run_step = b.step("run", "Run the application"); |
82 | | - const run_cmd = b.addRunArtifact(exe); |
83 | | - run_step.dependOn(&run_cmd.step); |
84 | | - } |
85 | | - } |
| 74 | + const apk: *android.Apk = android_apk orelse @panic("Android APK should be initialized"); |
| 75 | + const android_dep = b.dependency("android", .{ |
| 76 | + .optimize = optimize, |
| 77 | + .target = target, |
| 78 | + }); |
| 79 | + libmain.root_module.addImport("android", android_dep.module("android")); |
| 80 | + |
| 81 | + apk.addArtifact(libmain); |
86 | 82 | } |
87 | 83 | if (android_apk) |apk| { |
88 | 84 | testInstallAndAddRunStep(b, apk); |
89 | 85 | } |
90 | 86 | } |
91 | 87 |
|
92 | | -/// Test calling lazyImport and then calling "resolveTargets" |
93 | | -/// |
94 | | -/// PR: https://github.com/silbinarywolf/zig-android-sdk/pull/83 |
95 | | -fn testLazyImportAndResolveTargets(b: *std.Build, root_target: std.Build.ResolvedTarget) void { |
96 | | - const all_android_targets = true; |
97 | | - const android_targets: []std.Build.ResolvedTarget = blk: { |
98 | | - if (all_android_targets or root_target.result.abi.isAndroid()) { |
99 | | - if (b.lazyImport(@This(), "lazy_android")) |lazy_android| { |
100 | | - break :blk lazy_android.resolveTargets(b, .{ |
101 | | - .default_target = root_target, |
102 | | - .all_targets = true, |
103 | | - }); |
104 | | - } |
105 | | - } |
106 | | - break :blk &[0]std.Build.ResolvedTarget{}; |
107 | | - }; |
108 | | - if (android_targets.len != 4) @panic("expected 'resolveTargets' it to return 4 Android targets"); |
| 88 | +/// Test the Translate-C vendored copy, this will eventually be deprecated and removed from Zig but for now exists in 0.16.X |
| 89 | +fn testTranslateCVendor(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std.builtin.OptimizeMode) ?*std.Build.Module { |
| 90 | + const trans_c = b.addTranslateC(.{ |
| 91 | + .root_source_file = b.addWriteFiles().add("android_c.h", |
| 92 | + \\#include <android/log.h> |
| 93 | + ), |
| 94 | + .target = target, |
| 95 | + .optimize = optimize, |
| 96 | + }); |
| 97 | + return trans_c.createModule(); |
| 98 | +} |
| 99 | + |
| 100 | +/// Test the Translate-C external dependency version |
| 101 | +fn testTranslateCExternal(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std.builtin.OptimizeMode) ?*std.Build.Module { |
| 102 | + const translate_c_dep_name = if (comptime builtin.zig_version.major == 0 and builtin.zig_version.minor == 15) |
| 103 | + "translate_c_previous_stable" |
| 104 | + else |
| 105 | + "translate_c_stable"; |
| 106 | + const translate_c_import = b.lazyImport(@This(), translate_c_dep_name) orelse return null; |
| 107 | + const translate_c = b.lazyDependency(translate_c_dep_name, .{}) orelse return null; |
| 108 | + const Translator = translate_c_import.Translator; |
| 109 | + |
| 110 | + const trans_libandroid: Translator = .init(translate_c, .{ |
| 111 | + .c_source_file = b.addWriteFiles().add("android_c.h", |
| 112 | + \\#include <android/log.h> |
| 113 | + ), |
| 114 | + .target = target, |
| 115 | + .optimize = optimize, |
| 116 | + }); |
| 117 | + return trans_libandroid.mod; |
109 | 118 | } |
110 | 119 |
|
111 | 120 | /// Test the addLibraryFile functionality |
112 | 121 | /// |
113 | 122 | /// Requested feature here: https://github.com/silbinarywolf/zig-android-sdk/issues/77 |
114 | 123 | fn testAddLibraryFile(b: *std.Build, apk: *android.Apk) void { |
| 124 | + if (!is_latest_stable_zig) { |
| 125 | + return; |
| 126 | + } |
| 127 | + |
115 | 128 | const vulkan_validation_dep = b.lazyDependency("vulkan_validation", .{}) orelse return; |
116 | 129 | apk.addLibraryFile(.arm64_v8a, vulkan_validation_dep.path("arm64-v8a/libVkLayer_khronos_validation.so")); |
117 | 130 | apk.addLibraryFile(.armeabi_v7a, vulkan_validation_dep.path("armeabi-v7a/libVkLayer_khronos_validation.so")); |
118 | 131 | apk.addLibraryFile(.x86, vulkan_validation_dep.path("x86/libVkLayer_khronos_validation.so")); |
119 | 132 | apk.addLibraryFile(.x86_64, vulkan_validation_dep.path("x86_64/libVkLayer_khronos_validation.so")); |
| 133 | + |
| 134 | + log.info("testAddLibraryFile: add vulkan validation layers to APK", .{}); |
120 | 135 | } |
121 | 136 |
|
122 | 137 | fn testInstallAndAddRunStep(b: *std.Build, apk: *android.Apk) void { |
|
0 commit comments