Skip to content

Commit ccc8d8e

Browse files
committed
feat(Cabal,Cabal-syntax): add per-file options to extra source files
1 parent 6ef8193 commit ccc8d8e

File tree

25 files changed

+244
-154
lines changed

25 files changed

+244
-154
lines changed

Cabal-described/src/Distribution/Described.hs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{-# LANGUAGE FlexibleInstances #-}
22
{-# LANGUAGE OverloadedStrings #-}
33
{-# LANGUAGE ScopedTypeVariables #-}
4+
{-# LANGUAGE DataKinds #-}
45
module Distribution.Described (
56
Described (..),
67
describeDoc,
@@ -79,6 +80,7 @@ import Distribution.Types.Dependency (Dependency)
7980
import Distribution.Types.ExecutableScope (ExecutableScope)
8081
import Distribution.Types.ExeDependency (ExeDependency)
8182
import Distribution.Types.ExposedModule (ExposedModule)
83+
import Distribution.Types.ExtraSource (ExtraSource)
8284
import Distribution.Types.Flag (FlagAssignment, FlagName)
8385
import Distribution.Types.ForeignLib (LibVersionInfo)
8486
import Distribution.Types.ForeignLibOption (ForeignLibOption)
@@ -98,7 +100,7 @@ import Distribution.Types.SourceRepo (RepoType)
98100
import Distribution.Types.TestType (TestType)
99101
import Distribution.Types.UnitId (UnitId)
100102
import Distribution.Types.UnqualComponentName (UnqualComponentName)
101-
import Distribution.Utils.Path (SymbolicPath, RelativePath)
103+
import Distribution.Utils.Path (SymbolicPath, RelativePath, FileOrDir(..), Pkg)
102104
import Distribution.Verbosity (Verbosity)
103105
import Distribution.Version (Version, VersionRange)
104106
import Language.Haskell.Extension (Extension, Language, knownLanguages)
@@ -405,6 +407,12 @@ instance Described ExposedModule where
405407
instance Described Extension where
406408
describe _ = RETodo
407409

410+
instance Described ExtraSource where
411+
describe _ = REAppend
412+
[ describe (Proxy :: Proxy (SymbolicPath Pkg File))
413+
, REOpt (reChar '(' <> reSpacedList (describe (Proxy :: Proxy Token')) <> reChar ')')
414+
]
415+
408416
instance Described FlagAssignment where
409417
describe _ = REMunch RESpaces1 $
410418
REUnion [fromString "+", fromString "-"] <> describe (Proxy :: Proxy FlagName)

Cabal-syntax/Cabal-syntax.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ library
141141
Distribution.Types.Executable
142142
Distribution.Types.Executable.Lens
143143
Distribution.Types.ExecutableScope
144+
Distribution.Types.ExtraSource
144145
Distribution.Types.ExposedModule
145146
Distribution.Types.Flag
146147
Distribution.Types.ForeignLib

Cabal-syntax/src/Distribution/PackageDescription.hs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ module Distribution.PackageDescription
4848
, module Distribution.Types.HookedBuildInfo
4949
, module Distribution.Types.SetupBuildInfo
5050

51+
-- * Extra sources
52+
, module Distribution.Types.ExtraSource
53+
5154
-- * Flags
5255
, module Distribution.Types.Flag
5356

@@ -95,6 +98,7 @@ import Distribution.Types.ComponentName
9598
import Distribution.Types.CondTree
9699
import Distribution.Types.Condition
97100
import Distribution.Types.ConfVar
101+
import Distribution.Types.ExtraSource
98102
import Distribution.Types.Dependency
99103
import Distribution.Types.ExeDependency
100104
import Distribution.Types.Executable

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

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ 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)
177178
, c (List CommaVCat (Identity ModuleReexport) ModuleReexport)
178179
, c (List FSep (MQuoted Extension) Extension)
179180
, c (List FSep (MQuoted Language) Language)
@@ -224,6 +225,7 @@ foreignLibFieldGrammar
224225
, c (List CommaFSep (Identity PkgconfigDependency) PkgconfigDependency)
225226
, c (List CommaVCat (Identity Dependency) Dependency)
226227
, c (List CommaVCat (Identity Mixin) Mixin)
228+
, c (List VCat (Identity ExtraSource) ExtraSource)
227229
, c (List FSep (Identity ForeignLibOption) ForeignLibOption)
228230
, c (List FSep (MQuoted Extension) Extension)
229231
, c (List FSep (MQuoted Language) Language)
@@ -263,6 +265,7 @@ executableFieldGrammar
263265
, c (List CommaFSep (Identity PkgconfigDependency) PkgconfigDependency)
264266
, c (List CommaVCat (Identity Dependency) Dependency)
265267
, c (List CommaVCat (Identity Mixin) Mixin)
268+
, c (List VCat (Identity ExtraSource) ExtraSource)
266269
, c (List FSep (MQuoted Extension) Extension)
267270
, c (List FSep (MQuoted Language) Language)
268271
, c (List FSep Token String)
@@ -339,6 +342,7 @@ testSuiteFieldGrammar
339342
, c (List CommaFSep Token String)
340343
, c (List CommaVCat (Identity Dependency) Dependency)
341344
, c (List CommaVCat (Identity Mixin) Mixin)
345+
, c (List VCat (Identity ExtraSource) ExtraSource)
342346
, c (List FSep (MQuoted Extension) Extension)
343347
, c (List FSep (MQuoted Language) Language)
344348
, c (List FSep Token String)
@@ -483,6 +487,7 @@ benchmarkFieldGrammar
483487
, c (List CommaFSep (Identity PkgconfigDependency) PkgconfigDependency)
484488
, c (List CommaVCat (Identity Dependency) Dependency)
485489
, c (List CommaVCat (Identity Mixin) Mixin)
490+
, c (List VCat (Identity ExtraSource) ExtraSource)
486491
, c (List FSep (MQuoted Extension) Extension)
487492
, c (List FSep (MQuoted Language) Language)
488493
, c (List FSep Token String)
@@ -585,6 +590,7 @@ buildInfoFieldGrammar
585590
, c (List CommaFSep (Identity PkgconfigDependency) PkgconfigDependency)
586591
, c (List CommaVCat (Identity Dependency) Dependency)
587592
, c (List CommaVCat (Identity Mixin) Mixin)
593+
, c (List VCat (Identity ExtraSource) ExtraSource)
588594
, c (List FSep (MQuoted Extension) Extension)
589595
, c (List FSep (MQuoted Language) Language)
590596
, c (List FSep Token String)
@@ -629,14 +635,14 @@ buildInfoFieldGrammar =
629635
<*> monoidalFieldAla "pkgconfig-depends" (alaList CommaFSep) L.pkgconfigDepends
630636
<*> monoidalFieldAla "frameworks" (alaList' FSep RelativePathNT) L.frameworks
631637
<*> monoidalFieldAla "extra-framework-dirs" (alaList' FSep SymbolicPathNT) L.extraFrameworkDirs
632-
<*> monoidalFieldAla "asm-sources" (alaList' VCat SymbolicPathNT) L.asmSources
638+
<*> monoidalFieldAla "asm-sources" formatExtraSources L.asmSources
633639
^^^ availableSince CabalSpecV3_0 []
634-
<*> monoidalFieldAla "cmm-sources" (alaList' VCat SymbolicPathNT) L.cmmSources
640+
<*> monoidalFieldAla "cmm-sources" formatExtraSources L.cmmSources
635641
^^^ availableSince CabalSpecV3_0 []
636-
<*> monoidalFieldAla "c-sources" (alaList' VCat SymbolicPathNT) L.cSources
637-
<*> monoidalFieldAla "cxx-sources" (alaList' VCat SymbolicPathNT) L.cxxSources
642+
<*> monoidalFieldAla "c-sources" formatExtraSources L.cSources
643+
<*> monoidalFieldAla "cxx-sources" formatExtraSources L.cxxSources
638644
^^^ availableSince CabalSpecV2_2 []
639-
<*> monoidalFieldAla "js-sources" (alaList' VCat SymbolicPathNT) L.jsSources
645+
<*> monoidalFieldAla "js-sources" formatExtraSources L.jsSources
640646
<*> hsSourceDirsGrammar
641647
<*> monoidalFieldAla "other-modules" formatOtherModules L.otherModules
642648
<*> monoidalFieldAla "virtual-modules" (alaList' VCat MQuoted) L.virtualModules
@@ -836,6 +842,9 @@ formatOtherExtensions = alaList' FSep MQuoted
836842
formatOtherModules :: [ModuleName] -> List VCat (MQuoted ModuleName) ModuleName
837843
formatOtherModules = alaList' VCat MQuoted
838844

845+
formatExtraSources :: [ExtraSource] -> List VCat (Identity ExtraSource) ExtraSource
846+
formatExtraSources = alaList' VCat Identity
847+
839848
-------------------------------------------------------------------------------
840849
-- newtypes
841850
-------------------------------------------------------------------------------

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

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import Prelude ()
2121

2222
import Distribution.Types.Dependency
2323
import Distribution.Types.ExeDependency
24+
import Distribution.Types.ExtraSource
2425
import Distribution.Types.LegacyExeDependency
2526
import Distribution.Types.Mixin
2627
import Distribution.Types.PkgconfigDependency
@@ -72,14 +73,17 @@ data BuildInfo = BuildInfo
7273
, frameworks :: [RelativePath Framework File]
7374
-- ^ support frameworks for Mac OS X
7475
, extraFrameworkDirs :: [SymbolicPath Pkg (Dir Framework)]
75-
-- ^ extra locations to find frameworks.
76-
, asmSources :: [SymbolicPath Pkg File]
77-
-- ^ Assembly files.
78-
, cmmSources :: [SymbolicPath Pkg File]
79-
-- ^ C-- files.
80-
, cSources :: [SymbolicPath Pkg File]
81-
, cxxSources :: [SymbolicPath Pkg File]
82-
, jsSources :: [SymbolicPath Pkg File]
76+
-- ^ extra locations to find frameworks
77+
, asmSources :: [ExtraSource]
78+
-- ^ Assembly source files
79+
, cmmSources :: [ExtraSource]
80+
-- ^ C-- source files
81+
, cSources :: [ExtraSource]
82+
-- ^ C source files
83+
, cxxSources :: [ExtraSource]
84+
-- ^ C++ source files
85+
, jsSources :: [ExtraSource]
86+
-- ^ JavaScript source file
8387
, hsSourceDirs :: [SymbolicPath Pkg (Dir Source)]
8488
-- ^ where to look for the Haskell module hierarchy
8589
, -- NB: these are symbolic paths are not relative paths,

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import Prelude ()
1313
import Distribution.Compiler (PerCompilerFlavor)
1414
import Distribution.ModuleName (ModuleName)
1515
import Distribution.Types.BuildInfo (BuildInfo)
16+
import Distribution.Types.ExtraSource (ExtraSource)
1617
import Distribution.Types.Dependency (Dependency)
1718
import Distribution.Types.ExeDependency (ExeDependency)
1819
import Distribution.Types.LegacyExeDependency (LegacyExeDependency)
@@ -83,23 +84,23 @@ class HasBuildInfo a where
8384
extraFrameworkDirs = buildInfo . extraFrameworkDirs
8485
{-# INLINE extraFrameworkDirs #-}
8586

86-
asmSources :: Lens' a [SymbolicPath Pkg File]
87+
asmSources :: Lens' a [ExtraSource]
8788
asmSources = buildInfo . asmSources
8889
{-# INLINE asmSources #-}
8990

90-
cmmSources :: Lens' a [SymbolicPath Pkg File]
91+
cmmSources :: Lens' a [ExtraSource]
9192
cmmSources = buildInfo . cmmSources
9293
{-# INLINE cmmSources #-}
9394

94-
cSources :: Lens' a [SymbolicPath Pkg File]
95+
cSources :: Lens' a [ExtraSource]
9596
cSources = buildInfo . cSources
9697
{-# INLINE cSources #-}
9798

98-
cxxSources :: Lens' a [SymbolicPath Pkg File]
99+
cxxSources :: Lens' a [ExtraSource]
99100
cxxSources = buildInfo . cxxSources
100101
{-# INLINE cxxSources #-}
101102

102-
jsSources :: Lens' a [SymbolicPath Pkg File]
103+
jsSources :: Lens' a [ExtraSource]
103104
jsSources = buildInfo . jsSources
104105
{-# INLINE jsSources #-}
105106

@@ -274,7 +275,7 @@ instance HasBuildInfo BuildInfo where
274275
cSources f s = fmap (\x -> s{T.cSources = x}) (f (T.cSources s))
275276
{-# INLINE cSources #-}
276277

277-
cxxSources f s = fmap (\x -> s{T.cSources = x}) (f (T.cxxSources s))
278+
cxxSources f s = fmap (\x -> s{T.cxxSources = x}) (f (T.cxxSources s))
278279
{-# INLINE cxxSources #-}
279280

280281
jsSources f s = fmap (\x -> s{T.jsSources = x}) (f (T.jsSources s))
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
{-# LANGUAGE DeriveDataTypeable #-}
2+
{-# LANGUAGE DeriveGeneric #-}
3+
{-# LANGUAGE DataKinds #-}
4+
5+
module Distribution.Types.ExtraSource
6+
( ExtraSource (..)
7+
, extraSourceFromPath
8+
) where
9+
10+
import Distribution.Compat.Prelude
11+
import Prelude ()
12+
13+
import Distribution.Parsec
14+
import Distribution.Pretty
15+
import Distribution.Utils.Path (SymbolicPath, FileOrDir(..), Pkg)
16+
17+
import qualified Distribution.Compat.CharParsing as P
18+
import qualified Text.PrettyPrint as PP
19+
import Distribution.FieldGrammar.Newtypes (SymbolicPathNT(..))
20+
21+
data ExtraSource = ExtraSource
22+
{ extraSourceFile :: SymbolicPath Pkg File
23+
, extraSourceOpts :: [String]
24+
}
25+
deriving (Generic, Show, Read, Eq, Ord, Typeable, Data)
26+
27+
instance Binary ExtraSource
28+
instance Structured ExtraSource
29+
instance NFData ExtraSource where rnf = genericRnf
30+
31+
instance Parsec ExtraSource where
32+
parsec = do
33+
SymbolicPathNT path <- parsec <* P.spaces
34+
opts <- P.optional (parensLax (P.sepBy p P.spaces))
35+
return (ExtraSource path (fromMaybe mempty opts))
36+
where
37+
p :: P.CharParsing p => p String
38+
p = some $ P.satisfy (\c -> not (isSpace c) && not (c == ')'))
39+
40+
parensLax :: (P.CharParsing m) => m a -> m a
41+
parensLax p = P.between (P.char '(' *> P.spaces) (P.char ')' *> P.spaces) p
42+
43+
instance Pretty ExtraSource where
44+
pretty (ExtraSource path opts) =
45+
pretty (SymbolicPathNT path) <<>> PP.parens (PP.hsep (map PP.text opts))
46+
47+
extraSourceFromPath :: SymbolicPath Pkg File -> ExtraSource
48+
extraSourceFromPath fp = ExtraSource fp mempty

Cabal-tests/tests/NoThunks.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{-# LANGUAGE CPP #-}
2+
{-# LANGUAGE FlexibleInstances #-}
23
#if !(__GLASGOW_HASKELL__ >= 806 && defined(MIN_VERSION_nothunks))
34
module Main (main) where
45
main :: IO ()
@@ -73,6 +74,7 @@ instance NoThunks ConfVar
7374
instance NoThunks Dependency
7475
instance NoThunks Executable
7576
instance NoThunks ExecutableScope
77+
instance NoThunks ExtraSource
7678
instance NoThunks FlagName
7779
instance NoThunks ForeignLib
7880
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-
0xc039c6741dead5203ad2b33bd3bf4dc8
32+
0xe6490e868f1f18e90046d07228c7034b
3333

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

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{-# OPTIONS_GHC -freduction-depth=0 #-}
22
{-# OPTIONS_GHC -Wno-orphans #-}
3+
{-# LANGUAGE FlexibleInstances #-}
34
module Data.TreeDiff.Instances.Cabal () where
45

56
import Data.TreeDiff
@@ -75,6 +76,7 @@ instance ToExpr ExeDependency
7576
instance ToExpr Executable
7677
instance ToExpr ExecutableScope
7778
instance ToExpr ExposedModule
79+
instance ToExpr ExtraSource
7880
instance ToExpr FlagAssignment
7981
instance ToExpr FlagName
8082
instance ToExpr ForeignLib

0 commit comments

Comments
 (0)