فهرست منبع

Add `@(extra_linker_flags=<string>)`

gingerBill 2 سال پیش
والد
کامیت
2c4a478987
5فایلهای تغییر یافته به همراه28 افزوده شده و 1 حذف شده
  1. 12 0
      src/checker.cpp
  2. 1 0
      src/checker.hpp
  3. 1 0
      src/entity.cpp
  4. 13 0
      src/main.cpp
  5. 1 1
      vendor/raylib/raylib.odin

+ 12 - 0
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 ||

+ 1 - 0
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;

+ 1 - 0
src/entity.cpp

@@ -259,6 +259,7 @@ struct Entity {
 			Slice<String> paths;
 			String name;
 			i64 priority_index;
+			String extra_linker_flags;
 		} LibraryName;
 		i32 Nil;
 		struct {

+ 13 - 0
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));

+ 1 - 1
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",