#! /usr/bin/env runhaskell {- configure.hs for bindings-levmar This file was completely copied from hmatrix-0.5.2.2 and then adjusted for bindings-levmar. -} import System import Data.List (isPrefixOf) import Distribution.Simple.LocalBuildInfo import Distribution.Simple.Configure import Distribution.PackageDescription -- possible additional dependencies for the desired libs (by default lapack) opts :: [String] opts = [ "" -- Ubuntu/Debian , "blas" , "blas cblas" , "cblas" , "f77blas cblas atlas gcc_s" -- Arch Linux (older version of atlas-lapack) , "blas gfortran" -- Arch Linux with normal blas and lapack ] -- Compile a simple program with symbols from LAPACK with the given libs. testProg :: String -> String -> String testProg libs fmks = "gcc levmar_lapack_test.c -o /tmp/dummy " ++ f1 libs ++ " " ++ f2 fmks ++ " > /dev/null 2> /dev/null" f1, f2 :: String -> String f1 = unwords . map ("-l" ++) . words f2 = unwords . map ("-framework "++) . words check :: String -> String -> IO Bool check libs fmks = checkCommand (testProg libs fmks) checkCommand :: String -> IO Bool checkCommand c = (ExitSuccess ==) `fmap` system c -- test different configurations until the first one works try :: String -> String -> [String] -> IO (Maybe String) try _ _ [] = return Nothing try b f (opt:rest) = do ok <- check (b ++ " " ++ opt) f if ok then return (Just opt) else try b f rest -- read --configure-option=link:lib1,lib2,lib3,etc linkOp :: String linkOp = "link:" getUserLink :: [String] -> String getUserLink = concatMap (g . drop (length linkOp)) . filter (isPrefixOf linkOp) where g = map cs cs ',' = ' ' cs x = x main :: IO () main = do putStr "Checking foreign libraries..." args <- getArgs Just bInfo <- maybeGetPersistBuildConfig "dist" let Just lib = library . localPkgDescr $ bInfo base = unwords . extraLibs . libBuildInfo $ lib fwks = unwords . frameworks . libBuildInfo $ lib auxpref = getUserLink args -- We extract the desired libs from bindings-levmar.cabal (using cabal flags) -- and from a possible --configure-option=link:lib1,lib2,lib3 -- by default the desired lib is lapack. let pref = if null (words (base ++ " " ++ auxpref)) then "lapack" else auxpref fullOpts = map ((pref ++ " ") ++ ) opts r <- try base fwks fullOpts case r of Nothing -> do putStrLn " FAIL" putStrLn " *** Sorry, I can't link LAPACK." putStrLn " *** Please make sure that the appropriate -dev packages are installed." putStrLn " *** You can also specify the required libraries using" putStrLn " *** cabal install bindings-levmar --configure-option=link:lib1,lib2,lib3,etc." writeFile "bindings-levmar.buildinfo" "buildable: False\n" Just ops -> do putStrLn " OK" writeFile "bindings-levmar.buildinfo" $ "extra-libraries: " ++ ops ++ "\n"