packages feed

haste-compiler-0.5.0.1: Setup.hs

{-# LANGUAGE CPP #-}
import Distribution.Simple
import Distribution.Simple.Setup
import Distribution.Simple.LocalBuildInfo hiding (libdir)
import Distribution.PackageDescription
import Control.Monad (when, forM_)
import System.Directory
import System.FilePath
import GHC.Paths
import Data.Version

showBootVersion :: Version -> LocalBuildInfo -> String
showBootVersion ver lbi =
    "haste-" ++ showVersion ver ++ "_ghc-" ++ ghcver
  where
    ghcver =
      case compilerId $ compiler lbi of
        CompilerId GHC ver -> showVersion ver
        _                  -> error "Haste only supports building with GHC!"

portablePostBuild :: PackageDescription -> LocalBuildInfo -> IO ()
portablePostBuild pkgdesc buildinfo = do
  -- Figure out paths
  let dirname = "haste-compiler"
      exes = [ exeName exe
             | exe <- executables pkgdesc]
      builddir = buildDir buildinfo
      outdir = dirname
      datadir = dataDir $ localPkgDescr buildinfo
      jsfiles = dataFiles $ localPkgDescr buildinfo
      hastedirfile = ".hastedir" -- does Haste "own" this directory?
         
  dirExists <- doesDirectoryExist outdir
  isHasteDir <- doesFileExist (outdir </> hastedirfile)
  when (dirExists && not isHasteDir) $
    error $ "The output directory " ++ outdir ++ " already exists, "
            ++ "and doesn't seem to be a Haste installation."

  when (dirExists && isHasteDir) $
    removeDirectoryRecursive outdir

  -- Create directory and mark as ours
  createDirectoryIfMissing True (outdir </> "js")
  createDirectoryIfMissing True (outdir </> "bin")
  writeFile (outdir </> ".hastedir") ""

  -- Copy settings and tools.
  copyGhcSettings outdir

  -- Copy executables
  forM_ exes $ \exe -> do
    exists <- doesFileExist $ builddir </> exe </> exe
    if exists
      then copyFile (builddir </> exe </> exe)
                    (outdir </> "bin" </> exe)
      else copyFile (builddir </> exe </> exe <.> "exe")
                    (outdir </> "bin" </> exe <.> "exe")

  -- Copy libs
  forM_ jsfiles $ \js -> do
    copyFile (datadir </> js) (outdir </> "js" </> js)

cabalPostBuild :: PackageDescription -> LocalBuildInfo -> IO ()
cabalPostBuild pkgdesc lbi = do
  appdir <- getAppUserDataDirectory "haste"
  let dest = appdir </> showBootVersion (pkgVersion $ package pkgdesc) lbi
  createDirectoryIfMissing True dest
  copyGhcSettings dest

-- | Copy GHC settings and utils into the given directory.
copyGhcSettings :: FilePath -> IO ()
copyGhcSettings dest = do
  copyFile (libdir </> "platformConstants") (dest </> "platformConstants")
#ifdef mingw32_HOST_OS
  copyFile ("settings.windows") (dest </> "settings")
  copyFile (libdir </> "unlit.exe") (dest </> "unlit.exe")
  copyFile (libdir </> "touchy.exe") (dest </> "touchy.exe")
#else
  copyFile (libdir </> "settings") (dest </> "settings")
  copyFile (libdir </> "unlit") (dest </> "unlit")
#endif

main = defaultMainWithHooks $ simpleUserHooks {
    postBuild = \_ _ pkgdesc buildinfo -> do
      if (buildinfo `has` "portable" || buildinfo `has` "portable-compiler")
        then portablePostBuild pkgdesc buildinfo
        else cabalPostBuild pkgdesc buildinfo
  }

has :: LocalBuildInfo -> String -> Bool
has lbi fn =
  case lookup (FlagName fn) (configConfigurationsFlags (configFlags lbi)) of
    Just f -> f
    _      -> False