File: Main.hs

package info (click to toggle)
haskell-shake 0.13.2%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 888 kB
  • ctags: 127
  • sloc: haskell: 6,388; makefile: 35; ansic: 25; sh: 2
file content (72 lines) | stat: -rw-r--r-- 2,683 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72

module Examples.Ninja.Main(main) where

import Development.Shake
import Development.Shake.FilePath
import System.Directory(copyFile)
import Control.Monad
import General.Base
import Examples.Util
import Data.List
import qualified Start
import System.Environment


main = shaken test $ \args obj -> do
    let args2 = ("-C" ++ obj "") : map tail (filter ("@" `isPrefixOf`) args)
    let real = "real" `elem` args
    action $
        if real then cmd "ninja" args2 else liftIO $ withArgs args2 Start.main


test build obj = do
    let run xs = build $ "--exception" : map ('@':) (words xs)
    let runFail xs bad = assertException [bad] $ run $ xs ++ " --quiet"

    build ["clean"]
    run "-f../../Examples/Ninja/test1.ninja"
    assertExists $ obj "out1.txt"

    run "-f../../Examples/Ninja/test2.ninja"
    assertExists $ obj "out2.2"
    assertMissing $ obj "out2.1"
    build ["clean"]
    run "-f../../Examples/Ninja/test2.ninja out2.1"
    assertExists $ obj "out2.1"
    assertMissing $ obj "out2.2"

    copyFile "Examples/Ninja/test3-sub.ninja" $ obj "test3-sub.ninja"
    copyFile "Examples/Ninja/test3-inc.ninja" $ obj "test3-inc.ninja"
    copyFile ("Examples/Ninja/" ++ if null exe then "test3-unix.ninja" else "test3-win.ninja") $ obj "test3-platform.ninja"
    run "-f../../Examples/Ninja/test3.ninja"
    assertNonSpace (obj "out3.1") "g4+b1+++i1"
    assertNonSpace (obj "out3.2") "g4++++i1"
    assertNonSpace (obj "out3.3") "g4++++i1"
    assertNonSpace (obj "out3.4") "g4+++s1+s2"

    run "-f../../Examples/Ninja/test4.ninja out"
    assertExists $ obj "out.txt"
    assertExists $ obj "out2.txt"

    run "-f../../Examples/Ninja/test5.ninja"
    assertExists $ obj "output file"

    writeFile (obj "nocreate.log") ""
    writeFile (obj "nocreate.in") ""
    run "-f../../Examples/Ninja/nocreate.ninja"
    assertNonSpace (obj "nocreate.log") "x"
    run "-f../../Examples/Ninja/nocreate.ninja"
    run "-f../../Examples/Ninja/nocreate.ninja"
    assertNonSpace (obj "nocreate.log") "xxx"

    writeFile (obj "input") ""
    runFail "-f../../Examples/Ninja/lint.ninja bad --lint" "'needed' file required rebuilding"
    run "-f../../Examples/Ninja/lint.ninja good --lint"
    runFail "-f../../Examples/Ninja/lint.ninja bad --lint" "not a pre-dependency"

    res <- fmap (reverse . drop 2 . reverse . drop 1 . lines) $ captureOutput $ run "-f../../Examples/Ninja/compdb.ninja -t compdb cxx"
    want <- fmap lines $ readFile "Examples/Ninja/compdb.output"
    let eq a b | (a1,'*':a2) <- break (== '*') a = unless (a1 `isPrefixOf` b && a2 `isSuffixOf` b) $ a === b
               | otherwise = a === b
    length want === length res
    zipWithM_ eq want res