aboutsummaryrefslogtreecommitdiff
path: root/src/main.cpp
diff options
context:
space:
mode:
authorJeroen van Rijn <Kelimion@users.noreply.github.com>2024-01-18 19:12:39 +0100
committerJeroen van Rijn <Kelimion@users.noreply.github.com>2024-01-18 19:12:39 +0100
commitfc047a8043493787878d064487fc1e410b334b23 (patch)
tree516ae56c604cd8d94dd7ad4a9b5f0fc3212fe607 /src/main.cpp
parentae52e245eaf737527a3af50ead74ed4e2b143e24 (diff)
Expand -subsystem option on Windows
W:\Odin>odin run sketch.odin -file -subsystem:foo Invalid -subsystem string, got oo. Expected one of: BOOT_APPLICATION, CONSOLE (default), EFI_APPLICATION, EFI_BOOT_SERVICE_DRIVER, EFI_ROM, EFI_RUNTIME_DRIVER, NATIVE, POSIX, WINDOWS (or WINDOW), WINDOWSCE We now also set the constant ODIN_WINDOWS_SUBSYSTEM, which is "" for non-Windows targets.
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp43
1 files changed, 35 insertions, 8 deletions
diff --git a/src/main.cpp b/src/main.cpp
index fd754248b..19271d667 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1270,16 +1270,43 @@ gb_internal bool parse_build_flags(Array<String> args) {
}
case BuildFlag_Subsystem: {
+ // TODO(Jeroen): Parse optional "[,major[.minor]]"
+
GB_ASSERT(value.kind == ExactValue_String);
String subsystem = value.value_string;
- if (str_eq_ignore_case(subsystem, str_lit("console"))) {
- build_context.use_subsystem_windows = false;
- } else if (str_eq_ignore_case(subsystem, str_lit("window"))) {
- build_context.use_subsystem_windows = true;
- } else if (str_eq_ignore_case(subsystem, str_lit("windows"))) {
- build_context.use_subsystem_windows = true;
- } else {
- gb_printf_err("Invalid -subsystem string, got %.*s, expected either 'console' or 'windows'\n", LIT(subsystem));
+ bool subsystem_found = false;
+ for (int i = 0; i < Windows_Subsystem_COUNT; i++) {
+ if (str_eq_ignore_case(subsystem, windows_subsystem_names[i])) {
+ build_context.ODIN_WINDOWS_SUBSYSTEM = windows_subsystem_names[i];
+ subsystem_found = true;
+ break;
+ }
+ }
+
+ // WINDOW is a hidden alias for WINDOWS. Check it.
+ String subsystem_windows_alias = str_lit("WINDOW");
+ if (!subsystem_found && str_eq_ignore_case(subsystem, subsystem_windows_alias)) {
+ build_context.ODIN_WINDOWS_SUBSYSTEM = windows_subsystem_names[Windows_Subsystem_WINDOWS];
+ subsystem_found = true;
+ break;
+ }
+
+ if (!subsystem_found) {
+ gb_printf_err("Invalid -subsystem string, got %.*s. Expected one of:\n", LIT(subsystem));
+ gb_printf_err("\t");
+ for (int i = 0; i < Windows_Subsystem_COUNT; i++) {
+ if (i > 0) {
+ gb_printf_err(", ");
+ }
+ gb_printf_err("%.*s", LIT(windows_subsystem_names[i]));
+ if (i == Windows_Subsystem_CONSOLE) {
+ gb_printf_err(" (default)");
+ }
+ if (i == Windows_Subsystem_WINDOWS) {
+ gb_printf_err(" (or WINDOW)");
+ }
+ }
+ gb_printf_err("\n");
bad_flags = true;
}
break;