From f122d290f11be5758d2178d1d6ac1ade2f0a820b Mon Sep 17 00:00:00 2001 From: Christoffer Lerno Date: Thu, 29 Dec 2022 01:06:35 +0100 Subject: [PATCH] Add macos sdk / min version to pass to the linker. --- src/build/build_options.c | 12 ++++++++++++ src/build/build_options.h | 4 ++++ src/build/builder.c | 2 ++ src/build/project.c | 6 ++++++ src/compiler/enums.h | 1 + src/compiler/linker.c | 18 ++++++++++++++++-- src/compiler/parse_stmt.c | 1 + src/compiler/tokens.c | 2 ++ src/version.h | 2 +- 9 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/build/build_options.c b/src/build/build_options.c index 4a4274b11..6ebd12f40 100644 --- a/src/build/build_options.c +++ b/src/build/build_options.c @@ -689,6 +689,18 @@ static void parse_option(BuildOptions *options) options->win.crt_linking = (WinCrtLinking)parse_multi_option(argopt, 3, wincrt_linking); return; } + if (match_longopt("macos-sdk-version")) + { + if (at_end() || next_is_opt()) error_exit("error: --macos-sdk-version needs a version."); + options->macos.sdk_version = next_arg(); + return; + } + if (match_longopt("macos-min-version")) + { + if (at_end() || next_is_opt()) error_exit("error: --macos-min-version needs a version."); + options->macos.min_version = next_arg(); + return; + } if (match_longopt("build-dir")) { if (at_end() || next_is_opt()) error_exit("error: --build-dir needs a directory."); diff --git a/src/build/build_options.h b/src/build/build_options.h index 9505164b9..8f5cfb515 100644 --- a/src/build/build_options.h +++ b/src/build/build_options.h @@ -242,6 +242,8 @@ typedef struct BuildOptions_ } win; struct { const char *sdk; + const char *min_version; + const char *sdk_version; } macos; int build_threads; const char** files; @@ -379,6 +381,8 @@ typedef struct struct { const char *sdk; + const char *min_version; + const char *sdk_version; } macos; struct { diff --git a/src/build/builder.c b/src/build/builder.c index 92d7f16f5..0ce7fdad8 100644 --- a/src/build/builder.c +++ b/src/build/builder.c @@ -228,6 +228,8 @@ static void update_build_target_from_options(BuildTarget *target, BuildOptions * target->testing = options->testing; if (options->macos.sdk) target->macos.sdk = options->macos.sdk; if (options->win.sdk) target->win.sdk = options->win.sdk; + if (options->macos.min_version) target->macos.min_version = options->macos.min_version; + if (options->macos.sdk_version) target->macos.sdk_version = options->macos.sdk_version; if (options->win.crt_linking != WIN_CRT_DEFAULT) target->win.crt_linking = options->win.crt_linking; if (options->x86_vector_capability != X86VECTOR_DEFAULT) { diff --git a/src/build/project.c b/src/build/project.c index d053d76b3..cea687791 100644 --- a/src/build/project.c +++ b/src/build/project.c @@ -327,6 +327,12 @@ static void load_into_build_target(JSONObject *json, const char *type, BuildTarg // macossdk target->macos.sdk = get_valid_string(json, "macossdk", type, false); + // macos-min-version + target->macos.min_version = get_valid_string(json, "macos-min-version", type, false); + + // macos-sdk-version + target->macos.sdk_version = get_valid_string(json, "macos-sdk-version", type, false); + // version const char *version = get_valid_string(json, "version", type, false); if (version) target->version = version; diff --git a/src/compiler/enums.h b/src/compiler/enums.h index 7fee0ea75..5ca4f6bab 100644 --- a/src/compiler/enums.h +++ b/src/compiler/enums.h @@ -585,6 +585,7 @@ typedef enum TOKEN_CT_FOR, // $for TOKEN_CT_FOREACH, // $foreach TOKEN_CT_IF, // $if + TOKEN_CT_INCLUDE, // $include TOKEN_CT_NAMEOF, // $nameof TOKEN_CT_OFFSETOF, // $offsetof TOKEN_CT_QNAMEOF, // $qnameof diff --git a/src/compiler/linker.c b/src/compiler/linker.c index 7af747a1e..e006b6eee 100644 --- a/src/compiler/linker.c +++ b/src/compiler/linker.c @@ -301,8 +301,22 @@ static void linker_setup_macos(const char ***args_ref, LinkerType linker_type) if (is_pie(platform_target.reloc_model)) add_arg("-pie"); add_arg("-platform_version"); add_arg("macos"); - add_arg(str_printf("%d.%d.0", mac_sdk->macos_min_deploy_target.major, mac_sdk->macos_min_deploy_target.minor)); - add_arg(str_printf("%d.%d", mac_sdk->macos_deploy_target.major, mac_sdk->macos_deploy_target.minor)); + if (active_target.macos.min_version) + { + add_arg(active_target.macos.min_version); + } + else + { + add_arg(str_printf("%d.%d.0", mac_sdk->macos_min_deploy_target.major, mac_sdk->macos_min_deploy_target.minor)); + } + if (active_target.macos.sdk_version) + { + add_arg(active_target.macos.sdk_version); + } + else + { + add_arg(str_printf("%d.%d", mac_sdk->macos_deploy_target.major, mac_sdk->macos_deploy_target.minor)); + } } diff --git a/src/compiler/parse_stmt.c b/src/compiler/parse_stmt.c index 4eed99953..d25088c23 100644 --- a/src/compiler/parse_stmt.c +++ b/src/compiler/parse_stmt.c @@ -1315,6 +1315,7 @@ Ast *parse_stmt(ParseContext *c) case TOKEN_CT_ENDFOREACH: case TOKEN_CT_VASPLAT: case TOKEN_IMPLIES: + case TOKEN_CT_INCLUDE: SEMA_ERROR_HERE("Unexpected '%s' found when expecting a statement.", token_type_to_string(c->tok)); advance(c); diff --git a/src/compiler/tokens.c b/src/compiler/tokens.c index 77f0d2608..4f05bc6bc 100644 --- a/src/compiler/tokens.c +++ b/src/compiler/tokens.c @@ -360,6 +360,8 @@ const char *token_type_to_string(TokenType type) return "$extnameof"; case TOKEN_CT_IF: return "$if"; + case TOKEN_CT_INCLUDE: + return "$include"; case TOKEN_CT_VACOUNT: return "$vacount"; case TOKEN_CT_VATYPE: diff --git a/src/version.h b/src/version.h index 8576d4426..fc1e4ff24 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define COMPILER_VERSION "0.3.126" \ No newline at end of file +#define COMPILER_VERSION "0.3.127" \ No newline at end of file