Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 49 additions & 34 deletions Cabal-syntax/src/Distribution/PackageDescription/FieldGrammar.hs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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)
Expand Down Expand Up @@ -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 #-}
55 changes: 28 additions & 27 deletions Cabal-syntax/src/Distribution/Types/BuildInfo.hs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ module Distribution.Types.BuildInfo
, hcStaticOptions
) where

import Data.Text (Text)
import Distribution.Compat.Prelude
import Prelude ()

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -99,26 +100,26 @@ 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)
-- and copied and registered together with this library. The
-- 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<name>_<flavour> | 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.
Expand All @@ -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.
Expand Down Expand Up @@ -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
Expand Down
Loading
Loading