aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2025-03-26 16:05:21 +0000
committergingerBill <bill@gingerbill.org>2025-03-26 16:05:21 +0000
commitd48e7bb0b89d19a9b5b66b5b6f35852125bd3afe (patch)
treeb748a81e1b5727ea46e1df4e31e749ea936dda88
parentdb82a49576c8e691cf938f7a2a86446f14b73f7c (diff)
Migrate `ODIN_ANDROID_*` constants to `build_settings.cpp`; `-minimum-os-version:<int>` for `-subtarget:android`
-rw-r--r--src/build_settings.cpp71
-rw-r--r--src/linker.cpp42
2 files changed, 77 insertions, 36 deletions
diff --git a/src/build_settings.cpp b/src/build_settings.cpp
index 0e040a4e6..b61121976 100644
--- a/src/build_settings.cpp
+++ b/src/build_settings.cpp
@@ -529,6 +529,14 @@ struct BuildContext {
String minimum_os_version_string;
bool minimum_os_version_string_given;
+
+
+ int ODIN_ANDROID_API_LEVEL;
+ String ODIN_ANDROID_NDK_PATH;
+ String ODIN_ANDROID_NDK_TOOLCHAIN_PATH;
+ String ODIN_ANDROID_NDK_TOOLCHAIN_LIB_PATH;
+ String ODIN_ANDROID_NDK_TOOLCHAIN_LIB_LEVEL_PATH;
+ String ODIN_ANDROID_NDK_TOOLCHAIN_SYSROOT_PATH;
};
gb_global BuildContext build_context = {0};
@@ -1725,6 +1733,69 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta
if (subtarget == Subtarget_Default) {
bc->metrics.target_triplet = concatenate_strings(permanent_allocator(), bc->metrics.target_triplet, bc->minimum_os_version_string);
}
+ } else if (selected_subtarget == Subtarget_Android) {
+ String default_level = str_lit("34");
+ if (!bc->minimum_os_version_string_given) {
+ bc->minimum_os_version_string = default_level;
+ }
+ BigInt level = {};
+ bool success = false;
+ big_int_from_string(&level, bc->minimum_os_version_string, &success);
+ if (!success) {
+ gb_printf_err("Warning: Invalid -minimum-os-version:%.*s for -subtarget:Android, defaulting to %.*s\n", LIT(bc->minimum_os_version_string), LIT(default_level));
+ bc->minimum_os_version_string = default_level;
+ big_int_from_string(&level, bc->minimum_os_version_string, &success);
+ GB_ASSERT(success);
+ }
+
+ i64 new_level = big_int_to_i64(&level);
+
+ if (new_level >= 21) {
+ bc->ODIN_ANDROID_API_LEVEL = cast(int)new_level;
+ } else {
+ gb_printf_err("Warning: Invalid -minimum-os-version:%.*s for -subtarget:Android, defaulting to %.*s\n", LIT(bc->minimum_os_version_string), LIT(default_level));
+ bc->ODIN_ANDROID_API_LEVEL = atoi(cast(char const *)default_level.text);
+ }
+
+ bc->ODIN_ANDROID_NDK_PATH = normalize_path(permanent_allocator(), make_string_c(gb_get_env("ODIN_ANDROID_NDK_PATH", permanent_allocator())), NIX_SEPARATOR_STRING);
+ bc->ODIN_ANDROID_NDK_TOOLCHAIN_PATH = normalize_path(permanent_allocator(), make_string_c(gb_get_env("ODIN_ANDROID_NDK_TOOLCHAIN_PATH", permanent_allocator())), NIX_SEPARATOR_STRING);
+
+ if (bc->ODIN_ANDROID_NDK_PATH.len != 0 && bc->ODIN_ANDROID_NDK_TOOLCHAIN_PATH.len == 0) {
+ String arch = str_lit("x86_64");
+ #if defined (GB_CPU_ARM)
+ // TODO(bill): this is a complete guess
+ arch = str_lit("aarch64");
+ #endif
+ #if defined(GB_SYSTEM_WINDOWS)
+ bc->ODIN_ANDROID_NDK_TOOLCHAIN_PATH = concatenate4_strings(temporary_allocator(), bc->ODIN_ANDROID_NDK_PATH, str_lit("toolchains/llvm/prebuilt/"), str_lit("windows-"), arch);
+ #elif defined(GB_SYSTEM_OSX)
+ // TODO(bill): is this name even correct?
+ bc->ODIN_ANDROID_NDK_TOOLCHAIN_PATH = concatenate4_strings(temporary_allocator(), bc->ODIN_ANDROID_NDK_PATH, str_lit("toolchains/llvm/prebuilt/"), str_lit("darwin-"), arch);
+ #elif defined(GB_SYSTEM_LINUX)
+ bc->ODIN_ANDROID_NDK_TOOLCHAIN_PATH = concatenate4_strings(temporary_allocator(), bc->ODIN_ANDROID_NDK_PATH, str_lit("toolchains/llvm/prebuilt/"), str_lit("linux-"), arch);
+ #endif
+
+ bc->ODIN_ANDROID_NDK_TOOLCHAIN_PATH = normalize_path(permanent_allocator(), bc->ODIN_ANDROID_NDK_TOOLCHAIN_PATH, NIX_SEPARATOR_STRING);
+ }
+
+ if (bc->ODIN_ANDROID_NDK_PATH.len == 0) {
+ gb_printf_err("Error: ODIN_ANDROID_NDK_PATH not set");
+ gb_exit(1);
+
+ }
+
+ if (bc->ODIN_ANDROID_NDK_TOOLCHAIN_PATH.len == 0) {
+ gb_printf_err("Error: ODIN_ANDROID_NDK_PATH not set");
+ gb_exit(1);
+ }
+
+ bc->ODIN_ANDROID_NDK_TOOLCHAIN_LIB_PATH = concatenate_strings(permanent_allocator(), bc->ODIN_ANDROID_NDK_TOOLCHAIN_PATH, str_lit("sysroot/usr/lib/aarch64-linux-android/"));
+
+ char buf[32] = {};
+ gb_snprintf(buf, gb_size_of(buf), "%d/", bc->ODIN_ANDROID_API_LEVEL);
+ bc->ODIN_ANDROID_NDK_TOOLCHAIN_LIB_LEVEL_PATH = concatenate_strings(permanent_allocator(), bc->ODIN_ANDROID_NDK_TOOLCHAIN_LIB_PATH, make_string_c(buf));
+
+ bc->ODIN_ANDROID_NDK_TOOLCHAIN_SYSROOT_PATH = concatenate_strings(permanent_allocator(), bc->ODIN_ANDROID_NDK_TOOLCHAIN_PATH, str_lit("sysroot/"));
}
if (!bc->custom_optimization_level) {
diff --git a/src/linker.cpp b/src/linker.cpp
index ea0abc5f3..1e6f045b1 100644
--- a/src/linker.cpp
+++ b/src/linker.cpp
@@ -418,43 +418,13 @@ try_cross_linking:;
} else {
timings_start_section(timings, str_lit("ld-link"));
- String ODIN_ANDROID_NDK_PATH = normalize_path(permanent_allocator(), make_string_c(gb_get_env("ODIN_ANDROID_NDK_PATH", permanent_allocator())), NIX_SEPARATOR_STRING);
- String ODIN_ANDROID_NDK_TOOLCHAIN_PATH = normalize_path(permanent_allocator(), make_string_c(gb_get_env("ODIN_ANDROID_NDK_TOOLCHAIN_PATH", permanent_allocator())), NIX_SEPARATOR_STRING);
-
- int ODIN_ANDROID_API_LEVEL = 34;
- if (char const *found = gb_get_env("ODIN_ANDROID_API_LEVEL", permanent_allocator())) {
- int new_level = atoi(found);
- if (new_level >= 34) {
- ODIN_ANDROID_API_LEVEL = new_level;
- } else {
- gb_printf_err("Warning: Invalid ODIN_ANDROID_API_LEVEL '%s', defaulting to %d\n", found, ODIN_ANDROID_API_LEVEL);
- }
- }
-
- String ODIN_ANDROID_NDK_TOOLCHAIN_LIB_PATH = {};
- String ODIN_ANDROID_NDK_TOOLCHAIN_LIB_LEVEL_PATH = {};
- String ODIN_ANDROID_NDK_TOOLCHAIN_SYSROOT_PATH = {};
-
- if (is_android) {
- if (ODIN_ANDROID_NDK_PATH.len == 0) {
- gb_printf_err("Error: ODIN_ANDROID_NDK_PATH not set");
- return 1;
- }
-
- if (ODIN_ANDROID_NDK_TOOLCHAIN_PATH.len == 0) {
- gb_printf_err("Error: ODIN_ANDROID_NDK_PATH not set");
- return 1;
- }
-
- ODIN_ANDROID_NDK_TOOLCHAIN_LIB_PATH = concatenate_strings(permanent_allocator(), ODIN_ANDROID_NDK_TOOLCHAIN_PATH, str_lit("sysroot/usr/lib/aarch64-linux-android/"));
-
- char buf[32] = {};
- gb_snprintf(buf, gb_size_of(buf), "%d/", ODIN_ANDROID_API_LEVEL);
- ODIN_ANDROID_NDK_TOOLCHAIN_LIB_LEVEL_PATH = concatenate_strings(permanent_allocator(), ODIN_ANDROID_NDK_TOOLCHAIN_LIB_PATH, make_string_c(buf));
-
- ODIN_ANDROID_NDK_TOOLCHAIN_SYSROOT_PATH = concatenate_strings(permanent_allocator(), ODIN_ANDROID_NDK_TOOLCHAIN_PATH, str_lit("sysroot/"));
- }
+ int const ODIN_ANDROID_API_LEVEL = build_context.ODIN_ANDROID_API_LEVEL;
+ String ODIN_ANDROID_NDK_PATH = build_context.ODIN_ANDROID_NDK_PATH;
+ String ODIN_ANDROID_NDK_TOOLCHAIN_PATH = build_context.ODIN_ANDROID_NDK_TOOLCHAIN_PATH;
+ String ODIN_ANDROID_NDK_TOOLCHAIN_LIB_PATH = build_context.ODIN_ANDROID_NDK_TOOLCHAIN_LIB_PATH;
+ String ODIN_ANDROID_NDK_TOOLCHAIN_LIB_LEVEL_PATH = build_context.ODIN_ANDROID_NDK_TOOLCHAIN_LIB_LEVEL_PATH;
+ String ODIN_ANDROID_NDK_TOOLCHAIN_SYSROOT_PATH = build_context.ODIN_ANDROID_NDK_TOOLCHAIN_SYSROOT_PATH;
// Link using `clang`, unless overridden by `ODIN_CLANG_PATH` environment variable.
const char* clang_path = gb_get_env("ODIN_CLANG_PATH", permanent_allocator());