packages feed

hlibsass-0.1.3.0: Setup.hs

import           Control.Monad                      (unless, when)
import           Data.Char                          (toLower)
import           Data.Maybe                         (fromJust, fromMaybe)
import           Distribution.PackageDescription
import           Distribution.Simple
import           Distribution.Simple.LocalBuildInfo (InstallDirs (..),
                                                     LocalBuildInfo (..),
                                                     absoluteInstallDirs,
                                                     localPkgDescr)
import           Distribution.Simple.Setup
import           Distribution.Simple.Utils          (installExecutableFile,
                                                     rawSystemExit,
                                                     rawSystemStdout)
import           Distribution.System
import           System.Directory                   (getCurrentDirectory)

main = defaultMainWithHooks simpleUserHooks
  {
    preConf = \a f -> makeLibsass a f >> preConf simpleUserHooks a f
  , confHook = \a f -> confHook simpleUserHooks a f >>= updateExtraLibDirs
  , postCopy = copyLibsass
  , postClean = cleanLibsass
  , preSDist = \a f -> (updateLibsassVersion a f >> preSDist simpleUserHooks a f)
  }

makeLibsass :: Args -> ConfigFlags -> IO ()
makeLibsass _ f =
    let verbosity = fromFlag $ configVerbosity f
        external = getCabalFlag "externalLibsass" f
        target = if getCabalFlag "sharedLibsass" f then "shared" else "static"
    in unless external $ rawSystemExit verbosity "env"
         ["BUILD=" ++ target, "make", "--directory=libsass"]

updateExtraLibDirs :: LocalBuildInfo -> IO LocalBuildInfo
updateExtraLibDirs lbi
    | getCabalFlag "externalLibsass" $ configFlags lbi = return lbi
    | otherwise = do
        let packageDescription = localPkgDescr lbi
            lib = fromJust $ library packageDescription
            libBuild = libBuildInfo lib
        dir <- getCurrentDirectory
        return lbi {
            localPkgDescr = packageDescription {
                library = Just $ lib {
                    libBuildInfo = libBuild {
                        extraLibDirs = (dir ++ "/libsass/lib") :
                            extraLibDirs libBuild
                    }
                }
            }
        }

copyLibsass :: Args -> CopyFlags -> PackageDescription -> LocalBuildInfo -> IO ()
copyLibsass _ flags pkg_descr lbi =
    let libPref = libdir . absoluteInstallDirs pkg_descr lbi
                . fromFlag . copyDest
                $ flags
        verb = fromFlag $ copyVerbosity flags
        config = configFlags lbi
        external = getCabalFlag "externalLibsass" config
        Platform _ os = hostPlatform lbi
        shared = getCabalFlag "sharedLibsass" config
        ext = if shared then "so" else "a"
    in unless external $
        if os == Windows
            then do
                installExecutableFile verb
                    "libsass/lib/libsass.a"
                    (libPref ++ "/libsass.a")
                when shared $ installExecutableFile verb
                    "libsass/lib/libsass.dll"
                    (libPref ++ "/libsass.dll")
           else
                installExecutableFile verb
                    ("libsass/lib/libsass." ++ ext)
                    (libPref ++ "/libsass." ++ ext)


cleanLibsass :: Args -> CleanFlags -> PackageDescription -> () -> IO ()
cleanLibsass _ flags _ _ =
    rawSystemExit (fromFlag $ cleanVerbosity flags) "env"
        ["make", "--directory=libsass", "clean"]

updateLibsassVersion :: Args -> SDistFlags -> IO ()
updateLibsassVersion _ flags = do
    let verbosity = fromFlag $ sDistVerbosity flags
    ver <- rawSystemStdout verbosity "env" [ "git", "-C", "libsass", "describe",
        "--abbrev=4", "--dirty", "--always", "--tags" ]
    writeFile "libsass/VERSION" ver

getCabalFlag :: String -> ConfigFlags -> Bool
getCabalFlag name flags = fromMaybe False (lookup (FlagName name') allFlags)
    where allFlags = configConfigurationsFlags flags
          name' = map toLower name