Page 1 of 1

SDL2 lib

Posted: Tue Sep 09, 2025 10:05 am
by Piero
Sooo… I built libSDL2-2.0.0.dylib, universal, compatible with ARM Macs down to the very old ones…

Can some Guru here show me the best way to "include/call" it, after placing it INSIDE a PB app?

It should include

Code: Select all

ImportC "/inside/app/libSDL2-2.0.0.dylib"
I suppose… Edit: 😱

Thanks in advance, and please forgive me if I wrote some PB/C blasphemy :oops: :oops: :oops:

Image

Re: SDL2 lib

Posted: Wed Sep 10, 2025 4:47 pm
by Piero

Code: Select all

Procedure.s UpperDir(path$, level = 1, setcurrdir = #False)
   Protected i, oldcurrdir$ = GetCurrentDirectory()
   path$ = GetPathPart(path$) ; in case of file
   For i = 1 To level : path$ + ".." + #PS$ : Next
   SetCurrentDirectory(path$)
   path$ = GetCurrentDirectory()
   If Not setcurrdir : SetCurrentDirectory(oldcurrdir$) : EndIf
   ProcedureReturn path$
EndProcedure

sdl2.s=UpperDir(ProgramFilename())+"Resources/Libraries/libSDL2-2.0.0.dylib"
OpenLibrary(0, sdl2) ; no error if it doesn't exist (so you can test the app later after adding it…)

Debug sdl2

Re: SDL2 lib

Posted: Thu Sep 11, 2025 12:58 am
by kenmo
Does this mean you've got it working now, by OpenLibrary?

I've used SDL2 and SDL3 with PB across Windows - Mac - Linux now, and I absolutely found Mac to be the most confusing, complicated, difficult to get working correctly and portable. The way it handles dylibs and frameworks seems so much more obtuse than on Windows/Linux. (Perhaps if you're using Xcode or other Apple suites, it's simplified.)

Here are some forum threads you might find helpful, including me being very confused about PB + SDL2 + Mac over 10 years ago...
viewtopic.php?p=448264
viewtopic.php?p=435318
viewtopic.php?f=13&t=57548

See the install_name_tool -add_rpath and otool commandline magic...

Re: SDL2 lib

Posted: Thu Sep 11, 2025 11:39 am
by Piero
MANY THANKS!

PS: I have a (simple) project in mind, just making some tests; I think I will wait to also test with inline C… :)

Re: SDL2 lib

Posted: Thu Sep 11, 2025 2:39 pm
by Piero
Old Forum example just needed a small fix:

Code: Select all

; SDL_Test.app
;
; Download: https://github.com/libsdl-org/SDL/releases/tag/release-2.30.11
;
; To make a standalone .app, copy SDL2.framework into your app.
; Put it into folder: your.app/Contents/Frameworks/
;
; Now run the following command on the command line (from the same directory where your .app is):
; install_name_tool -add_rpath @executable_path/../Frameworks ./SDL_Test.app/Contents/MacOS/SDL_Test
; This adds the .app internal 'Frameworks' directory to the search path for frameworks.
; YOU NEED TO DO IT EACH TIME YOU COMPILE "SDL_Test.app"!
;
; Now test if it is working:
; ./SDL_Test.app/Contents/MacOS/SDL_Test (or run it from Finder)

PrototypeC.i _SDL_Init(flags.l)
PrototypeC _SDL_Quit()
PrototypeC _SDL_PumpEvents()
PrototypeC.i _SDL_CreateWindowAndRenderer(width.i, height.i, window_flags.l, *pWindow, *pRenderer)
PrototypeC _SDL_DestroyRenderer(*renderer)
PrototypeC _SDL_DestroyWindow(*window)
PrototypeC.i _SDL_SetRenderDrawColor(*renderer, r.a, g.a, b.a, a.a)
PrototypeC.i _SDL_RenderClear(*renderer)
PrototypeC _SDL_RenderPresent(*renderer)

