Merge pull request #2864 from flysand7/vendor-shared-fix

Allow for shared object linking of vendor libraries
This commit is contained in:
gingerBill
2023-10-16 11:37:19 +01:00
committed by GitHub
18 changed files with 281 additions and 79 deletions

BIN
a.out Executable file

Binary file not shown.

View File

@@ -0,0 +1,30 @@
package main
import "core:intrinsics"
SUS_exit :: uintptr(60)
SUS_write ::uintptr(1)
STDOUT_FILENO :: int(1)
sus_write :: proc "contextless" (fd: int, buf: cstring, size: uint) -> int {
return int(intrinsics.syscall(
SUS_write,
cast(uintptr) fd,
cast(uintptr) cast(rawptr) buf,
cast(uintptr) size
))
}
@(link_name = "sussy_baka")
sus_exit :: proc "contextless" (code: $T)->! {
intrinsics.syscall(SUS_exit, uintptr(code))
unreachable()
}
sus :: proc {sus_write, sus_exit}
@(link_name="_start", export) _start :: proc "c" ()->! {
str :: cstring("Hello, world!\n")
sus_write(STDOUT_FILENO, str, uint(14));
sus_exit(0)
}

BIN
test-freestanding Executable file

Binary file not shown.

BIN
test-freestanding.so Executable file

Binary file not shown.

View File

@@ -1,7 +1,13 @@
package vendor_openexr
OPENEXRCORE_SHARED :: #config(OPENEXRCORE_SHARED, false)
when ODIN_OS == .Windows {
foreign import lib "OpenEXRCore-3_1.lib"
when OPENEXRCORE_SHARED {
#panic("Dynamic linking is not supported for OpenEXRCore yet")
} else {
foreign import lib "OpenEXRCore-3_1.lib"
}
} else {
foreign import lib "system:OpenEXRCore-3_1"
}

View File

