diff --git a/build.zig b/build.zig index 2e08003..11c13d5 100644 --- a/build.zig +++ b/build.zig @@ -1,14 +1,12 @@ const std = @import("std"); const builtin = @import("builtin"); -const androidbuild = @import("src/androidbuild/androidbuild.zig"); - -// Expose Android build functionality for use in your build.zig -// TODO: rename tools.zig to Sdk.zig -pub const Sdk = @import("src/androidbuild/tools.zig"); -pub const Apk = @import("src/androidbuild/Apk.zig"); +const androidbuild = @import("src/androidbuild/androidbuild.zig"); pub const ApiLevel = androidbuild.ApiLevel; pub const standardTargets = androidbuild.standardTargets; +pub const resolveTargets = androidbuild.resolveTargets; +pub const Apk = @import("src/androidbuild/Apk.zig"); +pub const Sdk = @import("src/androidbuild/tools.zig"); // Deprecated exposed fields diff --git a/build.zig.zon b/build.zig.zon index 484222c..1add7e8 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -7,6 +7,5 @@ "build.zig.zon", "src", }, - .minimum_zig_version = "0.14.0", .fingerprint = 0x92bcb62d42fb2cee, } diff --git a/src/androidbuild/Apk.zig b/src/androidbuild/Apk.zig index 68c5128..673275a 100644 --- a/src/androidbuild/Apk.zig +++ b/src/androidbuild/Apk.zig @@ -1,25 +1,23 @@ const std = @import("std"); +const Allocator = std.mem.Allocator; +const Target = std.Target; +const Step = std.Build.Step; +const ResolvedTarget = std.Build.ResolvedTarget; +const LazyPath = std.Build.LazyPath; const builtin = @import("builtin"); -const androidbuild = @import("androidbuild.zig"); -const Sdk = @import("tools.zig"); -const BuiltinOptionsUpdate = @import("BuiltinOptionsUpdate.zig"); -const DirectoryFileInput = @import("DirectoryFileInput.zig"); -const Ndk = @import("Ndk.zig"); -const BuildTools = @import("BuildTools.zig"); -const D8Glob = @import("D8Glob.zig"); - -const KeyStore = Sdk.KeyStore; +const androidbuild = @import("androidbuild.zig"); const ApiLevel = androidbuild.ApiLevel; const getAndroidTriple = androidbuild.getAndroidTriple; const runNameContext = androidbuild.runNameContext; const printErrorsAndExit = androidbuild.printErrorsAndExit; - -const Allocator = std.mem.Allocator; -const Target = std.Target; -const Step = std.Build.Step; -const ResolvedTarget = std.Build.ResolvedTarget; -const LazyPath = std.Build.LazyPath; +const BuildTools = @import("BuildTools.zig"); +const BuiltinOptionsUpdate = @import("BuiltinOptionsUpdate.zig"); +const D8Glob = @import("D8Glob.zig"); +const DirectoryFileInput = @import("DirectoryFileInput.zig"); +const Ndk = @import("Ndk.zig"); +const Sdk = @import("tools.zig"); +const KeyStore = Sdk.KeyStore; pub const Resource = union(enum) { // file: File, diff --git a/src/androidbuild/androidbuild.zig b/src/androidbuild/androidbuild.zig index fa0d2b0..facb30a 100644 --- a/src/androidbuild/androidbuild.zig +++ b/src/androidbuild/androidbuild.zig @@ -1,9 +1,8 @@ const std = @import("std"); -const builtin = @import("builtin"); - const Target = std.Target; const ResolvedTarget = std.Build.ResolvedTarget; const LazyPath = std.Build.LazyPath; +const builtin = @import("builtin"); const log = std.log.scoped(.@"zig-android-sdk"); @@ -62,10 +61,36 @@ pub fn getAndroidTriple(target: ResolvedTarget) error{InvalidAndroidTarget}![]co /// /// If none of the above, then return a zero length slice. pub fn standardTargets(b: *std.Build, target: ResolvedTarget) []ResolvedTarget { - const all_targets = b.option(bool, "android", "if true, build for all Android targets (x86, x86_64, aarch64, etc)") orelse false; - if (all_targets) { + // NOTE(jae): 2026-04-11 + // Seperated logic into "resolveTargets" so that consumers of this library can create this option themselves and use "b.lazyImport" + // See: https://github.com/silbinarywolf/zig-android-sdk/pull/82 + const all_targets = b.option(bool, "android", "Build for all Android targets (x86, x86_64, aarch64, arm, etc)") orelse false; + return resolveTargets(b, .{ + .default_target = target, + .all_targets = all_targets, + }); +} + +pub const ResolveTargetOptions = struct { + /// The target retrieved from b.standardTargetOptions + default_target: ResolvedTarget, + /// If true, then retrieve all Android targets rather than using the default target + all_targets: bool, + + /// Shorthand to query all Android targets + pub const all: ResolveTargetOptions = .{ + .default_target = undefined, + .all_targets = true, + }; +}; + +/// Will return a slice of Android targets depending on the options given. +/// Avoids setting up options +pub fn resolveTargets(b: *std.Build, options: ResolveTargetOptions) []ResolvedTarget { + if (options.all_targets) { return getAllAndroidTargets(b); } + const target = options.default_target; if (!target.result.abi.isAndroid()) { return &[0]ResolvedTarget{}; }