Skip to content

Commit 1f2da2d

Browse files
committed
MicroHS support
1 parent 7da2987 commit 1f2da2d

File tree

6 files changed

+174
-0
lines changed

6 files changed

+174
-0
lines changed

Cabal/Cabal.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ library
163163
Distribution.Simple.Test.LibV09
164164
Distribution.Simple.Test.Log
165165
Distribution.Simple.UHC
166+
Distribution.Simple.MHS
166167
Distribution.Simple.UserHooks
167168
Distribution.Simple.SetupHooks.Errors
168169
Distribution.Simple.SetupHooks.Internal

Cabal/src/Distribution/Simple/Build.hs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ import Distribution.Package
7373
import qualified Distribution.Simple.GHC as GHC
7474
import qualified Distribution.Simple.GHCJS as GHCJS
7575
import qualified Distribution.Simple.PackageIndex as Index
76+
import qualified Distribution.Simple.MHS as MHS
7677
import qualified Distribution.Simple.UHC as UHC
7778

7879
import Distribution.Simple.Build.Macros (generateCabalMacrosHeader)
@@ -316,6 +317,7 @@ dumpBuildInfo verbosity distPref dumpBuildInfoFlag pkg_descr lbi flags = do
316317
flavorToProgram GHCJS = Just ghcjsProgram
317318
flavorToProgram UHC = Just uhcProgram
318319
flavorToProgram JHC = Just jhcProgram
320+
flavorToProgram MHS = Just mhsProgram
319321
flavorToProgram _ = Nothing
320322

321323
repl
@@ -974,6 +976,7 @@ buildLib flags numJobs pkg_descr lbi lib clbi =
974976
GHC -> GHC.buildLib flags numJobs pkg_descr lbi lib clbi
975977
GHCJS -> GHCJS.buildLib verbosity numJobs pkg_descr lbi lib clbi
976978
UHC -> UHC.buildLib verbosity pkg_descr lbi lib clbi
979+
MHS -> MHS.buildLib verbosity pkg_descr lbi lib clbi
977980
_ -> dieWithException verbosity BuildingNotSupportedWithCompiler
978981

979982
-- | Build a foreign library
@@ -1006,6 +1009,7 @@ buildExe verbosity numJobs pkg_descr lbi exe clbi =
10061009
GHC -> GHC.buildExe verbosity numJobs pkg_descr lbi exe clbi
10071010
GHCJS -> GHCJS.buildExe verbosity numJobs pkg_descr lbi exe clbi
10081011
UHC -> UHC.buildExe verbosity pkg_descr lbi exe clbi
1012+
MHS -> MHS.buildExe verbosity pkg_descr lbi exe clbi
10091013
_ -> dieWithException verbosity BuildingNotSupportedWithCompiler
10101014

10111015
replLib

Cabal/src/Distribution/Simple/Configure.hs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ import Distribution.Version
123123
import qualified Distribution.Simple.GHC as GHC
124124
import qualified Distribution.Simple.GHCJS as GHCJS
125125
import qualified Distribution.Simple.UHC as UHC
126+
import qualified Distribution.Simple.MHS as MHS
126127