@@ -10,8 +10,13 @@ import "core:c"
import "core:c/libc"
import "core:runtime"
COMMONMARK_SHARED :: #config(COMMONMARK_SHARED, false)
BINDING_VERSION :: Version_Info{major = 0, minor = 30, patch = 2}
when COMMONMARK_SHARED {
#panic("Shared linking for vendor:commonmark is not supported yet")
}
when ODIN_OS == .Windows {
foreign import lib {
"cmark_static.lib",

View File

@@ -3,10 +3,10 @@ package glfw_bindings
import "core:c"
import vk "vendor:vulkan"
GLFW_DYNAMIC :: #config(GLFW_DYNAMIC, false)
GLFW_SHARED :: #config(GLFW_SHARED, false)
when ODIN_OS == .Windows {
when GLFW_DYNAMIC {
when GLFW_SHARED {
foreign import glfw {
"../lib/glfw3dll.lib",
"system:user32.lib",
@@ -22,15 +22,14 @@ when ODIN_OS == .Windows {
}
}
} else when ODIN_OS == .Linux {
// TODO: Add the billion-or-so static libs to link to in linux
foreign import glfw "system:glfw"
} else when ODIN_OS == .Darwin {
foreign import glfw {
"../lib/darwin/libglfw3.a",
"system:Cocoa.framework",
"system:IOKit.framework",
"system:OpenGL.framework",
}
foreign import glfw {
"../lib/darwin/libglfw3.a",
"system:Cocoa.framework",
"system:IOKit.framework",
"system:OpenGL.framework",
}
} else {
foreign import glfw "system:glfw"
}

View File

@@ -1,7 +1,7 @@
package glfw
/* Config */
GLFW_DYNAMIC :: #config(GLFW_DYNAMIC, false)
GLFW_SHARED :: #config(GLFW_SHARED, false)
/*** Constants ***/
/* Versions */

View File

@@ -4,7 +4,14 @@ package glfw
import NS "vendor:darwin/foundation"
foreign import glfw { "lib/darwin/libglfw3.a" }
when GLFW_SHARED {
#panic("Dynamic linking for glfw is not supported for darwin yet")
foreign import glfw {"_"}
} else {
foreign import glfw {
"lib/darwin/libglfw3.a",
}
}
@(default_calling_convention="c", link_prefix="glfw")
foreign glfw {

View File

@@ -4,10 +4,20 @@ package glfw
import win32 "core:sys/windows"
when GLFW_DYNAMIC {
foreign import glfw { "lib/glfw3dll.lib", "system:user32.lib", "system:gdi32.lib", "system:shell32.lib" }
when GLFW_SHARED {
foreign import glfw {
"lib/glfw3dll.lib",
"system:user32.lib",
"system:gdi32.lib",
"system:shell32.lib",
}
} else {
foreign import glfw { "lib/glfw3_mt.lib", "system:user32.lib", "system:gdi32.lib", "system:shell32.lib" }
foreign import glfw {
"lib/glfw3_mt.lib",
"system:user32.lib",
"system:gdi32.lib",
"system:shell32.lib",
}
}
@(default_calling_convention="c", link_prefix="glfw")

View File

@@ -7,12 +7,25 @@ import c "core:c/libc"
#assert(size_of(c.int) == size_of(b32))
when ODIN_OS == .Windows {
foreign import lib "windows/lua5.1.dll.lib"
} else when ODIN_OS == .Linux {
foreign import lib "linux/liblua5.1.a"
LUA_SHARED :: #config(LUA_SHARED, false)
when LUA_SHARED {
when ODIN_OS == .Windows {
// Does nothing special on windows
foreign import lib "windows/lua5.1.dll.lib"
} else when ODIN_OS == .Linux {
foreign import lib "linux/liblua5.1.so"
} else {
foreign import lib "system:liblua.so.5.1"
}
} else {
foreign import lib "system:liblua5.1.a"
when ODIN_OS == .Windows {
foreign import lib "windows/lua5.1.dll.lib"
} else when ODIN_OS == .Linux {
foreign import lib "linux/liblua5.1.a"
} else {
foreign import lib "system:liblua5.1.a"
}
}
VERSION :: "Lua 5.1"

View File

@@ -7,12 +7,25 @@ import c "core:c/libc"
#assert(size_of(c.int) == size_of(b32))
when ODIN_OS == .Windows {
foreign import lib "windows/lua52dll.lib"
} else when ODIN_OS == .Linux {
foreign import lib "linux/liblua52.a"
LUA_SHARED :: config(LUA_SHARED, false)
when LUA_SHARED {
when ODIN_OS == .Windows {
// Does nothing special on windows
foreign import lib "windows/lua52dll.lib"
} else when ODIN_OS == .Linux {
foreign import lib "linux/liblua52.so"
} else {
foreign import lib "system:liblua.so.5.2"
}
} else {
foreign import lib "system:liblua52.a"
when ODIN_OS == .Windows {
foreign import lib "windows/lua52dll.lib"
} else when ODIN_OS == .Linux {
foreign import lib "linux/liblua52.a"
} else {
foreign import lib "system:liblua52.a"
}
}
VERSION_MAJOR :: "5"

View File

@@ -7,12 +7,25 @@ import c "core:c/libc"
#assert(size_of(c.int) == size_of(b32))
when ODIN_OS == .Windows {
foreign import lib "windows/lua53dll.lib"
} else when ODIN_OS == .Linux {
foreign import lib "linux/liblua53.a"
LUA_SHARED :: #config(LUA_SHARED, false)
when LUA_SHARED {
when ODIN_OS == .Windows {
// Does nothing special on windows
foreign import lib "windows/lua53dll.lib"
} else when ODIN_OS == .Linux {
foreign import lib "linux/liblua53.so"
} else {
foreign import lib "system:liblua.so.5.3"
}
} else {
foreign import lib "system:liblua53.a"
when ODIN_OS == .Windows {
foreign import lib "windows/lua53dll.lib"
} else when ODIN_OS == .Linux {
foreign import lib "linux/liblua53.a"
} else {
foreign import lib "system:liblua53.a"
}
}
VERSION_MAJOR :: "5"

View File

@@ -7,12 +7,33 @@ import c "core:c/libc"
#assert(size_of(c.int) == size_of(b32))
when ODIN_OS == .Windows {
foreign import lib "windows/lua54dll.lib"
} else when ODIN_OS == .Linux {
foreign import lib "linux/liblua54.a"
LUA_SHARED :: #config(LUA_SHARED, false)
when LUA_SHARED {
when ODIN_OS == .Windows {
// LUA_SHARED does nothing special on windows
foreign import lib "windows/lua54dll.lib"
} else when ODIN_OS == .Linux {
foreign import lib "linux/liblua54.so"
} else {
// Note(bumbread): My linux system has a few aliases for this shared object
// lublua5.4.so, liblua.so, lublua.so.5.4, liblua.so.5.4.6. I don't know
// who enforces these numbers (probably ld?), and if it can be done in a
// unix-generic way, but in any way I think the most sane thing to do is to
// keep it close to what linux does and if it breaks, just special case those
// operating systems.
// Also there was no alias for liblua54.so, that seems to suggest that way
// of specifying it isn't portable
foreign import lib "system:liblua.so.5.4"
}
} else {
foreign import lib "system:liblua54.a"
when ODIN_OS == .Windows {
foreign import lib "windows/lua54dll.lib"
} else when ODIN_OS == .Linux {
foreign import lib "linux/liblua54.a"
} else {
foreign import lib "system:liblua54.a"
}
}
VERSION_MAJOR :: "5"

View File

@@ -2,6 +2,12 @@ package miniaudio
import "core:c"
MINIAUDIO_SHARED :: #config(MINIAUDIO_SHARED, false)
when MINIAUDIO_SHARED {
#panic("Shared linking for miniaudio is not supported yet")
}
when ODIN_OS == .Windows {
foreign import lib "lib/miniaudio.lib"
} else when ODIN_OS == .Linux {

View File

@@ -3,11 +3,17 @@ package portmidi
import "core:c"
import "core:strings"
PORTMIDI_SHARED :: #config(PORTMIDI_SHARED, false)
when ODIN_OS == .Windows {
foreign import lib {
"portmidi_s.lib",
"system:Winmm.lib",
"system:Advapi32.lib",
when PORTMIDI_SHARED {
#panic("Shared linking not supported for portmidi on windows yet")
} else {
foreign import lib {
"portmidi_s.lib",
"system:Winmm.lib",
"system:Advapi32.lib",
}
}
} else {
foreign import lib "system:portmidi"

View File

@@ -2,30 +2,60 @@ package raylib
import c "core:c/libc"
RAYGUI_SHARED :: #config(RAYGUI_SHARED, false)
when ODIN_OS == .Windows {
foreign import lib {
"windows/raygui.lib",
}
} else when ODIN_OS == .Linux {
foreign import lib {
"linux/libraygui.a",
// "system:dl",
// "system:pthread",
}
} else when ODIN_OS == .Darwin {
when ODIN_ARCH == .arm64 {
when RAYGUI_SHARED {
foreign import lib {
"macos-arm64/libraygui.a",
// "system:Cocoa.framework",
// "system:OpenGL.framework",
// "system:IOKit.framework",
"windows/rayguidll.lib",
}
} else {
foreign import lib {
"macos/libraygui.a",
// "system:Cocoa.framework",
// "system:OpenGL.framework",
// "system:IOKit.framework",
"windows/raygui.lib",
}
}
} else when ODIN_OS == .Linux {
when RAYGUI_SHARED {
// Note(bumbread): can't panic here, because the users might be expecting to
// only use raylib. Let's have them get the error at link-time instead..
//#panic("Cannot link libraygui.so: not in the vendor collection")
// Note(bumbread): unless we import something the rest of the bindings will
// make a compile-time error. This is a bit ugly for now, but in the future
// raygui probably needs to be in a separate package.
foreign import lib {"_"}
} else {
// #panic("Cannot link libraygui.a: not in the vendor collection")
// TODO(bumbread): apparently this one was missing. This might need
// to get rebuilt for linux
// foreign import lib {
// "linux/libraygui.a",
// // "system:dl",
// // "system:pthread",
// }
foreign import lib {"_"}
}
} else when ODIN_OS == .Darwin {
when ODIN_ARCH == .arm64 {
when RAYGUI_SHARED {
// #panic("Cannot link libraygui.450.dylib: not in the vendor collection")
} else {
foreign import lib {
"macos-arm64/libraygui.a",
// "system:Cocoa.framework",
// "system:OpenGL.framework",
// "system:IOKit.framework",
}
}
} else {
when RAYGUI_SHARED {
// #panic("Cannot link libraygui.450.dylib: not in the vendor collection")
} else {
foreign import lib {
"macos/libraygui.a",
// "system:Cocoa.framework",
// "system:OpenGL.framework",
// "system:IOKit.framework",
}
}
}
} else {

View File

@@ -95,35 +95,78 @@ MAX_TEXT_BUFFER_LENGTH :: #config(RAYLIB_MAX_TEXT_BUFFER_LENGTH, 1024)
#assert(size_of(rune) == size_of(c.int))
RAYLIB_SHARED :: #config(RAYLIB_SHARED, false)
when ODIN_OS == .Windows {
@(extra_linker_flags="/NODEFAULTLIB:libcmt")
foreign import lib {
"windows/raylib.lib",
"system:Winmm.lib",
"system:Gdi32.lib",
"system:User32.lib",
"system:Shell32.lib",
when RAYLIB_SHARED {
@(extra_linker_flags="/NODEFAULTLIB:libcmt")
foreign import lib {
"windows/raylibdll.lib",
"system:Winmm.lib",
"system:Gdi32.lib",
"system:User32.lib",
"system:Shell32.lib",
}
} else {
@(extra_linker_flags="/NODEFAULTLIB:libcmt")
foreign import lib {
"windows/raylib.lib",
"system:Winmm.lib",
"system:Gdi32.lib",
"system:User32.lib",
"system:Shell32.lib",
}
}
} else when ODIN_OS == .Linux {
foreign import lib {
"linux/libraylib.a",
"system:dl",
"system:pthread",
when RAYLIB_SHARED {
foreign import lib {
// Note(bumbread): I'm not sure why in `linux/` folder there are
// multiple copies of raylib.so, but since these bindings are for
// particular version of the library, I better specify it. Ideally,
// though, it's best specified in terms of major (.so.4)
"linux/libraylib.so.450",
"system:dl",
"system:pthread",
}
} else {
foreign import lib {
"linux/libraylib.a",
"system:dl",
"system:pthread",
}
}
} else when ODIN_OS == .Darwin {
when ODIN_ARCH == .arm64 {
foreign import lib {
"macos-arm64/libraylib.a",
"system:Cocoa.framework",
"system:OpenGL.framework",
"system:IOKit.framework",
when RAYLIB_SHARED {
foreign import lib {
"macos-arm64/libraylib.450.dylib",
"system:Cocoa.framework",
"system:OpenGL.framework",
"system:IOKit.framework",
}
} else {
foreign import lib {
"macos-arm64/libraylib.a",
"system:Cocoa.framework",
"system:OpenGL.framework",
"system:IOKit.framework",
}
}
} else {
foreign import lib {
"macos/libraylib.a",
"system:Cocoa.framework",
"system:OpenGL.framework",
"system:IOKit.framework",
when RAYLIB_SHARED {
foreign import lib {
"macos/libraylib.450.dylib",
"system:Cocoa.framework",
"system:OpenGL.framework",
"system:IOKit.framework",
}
} else {
foreign import lib {
"macos/libraylib.a",
"system:Cocoa.framework",
"system:OpenGL.framework",
"system:IOKit.framework",
}
}
}
} else {