content: 
  module Test.OrderOnly(main) where
  
  import Development.Shake
  import Test.Type
  import System.Directory(removeFile)
  import Control.Exception.Extra
  
  
  main = testBuild test $ do
      "bar.txt" %> \out -> do
          alwaysRerun
          writeFile' out =<< liftIO (readFile "bar.in")
  
      "foo.txt" %> \out -> do
          let src = "bar.txt"
          orderOnly [src]
          writeFile' out =<< liftIO (readFile src)
          need [src]
  
      "baz.txt" %> \out -> do
          let src = "bar.txt"
          orderOnly [src]
          liftIO $ appendFile out "x"
  
      "primary.txt" %> \out -> do
          need ["source.txt"]
          orderOnly ["intermediate.txt"]
          writeFile' out =<< liftIO (readFile "intermediate.txt")
  
      "intermediate.txt" %> \out ->
          copyFile' "source.txt" out
  
  
  test build = do
      writeFile "bar.in" "in"
      build ["foo.txt","--sleep"]
      assertContents "foo.txt" "in"
      writeFile "bar.in" "out"
      build ["foo.txt","--sleep"]
      assertContents "foo.txt" "out"
  
      writeFile "baz.txt" ""
      writeFile "bar.in" "in"
      build ["baz.txt","--sleep"]
      assertContents "baz.txt" "x"
      writeFile "bar.in" "out"
      build ["baz.txt"]
      assertContents "baz.txt" "x"
  
      ignore $ removeFile "intermediate.txt"
      writeFile "source.txt" "x"
      build ["primary.txt","--sleep"]
      assertContents "intermediate.txt" "x"
      removeFile "intermediate.txt"
      build ["primary.txt","--sleep"]
      assertMissing "intermediate.txt"
      writeFile "source.txt" "y"
      build ["primary.txt","--sleep"]
      assertContents "intermediate.txt" "y"
  