{-# LANGUAGE LambdaCase #-} module Target ( Target, target, context, builder, inputs, outputs, trackArgument, module Builder ) where import Data.Char import Data.List.Extra import qualified Hadrian.Target as H import Hadrian.Target hiding (Target) import Builder import Context type Target = H.Target Context Builder -- | Some arguments do not affect build results and therefore do not need to be -- tracked by the build system. A notable example is "-jN" that controls Make's -- parallelism. Given a 'Target' and an argument, this function should return -- 'True' only if the argument needs to be tracked. trackArgument :: Target -> String -> Bool trackArgument target arg = case builder target of Make _ -> not $ threadArg arg Ghc _ _ -> not $ verbosityArg arg || diagnosticsColorArg arg Cabal _ _ -> not $ verbosityArg arg || cabal_configure_ignore arg _ -> True where match_str_num [] rs = all isDigit rs match_str_num (x:xs) (r:rs) = x == r && match_str_num xs rs match_str_num (_:_) [] = False threadArg s = match_str_num "-j" s || match_str_num "MAKEFLAGS=-j" s || match_str_num "THREADS=" s verbosityArg s = match_str_num "-v" s diagnosticsColorArg s = "-fdiagnostics-color=" `isPrefixOf` s -- N.B. #18672 cabal_configure_ignore = \case "--configure-option=--quiet" -> True "--configure-option=--disable-option-checking" -> True _ -> False