packages feed

backprop-0.2.5.0: Build.hs

#!/usr/bin/env stack
-- stack --install-ghc runghc --package shake-0.16.4 --stack-yaml stack.yaml

import           Development.Shake
import           Development.Shake.FilePath
import           System.Directory

opts = shakeOptions { shakeFiles     = ".shake"
                    , shakeVersion   = "1.0"
                    , shakeVerbosity = Normal
                    , shakeThreads   = 1
                    }

data Doc = Lab

main :: IO ()
main = getDirectoryFilesIO "samples" ["/*.lhs", "/*.hs"] >>= \allSamps ->
       getDirectoryFilesIO "src"     ["//*.hs"]          >>= \allSrc ->
         shakeArgs opts $ do

    want ["all"]

    "all" ~>
      need ["pdf", "md", "gentags", "install", "exe"]

    "pdf" ~>
      need [ "renders" </> takeFileName f -<.> ".pdf"
                | f <- allSamps, takeExtension f == ".lhs"
           ]

    "md" ~>
      need [ "renders" </> takeFileName f -<.> ".md"
                | f <- allSamps, takeExtension f == ".lhs"
           ]

    "exe" ~>
      need (map (\f -> "samples-exe" </> dropExtension f) allSamps)

    "haddocks" ~> do
      need $ ("src" </>) <$> allSrc
      cmd "jle-git-haddocks"

    "install" ~> do
      need $ ("src" </>) <$> allSrc
      cmd "stack install"

    "install-profile" ~> do
      need $ ("src" </>) <$> allSrc
      cmd "stack install --profile"

    "gentags" ~>
      need ["tags", "TAGS"]

    ["renders/*.pdf", "renders/*.md"] |%> \f -> do
      let src = "samples" </> takeFileName f -<.> "lhs"
      need [src]
      liftIO $ createDirectoryIfMissing True "renders"
      cmd "pandoc"
        "-V geometry:margin=1in"
        "-V fontfamily:palatino,cmtt"
        "-V links-as-notes"
        "-s"
        "--highlight-style tango"
        "--reference-links"
        "--reference-location block"
        "-o" f
        src

    "samples-exe/*" %> \f -> do
      need ["install"]
      [src] <- getDirectoryFiles "samples" $ (takeFileName f <.>) <$> ["hs","lhs"]
      liftIO $ do
        createDirectoryIfMissing True "samples-exe"
        createDirectoryIfMissing True ".build"
      removeFilesAfter "samples" ["/*.o"]
      cmd "stack ghc"
        "--stack-yaml stack.yaml"
        "--package mnist-idx"
        "--package singletons"
        "--package one-liner-instances"
        "--"
        ("samples" </> src)
        "-o" f
        "-hidir .build"
        "-Wall"
        "-O2"

    "profile" ~> do
      need $ do
        s <- ["manual","bp-lens","bp-hkd","hybrid"]
        e <- ["prof.html","svg"]
        return $ "bench-prof/bench-" ++ s <.> e

    "bench-prof/bench" %> \f -> do
      let src = "bench" </> takeFileName f <.> ".hs"
      need ["install-profile", src]
      unit $ cmd "stack install"
        "--profile"
        "--stack-yaml stack.yaml"
        [ "lens"
        , "hmatrix"
        , "one-liner-instances"
        , "split"
        , "criterion"
        ]
      unit $ cmd "stack ghc"
        "--profile"
        "--stack-yaml stack.yaml"
        src
        "--"
        "-o" f
        "-hidir .build"
        "-O2"
        "-prof"
        "-fexternal-interpreter"

    "bench-prof/bench-*.prof" %> \f -> do
      need ["bench-prof/bench"]
      let b = drop 6 $ takeBaseName f
      unit $ cmd "./bench-prof/bench"
                 ("gradient/" ++ b)
                 "+RTS"
                 "-p"
      cmd "mv" "bench.prof" f

    "**/*.prof.html" %> \f -> do
      let src = f -<.> ""
      need [src]
      cmd "profiteur" src

    "**/*.prof.folded" %> \f -> do
      let src = f -<.> ""
      need [src]
      Stdout out <- cmd "cat" [src]
      cmd (Stdin out)
          (FileStdout f)
          "ghc-prof-flamegraph"

    "bench-prof/*.svg" %> \f -> do
      let src = f -<.> "prof.folded"
      need [src]
      cmd (FileStdout f)
          "flamegraph.pl"
          "--width 2000"
          src

    ["tags","TAGS"] &%> \_ -> do
      need (("src" </>) <$> allSrc)
      cmd "hasktags" "src/"

    "clean" ~> do
      unit $ cmd "stack clean"
      removeFilesAfter ".shake" ["//*"]
      removeFilesAfter ".build" ["//*"]