Skip to content

Commit dfcc65f

Browse files
committed
feat(Cabal, Cabal-syntax): support generated cmm-sources
1 parent 5c83c48 commit dfcc65f

File tree

15 files changed

+168
-87
lines changed

15 files changed

+168
-87
lines changed

Cabal-described/src/Distribution/Described.hs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ import Distribution.Types.SourceRepo (RepoType)
100100
import Distribution.Types.TestType (TestType)
101101
import Distribution.Types.UnitId (UnitId)
102102
import Distribution.Types.UnqualComponentName (UnqualComponentName)
103-
import Distribution.Utils.Path (SymbolicPath, RelativePath, FileOrDir(..), Pkg)
103+
import Distribution.Utils.Path (SymbolicPath, RelativePath, FileOrDir(..), Pkg, Build)
104104
import Distribution.Verbosity (Verbosity)
105105
import Distribution.Version (Version, VersionRange)
106106
import Language.Haskell.Extension (Extension, Language, knownLanguages)
@@ -407,7 +407,13 @@ instance Described ExposedModule where
407407
instance Described Extension where
408408
describe _ = RETodo
409409

410-
instance Described ExtraSource where
410+
instance Described (ExtraSource Build) where
411+
describe _ = REAppend
412+
[ describe (Proxy :: Proxy (SymbolicPath Build File))
413+
, REOpt (reChar '(' <> reSpacedList (describe (Proxy :: Proxy Token')) <> reChar ')')
414+
]
415+
416+
instance Described (ExtraSource Pkg) where
411417
describe _ = REAppend
412418
[ describe (Proxy :: Proxy (SymbolicPath Pkg File))
413419
, REOpt (reChar '(' <> reSpacedList (describe (Proxy :: Proxy Token')) <> reChar ')')

Cabal-syntax/src/Distribution/PackageDescription/FieldGrammar.hs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,8 @@ libraryFieldGrammar
174174
, c (List CommaFSep (Identity PkgconfigDependency) PkgconfigDependency)
175175
, c (List CommaVCat (Identity Dependency) Dependency)
176176
, c (List CommaVCat (Identity Mixin) Mixin)
177-
, c (List VCat (Identity ExtraSource) ExtraSource)
177+
, c (List VCat (Identity (ExtraSource Pkg)) (ExtraSource Pkg))
178+
, c (List VCat (Identity (ExtraSource Build)) (ExtraSource Build))
178179
, c (List CommaVCat (Identity ModuleReexport) ModuleReexport)
179180
, c (List FSep (MQuoted Extension) Extension)
180181
, c (List FSep (MQuoted Language) Language)
@@ -225,7 +226,8 @@ foreignLibFieldGrammar
225226
, c (List CommaFSep (Identity PkgconfigDependency) PkgconfigDependency)
226227
, c (List CommaVCat (Identity Dependency) Dependency)
227228
, c (List CommaVCat (Identity Mixin) Mixin)
228-
, c (List VCat (Identity ExtraSource) ExtraSource)
229+
, c (List VCat (Identity (ExtraSource Pkg)) (ExtraSource Pkg))
230+
, c (List VCat (Identity (ExtraSource Build)) (ExtraSource Build))
229231
, c (List FSep (Identity ForeignLibOption) ForeignLibOption)
230232
, c (List FSep (MQuoted Extension) Extension)
231233
, c (List FSep (MQuoted Language) Language)
@@ -265,7 +267,8 @@ executableFieldGrammar
265267
, c (List CommaFSep (Identity PkgconfigDependency) PkgconfigDependency)
266268
, c (List CommaVCat (Identity Dependency) Dependency)
267269
, c (List CommaVCat (Identity Mixin) Mixin)
268-
, c (List VCat (Identity ExtraSource) ExtraSource)
270+
, c (List VCat (Identity (ExtraSource Pkg)) (ExtraSource Pkg))
271+
, c (List VCat (Identity (ExtraSource Build)) (ExtraSource Build))
269272
, c (List FSep (MQuoted Extension) Extension)
270273
, c (List FSep (MQuoted Language) Language)
271274
, c (List FSep Token String)
@@ -342,7 +345,8 @@ testSuiteFieldGrammar
342345
, c (List CommaFSep Token String)
343346
, c (List CommaVCat (Identity Dependency) Dependency)
344347
, c (List CommaVCat (Identity Mixin) Mixin)
345-
, c (List VCat (Identity ExtraSource) ExtraSource)
348+
, c (List VCat (Identity (ExtraSource Pkg)) (ExtraSource Pkg))
349+
, c (List VCat (Identity (ExtraSource Build)) (ExtraSource Build))
346350
, c (List FSep (MQuoted Extension) Extension)
347351
, c (List FSep (MQuoted Language) Language)
348352
, c (List FSep Token String)
@@ -487,7 +491,8 @@ benchmarkFieldGrammar
487491
, c (List CommaFSep (Identity PkgconfigDependency) PkgconfigDependency)
488492
, c (List CommaVCat (Identity Dependency) Dependency)
489493
, c (List CommaVCat (Identity Mixin) Mixin)
490-
, c (List VCat (Identity ExtraSource) ExtraSource)
494+
, c (List VCat (Identity (ExtraSource Pkg)) (ExtraSource Pkg))
495+
, c (List VCat (Identity (ExtraSource Build)) (ExtraSource Build))
491496
, c (List FSep (MQuoted Extension) Extension)
492497
, c (List FSep (MQuoted Language) Language)
493498
, c (List FSep Token String)
@@ -590,7 +595,8 @@ buildInfoFieldGrammar
590595
, c (List CommaFSep (Identity PkgconfigDependency) PkgconfigDependency)
591596
, c (List CommaVCat (Identity Dependency) Dependency)
592597
, c (List CommaVCat (Identity Mixin) Mixin)
593-
, c (List VCat (Identity ExtraSource) ExtraSource)
598+
, c (List VCat (Identity (ExtraSource Pkg)) (ExtraSource Pkg))
599+
, c (List VCat (Identity (ExtraSource Build)) (ExtraSource Build))
594600
, c (List FSep (MQuoted Extension) Extension)
595601
, c (List FSep (MQuoted Language) Language)
596602
, c (List FSep Token String)
@@ -639,6 +645,8 @@ buildInfoFieldGrammar =
639645
^^^ availableSince CabalSpecV3_0 []
640646
<*> monoidalFieldAla "cmm-sources" formatExtraSources L.cmmSources
641647
^^^ availableSince CabalSpecV3_0 []
648+
<*> monoidalFieldAla "autogen-cmm-sources" formatExtraSources L.autogenCmmSources
649+
-- FIXME ^^^ availableSince CabalSpecV3_0 []
642650
<*> monoidalFieldAla "c-sources" formatExtraSources L.cSources
643651
<*> monoidalFieldAla "cxx-sources" formatExtraSources L.cxxSources
644652
^^^ availableSince CabalSpecV2_2 []
@@ -842,7 +850,7 @@ formatOtherExtensions = alaList' FSep MQuoted
842850
formatOtherModules :: [ModuleName] -> List VCat (MQuoted ModuleName) ModuleName
843851
formatOtherModules = alaList' VCat MQuoted
844852

845-
formatExtraSources :: [ExtraSource] -> List VCat (Identity ExtraSource) ExtraSource
853+
formatExtraSources :: [ExtraSource pkg] -> List VCat (Identity (ExtraSource pkg)) (ExtraSource pkg)
846854
formatExtraSources = alaList' VCat Identity
847855

848856
-------------------------------------------------------------------------------

Cabal-syntax/src/Distribution/Types/BuildInfo.hs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,15 +74,17 @@ data BuildInfo = BuildInfo
7474
-- ^ support frameworks for Mac OS X
7575
, extraFrameworkDirs :: [SymbolicPath Pkg (Dir Framework)]
7676
-- ^ extra locations to find frameworks
77-
, asmSources :: [ExtraSource]
77+
, asmSources :: [ExtraSource Pkg]
7878
-- ^ Assembly source files
79-
, cmmSources :: [ExtraSource]
79+
, cmmSources :: [ExtraSource Pkg]
8080
-- ^ C-- source files
81-
, cSources :: [ExtraSource]
81+
, autogenCmmSources :: [ExtraSource Build]
82+
-- ^ C-- generated source files
83+
, cSources :: [ExtraSource Pkg]
8284
-- ^ C source files
83-
, cxxSources :: [ExtraSource]
85+
, cxxSources :: [ExtraSource Pkg]
8486
-- ^ C++ source files
85-
, jsSources :: [ExtraSource]
87+
, jsSources :: [ExtraSource Pkg]
8688
-- ^ JavaScript source file
8789
, hsSourceDirs :: [SymbolicPath Pkg (Dir Source)]
8890
-- ^ where to look for the Haskell module hierarchy
@@ -175,6 +177,7 @@ instance Monoid BuildInfo where
175177
, extraFrameworkDirs = []
176178
, asmSources = []
177179
, cmmSources = []
180+
, autogenCmmSources = []
178181
, cSources = []
179182
, cxxSources = []
180183
, jsSources = []
@@ -229,6 +232,7 @@ instance Semigroup BuildInfo where
229232
, extraFrameworkDirs = combineNub extraFrameworkDirs
230233
, asmSources = combineNub asmSources
231234
, cmmSources = combineNub cmmSources
235+
, autogenCmmSources = combineNub autogenCmmSources
232236
, cSources = combineNub cSources
233237
, cxxSources = combineNub cxxSources
234238
, jsSources = combineNub jsSources

Cabal-syntax/src/Distribution/Types/BuildInfo/Lens.hs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,23 +84,27 @@ class HasBuildInfo a where
8484
extraFrameworkDirs = buildInfo . extraFrameworkDirs
8585
{-# INLINE extraFrameworkDirs #-}
8686

87-
asmSources :: Lens' a [ExtraSource]
87+
asmSources :: Lens' a [ExtraSource Pkg]
8888
asmSources = buildInfo . asmSources
8989
{-# INLINE asmSources #-}
9090

91-
cmmSources :: Lens' a [ExtraSource]
91+
autogenCmmSources :: Lens' a [ExtraSource Build]
92+
autogenCmmSources = buildInfo . autogenCmmSources
93+
{-# INLINE autogenCmmSources #-}
94+
95+
cmmSources :: Lens' a [ExtraSource Pkg]
9296
cmmSources = buildInfo . cmmSources
9397
{-# INLINE cmmSources #-}
9498

95-
cSources :: Lens' a [ExtraSource]
99+
cSources :: Lens' a [ExtraSource Pkg]
96100
cSources = buildInfo . cSources
97101
{-# INLINE cSources #-}
98102

99-
cxxSources :: Lens' a [ExtraSource]
103+
cxxSources :: Lens' a [ExtraSource Pkg]
100104
cxxSources = buildInfo . cxxSources
101105
{-# INLINE cxxSources #-}
102106

103-
jsSources :: Lens' a [ExtraSource]
107+
jsSources :: Lens' a [ExtraSource Pkg]
104108
jsSources = buildInfo . jsSources
105109
{-# INLINE jsSources #-}
106110

Lines changed: 53 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,79 @@
11
{-# LANGUAGE DataKinds #-}
22
{-# LANGUAGE DeriveDataTypeable #-}
33
{-# LANGUAGE DeriveGeneric #-}
4+
{-# LANGUAGE FlexibleInstances #-}
5+
{-# LANGUAGE TypeFamilies #-}
46

57
module Distribution.Types.ExtraSource
68
( ExtraSource (..)
7-
, extraSourceFromPath
9+
, ExtraSourceClass (..)
810
) where
911

1012
import Distribution.Compat.Prelude
1113
import Prelude ()
1214

1315
import Distribution.Parsec
1416
import Distribution.Pretty
15-
import Distribution.Utils.Path (FileOrDir (..), Pkg, SymbolicPath)
17+
import Distribution.Utils.Path (Build, FileOrDir (..), Pkg, RelativePath, SymbolicPath, relativeSymbolicPath, unsafeCoerceSymbolicPath)
1618

1719
import qualified Distribution.Compat.CharParsing as P
18-
import Distribution.FieldGrammar.Newtypes (SymbolicPathNT (..))
1920
import qualified Text.PrettyPrint as PP
2021

21-
data ExtraSource = ExtraSource
22-
{ extraSourceFile :: SymbolicPath Pkg File
23-
, extraSourceOpts :: [String]
24-
}
25-
deriving (Generic, Show, Read, Eq, Ord, Typeable, Data)
22+
data family ExtraSource pkg
2623

27-
instance Binary ExtraSource
28-
instance Structured ExtraSource
29-
instance NFData ExtraSource where rnf = genericRnf
24+
data instance ExtraSource Pkg = ExtraSourcePkg (SymbolicPath Pkg File) [String]
25+
deriving (Generic, Show, Read, Eq, Ord, Data)
3026

31-
instance Parsec ExtraSource where
27+
data instance ExtraSource Build = ExtraSourceBuild (RelativePath Build File) [String]
28+
deriving (Generic, Show, Read, Eq, Ord, Data)
29+
30+
class ExtraSourceClass e where
31+
extraSourceOpts :: e -> [String]
32+
extraSourceFile :: e -> SymbolicPath Pkg 'File
33+
34+
instance ExtraSourceClass (ExtraSource Pkg) where
35+
extraSourceOpts (ExtraSourcePkg _ opts) = opts
36+
extraSourceFile (ExtraSourcePkg f _) = f
37+
38+
instance ExtraSourceClass (ExtraSource Build) where
39+
extraSourceOpts (ExtraSourceBuild _ opts) = opts
40+
41+
-- FIXME
42+
extraSourceFile (ExtraSourceBuild f _) = unsafeCoerceSymbolicPath (relativeSymbolicPath f)
43+
44+
instance Binary (ExtraSource Pkg)
45+
instance Structured (ExtraSource Pkg)
46+
instance NFData (ExtraSource Pkg) where rnf = genericRnf
47+
48+
instance Binary (ExtraSource Build)
49+
instance Structured (ExtraSource Build)
50+
instance NFData (ExtraSource Build) where rnf = genericRnf
51+
52+
instance Parsec (ExtraSource Pkg) where
3253
parsec = do
33-
SymbolicPathNT path <- parsec <* P.spaces
54+
path <- parsec <* P.spaces
3455
opts <- P.optional (parensLax (P.sepBy p P.spaces))
35-
return (ExtraSource path (fromMaybe mempty opts))
56+
return (ExtraSourcePkg path (fromMaybe mempty opts))
3657
where
3758
p :: P.CharParsing p => p String
38-
p = some $ P.satisfy (\c -> not (isSpace c) && not (c == ')'))
59+
p = some $ P.satisfy (\c -> not (isSpace c) && (c /= ')'))
3960

40-
parensLax :: P.CharParsing m => m a -> m a
41-
parensLax p = P.between (P.char '(' *> P.spaces) (P.char ')' *> P.spaces) p
61+
instance Parsec (ExtraSource Build) where
62+
parsec = do
63+
path <- parsec <* P.spaces
64+
opts <- P.optional (parensLax (P.sepBy p P.spaces))
65+
return (ExtraSourceBuild path (fromMaybe mempty opts))
66+
where
67+
p :: P.CharParsing p => p String
68+
p = some $ P.satisfy (\c -> not (isSpace c) && (c /= ')'))
69+
70+
instance Pretty (ExtraSource Pkg) where
71+
pretty (ExtraSourcePkg path opts) =
72+
pretty path <<>> PP.parens (PP.hsep (map PP.text opts))
4273

43-
instance Pretty ExtraSource where
44-
pretty (ExtraSource path opts) =
45-
pretty (SymbolicPathNT path) <<>> PP.parens (PP.hsep (map PP.text opts))
74+
instance Pretty (ExtraSource Build) where
75+
pretty (ExtraSourceBuild path opts) =
76+
pretty path <<>> PP.parens (PP.hsep (map PP.text opts))
4677

47-
extraSourceFromPath :: SymbolicPath Pkg File -> ExtraSource
48-
extraSourceFromPath fp = ExtraSource fp mempty
78+
parensLax :: P.CharParsing m => m a -> m a
79+
parensLax p = P.between (P.char '(' *> P.spaces) (P.char ')' *> P.spaces) p

Cabal-syntax/src/Distribution/Utils/Path.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,7 @@ data CWD
460460
-- | Abstract directory: package directory (e.g. a directory containing the @.cabal@ file).
461461
--
462462
-- See Note [Symbolic paths] in Distribution.Utils.Path.
463-
data Pkg
463+
data Pkg deriving (Data)
464464

465465
-- | Abstract directory: dist directory (e.g. @dist-newstyle@).
466466
--
@@ -490,7 +490,7 @@ data Framework
490490
-- | Abstract directory: build directory.
491491
--
492492
-- See Note [Symbolic paths] in Distribution.Utils.Path.
493-
data Build
493+
data Build deriving (Data)
494494

495495
-- | Abstract directory: directory for build artifacts, such as documentation or @.hie@ files.
496496
--

Cabal-tests/tests/NoThunks.hs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import Distribution.PackageDescription.Parsec (parseGenericPackageDescription, w
2626
import Distribution.Parsec.Source
2727
import Distribution.SPDX (License, LicenseExceptionId, LicenseExpression, LicenseId, LicenseRef, SimpleLicenseExpression)
2828
import Distribution.System (Arch, OS)
29-
import Distribution.Utils.Path (SymbolicPathX)
29+
import Distribution.Utils.Path (SymbolicPathX, Pkg, Build)
3030
import Distribution.Utils.ShortText (ShortText)
3131
import Distribution.Version (Version, VersionRange)
3232
import Language.Haskell.Extension (Extension, KnownExtension, Language)
@@ -74,7 +74,8 @@ instance NoThunks ConfVar
7474
instance NoThunks Dependency
7575
instance NoThunks Executable
7676
instance NoThunks ExecutableScope
77-
instance NoThunks ExtraSource
77+
instance NoThunks (ExtraSource Build)
78+
instance NoThunks (ExtraSource Pkg)
7879
instance NoThunks FlagName
7980
instance NoThunks ForeignLib
8081
instance NoThunks ForeignLibOption

Cabal-tests/tests/UnitTests/Distribution/Utils/Structured.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ md5Check proxy md5Int = structureHash proxy @?= md5FromInteger md5Int
2929

3030
md5CheckGenericPackageDescription :: Proxy GenericPackageDescription -> Assertion
3131
md5CheckGenericPackageDescription proxy = md5Check proxy
32-
0xe6490e868f1f18e90046d07228c7034b
32+
0x8ba94d68856c65b2946ee48e11afdd07
3333

3434
md5CheckLocalBuildInfo :: Proxy LocalBuildInfo -> Assertion
3535
md5CheckLocalBuildInfo proxy = md5Check proxy
36-
0xa5356c060cd3a6bd599819de2994d5e2
36+
0x4e2dd902c8bf79bb656793174f0a6c49

Cabal-tree-diff/src/Data/TreeDiff/Instances/Cabal.hs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import Distribution.Types.DumpBuildInfo (DumpBuildInfo)
2828
import Distribution.Types.PackageVersionConstraint
2929
import Distribution.Types.UnitId (DefUnitId, UnitId)
3030
import Distribution.Utils.NubList (NubList)
31-
import Distribution.Utils.Path (SymbolicPathX)
31+
import Distribution.Utils.Path (SymbolicPathX, Build, Pkg)
3232
import Distribution.Utils.ShortText (ShortText, fromShortText)
3333
import Distribution.Verbosity
3434
import Distribution.Verbosity.Internal
@@ -76,7 +76,8 @@ instance ToExpr ExeDependency
7676
instance ToExpr Executable
7777
instance ToExpr ExecutableScope
7878
instance ToExpr ExposedModule
79-
instance ToExpr ExtraSource
79+
instance ToExpr (ExtraSource Build)
80+
instance ToExpr (ExtraSource Pkg)
8081
instance ToExpr FlagAssignment
8182
instance ToExpr FlagName
8283
instance ToExpr ForeignLib

0 commit comments

Comments
 (0)