package SDL::Internal::Loader; use strict; use warnings; require Exporter; our @ISA = qw(Exporter); our @EXPORT = qw(internal_load_dlls); our @LIBREFS = (); use SDL::ConfigData; use Alien::SDL; # SDL::Internal::Loader is a king of "Dynaloader kung-fu" that is # necessary in situations when you install Allien::SDL from sources # or from prebuilt binaries as in these scenarios the SDL stuff is # installed into so called 'sharedir' somewhere in perl/lib/ tree # on Windows box it is e.g. # C:\strawberry\perl\site\lib\auto\share\dist\Alien-SDL... # # What happens is that for example XS module "SDL::Video" is linked # with -lSDL library which means that resulting "Video.(so|dll)" has # a dependency on "libSDL.(so|dll)" - however "libSDL.(so|dll)" is # neither in PATH (Win) or in LD_LIBRARY_PATH (Unix) so Dynaloader # will fail to load "Video.(so|dll)". # # To handle this we have internal_load_dlls() which has to be called # from XS modules (e.g. SDL::Video) linked with SDL libs like this: # # use SDL::Internal::Loader; # internal_load_dlls(PACKAGE); sub internal_load_dlls($) { my $package = shift; ### check if some ld_shlib_map is defined my $shlib_map = Alien::SDL->config('ld_shlib_map'); return unless $shlib_map; # empty shlib_map, nothing to do ### get list of lib nicknames based on packagename my $lib_nick = SDL::ConfigData->config('SDL_lib_translate')->{$package}; return unless $lib_nick; # no need to load anything ### let us load the corresponding shlibs (*.dll|*.so) require DynaLoader; foreach my $n (@$lib_nick) { my $file = $shlib_map->{$n}; next unless $file && -e $file; my $libref = DynaLoader::dl_load_file( $file, 0 ); push( @DynaLoader::dl_librefs, $libref ) if $libref; push( @LIBREFS, $libref ) if $libref; } } 1;