+#!/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)
+-}
\ No newline at end of file