diff --git a/Cabal/Distribution/Simple/Utils.hs b/Cabal/Distribution/Simple/Utils.hs index 2f28f880c8dc351519f7d52bd764560df3a17aee..12fdaff6c2755590d4fb866a1afa0145208c139a 100644 --- a/Cabal/Distribution/Simple/Utils.hs +++ b/Cabal/Distribution/Simple/Utils.hs @@ -333,8 +333,8 @@ dieMsg verbosity msg = do -- | As 'dieMsg' but with pre-formatted text. -- -dieMsgNoWrap :: String -> NoCallStackIO () -dieMsgNoWrap msg = do +dieMsgNoWrap :: Verbosity -> String -> NoCallStackIO () +dieMsgNoWrap _verbosity msg = do hFlush stdout hPutStr stderr msg diff --git a/Cabal/Distribution/Utils/LogProgress.hs b/Cabal/Distribution/Utils/LogProgress.hs index 07aaa2e27380122160e40a349098c0a8faf739e9..12953aaac7b867f470d631266d52cc890d303e35 100644 --- a/Cabal/Distribution/Utils/LogProgress.hs +++ b/Cabal/Distribution/Utils/LogProgress.hs @@ -58,7 +58,7 @@ runLogProgress verbosity (LogProgress m) = go fail_fn :: Doc -> NoCallStackIO a fail_fn doc = do - dieMsgNoWrap (render doc ++ "\n") + dieMsgNoWrap verbosity (render doc ++ "\n") die "Configuration failed" -- | Output a warning trace message in 'LogProgress'. diff --git a/Cabal/Distribution/Verbosity.hs b/Cabal/Distribution/Verbosity.hs index aa9734a4482215005c2b2cc9f4d700646a7c5da0..03763cc1bac62f9256279308715dc32bd23a56fb 100644 --- a/Cabal/Distribution/Verbosity.hs +++ b/Cabal/Distribution/Verbosity.hs @@ -160,8 +160,21 @@ flagToVerbosity = ReadE $ \s -> showForCabal, showForGHC :: Verbosity -> String -showForCabal v = maybe (error "unknown verbosity") show $ - elemIndex v [silent,normal,verbose,deafening] +showForCabal v + | Set.null (vFlags v) + = maybe (error "unknown verbosity") show $ + elemIndex v [silent,normal,verbose,deafening] + | otherwise + = unwords $ (case vLevel v of + Silent -> "silent" + Normal -> "normal" + Verbose -> "verbose" + Deafening -> "debug") + : map showFlag (Set.toList (vFlags v)) + where + showFlag VCallSite = "+callsite" + showFlag VCallStack = "+callstack" + showFlag VNoWrap = "+nowrap" showForGHC v = maybe (error "unknown verbosity") show $ elemIndex v [silent,normal,__,verbose,deafening] where __ = silent -- this will be always ignored by elemIndex diff --git a/cabal-install/Distribution/Client/ProjectOrchestration.hs b/cabal-install/Distribution/Client/ProjectOrchestration.hs index 0b37a00adc2d0c20bd35497361c092690f7258d8..e3a892857976bc1e0e178fca694dfc7d0b0fa464 100644 --- a/cabal-install/Distribution/Client/ProjectOrchestration.hs +++ b/cabal-install/Distribution/Client/ProjectOrchestration.hs @@ -644,7 +644,7 @@ dieOnBuildFailures verbosity plan buildOutcomes [ do dieMsg verbosity $ '\n' : renderFailureDetail False pkg reason ++ "\nBuild log ( " ++ logfile ++ " ):" - readFile logfile >>= dieMsgNoWrap + readFile logfile >>= dieMsgNoWrap verbosity | verbosity >= normal , (pkg, ShowBuildSummaryAndLog reason logfile) <- failuresClassification diff --git a/cabal-install/Distribution/Client/Setup.hs b/cabal-install/Distribution/Client/Setup.hs index 4e136da9590778071fb502c79ce2af629f5be14f..bf868e5e9d0715d19a809e5fb42a7ca135edd685 100644 --- a/cabal-install/Distribution/Client/Setup.hs +++ b/cabal-install/Distribution/Client/Setup.hs @@ -113,7 +113,7 @@ import qualified Distribution.Compat.ReadP as Parse import Distribution.ParseUtils ( readPToMaybe ) import Distribution.Verbosity - ( Verbosity, lessVerbose, normal ) + ( Verbosity, lessVerbose, normal, verboseNoFlags ) import Distribution.Simple.Utils ( wrapText, wrapLine ) import Distribution.Client.GlobalFlags @@ -399,8 +399,12 @@ filterConfigureFlags flags cabalLibVersion configAllowNewer = Just (Cabal.AllowNewer Cabal.RelaxDepsNone) } - -- Cabal < 1.25.0 doesn't know about --dynlibdir. - flags_1_25_0 = flags_latest { configInstallDirs = configInstallDirs_1_25_0} + flags_1_25_0 = flags_latest { + -- Cabal < 1.25.0 doesn't know about --dynlibdir. + configInstallDirs = configInstallDirs_1_25_0, + -- Cabal < 1.25 doesn't have extended verbosity syntax + configVerbosity = fmap verboseNoFlags (configVerbosity flags_latest) + } configInstallDirs_1_25_0 = (configInstallDirs flags) { dynlibdir = NoFlag } -- Cabal < 1.23 doesn't know about '--profiling-detail'. diff --git a/cabal-install/Distribution/Client/SetupWrapper.hs b/cabal-install/Distribution/Client/SetupWrapper.hs index 69fe07d49320929fee827daf9d880d03933b84c9..44fa1407ea9d8d86db46cdc5f9c71e2afb1088c4 100644 --- a/cabal-install/Distribution/Client/SetupWrapper.hs +++ b/cabal-install/Distribution/Client/SetupWrapper.hs @@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-} +{-# LANGUAGE FlexibleContexts #-} ----------------------------------------------------------------------------- -- | -- Module : Distribution.Client.SetupWrapper @@ -85,7 +86,7 @@ import Distribution.Client.JobControl import Distribution.Simple.Setup ( Flag(..) ) import Distribution.Simple.Utils - ( die, debug, info, cabalVersion, tryFindPackageDesc, comparing + ( die, debug, info, infoNoWrap, cabalVersion, tryFindPackageDesc, comparing , createDirectoryIfMissingVerbose, installExecutableFile , copyFileVerbose, rewriteFile ) import Distribution.Client.Utils @@ -95,15 +96,17 @@ import Distribution.Client.Utils , canonicalizePathNoThrow #endif ) + +import Distribution.ReadE import Distribution.System ( Platform(..), buildPlatform ) import Distribution.Text ( display ) import Distribution.Utils.NubList ( toNubListR ) import Distribution.Verbosity - ( Verbosity, normal ) import Distribution.Compat.Exception ( catchIO ) +import Distribution.Compat.Stack import System.Directory ( doesFileExist ) import System.FilePath ( (</>), (<.>) ) @@ -335,7 +338,7 @@ getSetupMethod verbosity options pkg buildType' return (cabalVersion, SelfExecMethod, options) | otherwise = return (cabalVersion, InternalMethod, options) -runSetupMethod :: SetupMethod -> SetupRunner +runSetupMethod :: WithCallStack (SetupMethod -> SetupRunner) runSetupMethod InternalMethod = internalSetupMethod runSetupMethod (ExternalMethod path) = externalSetupMethod path runSetupMethod SelfExecMethod = selfExecSetupMethod @@ -344,11 +347,45 @@ runSetupMethod SelfExecMethod = selfExecSetupMethod runSetup :: Verbosity -> Setup -> [String] -- ^ command-line arguments -> IO () -runSetup verbosity setup args = +runSetup verbosity setup args0 = do let method = setupMethod setup options = setupScriptOptions setup bt = setupBuildType setup - in runSetupMethod method verbosity options bt args + args = verbosityHack (setupVersion setup) args0 + when (verbosity >= deafening {- avoid test if not debug -} && args /= args0) $ + infoNoWrap verbose $ + "Applied verbosity hack:\n" ++ + " Before: " ++ show args0 ++ "\n" ++ + " After: " ++ show args ++ "\n" + runSetupMethod method verbosity options bt args + +-- | This is a horrible hack to make sure passing fancy verbosity +-- flags (e.g., @-v'info +callstack'@) doesn't break horribly on +-- old Setup. We can't do it in 'filterConfigureFlags' because +-- verbosity applies to ALL commands. +verbosityHack :: Version -> [String] -> [String] +verbosityHack ver args0 + | ver >= mkVersion [1,25] = args0 + | otherwise = go args0 + where + go (('-':'v':rest) : args) + | Just rest' <- munch rest = ("-v" ++ rest') : go args + go (('-':'-':'v':'e':'r':'b':'o':'s':'e':'=':rest) : args) + | Just rest' <- munch rest = ("--verbose=" ++ rest') : go args + go ("--verbose" : rest : args) + | Just rest' <- munch rest = "--verbose" : rest' : go args + go rest@("--" : _) = rest + go (arg:args) = arg : go args + go [] = [] + + munch rest = + case runReadE flagToVerbosity rest of + Right v | verboseHasFlags v + -- We could preserve the prefix, but since we're assuming + -- it's Cabal's verbosity flag, we can assume that + -- any format is OK + -> Just (showForCabal (verboseNoFlags v)) + _ -> Nothing -- | Run a command through a configured 'Setup'. runSetupCommand :: Verbosity -> Setup @@ -459,7 +496,7 @@ selfExecSetupMethod verbosity options bt args0 = do -- * External SetupMethod -- ------------------------------------------------------------ -externalSetupMethod :: FilePath -> SetupRunner +externalSetupMethod :: WithCallStack (FilePath -> SetupRunner) externalSetupMethod path verbosity options _ args = do info verbosity $ unwords (path : args) case useLoggingHandle options of