X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Setup.hs;h=d080b2a0952e6b900ae404115a6c40163d5e1d4f;hb=778b765be6dd903fdac167c3973aebd94b12df33;hp=13502f48aec2cb50c6af872dd01d0b54a6351c54;hpb=5aa48cdf0852c15f6bedd8ffc74a1f7d39c7518c;p=haskell-directory.git diff --git a/Setup.hs b/Setup.hs index 13502f4..d080b2a 100644 --- a/Setup.hs +++ b/Setup.hs @@ -10,52 +10,66 @@ import Control.Monad import Data.List import Distribution.Simple import Distribution.PackageDescription -import Distribution.PreProcess import Distribution.Setup -import Distribution.Simple.Configure import Distribution.Simple.LocalBuildInfo import System.Environment -import System.Exit +import System.Info main :: IO () main = do args <- getArgs let (ghcArgs, args') = extractGhcArgs args - let hooks = defaultUserHooks { + (confArgs, args'') = extractConfigureArgs args' + hooks = defaultUserHooks { confHook = add_extra_deps $ confHook defaultUserHooks, + postConf = add_configure_options confArgs + $ postConf defaultUserHooks, buildHook = add_ghc_options ghcArgs $ filter_modules_hook $ buildHook defaultUserHooks, + makefileHook = add_ghc_options ghcArgs + $ filter_modules_hook + $ makefileHook defaultUserHooks, + regHook = add_extra_libs + $ regHook defaultUserHooks, instHook = filter_modules_hook $ instHook defaultUserHooks } - withArgs args' $ defaultMainWithHooks hooks + withArgs args'' $ defaultMainWithHooks hooks extractGhcArgs :: [String] -> ([String], [String]) -extractGhcArgs args +extractGhcArgs = extractPrefixArgs "--ghc-option=" + +extractConfigureArgs :: [String] -> ([String], [String]) +extractConfigureArgs = extractPrefixArgs "--configure-option=" + +extractPrefixArgs :: String -> [String] -> ([String], [String]) +extractPrefixArgs the_prefix args = let f [] = ([], []) f (x:xs) = case f xs of - (ghcArgs, otherArgs) -> - case removePrefix "--ghc-option=" x of - Just ghcArg -> - (ghcArg:ghcArgs, otherArgs) + (wantedArgs, otherArgs) -> + case removePrefix the_prefix x of + Just wantedArg -> + (wantedArg:wantedArgs, otherArgs) Nothing -> - (ghcArgs, x:otherArgs) + (wantedArgs, x:otherArgs) in f args removePrefix :: String -> String -> Maybe String removePrefix "" ys = Just ys +removePrefix _ "" = Nothing removePrefix (x:xs) (y:ys) | x == y = removePrefix xs ys | otherwise = Nothing -type Hook a = PackageDescription -> LocalBuildInfo -> Maybe UserHooks -> a - -> IO () +type Hook a = PackageDescription -> LocalBuildInfo -> UserHooks -> a -> IO () type ConfHook = PackageDescription -> ConfigFlags -> IO LocalBuildInfo +type PostConfHook = Args -> ConfigFlags -> PackageDescription -> LocalBuildInfo + -> IO () -- type PDHook = PackageDescription -> ConfigFlags -> IO () add_ghc_options :: [String] -> Hook a -> Hook a -add_ghc_options args f pd lbi muhs x +add_ghc_options args f pd lbi uhs x = do let lib' = case library pd of Just lib -> let bi = libBuildInfo lib @@ -64,10 +78,14 @@ add_ghc_options args f pd lbi muhs x in lib { libBuildInfo = bi' } Nothing -> error "Expected a library" pd' = pd { library = Just lib' } - f pd' lbi muhs x + f pd' lbi uhs x + +add_configure_options :: [String] -> PostConfHook -> PostConfHook +add_configure_options args f as cfs pd lbi + = f (as ++ args) cfs pd lbi filter_modules_hook :: Hook a -> Hook a -filter_modules_hook f pd lbi muhs x +filter_modules_hook f pd lbi uhs x = let build_filter = case compilerFlavor $ compiler lbi of GHC -> forGHCBuild _ -> isPortableBuild @@ -77,14 +95,13 @@ filter_modules_hook f pd lbi muhs x in lib { exposedModules = ems } Nothing -> error "Expected a library" pd' = pd { library = Just lib' } - in f pd' lbi muhs x + in f pd' lbi uhs x isPortableBuild :: String -> Bool isPortableBuild s | "GHC" `isPrefixOf` s = False | "Data.Generics" `isPrefixOf` s = False - | otherwise = s `elem` ["Foreign.Concurrent", - "System.Process"] + | otherwise = s `notElem` ["Foreign.Concurrent", "System.Process"] forGHCBuild :: String -> Bool forGHCBuild = ("GHC.Prim" /=) @@ -102,3 +119,21 @@ add_extra_deps f pd cf _ -> return lbi +add_extra_libs :: Hook a -> Hook a +add_extra_libs f pd lbi uhs x + = let pd' = if (os == "mingw32") && (compilerFlavor (compiler lbi) == GHC) + then case library pd of + Just lib -> + let lib_bi = libBuildInfo lib + lib_bi' = lib_bi { extraLibs = "wsock32" + : "msvcrt" + : "kernel32" + : "user32" + : "shell32" + : extraLibs lib_bi } + lib' = lib { libBuildInfo = lib_bi' } + in pd { library = Just lib' } + Nothing -> error "Expected a library" + else pd + in f pd' lbi uhs x +