Browse Source

Add experimental `-subtarget:ios`

gingerBill 2 years ago
parent
commit
939bf4bb5d
2 changed files with 69 additions and 2 deletions
  1. 30 1
      src/build_settings.cpp
  2. 39 1
      src/main.cpp

+ 30 - 1
src/build_settings.cpp

@@ -123,6 +123,18 @@ struct TargetMetrics {
 	TargetABIKind  abi;
 	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 {
 enum QueryDataSetKind {
 	QueryDataSet_Invalid,
 	QueryDataSet_Invalid,
@@ -585,6 +597,8 @@ gb_global NamedTargetMetrics named_targets[] = {
 };
 };
 
 
 gb_global NamedTargetMetrics *selected_target_metrics;
 gb_global NamedTargetMetrics *selected_target_metrics;
+gb_global Subtarget selected_subtarget;
+
 
 
 gb_internal TargetOsKind get_target_os_from_string(String str) {
 gb_internal TargetOsKind get_target_os_from_string(String str) {
 	for (isize i = 0; i < TargetOs_COUNT; i++) {
 	for (isize i = 0; i < TargetOs_COUNT; i++) {
@@ -1147,7 +1161,7 @@ gb_internal char *token_pos_to_string(TokenPos const &pos) {
 	return s;
 	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;
 	BuildContext *bc = &build_context;
 
 
 	gb_affinity_init(&bc->affinity);
 	gb_affinity_init(&bc->affinity);
@@ -1242,6 +1256,21 @@ gb_internal void init_build_context(TargetMetrics *cross_target) {
 
 
 
 
 	bc->metrics = *metrics;
 	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_OS        = target_os_names[metrics->os];
 	bc->ODIN_ARCH      = target_arch_names[metrics->arch];
 	bc->ODIN_ARCH      = target_arch_names[metrics->arch];
 	bc->endian_kind    = target_endians[metrics->arch];
 	bc->endian_kind    = target_endians[metrics->arch];

+ 39 - 1
src/main.cpp

@@ -238,6 +238,7 @@ enum BuildFlagKind {
 	BuildFlag_Define,
 	BuildFlag_Define,
 	BuildFlag_BuildMode,
 	BuildFlag_BuildMode,
 	BuildFlag_Target,
 	BuildFlag_Target,
+	BuildFlag_Subtarget,
 	BuildFlag_Debug,
 	BuildFlag_Debug,
 	BuildFlag_DisableAssert,
 	BuildFlag_DisableAssert,
 	BuildFlag_NoBoundsCheck,
 	BuildFlag_NoBoundsCheck,
@@ -423,6 +424,7 @@ gb_internal bool parse_build_flags(Array<String> args) {
 	add_flag(&build_flags, BuildFlag_Define,                  str_lit("define"),                    BuildFlagParam_String,  Command__does_check, true);
 	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_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_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_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_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);
 	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<String> args) {
 							break;
 							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: {
 						case BuildFlag_BuildMode: {
 							GB_ASSERT(value.kind == ExactValue_String);
 							GB_ASSERT(value.kind == ExactValue_String);
 							String str = value.value_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")));
 			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) {
 	// 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]));
 	// 	print_usage_line(0, "%.*s 32-bit is not yet supported for this platform", LIT(args[0]));
 	// 	return 1;
 	// 	return 1;