@@ -1,18 +1,27 @@
11-- | Platform-specific dynamic linking support. Add new platforms to this file
22-- through conditional compilation.
3−{-# LANGUAGE ExistentialQuantification #-}
3+{-# LANGUAGE ExistentialQuantification, CPP #-}
44module Util.DynamicLinker where
55
66import Foreign.LibFFI
77import Foreign.Ptr (nullPtr, FunPtr, nullFunPtr)
88import System.Posix.DynamicLinker
99
10+hostDynamicLibExt :: String
11+#ifdef LINUX
12+hostDynamicLibExt = "so"
13+#elif MACOSX
14+hostDynamicLibExt = "dylib"
15+#elif WINDOWS
16+hostDynamicLibExt = "dll"
17+#endif
18+
1019data DynamicLib = Lib { lib_name :: String
1120 , lib_handle :: DL
1221 }
1322
1423tryLoadLib :: String -> IO (Maybe DynamicLib)
15−tryLoadLib lib = do handle <- dlopen lib [RTLD_NOW]
24+tryLoadLib lib = do handle <- dlopen (lib ++ "." ++ hostDynamicLibExt) [RTLD_NOW]
1625 if undl handle == nullPtr
1726 then return Nothing
1827 else return . Just $ Lib lib handle