Răsfoiți Sursa

Check for invalid subtargets.

- Add 'ios' pseudo-subtarget which triggets with either iPhone or iPhoneSimulator subtargets.

- Treat an explicit 'default' subtarget as exclusive only to the default subtarget, not an other platform-compatible subtargets.

- 'generic' continues to resolve to true for any platform-compatible subtarget as it names appears to imply such behavior.
Harold Brenes 1 săptămână în urmă
părinte
comite
7c917d56e9
2 a modificat fișierele cu 43 adăugiri și 14 ștergeri
  1. 20 11
      src/build_settings.cpp
  2. 23 3
      src/parser.cpp

+ 20 - 11
src/build_settings.cpp

@@ -174,8 +174,9 @@ enum Subtarget : u32 {
 	Subtarget_iPhone,
 	Subtarget_iPhoneSimulator,
 	Subtarget_Android,
-
+	
 	Subtarget_COUNT,
+	Subtarget_Invalid,    // NOTE(harold): Must appear after _COUNT as this is not a real subtarget
 };
 
 gb_global String subtarget_strings[Subtarget_COUNT] = {
@@ -859,7 +860,7 @@ gb_global NamedTargetMetrics *selected_target_metrics;
 gb_global Subtarget selected_subtarget;
 
 
-gb_internal TargetOsKind get_target_os_from_string(String str, Subtarget *subtarget_ = nullptr) {
+gb_internal TargetOsKind get_target_os_from_string(String str, Subtarget *subtarget_ = nullptr, String *subtarget_str = nullptr) {
 	String os_name = str;
 	String subtarget = {};
 	auto part = string_partition(str, str_lit(":"));
@@ -876,18 +877,26 @@ gb_internal TargetOsKind get_target_os_from_string(String str, Subtarget *subtar
 			break;
 		}
 	}
-	if (subtarget_) *subtarget_ = Subtarget_Default;
 
-	if (subtarget.len != 0) {
-		if (str_eq_ignore_case(subtarget, "generic") || str_eq_ignore_case(subtarget, "default")) {
-			if (subtarget_) *subtarget_ = Subtarget_Default;
-		} else {
-			for (isize i = 1; i < Subtarget_COUNT; i++) {
-				if (str_eq_ignore_case(subtarget_strings[i], subtarget)) {
-					if (subtarget_) *subtarget_ = cast(Subtarget)i;
-					break;
+	if (subtarget_str) *subtarget_str = subtarget;
+
+	if (subtarget_) {
+		if (subtarget.len != 0) {
+			*subtarget_ = Subtarget_Invalid;
+
+			if (str_eq_ignore_case(subtarget, "generic") || str_eq_ignore_case(subtarget, "default")) {
+				*subtarget_ = Subtarget_Default;
+				
+			} else {
+				for (isize i = 1; i < Subtarget_COUNT; i++) {
+					if (str_eq_ignore_case(subtarget_strings[i], subtarget)) {
+						*subtarget_ = cast(Subtarget)i;
+						break;
+					}
 				}
 			}
+		} else {
+			*subtarget_ = Subtarget_Default;
 		}
 	}
 

+ 23 - 3
src/parser.cpp

@@ -6220,9 +6220,10 @@ gb_internal bool parse_build_tag(Token token_for_pos, String s) {
 				continue;
 			}
 
-			Subtarget subtarget = Subtarget_Default;
+			Subtarget subtarget     = Subtarget_Invalid;
+			String    subtarget_str = {};
 
-			TargetOsKind   os   = get_target_os_from_string(p, &subtarget);
+			TargetOsKind   os   = get_target_os_from_string(p, &subtarget, &subtarget_str);
 			TargetArchKind arch = get_target_arch_from_string(p);
 			num_tokens += 1;
 
@@ -6233,10 +6234,29 @@ gb_internal bool parse_build_tag(Token token_for_pos, String s) {
 				break;
 			}
 
+			bool is_ios_subtarget = false;
+			if (subtarget == Subtarget_Invalid) {
+				// Special case for pseudo subtarget
+				if (!str_eq_ignore_case(subtarget_str, "ios")) {
+					syntax_error(token_for_pos, "Invalid subtarget '%.*s'.", LIT(subtarget_str));
+					break;
+				}
+
+				is_ios_subtarget = true;
+			}
+
+
 			if (os != TargetOs_Invalid) {
 				this_kind_os_seen = true;
 
-				bool same_subtarget = (subtarget == Subtarget_Default) || (subtarget == selected_subtarget);
+				// NOTE: Only testing for 'default' and not 'generic' because the 'generic' nomenclature implies any subtarget.
+				bool is_explicit_default_subtarget = str_eq_ignore_case(subtarget_str, "default");
+				bool same_subtarget = (subtarget == Subtarget_Default && !is_explicit_default_subtarget) || (subtarget == selected_subtarget);
+
+				// Special case for iPhone or iPhoneSimulator
+				if (is_ios_subtarget && (selected_subtarget == Subtarget_iPhone || selected_subtarget == Subtarget_iPhoneSimulator)) {
+					same_subtarget = true;
+				}
 
 				GB_ASSERT(arch == TargetArch_Invalid);
 				if (is_notted) {