diff options
| -rw-r--r-- | Setup.hs | 47 | 
1 files changed, 41 insertions, 6 deletions
| @@ -1,13 +1,48 @@  import Distribution.Simple +import Distribution.PackageDescription ( emptyHookedBuildInfo ) +import Control.Exception ( bracket_ )  import System.Process ( runCommand, waitForProcess ) -import System.Directory ( setCurrentDirectory ) +import System.FilePath ( (</>) ) +import System.Directory ( getCurrentDirectory, setCurrentDirectory, findExecutable, doesFileExist ) +import System.IO ( stderr ) +import System.Exit +import Data.Maybe ( fromJust ) -main = defaultMainWithHooks (simpleUserHooks {runTests = runTestSuite}) - -testDir = "tests" +main = defaultMainWithHooks (simpleUserHooks {runTests = runTestSuite, preConf = checkReferenceODT}) +-- | Run test suite.  runTestSuite _ _ _ _ = do -  setCurrentDirectory testDir -  runCommand "runhaskell RunTests.hs" >>= waitForProcess +  inDirectory "tests" $ runCommand "runhaskell RunTests.hs" >>= waitForProcess    return () +-- | If reference.odt does not exist, build it. +checkReferenceODT _ _ = do +  refODTexists <- doesFileExist ("odt-styles" </> "reference.odt") +  if refODTexists +     then return () +     else makeReferenceODT +  return emptyHookedBuildInfo + +-- | Create reference.odt by zipping up sources in odt-styles directory. +makeReferenceODT :: IO () +makeReferenceODT = do +  zipPathMaybe <- findExecutable "zip" +  if zipPathMaybe == Nothing +     then error $ "The 'zip' command, which is needed to build reference.odt\n" ++ +                  "from sources in the odt-styles directory, was not found.\n" ++ +                  "Try again after installing zip (http://www.info-zip.org/Zip.html).\n" ++ +                  "Or use the pandoc source tarball, which contains a prebuilt reference.odt." +     else do +       putStrLn "Creating reference.odt:" +       inDirectory "odt-styles" $ do +         ec <- runCommand "zip -9 -r reference.odt *" >>= waitForProcess +         case ec of +              ExitSuccess -> putStrLn "Done." +              _           -> error "Error creating ODT." + +-- | Perform an IO action in a directory. +inDirectory :: FilePath -> IO a -> IO a +inDirectory dir action = do +  oldDir <- getCurrentDirectory +  bracket_ (setCurrentDirectory dir) (setCurrentDirectory oldDir) action + | 
