#!/usr/bin/env cabal {- cabal: build-depends: base, bytestring, cereal, hspec, process, shake, -} -- initial version taken from https://shakebuild.com/manual import Development.Shake import Development.Shake.FilePath import Development.Shake.Util cc = "gcc" flags = "-ggdb" clearCcCache = removeFilesAfter "build" ["//*"] main :: IO () main = shakeArgs shakeOptions{shakeFiles="_build"} $ do want ["_build/interpreter" <.> exe] phony "clean" $ do putInfo "Cleaning files in _build" removeFilesAfter "_build" ["//*"] clearCcCache removeFilesAfter "newdist" ["//*"] cmd_ "cabal" "clean" phony "run" $ do need ["_build/interpreter" <.> exe] putInfo "Running interpreter" cmd_ "_build/interpreter" ["program.code"] "_build/interpreter" <.> exe %> \out -> do cs <- getDirectoryFiles "src" ["//*.c"] let os = ["_build" "normal" "src" c -<.> "o" | c <- cs] need os cmd_ (cc <> " " <> flags <> " -o") [out] os "_build/normal//*.o" %> \out -> do let c = dropDirectory1 $ dropDirectory1 $ out -<.> "c" let m = out -<.> "m" cmd_ (cc <> " " <> flags <> " -c") [c] "-o" [out] "-MMD -MF" [m] neededMakefileDependencies m