diff --git a/Cabal-syntax/src/Distribution/PackageDescription/FieldGrammar.hs b/Cabal-syntax/src/Distribution/PackageDescription/FieldGrammar.hs index b7d3df00f76..84edf12eec6 100644 --- a/Cabal-syntax/src/Distribution/PackageDescription/FieldGrammar.hs +++ b/Cabal-syntax/src/Distribution/PackageDescription/FieldGrammar.hs @@ -85,6 +85,7 @@ import Distribution.Version (Version, VersionRange) import Data.Bifunctor import qualified Data.ByteString.Char8 as BS8 import Data.Coerce (coerce) +import Data.Text (Text) import qualified Data.Text as T import qualified Distribution.Compat.CharParsing as P import qualified Distribution.SPDX as SPDX @@ -629,24 +630,29 @@ buildInfoFieldGrammar = do -- as otherwise cabal new-build cannot really work. -- -- I.e. we don't want trigger unknown field warning - cppOptions <- monoidalFieldAla "cpp-options" (alaList' NoCommaFSep Token') L.cppOptions + cppOptions <- map T.pack <$> monoidalFieldAla "cpp-options" (alaList' NoCommaFSep Token') (L.cppOptions . fromTextsLens) asmOptions <- - monoidalFieldAla "asm-options" (alaList' NoCommaFSep Token') L.asmOptions - ^^^ availableSince CabalSpecV3_0 [] + map T.pack + <$> monoidalFieldAla "asm-options" (alaList' NoCommaFSep Token') (L.asmOptions . fromTextsLens) + ^^^ availableSince CabalSpecV3_0 [] cmmOptions <- - monoidalFieldAla "cmm-options" (alaList' NoCommaFSep Token') L.cmmOptions - ^^^ availableSince CabalSpecV3_0 [] - ccOptions <- monoidalFieldAla "cc-options" (alaList' NoCommaFSep Token') L.ccOptions + map T.pack + <$> monoidalFieldAla "cmm-options" (alaList' NoCommaFSep Token') (L.cmmOptions . fromTextsLens) + ^^^ availableSince CabalSpecV3_0 [] + ccOptions <- map T.pack <$> monoidalFieldAla "cc-options" (alaList' NoCommaFSep Token') (L.ccOptions . fromTextsLens) cxxOptions <- - monoidalFieldAla "cxx-options" (alaList' NoCommaFSep Token') L.cxxOptions - ^^^ availableSince CabalSpecV2_2 [] + map T.pack + <$> monoidalFieldAla "cxx-options" (alaList' NoCommaFSep Token') (L.cxxOptions . fromTextsLens) + ^^^ availableSince CabalSpecV2_2 [] jsppOptions <- - monoidalFieldAla "jspp-options" (alaList' NoCommaFSep Token') L.jsppOptions - ^^^ availableSince CabalSpecV3_16 [] - ldOptions <- monoidalFieldAla "ld-options" (alaList' NoCommaFSep Token') L.ldOptions + map T.pack + <$> monoidalFieldAla "jspp-options" (alaList' NoCommaFSep Token') (L.jsppOptions . fromTextsLens) + ^^^ availableSince CabalSpecV3_16 [] + ldOptions <- map T.pack <$> monoidalFieldAla "ld-options" (alaList' NoCommaFSep Token') (L.ldOptions . fromTextsLens) hsc2hsOptions <- - monoidalFieldAla "hsc2hs-options" (alaList' NoCommaFSep Token') L.hsc2hsOptions - ^^^ availableSince CabalSpecV3_6 [] + map T.pack + <$> monoidalFieldAla "hsc2hs-options" (alaList' NoCommaFSep Token') (L.hsc2hsOptions . fromTextsLens) + ^^^ availableSince CabalSpecV3_6 [] pkgconfigDepends <- monoidalFieldAla "pkgconfig-depends" (alaList CommaFSep) L.pkgconfigDepends frameworks <- monoidalFieldAla "frameworks" (alaList' FSep RelativePathNT) L.frameworks extraFrameworkDirs <- monoidalFieldAla "extra-framework-dirs" (alaList' FSep SymbolicPathNT) L.extraFrameworkDirs @@ -689,16 +695,18 @@ buildInfoFieldGrammar = do ^^^ removedIn CabalSpecV3_0 "Please use 'default-extensions' or 'other-extensions' fields." - extraLibs <- monoidalFieldAla "extra-libraries" (alaList' VCat Token) L.extraLibs + extraLibs <- map T.pack <$> monoidalFieldAla "extra-libraries" (alaList' VCat Token) (L.extraLibs . fromTextsLens) extraLibsStatic <- - monoidalFieldAla "extra-libraries-static" (alaList' VCat Token) L.extraLibsStatic - ^^^ availableSince CabalSpecV3_8 [] - extraGHCiLibs <- monoidalFieldAla "extra-ghci-libraries" (alaList' VCat Token) L.extraGHCiLibs - extraBundledLibs <- monoidalFieldAla "extra-bundled-libraries" (alaList' VCat Token) L.extraBundledLibs - extraLibFlavours <- monoidalFieldAla "extra-library-flavours" (alaList' VCat Token) L.extraLibFlavours + map T.pack + <$> monoidalFieldAla "extra-libraries-static" (alaList' VCat Token) (L.extraLibsStatic . fromTextsLens) + ^^^ availableSince CabalSpecV3_8 [] + extraGHCiLibs <- map T.pack <$> monoidalFieldAla "extra-ghci-libraries" (alaList' VCat Token) (L.extraGHCiLibs . fromTextsLens) + extraBundledLibs <- map T.pack <$> monoidalFieldAla "extra-bundled-libraries" (alaList' VCat Token) (L.extraBundledLibs . fromTextsLens) + extraLibFlavours <- map T.pack <$> monoidalFieldAla "extra-library-flavours" (alaList' VCat Token) (L.extraLibFlavours . fromTextsLens) extraDynLibFlavours <- - monoidalFieldAla "extra-dynamic-library-flavours" (alaList' VCat Token) L.extraDynLibFlavours - ^^^ availableSince CabalSpecV3_0 [] + map T.pack + <$> monoidalFieldAla "extra-dynamic-library-flavours" (alaList' VCat Token) (L.extraDynLibFlavours . fromTextsLens) + ^^^ availableSince CabalSpecV3_0 [] extraLibDirs <- monoidalFieldAla "extra-lib-dirs" (alaList' FSep SymbolicPathNT) L.extraLibDirs extraLibDirsStatic <- monoidalFieldAla "extra-lib-dirs-static" (alaList' FSep SymbolicPathNT) L.extraLibDirsStatic @@ -714,7 +722,7 @@ buildInfoFieldGrammar = do sharedOptions <- sharedOptionsFieldGrammar profSharedOptions <- profSharedOptionsFieldGrammar let staticOptions = mempty - customFieldsBI <- map (bimap T.unpack T.unpack) <$> prefixedFields "x-" L.customFieldsBIText + customFieldsBI <- prefixedFields "x-" L.customFieldsBI targetBuildDepends <- monoidalFieldAla "build-depends" formatDependencyList L.targetBuildDepends mixins <- monoidalFieldAla "mixins" formatMixinList L.mixins @@ -742,9 +750,9 @@ hsSourceDirsGrammar = optionsFieldGrammar :: (FieldGrammar c g, c (List NoCommaFSep Token' String)) - => g BuildInfo (PerCompilerFlavor [String]) + => g BuildInfo (PerCompilerFlavor [Text]) optionsFieldGrammar = - PerCompilerFlavor + perCompilerFlavorFromStrings <$> monoidalFieldAla "ghc-options" (alaList' NoCommaFSep Token') (extract GHC) <*> monoidalFieldAla "ghcjs-options" (alaList' NoCommaFSep Token') (extract GHCJS) -- NOTE: Hugs, NHC and JHC are not supported anymore, but these @@ -757,42 +765,45 @@ optionsFieldGrammar = <* knownField "mhs-options" where extract :: CompilerFlavor -> ALens' BuildInfo [String] - extract flavor = L.options . lookupLens flavor + extract flavor = L.options . lookupLens flavor . fromTextsLens profOptionsFieldGrammar :: (FieldGrammar c g, c (List NoCommaFSep Token' String)) - => g BuildInfo (PerCompilerFlavor [String]) + => g BuildInfo (PerCompilerFlavor [Text]) profOptionsFieldGrammar = - PerCompilerFlavor + perCompilerFlavorFromStrings <$> monoidalFieldAla "ghc-prof-options" (alaList' NoCommaFSep Token') (extract GHC) <*> monoidalFieldAla "ghcjs-prof-options" (alaList' NoCommaFSep Token') (extract GHCJS) where extract :: CompilerFlavor -> ALens' BuildInfo [String] - extract flavor = L.profOptions . lookupLens flavor + extract flavor = L.profOptions . lookupLens flavor . fromTextsLens sharedOptionsFieldGrammar :: (FieldGrammar c g, c (List NoCommaFSep Token' String)) - => g BuildInfo (PerCompilerFlavor [String]) + => g BuildInfo (PerCompilerFlavor [Text]) sharedOptionsFieldGrammar = - PerCompilerFlavor + perCompilerFlavorFromStrings <$> monoidalFieldAla "ghc-shared-options" (alaList' NoCommaFSep Token') (extract GHC) <*> monoidalFieldAla "ghcjs-shared-options" (alaList' NoCommaFSep Token') (extract GHCJS) where extract :: CompilerFlavor -> ALens' BuildInfo [String] - extract flavor = L.sharedOptions . lookupLens flavor + extract flavor = L.sharedOptions . lookupLens flavor . fromTextsLens profSharedOptionsFieldGrammar :: (FieldGrammar c g, c (List NoCommaFSep Token' String)) - => g BuildInfo (PerCompilerFlavor [String]) + => g BuildInfo (PerCompilerFlavor [Text]) profSharedOptionsFieldGrammar = - PerCompilerFlavor + perCompilerFlavorFromStrings <$> monoidalFieldAla "ghc-prof-shared-options" (alaList' NoCommaFSep Token') (extract GHC) ^^^ availableSince CabalSpecV3_14 [] <*> monoidalFieldAla "ghcjs-prof-shared-options" (alaList' NoCommaFSep Token') (extract GHCJS) ^^^ availableSince CabalSpecV3_14 [] where extract :: CompilerFlavor -> ALens' BuildInfo [String] - extract flavor = L.profSharedOptions . lookupLens flavor + extract flavor = L.profSharedOptions . lookupLens flavor . fromTextsLens + +perCompilerFlavorFromStrings :: [String] -> [String] -> PerCompilerFlavor [Text] +perCompilerFlavorFromStrings xs ys = PerCompilerFlavor (map T.pack xs) (map T.pack ys) lookupLens :: (Functor f, Monoid v) => CompilerFlavor -> LensLike' f (PerCompilerFlavor v) v lookupLens k f p@(PerCompilerFlavor ghc ghcjs) @@ -959,3 +970,7 @@ _syntaxExtensions = | e <- [minBound .. maxBound] , e `notElem` [Safe, Unsafe, Trustworthy] ] + +fromTextsLens :: Lens' [Text] [String] +fromTextsLens f = fmap (map T.pack) . f . map T.unpack +{-# INLINE fromTextsLens #-} diff --git a/Cabal-syntax/src/Distribution/Types/BuildInfo.hs b/Cabal-syntax/src/Distribution/Types/BuildInfo.hs index 6e94a3f26db..99f030d8e14 100644 --- a/Cabal-syntax/src/Distribution/Types/BuildInfo.hs +++ b/Cabal-syntax/src/Distribution/Types/BuildInfo.hs @@ -14,6 +14,7 @@ module Distribution.Types.BuildInfo , hcStaticOptions ) where +import Data.Text (Text) import Distribution.Compat.Prelude import Prelude () @@ -50,21 +51,21 @@ data BuildInfo = BuildInfo -- Unless use are very sure what you are doing, use the functions in -- "Distribution.Simple.BuildToolDepends" rather than accessing this -- field directly. - , cppOptions :: [String] + , cppOptions :: [Text] -- ^ options for pre-processing Haskell code - , asmOptions :: [String] + , asmOptions :: [Text] -- ^ options for assembler - , cmmOptions :: [String] + , cmmOptions :: [Text] -- ^ options for C-- compiler - , ccOptions :: [String] + , ccOptions :: [Text] -- ^ options for C compiler - , cxxOptions :: [String] + , cxxOptions :: [Text] -- ^ options for C++ compiler - , jsppOptions :: [String] + , jsppOptions :: [Text] -- ^ options for pre-processing JavaScript code @since 3.16.0.0 - , ldOptions :: [String] + , ldOptions :: [Text] -- ^ options for linker - , hsc2hsOptions :: [String] + , hsc2hsOptions :: [Text] -- ^ options for hsc2hs , pkgconfigDepends :: [PkgconfigDependency] -- ^ pkg-config packages that are used @@ -99,13 +100,13 @@ data BuildInfo = BuildInfo -- ^ other language extensions used within the package , oldExtensions :: [Extension] -- ^ the old extensions field, treated same as 'defaultExtensions' - , extraLibs :: [String] + , extraLibs :: [Text] -- ^ what libraries to link with when compiling a program that uses your package - , extraLibsStatic :: [String] + , extraLibsStatic :: [Text] -- ^ what libraries to link with when compiling a program fully statically that uses your package - , extraGHCiLibs :: [String] + , extraGHCiLibs :: [Text] -- ^ if present, overrides extraLibs when package is loaded with GHCi. - , extraBundledLibs :: [String] + , extraBundledLibs :: [Text] -- ^ if present, adds libs to hs-libraries, which become part of the package. -- Example 1: the Cffi library shipping with the rts, alongside the HSrts-1.0.a,.o,... -- Example 2: a library that is being built by a foreign tool (e.g. rust) @@ -113,12 +114,12 @@ data BuildInfo = BuildInfo -- logic on how this library is built will have to be encoded in a -- custom Setup for now. Otherwise cabal would need to learn how to -- call arbitrary library builders. - , extraLibFlavours :: [String] + , extraLibFlavours :: [Text] -- ^ Hidden Flag. This set of strings, will be appended to all libraries when -- copying. E.g. [libHS_ | flavour <- extraLibFlavours]. This -- should only be needed in very specific cases, e.g. the `rts` package, where -- there are multiple copies of slightly differently built libs. - , extraDynLibFlavours :: [String] + , extraDynLibFlavours :: [Text] -- ^ Hidden Flag. This set of strings will be appended to all /dynamic/ -- libraries when copying. This is particularly useful with the `rts` package, -- where we want different dynamic flavours of the RTS library to be installed. @@ -132,12 +133,12 @@ data BuildInfo = BuildInfo -- ^ The .h files to be generated (e.g. by @autoconf@) , installIncludes :: [RelativePath Include File] -- ^ .h files to install with the package - , options :: PerCompilerFlavor [String] - , profOptions :: PerCompilerFlavor [String] - , sharedOptions :: PerCompilerFlavor [String] - , profSharedOptions :: PerCompilerFlavor [String] - , staticOptions :: PerCompilerFlavor [String] - , customFieldsBI :: [(String, String)] + , options :: PerCompilerFlavor [Text] + , profOptions :: PerCompilerFlavor [Text] + , sharedOptions :: PerCompilerFlavor [Text] + , profSharedOptions :: PerCompilerFlavor [Text] + , staticOptions :: PerCompilerFlavor [Text] + , customFieldsBI :: [(Text, Text)] -- ^ Custom fields starting -- with x-, stored in a -- simple assoc-list. @@ -292,26 +293,26 @@ usesTemplateHaskellOrQQ bi = any p (allExtensions bi) `elem` [EnableExtension TemplateHaskell, EnableExtension QuasiQuotes] -- | Select options for a particular Haskell compiler. -hcOptions :: CompilerFlavor -> BuildInfo -> [String] +hcOptions :: CompilerFlavor -> BuildInfo -> [Text] hcOptions = lookupHcOptions options -hcProfOptions :: CompilerFlavor -> BuildInfo -> [String] +hcProfOptions :: CompilerFlavor -> BuildInfo -> [Text] hcProfOptions = lookupHcOptions profOptions -hcSharedOptions :: CompilerFlavor -> BuildInfo -> [String] +hcSharedOptions :: CompilerFlavor -> BuildInfo -> [Text] hcSharedOptions = lookupHcOptions sharedOptions -hcProfSharedOptions :: CompilerFlavor -> BuildInfo -> [String] +hcProfSharedOptions :: CompilerFlavor -> BuildInfo -> [Text] hcProfSharedOptions = lookupHcOptions profSharedOptions -hcStaticOptions :: CompilerFlavor -> BuildInfo -> [String] +hcStaticOptions :: CompilerFlavor -> BuildInfo -> [Text] hcStaticOptions = lookupHcOptions staticOptions lookupHcOptions - :: (BuildInfo -> PerCompilerFlavor [String]) + :: (BuildInfo -> PerCompilerFlavor [Text]) -> CompilerFlavor -> BuildInfo - -> [String] + -> [Text] lookupHcOptions f hc bi = case f bi of PerCompilerFlavor ghc ghcjs | hc == GHC -> ghc diff --git a/Cabal-syntax/src/Distribution/Types/BuildInfo/Lens.hs b/Cabal-syntax/src/Distribution/Types/BuildInfo/Lens.hs index 73f52e78040..72cfebb865d 100644 --- a/Cabal-syntax/src/Distribution/Types/BuildInfo/Lens.hs +++ b/Cabal-syntax/src/Distribution/Types/BuildInfo/Lens.hs @@ -3,11 +3,10 @@ module Distribution.Types.BuildInfo.Lens ( BuildInfo , HasBuildInfo (..) - , customFieldsBIText , HasBuildInfos (..) ) where -import Data.Bifunctor +import Data.Text (Text) import Distribution.Compat.Lens import Distribution.Compat.Prelude import Prelude () @@ -23,7 +22,6 @@ import Distribution.Types.PkgconfigDependency (PkgconfigDependency) import Distribution.Utils.Path import Language.Haskell.Extension (Extension, Language) -import qualified Data.Text as T import qualified Distribution.Types.BuildInfo as T -- | Classy lenses for 'BuildInfo'. @@ -42,35 +40,35 @@ class HasBuildInfo a where buildToolDepends = buildInfo . buildToolDepends {-# INLINE buildToolDepends #-} - cppOptions :: Lens' a [String] + cppOptions :: Lens' a [Text] cppOptions = buildInfo . cppOptions {-# INLINE cppOptions #-} - asmOptions :: Lens' a [String] + asmOptions :: Lens' a [Text] asmOptions = buildInfo . asmOptions {-# INLINE asmOptions #-} - cmmOptions :: Lens' a [String] + cmmOptions :: Lens' a [Text] cmmOptions = buildInfo . cmmOptions {-# INLINE cmmOptions #-} - ccOptions :: Lens' a [String] + ccOptions :: Lens' a [Text] ccOptions = buildInfo . ccOptions {-# INLINE ccOptions #-} - cxxOptions :: Lens' a [String] + cxxOptions :: Lens' a [Text] cxxOptions = buildInfo . cxxOptions {-# INLINE cxxOptions #-} - jsppOptions :: Lens' a [String] + jsppOptions :: Lens' a [Text] jsppOptions = buildInfo . jsppOptions {-# INLINE jsppOptions #-} - ldOptions :: Lens' a [String] + ldOptions :: Lens' a [Text] ldOptions = buildInfo . ldOptions {-# INLINE ldOptions #-} - hsc2hsOptions :: Lens' a [String] + hsc2hsOptions :: Lens' a [Text] hsc2hsOptions = buildInfo . hsc2hsOptions {-# INLINE hsc2hsOptions #-} @@ -142,27 +140,27 @@ class HasBuildInfo a where oldExtensions = buildInfo . oldExtensions {-# INLINE oldExtensions #-} - extraLibs :: Lens' a [String] + extraLibs :: Lens' a [Text] extraLibs = buildInfo . extraLibs {-# INLINE extraLibs #-} - extraLibsStatic :: Lens' a [String] + extraLibsStatic :: Lens' a [Text] extraLibsStatic = buildInfo . extraLibsStatic {-# INLINE extraLibsStatic #-} - extraGHCiLibs :: Lens' a [String] + extraGHCiLibs :: Lens' a [Text] extraGHCiLibs = buildInfo . extraGHCiLibs {-# INLINE extraGHCiLibs #-} - extraBundledLibs :: Lens' a [String] + extraBundledLibs :: Lens' a [Text] extraBundledLibs = buildInfo . extraBundledLibs {-# INLINE extraBundledLibs #-} - extraLibFlavours :: Lens' a [String] + extraLibFlavours :: Lens' a [Text] extraLibFlavours = buildInfo . extraLibFlavours {-# INLINE extraLibFlavours #-} - extraDynLibFlavours :: Lens' a [String] + extraDynLibFlavours :: Lens' a [Text] extraDynLibFlavours = buildInfo . extraDynLibFlavours {-# INLINE extraDynLibFlavours #-} @@ -190,27 +188,27 @@ class HasBuildInfo a where installIncludes = buildInfo . installIncludes {-# INLINE installIncludes #-} - options :: Lens' a (PerCompilerFlavor [String]) + options :: Lens' a (PerCompilerFlavor [Text]) options = buildInfo . options {-# INLINE options #-} - profOptions :: Lens' a (PerCompilerFlavor [String]) + profOptions :: Lens' a (PerCompilerFlavor [Text]) profOptions = buildInfo . profOptions {-# INLINE profOptions #-} - sharedOptions :: Lens' a (PerCompilerFlavor [String]) + sharedOptions :: Lens' a (PerCompilerFlavor [Text]) sharedOptions = buildInfo . sharedOptions {-# INLINE sharedOptions #-} - profSharedOptions :: Lens' a (PerCompilerFlavor [String]) + profSharedOptions :: Lens' a (PerCompilerFlavor [Text]) profSharedOptions = buildInfo . profSharedOptions {-# INLINE profSharedOptions #-} - staticOptions :: Lens' a (PerCompilerFlavor [String]) + staticOptions :: Lens' a (PerCompilerFlavor [Text]) staticOptions = buildInfo . staticOptions {-# INLINE staticOptions #-} - customFieldsBI :: Lens' a [(String, String)] + customFieldsBI :: Lens' a [(Text, Text)] customFieldsBI = buildInfo . customFieldsBI {-# INLINE customFieldsBI #-} @@ -222,13 +220,6 @@ class HasBuildInfo a where mixins = buildInfo . mixins {-# INLINE mixins #-} -customFieldsBIText :: HasBuildInfo a => Lens' a [(T.Text, T.Text)] -customFieldsBIText = customFieldsBI . textLens - where - textLens :: Lens' [(String, String)] [(T.Text, T.Text)] - textLens f = fmap (map (bimap T.unpack T.unpack)) . f . map (bimap T.pack T.pack) -{-# INLINE customFieldsBIText #-} - instance HasBuildInfo BuildInfo where buildInfo = id {-# INLINE buildInfo #-} diff --git a/Cabal-tests/Cabal-tests.cabal b/Cabal-tests/Cabal-tests.cabal index 4f44b33459e..a608a63f041 100644 --- a/Cabal-tests/Cabal-tests.cabal +++ b/Cabal-tests/Cabal-tests.cabal @@ -132,6 +132,7 @@ test-suite custom-setup-tests , directory , filepath , process + , text default-language: GHC2021 diff --git a/Cabal-tests/tests/UnitTests/Distribution/Utils/Structured.hs b/Cabal-tests/tests/UnitTests/Distribution/Utils/Structured.hs index fb3b3454ee3..046eecfdda6 100644 --- a/Cabal-tests/tests/UnitTests/Distribution/Utils/Structured.hs +++ b/Cabal-tests/tests/UnitTests/Distribution/Utils/Structured.hs @@ -33,8 +33,8 @@ md5Check proxy md5Int = structureHash proxy @?= md5FromInteger md5Int md5CheckGenericPackageDescription :: Proxy GenericPackageDescription -> Assertion md5CheckGenericPackageDescription proxy = md5Check proxy - 0x2ab5eeae7337cba494221e344aaaaafc + 0xa8370956f6dd760de75421a92d1e577e md5CheckLocalBuildInfo :: Proxy LocalBuildInfo -> Assertion md5CheckLocalBuildInfo proxy = md5Check proxy - 0x3398bd7f316ecb8f535cbe78498a89a4 + 0x9746a50112ce9f1168f862767d831ac0 diff --git a/Cabal-tests/tests/custom-setup/CabalDoctestSetup.hs b/Cabal-tests/tests/custom-setup/CabalDoctestSetup.hs index 15e583e5101..909a7b86025 100644 --- a/Cabal-tests/tests/custom-setup/CabalDoctestSetup.hs +++ b/Cabal-tests/tests/custom-setup/CabalDoctestSetup.hs @@ -120,6 +120,7 @@ import Distribution.Verbosity import qualified Data.Foldable as F (for_) +import qualified Data.Text as Text import qualified Data.Traversable as T (traverse) @@ -366,15 +367,15 @@ generateBuildModule testSuiteName flags pkg lbi = do let testBI = testBuildInfo suite -- TODO: `words` is not proper parser (no support for quotes) - let additionalFlags = maybe [] words + let additionalFlags = maybe [] (words . Text.unpack) $ lookup "x-doctest-options" $ customFieldsBI testBI - let additionalModules = maybe [] words + let additionalModules = maybe [] (words . Text.unpack) $ lookup "x-doctest-modules" $ customFieldsBI testBI - let additionalDirs' = maybe [] words + let additionalDirs' = maybe [] (words . Text.unpack) $ lookup "x-doctest-source-dirs" $ customFieldsBI testBI @@ -418,7 +419,7 @@ generateBuildModule testSuiteName flags pkg lbi = do -- CPP includes, i.e. include cabal_macros.h let cppFlags = map ("-optP"++) $ [ "-include", compAutogenDir ++ "/cabal_macros.h" ] - ++ cppOptions compBI + ++ map Text.unpack (cppOptions compBI) -- Unlike other modules, the main-is module of an executable is not -- guaranteed to share a module name with its filepath name. That is, @@ -476,7 +477,7 @@ generateBuildModule testSuiteName flags pkg lbi = do -- write enabled components, i.e. x-doctest-components -- if none enabled, pick library - let enabledComponents = maybe [NameLib Nothing] (mapMaybe parseComponentName . words) + let enabledComponents = maybe [NameLib Nothing] (mapMaybe parseComponentName . words . Text.unpack) $ lookup "x-doctest-components" $ customFieldsBI testBI diff --git a/Cabal-tests/tests/custom-setup/IdrisSetup.hs b/Cabal-tests/tests/custom-setup/IdrisSetup.hs index 20ba0e0a6e5..330265b4fde 100644 --- a/Cabal-tests/tests/custom-setup/IdrisSetup.hs +++ b/Cabal-tests/tests/custom-setup/IdrisSetup.hs @@ -49,6 +49,7 @@ import Control.Monad import Data.IORef import Control.Exception (SomeException, catch) import Data.String (fromString) +import qualified Data.Text as T import Distribution.Simple import Distribution.Simple.BuildPaths @@ -313,14 +314,14 @@ idrisPostSDist args flags desc lbi = do getVersion :: Args -> S.BuildFlags -> IO HookedBuildInfo getVersion args flags = do hash <- gitHash - let buildinfo = (emptyBuildInfo { cppOptions = ["-DVERSION="++hash] }) :: BuildInfo + let buildinfo = (emptyBuildInfo { cppOptions = [T.pack $ "-DVERSION=" ++ hash] }) :: BuildInfo return (Just buildinfo, []) idrisPreBuild args flags = do #ifdef mingw32_HOST_OS createDirectoryIfMissingVerbose verbosity True dir windres verbosity ["icons/idris_icon.rc","-o", dir++"/idris_icon.o"] - return (Nothing, [(fromString "idris", emptyBuildInfo { ldOptions = [dir ++ "/idris_icon.o"] })]) + return (Nothing, [(fromString "idris", emptyBuildInfo { ldOptions = [T.pack $ dir ++ "/idris_icon.o"] })]) where verbosity = mkVerbosity $ S.buildVerbosity flags diff --git a/Cabal/Cabal.cabal b/Cabal/Cabal.cabal index a2873501231..7b0fbc41139 100644 --- a/Cabal/Cabal.cabal +++ b/Cabal/Cabal.cabal @@ -51,6 +51,7 @@ library , filepath >= 1.4.2 && < 1.6 , pretty >= 1.1.1 && < 1.2 , process >= 1.6.29.0 && < 1.7 + , text >= 2.0.2 && < 2.2 , time >= 1.4.0.1 && < 1.17 if os(windows) diff --git a/Cabal/src/Distribution/PackageDescription/Check/Target.hs b/Cabal/src/Distribution/PackageDescription/Check/Target.hs index 5e05b6fb5c6..029d9e1def5 100644 --- a/Cabal/src/Distribution/PackageDescription/Check/Target.hs +++ b/Cabal/src/Distribution/PackageDescription/Check/Target.hs @@ -42,7 +42,8 @@ import Language.Haskell.Extension import System.FilePath (takeExtension) import Control.Monad - +import Data.Bifunctor +import qualified Data.Text as T import qualified Distribution.Types.BuildInfo.Lens as L checkLibrary @@ -359,7 +360,7 @@ checkBuildInfo cet ams ads bi = do (checkPVPs (checkDependencyVersionRange hasGTLowerBound) gtlck ds) -- Custom fields well-formedness (ASCII). - mapM_ checkCustomField (customFieldsBI bi) + mapM_ (checkCustomField . bimap T.unpack T.unpack) (customFieldsBI bi) -- Content. mapM_ (checkLocalPathExist "extra-lib-dirs" . getSymbolicPath) (extraLibDirs bi) @@ -469,7 +470,7 @@ checkBuildInfoPathsWellFormedness bi = do mapM_ (checkPath True "extra-lib-dirs-static" PathKindDirectory . getSymbolicPath) (extraLibDirsStatic bi) - mapM_ checkOptionPath (perCompilerFlavorToList $ options bi) + mapM_ (checkOptionPath . fmap (map T.unpack)) (perCompilerFlavorToList $ options bi) where checkOptionPath :: Monad m @@ -519,14 +520,14 @@ checkBuildInfoFeatures bi sv = do -- asm-sources, cmm-sources and friends only w/ spec ≥ 1.10 checkCVSources (map getSymbolicPath $ asmSources bi) checkCVSources (map getSymbolicPath $ cmmSources bi) - checkCVSources (extraBundledLibs bi) - checkCVSources (extraLibFlavours bi) + checkCVSources (map T.unpack $ extraBundledLibs bi) + checkCVSources (map T.unpack $ extraLibFlavours bi) -- extra-dynamic-library-flavours requires ≥ 3.0 checkSpecVer CabalSpecV3_0 (not . null $ extraDynLibFlavours bi) - (PackageDistInexcusable $ CVExtraDynamic [extraDynLibFlavours bi]) + (PackageDistInexcusable $ CVExtraDynamic [map T.unpack (extraDynLibFlavours bi)]) -- virtual-modules requires ≥ 2.2 checkSpecVer CabalSpecV2_2 (not . null $ virtualModules bi) (PackageDistInexcusable CVVirtualModules) -- Check use of thinning and renaming. @@ -792,14 +793,14 @@ cet2bit CETSetup = BITOther -- General check on all options (ghc, C, C++, …) for common inaccuracies. checkBuildInfoOptions :: Monad m => BITarget -> BuildInfo -> CheckM m () checkBuildInfoOptions t bi = do - checkGHCOptions "ghc-options" t (hcOptions GHC bi) - checkGHCOptions "ghc-prof-options" t (hcProfOptions GHC bi) - checkGHCOptions "ghc-shared-options" t (hcSharedOptions GHC bi) + checkGHCOptions "ghc-options" t (map T.unpack (hcOptions GHC bi)) + checkGHCOptions "ghc-prof-options" t (map T.unpack (hcProfOptions GHC bi)) + checkGHCOptions "ghc-shared-options" t (map T.unpack (hcSharedOptions GHC bi)) let ldOpts = ldOptions bi - checkCLikeOptions LangC "cc-options" (ccOptions bi) ldOpts - checkCLikeOptions LangCPlusPlus "cxx-options" (cxxOptions bi) ldOpts - checkCPPOptions (cppOptions bi) - checkJSPOptions (jsppOptions bi) + checkCLikeOptions LangC "cc-options" (map T.unpack (ccOptions bi)) (map T.unpack ldOpts) + checkCLikeOptions LangCPlusPlus "cxx-options" (map T.unpack (cxxOptions bi)) (map T.unpack ldOpts) + checkCPPOptions (map T.unpack (cppOptions bi)) + checkJSPOptions (map T.unpack (jsppOptions bi)) -- | Checks GHC options for commonly misused or non-portable flags. checkGHCOptions diff --git a/Cabal/src/Distribution/Simple/Configure.hs b/Cabal/src/Distribution/Simple/Configure.hs index e451c93f700..78b13d60918 100644 --- a/Cabal/src/Distribution/Simple/Configure.hs +++ b/Cabal/src/Distribution/Simple/Configure.hs @@ -146,6 +146,7 @@ import Data.List ) import qualified Data.List.NonEmpty as NEL import qualified Data.Map as Map +import qualified Data.Text as Text import Distribution.Compat.Environment (lookupEnv) import Distribution.Parsec ( simpleParsec @@ -2652,12 +2653,12 @@ ccLdOptionsBuildInfo cflags ldflags ldflags_static = extraLibDirsStatic' = filter ("-L" `isPrefixOf`) ldflags_static in mempty { includeDirs = map (makeSymbolicPath . drop 2) includeDirs' - , extraLibs = map (drop 2) extraLibs' + , extraLibs = map (Text.pack . drop 2) extraLibs' , extraLibDirs = map (makeSymbolicPath . drop 2) extraLibDirs' - , extraLibsStatic = map (drop 2) extraLibsStatic' + , extraLibsStatic = map (Text.pack . drop 2) extraLibsStatic' , extraLibDirsStatic = map (makeSymbolicPath . drop 2) extraLibDirsStatic' - , ccOptions = cflags' - , ldOptions = ldflags'' + , ccOptions = map Text.pack cflags' + , ldOptions = map Text.pack ldflags'' } -- ----------------------------------------------------------------------------- @@ -2745,12 +2746,12 @@ checkForeignDeps :: PackageDescription -> LocalBuildInfo -> Verbosity -> IO () checkForeignDeps pkg lbi verbosity = ifBuildsWith allHeaders - (commonCcArgs ++ makeLdArgs allLibs) -- I'm feeling lucky + (commonCcArgs ++ makeLdArgs (map Text.unpack allLibs)) -- I'm feeling lucky (return ()) ( do missingLibs <- findMissingLibs missingHdr <- findOffendingHdr - explainErrors missingHdr missingLibs + explainErrors missingHdr (map Text.unpack missingLibs) ) where allHeaders = collectField (fmap getSymbolicPath . includes) @@ -2818,9 +2819,9 @@ checkForeignDeps pkg lbi verbosity = findMissingLibs = ifBuildsWith [] - (makeLdArgs allLibs) + (makeLdArgs $ map Text.unpack allLibs) (return []) - (filterM (fmap not . libExists) allLibs) + (filterM (fmap not . libExists . Text.unpack) allLibs) libExists lib = builds (makeProgram []) (makeLdArgs [lib]) @@ -2852,8 +2853,8 @@ checkForeignDeps pkg lbi verbosity = , isAbsolute dir ] ++ ["-I" ++ baseDir] - ++ collectField cppOptions - ++ collectField ccOptions + ++ map Text.unpack (collectField cppOptions) + ++ map Text.unpack (collectField ccOptions) ++ [ "-I" ++ dir | dir <- ordNub @@ -2871,7 +2872,7 @@ checkForeignDeps pkg lbi verbosity = commonCcArgs = commonCppArgs - ++ collectField ccOptions + ++ map Text.unpack (collectField ccOptions) ++ [ opt | dep <- deps , opt <- IPI.ccOptions dep @@ -2887,7 +2888,7 @@ checkForeignDeps pkg lbi verbosity = else extraLibDirs ) ] - ++ collectField ldOptions + ++ map Text.unpack (collectField ldOptions) ++ [ "-L" ++ dir | dir <- ordNub diff --git a/Cabal/src/Distribution/Simple/GHC.hs b/Cabal/src/Distribution/Simple/GHC.hs index 5d3d180665c..653256f2b42 100644 --- a/Cabal/src/Distribution/Simple/GHC.hs +++ b/Cabal/src/Distribution/Simple/GHC.hs @@ -83,6 +83,7 @@ import Control.Arrow ((***)) import Control.Monad (forM_) import qualified Data.Map as Map import Data.Maybe (fromJust) +import qualified Data.Text as Text import Distribution.CabalSpecVersion import Distribution.InstalledPackageInfo (InstalledPackageInfo) import Distribution.Package @@ -796,7 +797,7 @@ libAbiHash verbosity _pkg_descr lbi lib clbi = do , ghcOptFPic = toFlag True , ghcOptHiSuffix = toFlag "dyn_hi" , ghcOptObjSuffix = toFlag "dyn_o" - , ghcOptExtra = hcSharedOptions GHC libBi + , ghcOptExtra = map Text.unpack $ hcSharedOptions GHC libBi } profArgs = vanillaArgs @@ -808,7 +809,7 @@ libAbiHash verbosity _pkg_descr lbi lib clbi = do (withProfLibDetail lbi) , ghcOptHiSuffix = toFlag "p_hi" , ghcOptObjSuffix = toFlag "p_o" - , ghcOptExtra = hcProfOptions GHC libBi + , ghcOptExtra = map Text.unpack $ hcProfOptions GHC libBi } profDynArgs = vanillaArgs @@ -822,7 +823,7 @@ libAbiHash verbosity _pkg_descr lbi lib clbi = do , ghcOptFPic = toFlag True , ghcOptHiSuffix = toFlag "p_dyn_hi" , ghcOptObjSuffix = toFlag "p_dyn_o" - , ghcOptExtra = hcProfSharedOptions GHC libBi + , ghcOptExtra = map Text.unpack $ hcProfSharedOptions GHC libBi } ghcArgs = let (libWays, _, _) = buildWays lbi @@ -979,12 +980,11 @@ installLib verbosity lbi targetDir dynlibTargetDir bytecodeTargetDir _builtDir p [ installOrdinary builtDir targetDir - (mkGenericStaticLibName (l ++ f)) + (mkGenericStaticLibName (Text.unpack $ l <> f)) | l <- - getHSLibraryName - (componentUnitId clbi) + Text.pack (getHSLibraryName (componentUnitId clbi)) : extraBundledLibs (libBuildInfo lib) - , f <- "" : extraLibFlavours (libBuildInfo lib) + , f <- mempty : extraLibFlavours (libBuildInfo lib) ] whenGHCi $ installOrdinary builtDir targetDir ghciLibName ProfWay -> do @@ -1004,9 +1004,9 @@ installLib verbosity lbi targetDir dynlibTargetDir bytecodeTargetDir _builtDir p [ installShared builtDir dynlibTargetDir - (mkGenericSharedLibName platform compiler_id (l ++ f)) - | l <- getHSLibraryName uid : extraBundledLibs (libBuildInfo lib) - , f <- "" : extraDynLibFlavours (libBuildInfo lib) + (mkGenericSharedLibName platform compiler_id (Text.unpack $ l <> f)) + | l <- Text.pack (getHSLibraryName uid) : extraBundledLibs (libBuildInfo lib) + , f <- mempty : extraDynLibFlavours (libBuildInfo lib) ] | otherwise -> do sequence_ @@ -1016,9 +1016,9 @@ installLib verbosity lbi targetDir dynlibTargetDir bytecodeTargetDir _builtDir p ( mkGenericSharedLibName platform compiler_id - (getHSLibraryName uid ++ f) + (getHSLibraryName uid ++ Text.unpack f) ) - | f <- "" : extraDynLibFlavours (libBuildInfo lib) + | f <- mempty : extraDynLibFlavours (libBuildInfo lib) ] sequence_ [ do @@ -1027,7 +1027,7 @@ installLib verbosity lbi targetDir dynlibTargetDir bytecodeTargetDir _builtDir p mkGenericSharedBundledLibName platform compiler_id - (l ++ f) + (Text.unpack $ l <> f) forM_ files $ \file -> when (l' `isPrefixOf` file) $ do isFile <- doesFileExist (i $ builtDir makeRelativePathEx file) @@ -1037,7 +1037,7 @@ installLib verbosity lbi targetDir dynlibTargetDir bytecodeTargetDir _builtDir p dynlibTargetDir file | l <- extraBundledLibs (libBuildInfo lib) - , f <- "" : extraDynLibFlavours (libBuildInfo lib) + , f <- mempty : extraDynLibFlavours (libBuildInfo lib) ] where -- See Note [Symbolic paths] in Distribution.Utils.Path diff --git a/Cabal/src/Distribution/Simple/GHC/Build/Link.hs b/Cabal/src/Distribution/Simple/GHC/Build/Link.hs index 16e75af04b3..1ed77d406ab 100644 --- a/Cabal/src/Distribution/Simple/GHC/Build/Link.hs +++ b/Cabal/src/Distribution/Simple/GHC/Build/Link.hs @@ -10,6 +10,7 @@ import Control.Monad import Control.Monad.IO.Class import qualified Data.ByteString.Lazy.Char8 as BS import qualified Data.Set as Set +import qualified Data.Text as Text import Distribution.Backpack import Distribution.Compat.Binary (encode) import Distribution.Compat.ResponseFile @@ -134,9 +135,10 @@ linkOrLoadComponent programOverrideArgs (lookupProgram ldProgram (withPrograms lbi)) , ghcOptLinkLibs = - if withFullyStaticExe lbi - then extraLibsStatic bi - else extraLibs bi + map Text.unpack $ + if withFullyStaticExe lbi + then extraLibsStatic bi + else extraLibs bi , ghcOptLinkLibPath = toNubListR $ if withFullyStaticExe lbi @@ -327,7 +329,7 @@ linkLibrary buildTargetDir cleanedExtraLibDirs verbosity runGhcProg lib lbi clbi ghcBaseLinkArgs = Internal.linkGhcOptions (verbosityLevel verbosity) lbi libBi clbi <> mempty - { ghcOptExtra = hcStaticOptions GHC libBi + { ghcOptExtra = map Text.unpack $ hcStaticOptions GHC libBi , ghcOptNoAutoLinkPackages = toFlag True } @@ -342,7 +344,7 @@ linkLibrary buildTargetDir cleanedExtraLibDirs verbosity runGhcProg lib lbi clbi , ghcOptInputFiles = toNubListR $ map coerceSymbolicPath dynObjectFiles , ghcOptOutputFile = toFlag sharedLibFilePath , ghcOptDylibName = mempty - , ghcOptLinkLibs = extraLibs libBi + , ghcOptLinkLibs = map Text.unpack $ extraLibs libBi , ghcOptLinkLibPath = toNubListR cleanedExtraLibDirs , ghcOptLinkFrameworks = toNubListR $ map getSymbolicPath $ PD.frameworks libBi , ghcOptLinkFrameworkDirs = @@ -361,7 +363,7 @@ linkLibrary buildTargetDir cleanedExtraLibDirs verbosity runGhcProg lib lbi clbi , ghcOptInputFiles = toNubListR pdynObjectFiles , ghcOptOutputFile = toFlag profSharedLibFilePath , ghcOptDylibName = mempty - , ghcOptLinkLibs = extraLibs libBi + , ghcOptLinkLibs = map Text.unpack $ extraLibs libBi , ghcOptLinkLibPath = toNubListR cleanedExtraLibDirs , ghcOptLinkFrameworks = toNubListR $ map getSymbolicPath $ PD.frameworks libBi , ghcOptLinkFrameworkDirs = @@ -373,7 +375,7 @@ linkLibrary buildTargetDir cleanedExtraLibDirs verbosity runGhcProg lib lbi clbi { ghcOptStaticLib = toFlag True , ghcOptInputFiles = toNubListR $ map coerceSymbolicPath staticObjectFiles , ghcOptOutputFile = toFlag staticLibFilePath - , ghcOptLinkLibs = extraLibs libBi + , ghcOptLinkLibs = map Text.unpack $ extraLibs libBi , -- TODO: Shouldn't this use cleanedExtraLibDirsStatic instead? ghcOptLinkLibPath = toNubListR cleanedExtraLibDirs } @@ -680,7 +682,7 @@ extractRtsInfo lbi = -- threaded RTS. This is used to determine which RTS to link against when -- building a foreign library with a GHC without support for @-flink-rts@. hasThreaded :: BuildInfo -> Bool -hasThreaded bi = "-threaded" `elem` ghc +hasThreaded bi = Text.pack "-threaded" `elem` ghc where PerCompilerFlavor ghc _ = options bi diff --git a/Cabal/src/Distribution/Simple/GHC/Build/Modules.hs b/Cabal/src/Distribution/Simple/GHC/Build/Modules.hs index 5d0dcaa58bf..3113dbc7f9a 100644 --- a/Cabal/src/Distribution/Simple/GHC/Build/Modules.hs +++ b/Cabal/src/Distribution/Simple/GHC/Build/Modules.hs @@ -13,6 +13,8 @@ import Distribution.Compat.Prelude import Data.List (sortOn, (\\)) import qualified Data.Set as Set +import Data.Text (Text) +import qualified Data.Text as Text import Distribution.CabalSpecVersion import Distribution.ModuleName (ModuleName) import qualified Distribution.PackageDescription as PD @@ -183,7 +185,7 @@ buildHaskellModules numJobs ghcProg mbMainFile inputModules buildTargetDir neede , ghcOptInputModules = toNubListR inputModules , ghcOptInputFiles = toNubListR hsMains , ghcOptInputScripts = toNubListR scriptMains - , ghcOptExtra = buildWayExtraHcOptions way GHC bi + , ghcOptExtra = map Text.unpack $ buildWayExtraHcOptions way GHC bi , ghcOptHiSuffix = needsWaySuffixFlag (buildWayInterfaceExtension way) "hi" , ghcOptObjSuffix = needsWaySuffixFlag (buildWayObjectExtension "o" way) "o" , ghcOptHPCDir = hpcdir (buildWayHpcWay way) -- maybe this should not be passed for vanilla? @@ -368,7 +370,7 @@ buildWayHpcWay = \case -- | Returns a function to extract the extra haskell compiler options from a -- 'BuildInfo' and 'CompilerFlavor' -buildWayExtraHcOptions :: BuildWay -> CompilerFlavor -> BuildInfo -> [String] +buildWayExtraHcOptions :: BuildWay -> CompilerFlavor -> BuildInfo -> [Text] buildWayExtraHcOptions = \case StaticWay -> hcStaticOptions ProfWay -> hcProfOptions diff --git a/Cabal/src/Distribution/Simple/GHC/Build/Utils.hs b/Cabal/src/Distribution/Simple/GHC/Build/Utils.hs index afaf19d8d6f..7fbb97ec64f 100644 --- a/Cabal/src/Distribution/Simple/GHC/Build/Utils.hs +++ b/Cabal/src/Distribution/Simple/GHC/Build/Utils.hs @@ -7,6 +7,7 @@ import Prelude () import Control.Monad (msum) import Data.Char (isLower) +import qualified Data.Text as T import Distribution.ModuleName (ModuleName) import qualified Distribution.ModuleName as ModuleName import Distribution.PackageDescription as PD @@ -233,7 +234,7 @@ exeMainModuleName bnfo = -- Moreover, -main-is when parsed left-to-right can update either -- the "Main" module name, or the "main" function name, or both, -- see also 'decodeMainIsArg'. - fromMaybe ModuleName.main $ msum $ reverse $ map decodeMainIsArg $ findIsMainArgs ghcopts + fromMaybe ModuleName.main $ msum $ reverse $ map decodeMainIsArg $ findIsMainArgs $ map T.unpack ghcopts where ghcopts = hcOptions GHC bnfo diff --git a/Cabal/src/Distribution/Simple/GHC/Internal.hs b/Cabal/src/Distribution/Simple/GHC/Internal.hs index 29bd75180ba..a018b8da9c1 100644 --- a/Cabal/src/Distribution/Simple/GHC/Internal.hs +++ b/Cabal/src/Distribution/Simple/GHC/Internal.hs @@ -53,6 +53,7 @@ import Data.Bool (bool) import qualified Data.ByteString.Lazy.Char8 as BS import qualified Data.Map as Map import qualified Data.Set as Set +import qualified Data.Text as Text import Distribution.Backpack import Distribution.Compat.Stack import Distribution.Lex @@ -389,7 +390,7 @@ splitCandCxxOptions source verbosity lbi bi clbi odir filename = case source of ghcOptionsSince (mkVersion [8, 10]) (compiler lbi) - (optimizationCFlags lbi ++ ccOptions bi) + (optimizationCFlags lbi ++ map Text.unpack (ccOptions bi)) } setCxxOptions xxx = xxx @@ -401,7 +402,7 @@ splitCandCxxOptions source verbosity lbi bi clbi odir filename = case source of ghcOptionsSince (mkVersion [8, 10]) (compiler lbi) - (optimizationCFlags lbi ++ cxxOptions bi) + (optimizationCFlags lbi ++ map Text.unpack (cxxOptions bi)) } setCcProgram xxx = xxx @@ -540,13 +541,13 @@ linkGhcOptions verbosity lbi bi clbi = { -- Respect -v0, but don't crank up verbosity on GHC if -- Cabal verbosity is requested. For that, use --ghc-option=-v instead! ghcOptVerbosity = toFlag (min verbosity Normal) - , ghcOptCcOptions = ccOptions bi - , ghcOptCxxOptions = cxxOptions bi - , ghcOptAsmOptions = asmOptions bi - , ghcOptLinkOptions = ldOptions bi - , ghcOptCppOptions = cppOptions bi - , ghcOptJSppOptions = jsppOptions bi - , ghcOptExtra = hcOptions GHC bi <> cmmOptions bi + , ghcOptCcOptions = map Text.unpack $ ccOptions bi + , ghcOptCxxOptions = map Text.unpack $ cxxOptions bi + , ghcOptAsmOptions = map Text.unpack $ asmOptions bi + , ghcOptLinkOptions = map Text.unpack $ ldOptions bi + , ghcOptCppOptions = map Text.unpack $ cppOptions bi + , ghcOptJSppOptions = map Text.unpack $ jsppOptions bi + , ghcOptExtra = map Text.unpack $ hcOptions GHC bi <> cmmOptions bi , ghcOptCabal = toFlag True , ghcOptThisUnitId = case clbi of LibComponentLocalBuildInfo{componentCompatPackageKey = pk} -> diff --git a/Cabal/src/Distribution/Simple/Haddock.hs b/Cabal/src/Distribution/Simple/Haddock.hs index 4578579d07f..4446aac0faa 100644 --- a/Cabal/src/Distribution/Simple/Haddock.hs +++ b/Cabal/src/Distribution/Simple/Haddock.hs @@ -83,6 +83,7 @@ import Distribution.Version import Data.Bool (bool) import Data.Either (lefts, rights) +import qualified Data.Text as T import System.Directory (doesDirectoryExist, doesFileExist) import System.FilePath (isAbsolute, joinPath, normalise, splitDirectories) import System.IO (hClose, hPutStrLn, hSetEncoding, utf8) @@ -723,7 +724,7 @@ mkHaddockArgs verbosity (tmpObjDir, tmpHiDir, tmpStubDir) lbi clbi htmlTemplate , ghcOptFPic = toFlag True , ghcOptHiSuffix = toFlag "dyn_hi" , ghcOptObjSuffix = toFlag "dyn_o" - , ghcOptExtra = hcSharedOptions GHC bi + , ghcOptExtra = map T.unpack $ hcSharedOptions GHC bi } ifaceArgs <- getInterfaces verbosity lbi clbi htmlTemplate opts <- diff --git a/Cabal/src/Distribution/Simple/PreProcess.hs b/Cabal/src/Distribution/Simple/PreProcess.hs index 6af3e15051e..ea5b7dd30ce 100644 --- a/Cabal/src/Distribution/Simple/PreProcess.hs +++ b/Cabal/src/Distribution/Simple/PreProcess.hs @@ -68,6 +68,7 @@ import Distribution.Utils.Path import Distribution.Verbosity import Distribution.Version +import qualified Data.Text as T import System.Directory (doesDirectoryExist, doesFileExist) import System.FilePath ( normalise @@ -506,7 +507,7 @@ ppHsc2hs bi lbi clbi = cflags ++ ldflags ++ preccldFlags - ++ hsc2hsOptions bi + ++ map T.unpack (hsc2hsOptions bi) ++ postccldFlags ++ ["-o", outFile, inFile] where @@ -540,8 +541,8 @@ ppHsc2hs bi lbi clbi = then PD.extraLibDirsStatic bi else PD.extraLibDirs bi ] - , ["-l" ++ opt | opt <- PD.extraLibs bi] - , PD.ldOptions bi + , ["-l" ++ T.unpack opt | opt <- PD.extraLibs bi] + , map T.unpack (PD.ldOptions bi) , -- Options from dependent packages [ opt | pkg <- pkgs @@ -579,7 +580,7 @@ ppHsc2hs bi lbi clbi = -- because there will not be C++ sources. -- -- DO NOT add PD.cxxOptions unless this changes! - PD.ccOptions bi ++ PD.cppOptions bi + map T.unpack (PD.ccOptions bi ++ PD.cppOptions bi) , [ "-I" ++ u (autogenComponentModulesDir lbi clbi) , "-I" ++ u (autogenPackageModulesDir lbi) @@ -717,9 +718,9 @@ ppC2hsExtras mbWorkDir buildBaseDir = do getCppOptions :: BuildInfo -> LocalBuildInfo -> [String] getCppOptions bi lbi = platformDefines lbi - ++ cppOptions bi + ++ map T.unpack (cppOptions bi) ++ ["-I" ++ getSymbolicPath dir | dir <- PD.includeDirs bi] - ++ [opt | opt@('-' : c : _) <- PD.ccOptions bi ++ PD.cxxOptions bi, c `elem` "DIU"] + ++ [opt | opt@('-' : c : _) <- map T.unpack (PD.ccOptions bi ++ PD.cxxOptions bi), c `elem` "DIU"] platformDefines :: LocalBuildInfo -> [String] platformDefines lbi = diff --git a/Cabal/src/Distribution/Simple/Program/GHC.hs b/Cabal/src/Distribution/Simple/Program/GHC.hs index 9904e78a002..26cb7619796 100644 --- a/Cabal/src/Distribution/Simple/Program/GHC.hs +++ b/Cabal/src/Distribution/Simple/Program/GHC.hs @@ -55,6 +55,8 @@ import Data.List (stripPrefix) import qualified Data.Map as Map import Data.Monoid (All (..), Any (..), Endo (..)) import qualified Data.Set as Set +import Data.Text (Text) +import qualified Data.Text as Text import qualified System.Process as Process normaliseGhcArgs :: Maybe Version -> PackageDescription -> [String] -> [String] @@ -93,15 +95,15 @@ normaliseGhcArgs (Just ghcVersion) PackageDescription{..} ghcArgs checkComponentFlags getInfo = foldMap (checkComponent . getInfo) where checkComponent :: BuildInfo -> m - checkComponent = foldMap fun . filterGhcOptions . allGhcOptions + checkComponent = foldMap (fun . map Text.unpack) . filterGhcOptions . allGhcOptions - allGhcOptions :: BuildInfo -> [(CompilerFlavor, [String])] + allGhcOptions :: BuildInfo -> [(CompilerFlavor, [Text])] allGhcOptions = foldMap (perCompilerFlavorToList .) [options, profOptions, sharedOptions, staticOptions] - filterGhcOptions :: [(CompilerFlavor, [String])] -> [[String]] + filterGhcOptions :: [(CompilerFlavor, a)] -> [a] filterGhcOptions l = [opts | (GHC, opts) <- l] safeToFilterWarnings :: Bool diff --git a/Cabal/src/Distribution/Simple/Register.hs b/Cabal/src/Distribution/Simple/Register.hs index c11f52b2107..15d1a4bd48b 100644 --- a/Cabal/src/Distribution/Simple/Register.hs +++ b/Cabal/src/Distribution/Simple/Register.hs @@ -86,6 +86,7 @@ import System.Directory import System.FilePath (isAbsolute) import qualified Data.ByteString.Lazy.Char8 as BS.Char8 +import qualified Data.Text as T -- ----------------------------------------------------------------------------- -- Registration @@ -528,10 +529,10 @@ generalInstalledPackageInfo adjustRelIncDirs pkg abi_hash lib lbi clbi installDi , IPI.dataDir = datadir installDirs , IPI.hsLibraries = [getHSLibraryName (componentUnitId clbi) | hasLibrary] - ++ extraBundledLibs bi - , IPI.extraLibraries = extraLibs bi - , IPI.extraLibrariesStatic = extraLibsStatic bi - , IPI.extraGHCiLibraries = extraGHCiLibs bi + ++ map T.unpack (extraBundledLibs bi) + , IPI.extraLibraries = map T.unpack $ extraLibs bi + , IPI.extraLibrariesStatic = map T.unpack $ extraLibsStatic bi + , IPI.extraGHCiLibraries = map T.unpack $ extraGHCiLibs bi , IPI.includeDirs = absinc ++ adjustRelIncDirs relinc , IPI.includes = map getSymbolicPath $ includes bi , IPI.depends = depends @@ -540,7 +541,7 @@ generalInstalledPackageInfo adjustRelIncDirs pkg abi_hash lib lbi clbi installDi -- We don't want cc-options to be propagated -- to C compilations in other packages. , IPI.cxxOptions = [] -- Also. NOT cxxOptions bi! - , IPI.ldOptions = ldOptions bi + , IPI.ldOptions = map T.unpack $ ldOptions bi , IPI.frameworks = map getSymbolicPath $ frameworks bi , IPI.frameworkDirs = map getSymbolicPath $ extraFrameworkDirs bi , IPI.haddockInterfaces = diff --git a/Cabal/src/Distribution/Simple/SetupHooks/Internal.hs b/Cabal/src/Distribution/Simple/SetupHooks/Internal.hs index 2446c0270e0..dd8b0d3c919 100644 --- a/Cabal/src/Distribution/Simple/SetupHooks/Internal.hs +++ b/Cabal/src/Distribution/Simple/SetupHooks/Internal.hs @@ -128,6 +128,7 @@ import qualified Data.List.NonEmpty as NE import qualified Data.Map as Map import Data.Monoid (Ap (..)) import qualified Data.Set as Set +import qualified Data.Text as Text import System.Directory (doesFileExist, getModificationTime) import qualified System.FilePath as FilePath @@ -935,7 +936,7 @@ executeRulesUserOrSystem scope runDepsCmdData runCmdData verbosity lbi tgtInfo a ] extraBundledLibsPaths :: [RelativePath Source File] extraBundledLibsPaths = - map makeRelativePathEx $ + map (makeRelativePathEx . Text.unpack) $ extraBundledLibs compBuildInfo -- Is this rule directly demanded (e.g. it generates a Haskell module diff --git a/Cabal/src/Distribution/Simple/UHC.hs b/Cabal/src/Distribution/Simple/UHC.hs index bdea3d94fa1..612f9faed28 100644 --- a/Cabal/src/Distribution/Simple/UHC.hs +++ b/Cabal/src/Distribution/Simple/UHC.hs @@ -47,6 +47,7 @@ import Distribution.Version import Language.Haskell.Extension import qualified Data.Map as Map (empty) +import qualified Data.Text as Text import System.Directory import System.FilePath (pathSeparator) @@ -274,7 +275,7 @@ constructUHCCmdLine -> [String] constructUHCCmdLine user system lbi bi clbi odir verbosity = vFlags - ++ hcOptions UHC bi + ++ map Text.unpack (hcOptions UHC bi) -- flags for language extensions ++ languageToFlags (compiler lbi) (defaultLanguage bi) ++ extensionsToFlags (compiler lbi) (usedExtensions bi) @@ -289,7 +290,7 @@ constructUHCCmdLine user system lbi bi clbi odir verbosity = ++ ["-i" ++ u (autogenComponentModulesDir lbi clbi)] ++ ["-i" ++ u (autogenPackageModulesDir lbi)] -- cpp options - ++ ["--optP=" ++ opt | opt <- cppOptions bi] + ++ ["--optP=" ++ Text.unpack opt | opt <- cppOptions bi] -- output path ++ ["--odir=" ++ u odir] -- optimization diff --git a/cabal-install/src/Distribution/Client/ScriptUtils.hs b/cabal-install/src/Distribution/Client/ScriptUtils.hs index 656a515a26c..36c7c955f3e 100644 --- a/cabal-install/src/Distribution/Client/ScriptUtils.hs +++ b/cabal-install/src/Distribution/Client/ScriptUtils.hs @@ -199,6 +199,8 @@ import Control.Exception import qualified Data.ByteString.Char8 as BS import Data.ByteString.Lazy () import qualified Data.Set as S +import Data.Text (Text) +import qualified Data.Text as T import Distribution.Client.Errors import Distribution.Utils.Path ( unsafeMakeSymbolicPath @@ -447,9 +449,9 @@ scriptDistDirParams scriptPath ctx compiler platform = cid = mkComponentId $ prettyShow fakePackageId <> "-inplace-" <> prettyShow cn optimization = (packageConfigOptimization . projectConfigLocalPackages . projectConfig) ctx -setExePath :: FilePath -> [String] -> [String] +setExePath :: FilePath -> [Text] -> [Text] setExePath exePath options - | "-o" `notElem` options = "-o" : exePath : options + | T.pack "-o" `notElem` options = T.pack "-o" : T.pack exePath : options | otherwise = options -- | Add the 'SourcePackage' to the context and use it to write a .cabal file. @@ -601,7 +603,7 @@ movedExePath selectedComponent distDirLayout elabShared elabConfigured = do let CompilerId flavor _ = (compilerId . pkgConfigCompiler) elabShared opts <- lookup flavor (perCompilerFlavorToList . options $ buildInfo exe) let projectRoot = distProjectRootDirectory distDirLayout - fmap (projectRoot ) . lookup "-o" $ reverse (zip opts (drop 1 opts)) + fmap ((projectRoot ) . T.unpack) . lookup "-o" $ reverse (zip opts (drop 1 opts)) -- Lenses diff --git a/changelog.d/pr-12436.md b/changelog.d/pr-12436.md new file mode 100644 index 00000000000..30a4b14f5ed --- /dev/null +++ b/changelog.d/pr-12436.md @@ -0,0 +1,17 @@ +--- +synopsis: Use Text instead of String in data BuildInfo and class HasBuildInfo +packages: [Cabal-syntax] +prs: 12436 +--- + +Moving towards using sensible string types in Cabal, we change the remaining `String` fields +of `data BuildInfo` to contain `Text` to return `Text` instead of `String`. Simultaneously, +we change lens in `class HasBuildInfo` in the same fashion. + +Namely, `cppOptions`, `asmOptions`, `cmmOptions`, `ccOptions`, `cxxOptions`, `jsppOptions`, `ldOptions`, +`hsc2hsOptions`, `extraLibs`, `extraLibsStatic`, `extraGHCiLibs`, `extraBundledLibs`, +`extraLibFlavours` and `extraDynLibFlavours` are now `[Text]` instead of `[String]`. +Further, `options`, `profOptions`, `sharedOptions`, `profSharedOptions`, `staticOptions` +are now `PerCompilerFlavor [Text]` instead of `PerCompilerFlavor [String]` (and same for +helper functions `hcOptions`, `hcProfOptions`, `hcSharedOptions`, `hcProfSharedOptions` and `hcStaticOptions`). +Finally, `customFieldsBI` are now `[(Text, Text)]` instead of `[(String, String)]`.