From 939bf4bb5dd2c94f0e67d3193becf56ec9c7abf1 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 8 Aug 2023 11:35:51 +0100 Subject: [PATCH] Add experimental `-subtarget:ios` --- src/build_settings.cpp | 31 ++++++++++++++++++++++++++++++- src/main.cpp | 40 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index ef68a399b..79f6e8a2c 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -123,6 +123,18 @@ struct TargetMetrics { TargetABIKind abi; }; +enum Subtarget : u32 { + Subtarget_Default, + Subtarget_iOS, + + Subtarget_COUNT, +}; + +gb_global String subtarget_strings[Subtarget_COUNT] = { + str_lit(""), + str_lit("ios"), +}; + enum QueryDataSetKind { QueryDataSet_Invalid, @@ -585,6 +597,8 @@ gb_global NamedTargetMetrics named_targets[] = { }; gb_global NamedTargetMetrics *selected_target_metrics; +gb_global Subtarget selected_subtarget; + gb_internal TargetOsKind get_target_os_from_string(String str) { for (isize i = 0; i < TargetOs_COUNT; i++) { @@ -1147,7 +1161,7 @@ gb_internal char *token_pos_to_string(TokenPos const &pos) { return s; } -gb_internal void init_build_context(TargetMetrics *cross_target) { +gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subtarget) { BuildContext *bc = &build_context; gb_affinity_init(&bc->affinity); @@ -1242,6 +1256,21 @@ gb_internal void init_build_context(TargetMetrics *cross_target) { bc->metrics = *metrics; + switch (subtarget) { + case Subtarget_Default: + break; + case Subtarget_iOS: + GB_ASSERT(metrics->os == TargetOs_darwin); + if (metrics->arch == TargetArch_arm64) { + bc->metrics.target_triplet = str_lit("arm64-apple-ios"); + } else if (metrics->arch == TargetArch_amd64) { + bc->metrics.target_triplet = str_lit("x86_64-apple-ios"); + } else { + GB_PANIC("Unknown architecture for darwin"); + } + break; + } + bc->ODIN_OS = target_os_names[metrics->os]; bc->ODIN_ARCH = target_arch_names[metrics->arch]; bc->endian_kind = target_endians[metrics->arch]; diff --git a/src/main.cpp b/src/main.cpp index 2a7c90744..f1b62320f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -238,6 +238,7 @@ enum BuildFlagKind { BuildFlag_Define, BuildFlag_BuildMode, BuildFlag_Target, + BuildFlag_Subtarget, BuildFlag_Debug, BuildFlag_DisableAssert, BuildFlag_NoBoundsCheck, @@ -423,6 +424,7 @@ gb_internal bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_Define, str_lit("define"), BuildFlagParam_String, Command__does_check, true); add_flag(&build_flags, BuildFlag_BuildMode, str_lit("build-mode"), BuildFlagParam_String, Command__does_build); // Commands_build is not used to allow for a better error message add_flag(&build_flags, BuildFlag_Target, str_lit("target"), BuildFlagParam_String, Command__does_check); + add_flag(&build_flags, BuildFlag_Subtarget, str_lit("subtarget"), BuildFlagParam_String, Command__does_check); add_flag(&build_flags, BuildFlag_Debug, str_lit("debug"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_DisableAssert, str_lit("disable-assert"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_NoBoundsCheck, str_lit("no-bounds-check"), BuildFlagParam_None, Command__does_check); @@ -907,6 +909,42 @@ gb_internal bool parse_build_flags(Array args) { break; } + case BuildFlag_Subtarget: + if (selected_target_metrics == nullptr) { + gb_printf_err("-target must be set before -subtarget is used\n"); + bad_flags = true; + } else { + GB_ASSERT(value.kind == ExactValue_String); + String str = value.value_string; + bool found = false; + + if (selected_target_metrics->metrics->os != TargetOs_darwin) { + gb_printf_err("-subtarget can only be used with darwin based targets at the moment\n"); + bad_flags = true; + break; + } + + for (u32 i = 1; i < Subtarget_COUNT; i++) { + String name = subtarget_strings[i]; + if (str_eq_ignore_case(str, name)) { + selected_subtarget = cast(Subtarget)i; + found = true; + break; + } + } + + if (!found) { + gb_printf_err("Unknown subtarget '%.*s'\n", LIT(str)); + gb_printf_err("All supported subtargets:\n"); + for (u32 i = 1; i < Subtarget_COUNT; i++) { + String name = subtarget_strings[i]; + gb_printf_err("\t%.*s\n", LIT(name)); + } + bad_flags = true; + } + } + break; + case BuildFlag_BuildMode: { GB_ASSERT(value.kind == ExactValue_String); String str = value.value_string; @@ -2452,7 +2490,7 @@ int main(int arg_count, char const **arg_ptr) { get_fullpath_relative(heap_allocator(), odin_root_dir(), str_lit("shared"))); } - init_build_context(selected_target_metrics ? selected_target_metrics->metrics : nullptr); + init_build_context(selected_target_metrics ? selected_target_metrics->metrics : nullptr, selected_subtarget); // if (build_context.word_size == 4 && build_context.metrics.os != TargetOs_js) { // print_usage_line(0, "%.*s 32-bit is not yet supported for this platform", LIT(args[0])); // return 1;