gists/first-interpreter/build.hs
2026-01-03 23:59:53 +02:00

46 lines
1.2 KiB
Haskell
Executable file

#!/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