[Git][ghc/ghc][master] 2 commits: Hadrian: withResponseFile outputs response file when verbodity is Verbose
Marge Bot pushed to branch master at Glasgow Haskell Compiler / GHC Commits: a4ff6315 by David Eichmann at 2026-04-30T04:54:51-04:00 Hadrian: withResponseFile outputs response file when verbodity is Verbose At the Verbose verbosity, shake will display full commandlines. With the use of response files, the full command is hidden. That makes it hard to run the command manually. This commit outputs the contents of the response file so that that full command can be recreated and also hints at the use of the --keep-response-files hadrian flag. - - - - - cd732ee3 by Duncan Coutts at 2026-04-30T04:54:51-04:00 Use response files for hadrian linking with ghc (support long command lines) In future support for windows dynamic linking, we expect long command lines for linking dll files with ghc. Experiments with dynamic linking the ghc-internal library yielded a link command well over 32kb. We did not encounter this before for static libs, since we already use ar's @file feature (if available, which it is for the llvm toolchain). Co-authored-by: David Eichmann <davide@well-typed.com> - - - - - 4 changed files: - hadrian/src/Builder.hs - hadrian/src/Hadrian/Builder.hs - hadrian/src/Hadrian/Utilities.hs - hadrian/src/Settings/Builders/Ghc.hs Changes: ===================================== hadrian/src/Builder.hs ===================================== @@ -345,11 +345,7 @@ instance H.Builder Builder where Haddock BuildPackage -> runHaddock path buildArgs buildInputs - Ghc FindHsDependencies _ -> do - -- Use a response file for ghc -M invocations, to - -- avoid issues with command line size limit on - -- Windows (#26637) - runGhcWithResponse path buildArgs buildInputs + Ghc _ _ -> runGhcWithResponse path buildArgs buildInputs buildOptions HsCpp -> captureStdout @@ -393,14 +389,19 @@ runHaddock haddockPath flagArgs fileInputs = withResponseFile $ \tmp -> do writeFile' tmp $ escapeArgs fileInputs cmd [haddockPath] flagArgs ('@' : tmp) -runGhcWithResponse :: FilePath -> [String] -> [FilePath] -> Action () -runGhcWithResponse ghcPath flagArgs fileInputs = withResponseFile $ \tmp -> do - writeFile' tmp $ escapeArgs fileInputs - -- We can't put the flags in a response file, because some flags - -- require empty arguments (such as the -dep-suffix flag), but - -- that isn't supported yet due to #26560. - cmd [ghcPath] flagArgs ('@' : tmp) - +-- | Use a response file for ghc invocations to avoid issues with command line +-- size limit on Windows (#26637). +runGhcWithResponse :: FilePath -- ^ Path to ghc + -> [String] -- ^ Arguments passed on the command line + -> [FilePath] -- ^ Input file paths (passed via response file) + -> [CmdOption] + -> Action () +runGhcWithResponse ghcPath buildArgs buildInputs buildOptions = withResponseFile $ \tmp -> do + -- We can't put the buildArgs in a response file, because some flags require + -- empty arguments (such as the -dep-suffix flag), but that isn't supported + -- yet due to #26560. + writeFile' tmp (escapeArgs buildInputs) + cmd [ghcPath] buildArgs ('@' : tmp) buildOptions -- TODO: Some builders are required only on certain platforms. For example, -- 'Objdump' is only required on OpenBSD and AIX. Add support for platform ===================================== hadrian/src/Hadrian/Builder.hs ===================================== @@ -29,7 +29,9 @@ import Hadrian.Utilities -- | This data structure captures all information relevant to invoking a builder. data BuildInfo = BuildInfo { - -- | Command line arguments. + -- | Command line arguments. Some builders (e.g. Ar, Ghc, Haddock) omit + -- buildInputs from buildArgs so that buildInputs can be passed separately + -- using a response file. buildArgs :: [String], -- | Input files. buildInputs :: [FilePath], ===================================== hadrian/src/Hadrian/Utilities.hs ===================================== @@ -334,13 +334,23 @@ keepResponseFiles = do withResponseFile :: (FilePath -> Action a) -> Action a withResponseFile action = do keep <- keepResponseFiles + let putVerboseResponseFile tmp = do + verbosity <- getVerbosity + when (verbosity >= Verbose) $ do + tmpContent <- liftIO (readFile tmp) + putVerbose (tmp <> " (use hadrian flag --keep-response-files to keep this file):\n" <> tmpContent) if keep then do (tmp, h) <- liftIO $ openTempFile "." "hadrian-rsp" liftIO $ hClose h putInfo $ "Keeping response file: " ++ tmp - action tmp - else withTempFile action + result <- action tmp + putVerboseResponseFile tmp + return result + else withTempFile $ \tmp -> do + result <- action tmp + putVerboseResponseFile tmp + return result -- | Link a file tracking the link target. Create the target directory if -- missing. ===================================== hadrian/src/Settings/Builders/Ghc.hs ===================================== @@ -62,7 +62,6 @@ compileAndLinkHs = (builder (Ghc CompileHs) ||^ builder (Ghc LinkHs)) ? do [ arg "-fwrite-ide-info" , arg "-hiedir", arg hie_path ] - , getInputs , arg "-o", arg =<< getOutput ] compileC :: Args @@ -78,7 +77,6 @@ compileC = builder (Ghc CompileCWithGhc) ? do , mconcat (map (map ("-optc" ++) <$>) ccArgs) , defaultGhcWarningsArgs , arg "-c" - , getInputs , arg "-o" , arg =<< getOutput ] @@ -95,7 +93,6 @@ compileCxx = builder (Ghc CompileCppWithGhc) ? do , mconcat (map (map ("-optcxx" ++) <$>) ccArgs) , defaultGhcWarningsArgs , arg "-c" - , getInputs , arg "-o" , arg =<< getOutput ] View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/ce97fd3ed13028034ba27c34a6decdb... -- View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/ce97fd3ed13028034ba27c34a6decdb... You're receiving this email because of your account on gitlab.haskell.org.
participants (1)
-
Marge Bot (@marge-bot)