mirror of
https://github.com/odin-lang/Odin.git
synced 2026-04-21 13:55:19 +00:00
Merge pull request #2864 from flysand7/vendor-shared-fix
Allow for shared object linking of vendor libraries
This commit is contained in:
30
examples/test-freestanding/main.odin
Normal file
30
examples/test-freestanding/main.odin
Normal 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
BIN
test-freestanding
Executable file
Binary file not shown.
BIN
test-freestanding.so
Executable file
BIN
test-freestanding.so
Executable file
Binary file not shown.
8
vendor/OpenEXRCore/exr_base.odin
vendored
8
vendor/OpenEXRCore/exr_base.odin
vendored
@@ -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"
|
||||
}
|
||||
|
||||
5
vendor/commonmark/cmark.odin
vendored
5
vendor/commonmark/cmark.odin
vendored
@@ -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",
|
||||
|
||||
17
vendor/glfw/bindings/bindings.odin
vendored
17
vendor/glfw/bindings/bindings.odin
vendored
@@ -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"
|
||||
}
|
||||
|
||||
2
vendor/glfw/constants.odin
vendored
2
vendor/glfw/constants.odin
vendored
@@ -1,7 +1,7 @@
|
||||
package glfw
|
||||
|
||||
/* Config */
|
||||
GLFW_DYNAMIC :: #config(GLFW_DYNAMIC, false)
|
||||
GLFW_SHARED :: #config(GLFW_SHARED, false)
|
||||
|
||||
/*** Constants ***/
|
||||
/* Versions */
|
||||
|
||||
9
vendor/glfw/native_darwin.odin
vendored
9
vendor/glfw/native_darwin.odin
vendored
@@ -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 {
|
||||
|
||||
16
vendor/glfw/native_windows.odin
vendored
16
vendor/glfw/native_windows.odin
vendored
@@ -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")
|
||||
|
||||
23
vendor/lua/5.1/lua.odin
vendored
23
vendor/lua/5.1/lua.odin
vendored
@@ -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"
|
||||
|
||||
23
vendor/lua/5.2/lua.odin
vendored
23
vendor/lua/5.2/lua.odin
vendored
@@ -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"
|
||||
|
||||
23
vendor/lua/5.3/lua.odin
vendored
23
vendor/lua/5.3/lua.odin
vendored
@@ -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"
|
||||
|
||||
31
vendor/lua/5.4/lua.odin
vendored
31
vendor/lua/5.4/lua.odin
vendored
@@ -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"
|
||||
|
||||
6
vendor/miniaudio/common.odin
vendored
6
vendor/miniaudio/common.odin
vendored
@@ -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 {
|
||||
|
||||
14
vendor/portmidi/portmidi.odin
vendored
14
vendor/portmidi/portmidi.odin
vendored
@@ -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"
|
||||
|
||||
68
vendor/raylib/raygui.odin
vendored
68
vendor/raylib/raygui.odin
vendored
@@ -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 {
|
||||
|
||||
85
vendor/raylib/raylib.odin
vendored
85
vendor/raylib/raylib.odin
vendored
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user