diff options
author | Zubin Duggal <zubin.duggal@gmail.com> | 2021-08-02 18:51:24 +0530 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2021-08-03 10:15:11 -0400 |
commit | 9807350afa3457eb0450117cc9a210d2f1570208 (patch) | |
tree | 3ee29c87cbfccadea8e92a9c25111eed00cc54e0 /utils/ghc-cabal | |
parent | bbee89ddfe4b5df14e76d70d92b40648bd5d88b1 (diff) | |
download | haskell-9807350afa3457eb0450117cc9a210d2f1570208.tar.gz |
Properly escape arguments in ghc-cabal
Diffstat (limited to 'utils/ghc-cabal')
-rw-r--r-- | utils/ghc-cabal/Main.hs | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/utils/ghc-cabal/Main.hs b/utils/ghc-cabal/Main.hs index 0c13554b32..a6414b4131 100644 --- a/utils/ghc-cabal/Main.hs +++ b/utils/ghc-cabal/Main.hs @@ -36,6 +36,7 @@ import Control.Monad import Control.Applicative ((<|>)) import Data.List (nub, intercalate, isPrefixOf, isSuffixOf) import Data.Maybe +import Data.Char (isSpace) import System.IO import System.Directory (setCurrentDirectory, getCurrentDirectory, doesFileExist) import System.Environment @@ -455,12 +456,12 @@ generate directory distdir config_args variablePrefix ++ "_DATA_FILES = " ++ unwords (dataFiles pd), -- XXX This includes things it shouldn't, like: -- -odir dist-bootstrapping/build - variablePrefix ++ "_HC_OPTS = " ++ escape (unwords + variablePrefix ++ "_HC_OPTS = " ++ escapeArgs ( programDefaultArgs ghcProg ++ hcOptions GHC bi ++ languageToFlags (compiler lbi) (defaultLanguage bi) ++ extensionsToFlags (compiler lbi) (usedExtensions bi) - ++ programOverrideArgs ghcProg)), + ++ programOverrideArgs ghcProg), variablePrefix ++ "_CC_OPTS = " ++ unwords (ccOptions bi), variablePrefix ++ "_CPP_OPTS = " ++ unwords (cppOptions bi), variablePrefix ++ "_LD_OPTS = " ++ unwords (ldOptions bi), @@ -482,7 +483,6 @@ generate directory distdir config_args if null (fromShortText $ description pd) then synopsis pd else description pd where - escape = foldr (\c xs -> if c == '#' then '\\':'#':xs else c:xs) [] wrap = mapM wrap1 wrap1 s | null s = die ["Wrapping empty value"] @@ -501,3 +501,17 @@ generate directory distdir config_args writeFileUtf8 f txt = withFile f WriteMode $ \hdl -> do hSetEncoding hdl utf8 hPutStr hdl txt + +-- | Like GHC.ResponseFile.escapeArgs but uses spaces instead of newlines to seperate arguments +escapeArgs :: [String] -> String +escapeArgs = unwords . map escapeArg + +escapeArg :: String -> String +escapeArg = foldr escape "" + +escape :: Char -> String -> String +escape c cs + | isSpace c || c `elem` ['\\','\'','#','"'] + = '\\':c:cs + | otherwise + = c:cs |