127128
import Control.Exception
128129
( try
@@ -2071,6 +2072,7 @@ getInstalledPackages verbosity comp mbWorkDir packageDBs progdb = do
20712072
GHC -> GHC.getInstalledPackages verbosity comp mbWorkDir packageDBs' progdb
20722073
GHCJS -> GHCJS.getInstalledPackages verbosity mbWorkDir packageDBs' progdb
20732074
UHC -> UHC.getInstalledPackages verbosity comp mbWorkDir packageDBs' progdb
2075+
MHS -> MHS.getInstalledPackages verbosity comp mbWorkDir packageDBs' progdb
20742076
flv ->
20752077
dieWithException verbosity $ HowToFindInstalledPackages flv
20762078
where
@@ -2504,6 +2506,7 @@ configCompilerEx (Just hcFlavor) hcPath hcPkg progdb verbosity = do
25042506
GHC -> GHC.configure verbosity hcPath hcPkg progdb
25052507
GHCJS -> GHCJS.configure verbosity hcPath hcPkg progdb
25062508
UHC -> UHC.configure verbosity hcPath progdb
2509+
MHS -> MHS.configure verbosity hcPath progdb
25072510
_ -> dieWithException verbosity UnknownCompilerException
25082511
return (comp, fromMaybe buildPlatform maybePlatform, programDb)
25092512

@@ -2524,6 +2527,7 @@ configCompiler mbFlavor hcPath progdb verbosity = do
25242527
GHC -> GHC.configureCompiler verbosity hcPath progdb
25252528
GHCJS -> GHCJS.configureCompiler verbosity hcPath progdb
25262529
UHC -> UHC.configure verbosity hcPath progdb
2530+
MHS -> MHS.configure verbosity hcPath progdb
25272531
_ -> dieWithException verbosity UnknownCompilerException
25282532
return (comp, fromMaybe buildPlatform maybePlatform, programDb)
25292533

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
{-# LANGUAGE FlexibleContexts #-}
2+
{-# LANGUAGE RankNTypes #-}
3+
{-# LANGUAGE DataKinds #-}
4+
5+
-----------------------------------------------------------------------------
6+
7+
-- |
8+
-- Module : Distribution.Simple.MHS
9+
-- Copyright : Cabal Devs 2026
10+
-- License : BSD3
11+
--
12+
-- Maintainer : [email protected]
13+
-- Portability : portable
14+
--
15+
-- This module contains most of the MHS-specific code for configuring, building
16+
-- and installing packages.
17+
18+
module Distribution.Simple.MHS
19+
( configure
20+
, getInstalledPackages
21+
, buildLib
22+
, buildExe
23+
, installLib
24+
, registerPackage
25+
) where
26+
27+
import Distribution.Compat.Prelude
28+
import Prelude ()
29+
30+
import Distribution.InstalledPackageInfo
31+
import Distribution.PackageDescription
32+
import Distribution.Pretty
33+
import Distribution.Simple.Compiler
34+
import Distribution.Simple.LocalBuildInfo
35+
import Distribution.Simple.Program
36+
import Distribution.Simple.Utils
37+
import Distribution.Utils.Path
38+
import Distribution.Verbosity
39+
import qualified Data.Map as Map (empty)
40+
import Distribution.System (Platform)
41+
import Distribution.Version (mkVersion, orLaterVersion)
42+
import Language.Haskell.Extension
43+
import Distribution.Simple.PackageIndex (InstalledPackageIndex)
44+
import qualified Distribution.Simple.PackageIndex as PackageIndex
45+
46+
-- -----------------------------------------------------------------------------
47+
-- Configuring
48+
49+
configure
50+
:: Verbosity
51+
-> Maybe FilePath
52+
-> ProgramDb
53+
-> IO (Compiler, Maybe Platform, ProgramDb)
54+
configure verbosity hcPath progdb = do
55+
(_mhsProg, mhsVersion, progdb') <-
56+
requireProgramVersion
57+
verbosity
58+
mhsProgram
59+
(orLaterVersion (mkVersion [0, 10, 0]))
60+
(userMaybeSpecifyPath "mhs" hcPath progdb)
61+
62+
let comp =
63+
Compiler
64+
{ compilerId = CompilerId MHS mhsVersion
65+
, compilerAbiTag = NoAbiTag
66+
, compilerCompat = []
67+
, compilerLanguages = mhsLanguages
68+
, compilerExtensions = mhsLanguageExtensions
69+
, compilerProperties = Map.empty
70+
, compilerWiredInUnitIds = Nothing
71+
}
72+
compPlatform = Nothing
73+
info verbosity $ "MHS configured with languages: " ++ show (map fst mhsLanguages)
74+
return (comp, compPlatform, progdb')
75+
76+
mhsLanguages :: [(Language, CompilerFlag)]
77+
mhsLanguages = [(Haskell2010, ""), (Haskell98, "")] -- MHS docs say it supports 2010 but 98 should be fine too
78+
79+
mhsLanguageExtensions :: [(Extension, Maybe CompilerFlag)]
80+
mhsLanguageExtensions =
81+
[
82+
-- TODO: use the list from the MHS documentation
83+
]
84+
85+
getInstalledPackages
86+
:: Verbosity
87+
-> Compiler
88+
-> Maybe (SymbolicPath CWD (Dir from))
89+
-> PackageDBStackX (SymbolicPath from (Dir PkgDB))
90+
-> ProgramDb
91+
-> IO InstalledPackageIndex
92+
getInstalledPackages _verbosity _comp _mbWorkDir _packagedbs _progdb =
93+
return (PackageIndex.fromList [])
94+
95+
-- -----------------------------------------------------------------------------
96+
-- Building
97+
98+
buildLib
99+
:: Verbosity
100+
-> PackageDescription
101+
-> LocalBuildInfo
102+
-> Library
103+
-> ComponentLocalBuildInfo
104+
-> IO ()
105+
buildLib _verbosity _pkg_descr _lbi _lib _clbi = return ()
106+
107+
buildExe
108+
:: Verbosity
109+
-> PackageDescription
110+
-> LocalBuildInfo
111+
-> Executable
112+
-> ComponentLocalBuildInfo
113+
-> IO ()
114+
buildExe verbosity _pkg_descr lbi exe _clbi = do
115+
let runMhsProg = runDbProgramCwd verbosity (mbWorkDirLBI lbi) mhsProgram (withPrograms lbi)
116+
117+
let mbWorkDir = mbWorkDirLBI lbi
118+
srcMainPath <- findFileCwd verbosity mbWorkDir (hsSourceDirs $ buildInfo exe) (modulePath exe)
119+
120+
let odir = buildDir lbi
121+
u = interpretSymbolicPathCWD
122+
123+
mhsArgs =
124+
["-i" ++ u d | d <- hsSourceDirs (buildInfo exe)]
125+
++ ["-o", u $ odir </> makeRelativePathEx (prettyShow (exeName exe))]
126+
++ [u srcMainPath]
127+
128+
runMhsProg mhsArgs
129+
130+
-- -----------------------------------------------------------------------------
131+
-- Installation
132+
133+
installLib
134+
:: Verbosity
135+
-> LocalBuildInfo
136+
-> FilePath
137+
-> FilePath
138+
-> FilePath
139+
-> PackageDescription
140+
-> Library
141+
-> ComponentLocalBuildInfo
142+
-> IO ()
143+
installLib _verbosity _lbi _targetDir _dynlibTargetDir _builtDir _pkg _library _clbi = return ()
144+
145+
-- -----------------------------------------------------------------------------
146+
-- Registering
147+
148+
registerPackage
149+
:: Verbosity
150+
-> Maybe (SymbolicPath CWD (Dir from))
151+
-> Compiler
152+
-> ProgramDb
153+
-> PackageDBStackS from
154+
-> InstalledPackageInfo
155+
-> IO ()
156+
registerPackage _verbosity _mbWorkDir _comp _progdb _packageDbs _installedPkgInfo = return ()

Cabal/src/Distribution/Simple/Program.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ module Distribution.Simple.Program
113113
, ghcjsPkgProgram
114114
, jhcProgram
115115
, uhcProgram
116+
, mhsProgram
116117
, gccProgram
117118
, gppProgram
118119
, arProgram

Cabal/src/Distribution/Simple/Program/Builtin.hs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ module Distribution.Simple.Program.Builtin
2222
, ghcjsPkgProgram
2323
, jhcProgram
2424
, uhcProgram
25+
, mhsProgram
2526
, gccProgram
2627
, gppProgram
2728
, arProgram
@@ -76,6 +77,7 @@ builtinPrograms =
7677
, ghcjsPkgProgram
7778
, jhcProgram
7879
, uhcProgram
80+
, mhsProgram
7981
, hpcProgram
8082
, -- preprocessors
8183
hscolourProgram
@@ -196,6 +198,12 @@ uhcProgram =
196198
{ programFindVersion = findProgramVersion "--version-dotted" id
197199
}
198200

201+
mhsProgram :: Program
202+
mhsProgram =
203+
(simpleProgram "mhs")
204+
{ programFindVersion = findProgramVersion "--numeric-version" id
205+
}
206+
199207
hpcProgram :: Program
200208
hpcProgram =
201209
(simpleProgram "hpc")

0 commit comments

Comments
 (0)