+linkPackages :: [String] -> [Package] -> IO ()
+linkPackages cmdline_libs pkgs
+ = do mapM preloadLib cmdline_libs
+ mapM_ linkPackage pkgs
+ where
+ preloadLib orig_name
+ = do putStr ("Loading object " ++ orig_name ++ " ... ")
+ case classify orig_name of
+ Left static_ish
+ -> do b <- doesFileExist static_ish
+ if not b
+ then do putStr "not found.\n"
+ croak
+ else do loadObj static_ish
+ putStr "done.\n"
+ Right dll_unadorned
+ -> do dll_ok <- ocAddDLL (packString dll_unadorned)
+ if dll_ok == 1
+ then putStr "done.\n"
+ else do putStr "not found.\n"
+ croak
+
+ croak = throwDyn (OtherError "user specified .o/.so/.DLL cannot be found.")
+
+ classify a_lib
+ = let a_libr = reverse a_lib
+ in
+ case map toLower a_libr of
+ ('o':'.':_)
+ -> Left a_lib
+ ('o':'s':'.':_)
+ -> (Right . zap_leading_lib
+ . reverse . drop 3 . reverse) a_lib
+ ('l':'l':'d':'.':_)
+ -> (Right . reverse . drop 4 . reverse) a_lib
+ other
+ -> -- Main.beginInteractive should not have let this through
+ pprPanic "linkPackages" (text (show a_lib))
+
+ zap_leading_lib str
+ = if take 3 str == "lib" then drop 3 str else str
+