From 9eec9f57887a3b6d08488997a3a636a41494633f Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 1 Nov 2022 15:04:44 +0100 Subject: [PATCH] Add -minimum-os-version flag Allow for Darwin targets to specify the minimum OS version: e.g. -minimum-os-version:12.0.0 --- src/build_settings.cpp | 14 +++++++------- src/main.cpp | 26 ++++++++++++++++---------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 02de22ec4..97ee9f2a3 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -298,17 +298,17 @@ struct BuildContext { bool ignore_microsoft_magic; bool linker_map_file; - bool use_separate_modules; - bool threaded_checker; + bool use_separate_modules; + bool threaded_checker; - bool show_debug_messages; + bool show_debug_messages; - bool copy_file_contents; + bool copy_file_contents; - bool disallow_rtti; + bool disallow_rtti; RelocMode reloc_mode; - bool disable_red_zone; + bool disable_red_zone; u32 cmd_doc_flags; @@ -326,7 +326,7 @@ struct BuildContext { BlockingMutex target_features_mutex; StringSet target_features_set; String target_features_string; - + String minimum_os_version_string; }; gb_global BuildContext build_context = {0}; diff --git a/src/main.cpp b/src/main.cpp index ae6bd174a..b75137613 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -481,9 +481,9 @@ i32 linker_stage(lbGenerator *gen) { if (build_context.metrics.os == TargetOs_darwin) { // This sets a requirement of Mountain Lion and up, but the compiler doesn't work without this limit. - // NOTE: If you change this (although this minimum is as low as you can go with Odin working) - // make sure to also change the 'mtriple' param passed to 'opt' - if (build_context.metrics.arch == TargetArch_arm64) { + if (build_context.minimum_os_version_string.len) { + link_settings = gb_string_append_fmt(link_settings, " -mmacosx-version-min=%.*s ", LIT(build_context.minimum_os_version_string)); + } else if (build_context.metrics.arch == TargetArch_arm64) { link_settings = gb_string_appendc(link_settings, " -mmacosx-version-min=12.0.0 "); } else { link_settings = gb_string_appendc(link_settings, " -mmacosx-version-min=10.12.0 "); @@ -624,6 +624,7 @@ enum BuildFlagKind { BuildFlag_ExtraAssemblerFlags, BuildFlag_Microarch, BuildFlag_TargetFeatures, + BuildFlag_MinimumOSVersion, BuildFlag_RelocMode, BuildFlag_DisableRedZone, @@ -797,6 +798,7 @@ bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_ExtraAssemblerFlags, str_lit("extra-assembler-flags"), BuildFlagParam_String, Command__does_build); add_flag(&build_flags, BuildFlag_Microarch, str_lit("microarch"), BuildFlagParam_String, Command__does_build); add_flag(&build_flags, BuildFlag_TargetFeatures, str_lit("target-features"), BuildFlagParam_String, Command__does_build); + add_flag(&build_flags, BuildFlag_MinimumOSVersion, str_lit("minimum-os-version"), BuildFlagParam_String, Command__does_build); add_flag(&build_flags, BuildFlag_RelocMode, str_lit("reloc-mode"), BuildFlagParam_String, Command__does_build); add_flag(&build_flags, BuildFlag_DisableRedZone, str_lit("disable-red-zone"), BuildFlagParam_None, Command__does_build); @@ -1361,6 +1363,11 @@ bool parse_build_flags(Array args) { string_to_lower(&build_context.target_features_string); break; } + case BuildFlag_MinimumOSVersion: { + GB_ASSERT(value.kind == ExactValue_String); + build_context.minimum_os_version_string = value.value_string; + break; + } case BuildFlag_RelocMode: { GB_ASSERT(value.kind == ExactValue_String); String v = value.value_string; @@ -1972,12 +1979,6 @@ void print_show_help(String const arg0, String const &command) { print_usage_line(2, "Example: -out:foo.exe"); print_usage_line(0, ""); - print_usage_line(1, "-opt:"); - print_usage_line(2, "Set the optimization level for compilation"); - print_usage_line(2, "Accepted values: 0, 1, 2, 3"); - print_usage_line(2, "Example: -opt:2"); - print_usage_line(0, ""); - print_usage_line(1, "-o:"); print_usage_line(2, "Set the optimization mode for compilation"); print_usage_line(2, "Accepted values: minimal, size, speed"); @@ -2141,6 +2142,12 @@ void print_show_help(String const arg0, String const &command) { } if (run_or_build) { + print_usage_line(1, "-minimum-os-version:"); + print_usage_line(2, "Sets the minimum OS version targeted by the application"); + print_usage_line(2, "e.g. -minimum-os-version:12.0.0"); + print_usage_line(2, "(Only used when target is Darwin)"); + print_usage_line(0, ""); + print_usage_line(1, "-extra-linker-flags:"); print_usage_line(2, "Adds extra linker specific flags in a string"); print_usage_line(0, ""); @@ -2149,7 +2156,6 @@ void print_show_help(String const arg0, String const &command) { print_usage_line(2, "Adds extra assembler specific flags in a string"); print_usage_line(0, ""); - print_usage_line(1, "-microarch:"); print_usage_line(2, "Specifies the specific micro-architecture for the build in a string"); print_usage_line(2, "Examples:");