If OpenLibrary(0, "SDL2.framework/SDL2")
   Global SDL_Init._SDL_Init = GetFunction(0, "SDL_Init")
   Global SDL_Quit._SDL_Quit = GetFunction(0, "SDL_Quit")
   Global SDL_PumpEvents._SDL_PumpEvents = GetFunction(0, "SDL_PumpEvents")
   Global SDL_CreateWindowAndRenderer._SDL_CreateWindowAndRenderer = GetFunction(0, "SDL_CreateWindowAndRenderer")
   Global SDL_DestroyRenderer._SDL_DestroyRenderer = GetFunction(0, "SDL_DestroyRenderer")
   Global SDL_DestroyWindow._SDL_DestroyWindow = GetFunction(0, "SDL_DestroyWindow")
   Global SDL_SetRenderDrawColor._SDL_SetRenderDrawColor = GetFunction(0, "SDL_SetRenderDrawColor")
   Global SDL_RenderClear._SDL_RenderClear = GetFunction(0, "SDL_RenderClear")
   Global SDL_RenderPresent._SDL_RenderPresent = GetFunction(0, "SDL_RenderPresent")
   If (SDL_Init($20) = 0)
      If (SDL_CreateWindowAndRenderer(640, 480, 0, @*win, @*ren) = 0)
         SDL_SetRenderDrawColor(*ren, 0, 255, 0, 255)
         SDL_RenderClear(*ren)
         SDL_RenderPresent(*ren)
         For i=0 to 100
            SDL_PumpEvents() ; fix for Mac
         Next
         Delay(2000)
         SDL_DestroyRenderer(*ren)
         SDL_DestroyWindow(*win)
      EndIf
      SDL_Quit()
   EndIf
EndIf

SDL2 easy test

Posted: Thu Sep 11, 2025 7:01 pm
by Piero
SDL2 Test "Easy" version :)
Image

Code: Select all

; SDL Test
;
; Download: https://github.com/libsdl-org/SDL/releases/tag/release-2.32.10
;
; To make a standalone .app, copy SDL2.framework into your app.
; Put it into folder: your.app/Contents/Frameworks/ (needed only once!)

PrototypeC.i _SDL_Init(flags.l)
PrototypeC _SDL_Quit()
PrototypeC _SDL_PumpEvents()
PrototypeC.i _SDL_CreateWindowAndRenderer(width.i, height.i, window_flags.l, *pWindow, *pRenderer)
PrototypeC _SDL_DestroyRenderer(*renderer)
PrototypeC _SDL_DestroyWindow(*window)
PrototypeC.i _SDL_SetRenderDrawColor(*renderer, r.a, g.a, b.a, a.a)
PrototypeC.i _SDL_RenderClear(*renderer)
PrototypeC _SDL_RenderPresent(*renderer)

Procedure.s UpperDir(path$, level = 1, setcurrdir = #False)
   Protected i, oldcurrdir$ = GetCurrentDirectory()
   path$ = GetPathPart(path$) ; in case of file
   For i = 1 To level : path$ + ".." + #PS$ : Next
   SetCurrentDirectory(path$)
   path$ = GetCurrentDirectory()
   If Not setcurrdir : SetCurrentDirectory(oldcurrdir$) : EndIf
   ProcedureReturn path$
EndProcedure

Macro dq : "
EndMacro

Macro Fun(f,i=0)
   Global f#._#f = GetFunction(i, dq#f#dq)
EndMacro

If OpenLibrary(0, UpperDir(ProgramFilename())+"Frameworks/SDL2.framework/SDL2")
   Fun(SDL_Init)
   Fun(SDL_Quit)
   Fun(SDL_PumpEvents)
   Fun(SDL_CreateWindowAndRenderer)
   Fun(SDL_DestroyRenderer)
   Fun(SDL_DestroyWindow)
   Fun(SDL_SetRenderDrawColor)
   Fun(SDL_RenderClear)
   Fun(SDL_RenderPresent)
   If (SDL_Init($20) = 0)
      If (SDL_CreateWindowAndRenderer(640, 480, 0, @*win, @*ren) = 0)
         SDL_SetRenderDrawColor(*ren, 0, 255, 0, 255)
         SDL_RenderClear(*ren)
         SDL_RenderPresent(*ren)
         For i=0 to 100
            SDL_PumpEvents() ; fix for Mac
         Next
         Delay(2000)
         SDL_DestroyRenderer(*ren)
         SDL_DestroyWindow(*win)
      EndIf
      SDL_Quit()
   EndIf
EndIf
Edit: Added a bit more info, refined macro for general use and updated SDL2 link

Re: SDL2 lib

Posted: Fri Sep 12, 2025 1:30 am
by mk-soft
You do not have to copy the dylib into the APP by hand.
It belongs in "your.app/Contents/Resources"

Link: PB IDE Tool MyAppData
Link: PathHelper

Re: SDL2 lib

Posted: Fri Sep 12, 2025 8:10 am
by Piero
mk-soft wrote: Fri Sep 12, 2025 1:30 am You do not have to copy the dylib into the APP by hand.
Well, from what I've seen the framework seems more convenient than the dylib (I'll eventually test with the incoming inline C…)
I already knew your tools, but I just fixed and IMPROVED an old post…
Anyway, once you created the "Frameworks" folder and put stuff inside, recompiling/overwriting is NOT a problem with my method (at least with PB 6); the framework stays inside the app!

Your tools are very useful for "more complex" apps (Info.plist etc.); THANKS!