From 2c4a478987e030e0891b4e317b47886ac6fd06fe Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 21 Mar 2023 13:30:58 +0000 Subject: [PATCH] Add `@(extra_linker_flags=)` --- src/checker.cpp | 12 ++++++++++++ src/checker.hpp | 1 + src/entity.cpp | 1 + src/main.cpp | 13 +++++++++++++ vendor/raylib/raylib.odin | 2 +- 5 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/checker.cpp b/src/checker.cpp index 1bb437beb..696802e99 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -4447,6 +4447,14 @@ gb_internal DECL_ATTRIBUTE_PROC(foreign_import_decl_attribute) { ac->foreign_import_priority_index = exact_value_to_i64(ev); } return true; + } else if (name == "extra_linker_flags") { + ExactValue ev = check_decl_attribute_value(c, value); + if (ev.kind != ExactValue_String) { + error(elem, "Expected a string value for '%.*s'", LIT(name)); + } else { + ac->extra_linker_flags = ev.value_string; + } + return true; } return false; } @@ -4506,6 +4514,10 @@ gb_internal void check_add_foreign_import_decl(CheckerContext *ctx, Ast *decl) { if (ac.foreign_import_priority_index != 0) { e->LibraryName.priority_index = ac.foreign_import_priority_index; } + String extra_linker_flags = string_trim_whitespace(ac.extra_linker_flags); + if (extra_linker_flags.len != 0) { + e->LibraryName.extra_linker_flags = extra_linker_flags; + } if (has_asm_extension(fullpath)) { if (build_context.metrics.arch != TargetArch_amd64 || diff --git a/src/checker.hpp b/src/checker.hpp index b82612813..2918b7e83 100644 --- a/src/checker.hpp +++ b/src/checker.hpp @@ -121,6 +121,7 @@ struct AttributeContext { bool set_cold : 1; u32 optimization_mode; // ProcedureOptimizationMode i64 foreign_import_priority_index; + String extra_linker_flags; String objc_class; String objc_name; diff --git a/src/entity.cpp b/src/entity.cpp index 0c3629b2b..d6f4edece 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -259,6 +259,7 @@ struct Entity { Slice paths; String name; i64 priority_index; + String extra_linker_flags; } LibraryName; i32 Nil; struct { diff --git a/src/main.cpp b/src/main.cpp index 82c20cfe6..bbb28cdf8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -278,6 +278,13 @@ gb_internal i32 linker_stage(lbGenerator *gen) { } } + for (Entity *e : gen->foreign_libraries) { + GB_ASSERT(e->kind == Entity_LibraryName); + if (e->LibraryName.extra_linker_flags.len != 0) { + lib_str = gb_string_append_fmt(lib_str, " %.*s", LIT(e->LibraryName.extra_linker_flags)); + } + } + if (build_context.build_mode == BuildMode_DynamicLibrary) { link_settings = gb_string_append_fmt(link_settings, " /DLL"); } else { @@ -449,6 +456,12 @@ gb_internal i32 linker_stage(lbGenerator *gen) { } } + for (Entity *e : gen->foreign_libraries) { + GB_ASSERT(e->kind == Entity_LibraryName); + if (e->LibraryName.extra_linker_flags.len != 0) { + lib_str = gb_string_append_fmt(lib_str, " %.*s", LIT(e->LibraryName.extra_linker_flags)); + } + } gbString object_files = gb_string_make(heap_allocator(), ""); defer (gb_string_free(object_files)); diff --git a/vendor/raylib/raylib.odin b/vendor/raylib/raylib.odin index 7e63d364d..661478b58 100644 --- a/vendor/raylib/raylib.odin +++ b/vendor/raylib/raylib.odin @@ -93,8 +93,8 @@ MAX_TEXT_BUFFER_LENGTH :: #config(RAYLIB_MAX_TEXT_BUFFER_LENGTH, 1024) #assert(size_of(rune) == size_of(c.int)) when ODIN_OS == .Windows { + @(extra_linker_flags="/NODEFAULTLIB:libcmt") foreign import lib { - "system:msvcrt.lib", "windows/raylib.lib", "system:Winmm.lib", "system:Gdi32.lib",