content: module Main (main) where
  
  import Development.Shake
  import Hadrian.Expression
  import Hadrian.Utilities
  
  import qualified Base
  import qualified CommandLine
  import qualified Environment
  import qualified Rules
  import qualified Rules.Clean
  import qualified Rules.Documentation
  import qualified Rules.Nofib
  import qualified Rules.SourceDist
  import qualified Rules.Selftest
  import qualified Rules.Test
  import qualified UserSettings
  
  main :: IO ()
  main = do
      -- Provide access to command line arguments and some user settings through
      -- Shake's type-indexed map 'shakeExtra'.
      argsMap <- CommandLine.cmdLineArgsMap
      let extra = insertExtra UserSettings.buildProgressColour
                $ insertExtra UserSettings.successColour
                $ insertExtra (VerboseCommand UserSettings.verboseCommand) argsMap
  
          BuildRoot buildRoot = CommandLine.lookupBuildRoot argsMap
  
          rebuild = [ (RebuildLater, buildRoot -/- "stage0//*")
                    | CommandLine.lookupFreeze1 argsMap ]
  
          options :: ShakeOptions
          options = shakeOptions
              { shakeChange   = ChangeModtimeAndDigest
              , shakeFiles    = buildRoot -/- Base.shakeFilesDir
              , shakeProgress = progressSimple
              , shakeRebuild  = rebuild
              , shakeTimings  = True
              , shakeExtra    = extra }
  
          rules :: Rules ()
          rules = do
              Rules.buildRules
              Rules.Documentation.documentationRules
              Rules.Clean.cleanRules
              Rules.Nofib.nofibRules
              Rules.oracleRules
              Rules.Selftest.selftestRules
              Rules.SourceDist.sourceDistRules
              Rules.Test.testRules
              Rules.topLevelTargets
  
      shakeArgsWith options CommandLine.optDescrs $ \_ targets -> do
          Environment.setupEnvironment
          return . Just $ if null targets
                          then rules
                          else want targets >> withoutActions rules
  