#!/usr/bin/env runghc import Distribution.Simple main = defaultMain {- import Data.Maybe import Distribution.PackageDescription import Distribution.Setup import Distribution.Simple import Distribution.Simple.Configure import Distribution.Simple.LocalBuildInfo import System.IO import System.Exit import System.Directory import System.Process import Control.Monad import Control.Exception buildInfoName = "Kirschbaum.buildinfo" cgiName = "Kirschbaum.cgi" main = defaultMainWithHooks defaultUserHooks {preConf = preConf, postConf = postConf} where preConf :: [String] -> ConfigFlags -> IO HookedBuildInfo preConf args flags = do try (removeFile buildInfoName) return emptyHookedBuildInfo postConf :: [String] -> ConfigFlags -> PackageDescription -> LocalBuildInfo -> IO ExitCode postConf args flags _ localbuildinfo = do binfo <- pkgConfigBuildInfo (configVerbose flags) let default_binfo = emptyBuildInfo {extraLibs = ["xml2", "xslt", "exslt"]} writeHookedBuildInfo buildInfoName (Just emptyBuildInfo, [(cgiName, fromMaybe default_binfo binfo)]) return ExitSuccess message :: String -> IO () message s = putStrLn $ "configure: " ++ s rawSystemGrabOutput :: Int -> FilePath -> [String] -> IO String rawSystemGrabOutput verbose path args = do when (verbose > 0) $ putStrLn (path ++ concatMap (' ':) args) (inp,out,err,pid) <- runInteractiveProcess path args Nothing Nothing exitCode <- waitForProcess pid if exitCode /= ExitSuccess then do errMsg <- hGetContents err hPutStr stderr errMsg exitWith exitCode else return () hClose inp hClose err hGetContents out {- mergeBuildInfo :: BuildInfo -> BuildInfo -> BuildInfo mergeBuildInfo b1 b2 = BuildInfo { buildable = buildable b1 || buildable b2, ccOptions = ccOptions b1 ++ ccOptions b2, ldOptions = ldOptions b1 ++ ldOptions b2, frameworks = frameworks b1 ++ frameworks b2, cSources = cSources b1 ++ cSources b2, hsSourceDirs = hsSourceDirs b1 ++ hsSourceDirs b2, otherModules = otherModules b1 ++ otherModules b2, extensions = extensions b1 ++ extensions b2, extraLibs = extraLibs b1 ++ extraLibs b2, extraLibDirs = extraLibDirs b1 ++ extraLibDirs b2, includeDirs = includeDirs b1 ++ includeDirs b2, includes = includes b1 ++ includes b2, installIncludes = installIncludes b1 ++ installIncludes b2, options = options b1 ++ options b2, ghcProfOptions = ghcProfOptions b1 ++ ghcProfOptions b2 } libXml2ConfigBuildInfo :: Int -> IO (Maybe BuildInfo) libXml2ConfigBuildInfo verbose = do mb_libxml2_config_path <- findProgram "xml2-config" Nothing case mb_libxml2_config_path of Just libxml2_config_path -> do message "configuring libxml2 library" res <- rawSystemGrabOutput verbose libxml2_config_path ["--libs"] let (lib_dirs, libs, ld_opts) = splitLibsFlags (words res) res <- rawSystemGrabOutput verbose libxml2_config_path ["--cflags"] let (inc_dirs, cc_opts) = splitCFlags (words res) let bi = emptyBuildInfo { extraLibDirs = lib_dirs, extraLibs = libs, ldOptions = ld_opts, includeDirs = inc_dirs, ccOptions = cc_opts } return $ Just bi Nothing -> do message "This package will be built using default settings for libxml2 library" return Nothing libXsltConfigBuildInfo :: Int -> IO (Maybe BuildInfo) libXsltConfigBuildInfo verbose = do mb_libxslt_config_path <- findProgram "xslt-config" Nothing case mb_libxslt_config_path of Just libxslt_config_path -> do message "configuring libxslt library" res <- rawSystemGrabOutput verbose libxslt_config_path ["--libs"] let (lib_dirs, libs, ld_opts) = splitLibsFlags (words res) res <- rawSystemGrabOutput verbose libxslt_config_path ["--cflags"] let (inc_dirs, cc_opts) = splitCFlags (words res) let bi = emptyBuildInfo { extraLibDirs = lib_dirs, extraLibs = libs, ldOptions = ld_opts, includeDirs = inc_dirs, ccOptions = cc_opts } return $ Just bi Nothing -> do message "This package will be built using default settings for libxslt library" return Nothing -} pkgConfigBuildInfo :: Int -> IO (Maybe BuildInfo) pkgConfigBuildInfo verbose = do mb_libxslt_config_path <- findProgram "pkg-config" Nothing case mb_libxslt_config_path of Just libxslt_config_path -> do message "configuring libxml2, libxslt and libexslt library" let modules = ["libxml-2.0", "libxslt", "libexslt"] res <- rawSystemGrabOutput verbose libxslt_config_path (modules ++ ["--libs"]) let (lib_dirs, libs, ld_opts) = splitLibsFlags (words res) res <- rawSystemGrabOutput verbose libxslt_config_path (modules ++ ["--cflags"]) let (inc_dirs, cc_opts) = splitCFlags (words res) let bi = emptyBuildInfo { extraLibDirs = lib_dirs, extraLibs = libs, ldOptions = ld_opts, includeDirs = inc_dirs, ccOptions = cc_opts } return $ Just bi Nothing -> do message "This package will be built using default settings for libxslt library" return Nothing splitLibsFlags :: [String] -> ([String], [String], [String]) splitLibsFlags [] = ([], [], []) splitLibsFlags (arg:args) = case arg of ('-':'L':lib_dir) -> let (lib_dirs, libs, ld_opts) = splitLibsFlags args in (lib_dir:lib_dirs, libs, ld_opts) ('-':'l':lib) -> let (lib_dirs, libs, ld_opts) = splitLibsFlags args in (lib_dirs, lib:libs, ld_opts) ld_opt -> let (lib_dirs, libs, ld_opts) = splitLibsFlags args in (lib_dirs, libs, ld_opt:ld_opts) splitCFlags :: [String] -> ([String], [String]) splitCFlags [] = ([], []) splitCFlags (arg:args) = case arg of ('-':'I':inc_dir) -> let (inc_dirs, c_opts) = splitCFlags args in (inc_dir:inc_dirs, c_opts) c_opt -> let (inc_dirs, c_opts) = splitCFlags args in (inc_dirs, c_opt:c_opts) -}