aboutsummaryrefslogtreecommitdiff
path: root/src/CabalHelper/Shared/InterfaceTypes.hs
blob: 87536a5a5c9ba178d5a4e46c2c185b4f0727d7c6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
-- cabal-helper: Simple interface to Cabal's configuration state
-- Copyright (C) 2015-2018  Daniel Gröber <cabal-helper@dxld.at>
--
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program.  If not, see <http://www.gnu.org/licenses/>.

{-# LANGUAGE DeriveGeneric, DeriveDataTypeable, DefaultSignatures #-}

{-|
Module      : CabalHelper.Shared.InterfaceTypes
Description : Types which are used by c-h library and executable to communicate
License     : GPL-3

These types are used to communicate between the cabal-helper library and helper
executable, using Show/Read. If any types in this module change the major
version must be bumped since this will be exposed in the @Distribution.Helper@
module.

The cached executables in @$XDG_CACHE_HOME/cabal-helper@ use the cabal-helper
version (among other things) as a cache key so we don't need to worry about
talking to an old executable.
-}
module CabalHelper.Shared.InterfaceTypes where

import GHC.Generics
import Data.Version
import Data.Map.Strict (Map)

data ChResponse
    = ChResponseComponentsInfo (Map ChComponentName ChComponentInfo)
    | ChResponseList           [String]
    | ChResponsePkgDbs         [ChPkgDb]
    | ChResponseLbi            String
    | ChResponseVersion        (String, Version)
    | ChResponseLicenses       [(String, [(String, Version)])]
    | ChResponseFlags          [(String, Bool)]
  deriving (Eq, Ord, Read, Show, Generic)

data ChComponentName = ChSetupHsName
                     | ChLibName ChLibraryName
                     | ChFLibName String
                     | ChExeName String
                     | ChTestName String
                     | ChBenchName String
  deriving (Eq, Ord, Read, Show, Generic)

data ChLibraryName = ChMainLibName
                   | ChSubLibName String
  deriving (Eq, Ord, Read, Show, Generic)

newtype ChModuleName = ChModuleName { unChModuleName :: String }
    deriving (Eq, Ord, Read, Show, Generic)

data ChComponentInfo = ChComponentInfo
    { ciComponentName         :: ChComponentName
    -- ^ The component\'s type and name

    , ciGhcOptions            :: [String]
    -- ^ Full set of GHC options, ready for loading this component into GHCi.

    , ciGhcSrcOptions         :: [String]
    -- ^ Only search path related GHC options.

    , ciGhcPkgOptions         :: [String]
    -- ^ Only package related GHC options, sufficient for things don't need to
    -- access any home modules.

    , ciGhcLangOptions        :: [String]
    -- ^ Only Haskell language extension related options, i.e. @-XSomeExtension@

    , ciSourceDirs            :: [String]
    -- ^ A component's @hs-source-dirs@ field, note that this only contains the
    -- directories specified by the cabal file, however cabal also adds the
    -- output directory of preprocessors to GHC's search path when
    -- building. TODO: make this easier to use.

    , ciEntrypoints           :: ChEntrypoint
    -- ^ Modules or files Cabal would have the compiler build directly. Can be
    -- used to compute the home module closure for a component.

    , ciNeedsBuildOutput      :: NeedsBuildOutput
    -- ^ If a component has a non-default module renaming (backpack) it cannot
    -- be built in memory and instead needs proper build output.
    -- TODO: This is a ghc-mod legacy thing and has to be removed
    } deriving (Eq, Ord, Read, Show)

-- TODO: we know the source-dir now so we can resolve ChSetupEntrypoint
-- internally
data ChEntrypoint = ChSetupEntrypoint -- ^ Almost like 'ChExeEntrypoint' but
                                      -- @main-is@ could either be @"Setup.hs"@
                                      -- or @"Setup.lhs"@. Since we don't know
                                      -- where the source directory is you have
                                      -- to find these files.
                  | ChLibEntrypoint { chExposedModules :: [ChModuleName]
                                    , chOtherModules   :: [ChModuleName]
                                    , chSignatures     :: [ChModuleName] -- backpack only
                                    }
                  | ChExeEntrypoint { chMainIs         :: FilePath
                                    , chOtherModules   :: [ChModuleName]
                                    } deriving (Eq, Ord, Read, Show, Generic)

data ChPkgDb = ChPkgGlobal
             | ChPkgUser
             | ChPkgSpecific FilePath
               deriving (Eq, Ord, Read, Show, Generic)

data NeedsBuildOutput = ProduceBuildOutput | NoBuildOutput
               deriving (Eq, Ord, Read, Show, Generic)