module Build where

import Development.Shake

mlFiles :: [String]
mlFiles = ["//*.ml", "//*.mli", "//*.mll", "//*.mly"]

build :: IO ()
build = shakeArgs shakeOptions{shakeFiles="_build"} $ do
  want ["_build/bin/main"]
  want ["_build/bin/test"]

  phony "clean" $ do
    putNormal "Cleaning files in _build"
    removeFilesAfter "_build" ["//*"]

  phony "run" $ do
    cmd "_build/bin/main"

  phony "test" $ do
    cmd "_build/bin/test"

  "_build/bin/main" %> \_ -> do
    cs <- getDirectoryFiles "" mlFiles
    need cs
    () <- cmd "ocamlbuild -use-ocamlfind main.native"
    () <- cmd "mkdir -p _build/bin"
    cmd "mv main.native _build/bin/main"

  "_build/bin/test" %> \_ -> do
    cs <- getDirectoryFiles "" mlFiles
    need cs
    () <- cmd "ocamlbuild -use-ocamlfind -package oUnit test.native"
    () <- cmd "mkdir -p _build/bin"
    cmd "mv test.native _build/bin/test"