ソースを参照

Migrate `ODIN_ANDROID_*` constants to `build_settings.cpp`; `-minimum-os-version:<int>` for `-subtarget:android`

gingerBill 5 ヶ月 前
コミット
d48e7bb0b8
2 ファイル変更77 行追加36 行削除
  1. 71 0
      src/build_settings.cpp
  2. 6 36
      src/linker.cpp

+ 71 - 0
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) {

+ 6 - 36
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());