#!/usr/bin/runghc

\begin{code}
import Distribution.PackageDescription
import Distribution.Simple
import Distribution.Simple.Setup
import Distribution.Simple.LocalBuildInfo
import Distribution.Simple.Program

main = defaultMainWithHooks defaultUserHooks {
         hookedPrograms = [mysqlConfigProgram],
         postConf=configure
       }

mysqlConfigProgram = simpleProgram "mysql_config"

configure _ flags _ lbi = do
  mb_bi <- mysqlConfigBuildInfo (configVerbose flags) lbi
  writeHookedBuildInfo "MySQL.buildinfo" (mb_bi,[])

message :: String -> IO ()
message s = putStrLn $ "configure: " ++ s
\end{code}

Populate BuildInfo using pkg-config tool.
\begin{code}
mysqlConfigBuildInfo verbose lbi = do
  case lookupProgram mysqlConfigProgram (withPrograms lbi) of
    Just mysqlConfigProg -> do
       message ("configuring mysqlclient library") 
       res <- rawSystemProgramStdout verbose mysqlConfigProg ["--libs"]
       let (lib_dirs,libs,ld_opts) = splitLibsFlags (words res)
       res <- rawSystemProgramStdout verbose mysqlConfigProg ["--include"]
       let (inc_dirs,cc_opts) = splitCFlags (words res)
       return $ Just emptyBuildInfo {
         extraLibDirs=lib_dirs,
	 extraLibs=libs,
	 ldOptions=ld_opts,
	 includeDirs=inc_dirs,
	 ccOptions=cc_opts
       }
    Nothing -> do
       message ("The package will be built using default settings for mysqlclient library")
       return Nothing
  where
    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 []         = ([],[])
    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)

\end{code}
