BindBC Updates: new loader function, SDL_net, streamlined SDL_* version indentifiers

Mike Parker aldacron at gmail.com
Wed May 13 14:39:13 UTC 2020


I've recently implemented some improvements centered on 
bindbc-sdl.

== New Loader Function

I've added a function to bindbc-loader (on Windows only) to allow 
adding a single path to the default DLL search path. This is to 
solve the problem that some of the SDL satellite libraries would 
fail to load when placed in a directory outside of the search 
path, such as a ./libs subdirectory.

The problem is that SDL loads its dependencies dynamically. So 
when a bindbc user would load a lib with a custom path, e.g., 
`loadSDLImage("libs\\SDL2_image.dll")`, the system loader would 
find that DLL just fine, but then when it in turn attempted to 
load a dependency like libpng, the system loader would search the 
DLL search path and *not* the libs subdirectory, thereby causing 
a failure.

Now you can do this:

```
version(Windows) setCustomLoaderSearchPath("libs");

if(loadSDL() < sdlSupport) { /* handle error */ }
if(loadSDL_Image() < sdlImageSupport) { /* handle error */ }

// Give SDL_image a chance to load libpng and libjpeg (it loads 
them lazily
// when the corresponding flags are passed to IMG_Init.
auto flags = IMG_INIT_PNG | IMG_INIT_JPEG;
if(IMG_Init(flags) != flags) { /* handle error */ }

// Now reset the default loader search path
version(Windows) setCustomLoaderSearchPath(null);
```

It's up to the caller to ensure the path is valid. For example, 
if the executable is run from a different directory, then "libs" 
will not be relative to the current working directory. 
`SDL_GetBasePath` can help there:

https://wiki.libsdl.org/SDL_GetBasePath?highlight=%28%5CbCategoryFilesystem%5Cb%29%7C%28CategoryEnum%29%7C%28CategoryStruct%29

I'm unaware of any issues with other libraries BindBC binds to, 
but if they do arise, this will solve those, too.

== SDL_net

I didn't initially port SDL_net over because I didn't think 
anyone was using it. I was waiting for someone to request it. 
Someone did. It's a small API, so it took a matter of minutes to 
complete.

== Streamlined SDL_* version identifiers

Previously, the SDL satellite library bindings could be enabled 
with e.g., `BindSDL_Image`, `BindSDL_TTF`, etc. That would enable 
the lowest supported version of the library. To enable a more 
recent version, an additional identifier was required 
(`SDL_Image_205`, `SDL_TTF_2014`). That's just dumb. Now, only 
one identifier is required, e.g., `SDL_Image_205` will do the 
trick by itself now. `SDL_Image` is equivalent to the 
`SDL_Image_200`. The old approach is still supported, though, so 
current build configs should continue to work without change.

See the loader documentation for details on the new function:

https://github.com/BindBC/bindbc-loader

There's also a bit about it in the bindbc-sdl documentation, 
along with the details about the approach to version identifiers.

https://github.com/BindBC/bindbc-sdl/blob/master/README.md

I've got some bigger packages to port over from Derelict yet (the 
OpenCL binding, for example). I've also had a request to include 
support for SDL's thread/mutex API so folks using DasBetterC can 
have access to it. That's all in the pipeline. Going forward, I 
plan to devote a handful of hours one day a week to bindbc until 
I've implemented everything on my task list, so it will get done 
sooner rather than later.



More information about the Digitalmars-d-announce mailing list