aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2025-07-22 11:01:50 +0100
committerGitHub <noreply@github.com>2025-07-22 11:01:50 +0100
commite2b75d2addc9ae520030bc3daec701b80f7ef7c5 (patch)
tree2241e57d3b69260b2a0b967a55af4d395c901ccb
parentb095dd71cbe8386de901674535c9d86ccf4cb9d3 (diff)
parent7c917d56e9d07a5c8940560d7f1d35c01bc5fe58 (diff)
Merge pull request #5473 from harold-b/hb.subtarget-enhancements
Check for invalid subtargets and add "ios" pseudo subtarget
-rw-r--r--src/build_settings.cpp31
-rw-r--r--src/parser.cpp26
2 files changed, 43 insertions, 14 deletions
diff --git a/src/build_settings.cpp b/src/build_settings.cpp
index fb88b588a..ab501fe84 100644
--- a/src/build_settings.cpp
+++ b/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;
}
}
diff --git a/src/parser.cpp b/src/parser.cpp
index 5d0a75f8a..7a2693e29 100644
--- a/src/parser.cpp
+++ b/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) {