Skip to content
Draft
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
1 change: 1 addition & 0 deletions Cabal/Cabal.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ library
Distribution.Simple.Test.LibV09
Distribution.Simple.Test.Log
Distribution.Simple.UHC
Distribution.Simple.MHS
Distribution.Simple.UserHooks
Distribution.Simple.SetupHooks.Errors
Distribution.Simple.SetupHooks.Internal
Expand Down
4 changes: 4 additions & 0 deletions Cabal/src/Distribution/Simple/Build.hs
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ import Distribution.Package
import qualified Distribution.Simple.GHC as GHC
import qualified Distribution.Simple.GHCJS as GHCJS
import qualified Distribution.Simple.PackageIndex as Index
import qualified Distribution.Simple.MHS as MHS
import qualified Distribution.Simple.UHC as UHC

import Distribution.Simple.Build.Macros (generateCabalMacrosHeader)
Expand Down Expand Up @@ -316,6 +317,7 @@ dumpBuildInfo verbosity distPref dumpBuildInfoFlag pkg_descr lbi flags = do
flavorToProgram GHCJS = Just ghcjsProgram
flavorToProgram UHC = Just uhcProgram
flavorToProgram JHC = Just jhcProgram
flavorToProgram MHS = Just mhsProgram
flavorToProgram _ = Nothing

repl
Expand Down Expand Up @@ -974,6 +976,7 @@ buildLib flags numJobs pkg_descr lbi lib clbi =
GHC -> GHC.buildLib flags numJobs pkg_descr lbi lib clbi
GHCJS -> GHCJS.buildLib verbosity numJobs pkg_descr lbi lib clbi
UHC -> UHC.buildLib verbosity pkg_descr lbi lib clbi
MHS -> MHS.buildLib verbosity pkg_descr lbi lib clbi
_ -> dieWithException verbosity BuildingNotSupportedWithCompiler

-- | Build a foreign library
Expand Down Expand Up @@ -1006,6 +1009,7 @@ buildExe verbosity numJobs pkg_descr lbi exe clbi =
GHC -> GHC.buildExe verbosity numJobs pkg_descr lbi exe clbi
GHCJS -> GHCJS.buildExe verbosity numJobs pkg_descr lbi exe clbi
UHC -> UHC.buildExe verbosity pkg_descr lbi exe clbi
MHS -> MHS.buildExe verbosity pkg_descr lbi exe clbi
_ -> dieWithException verbosity BuildingNotSupportedWithCompiler

replLib
Expand Down
4 changes: 4 additions & 0 deletions Cabal/src/Distribution/Simple/Configure.hs
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ import Distribution.Version
import qualified Distribution.Simple.GHC as GHC
import qualified Distribution.Simple.GHCJS as GHCJS
import qualified Distribution.Simple.UHC as UHC
import qualified Distribution.Simple.MHS as MHS

import Control.Exception
( try
Expand Down Expand Up @@ -2071,6 +2072,7 @@ getInstalledPackages verbosity comp mbWorkDir packageDBs progdb = do
GHC -> GHC.getInstalledPackages verbosity comp mbWorkDir packageDBs' progdb
GHCJS -> GHCJS.getInstalledPackages verbosity mbWorkDir packageDBs' progdb
UHC -> UHC.getInstalledPackages verbosity comp mbWorkDir packageDBs' progdb
MHS -> MHS.getInstalledPackages verbosity comp mbWorkDir packageDBs' progdb
flv ->
dieWithException verbosity $ HowToFindInstalledPackages flv
where
Expand Down Expand Up @@ -2504,6 +2506,7 @@ configCompilerEx (Just hcFlavor) hcPath hcPkg progdb verbosity = do
GHC -> GHC.configure verbosity hcPath hcPkg progdb
GHCJS -> GHCJS.configure verbosity hcPath hcPkg progdb
UHC -> UHC.configure verbosity hcPath progdb
MHS -> MHS.configure verbosity hcPath progdb
_ -> dieWithException verbosity UnknownCompilerException
return (comp, fromMaybe buildPlatform maybePlatform, programDb)

Expand All @@ -2524,6 +2527,7 @@ configCompiler mbFlavor hcPath progdb verbosity = do
GHC -> GHC.configureCompiler verbosity hcPath progdb
GHCJS -> GHCJS.configureCompiler verbosity hcPath progdb
UHC -> UHC.configure verbosity hcPath progdb
MHS -> MHS.configure verbosity hcPath progdb
_ -> dieWithException verbosity UnknownCompilerException
return (comp, fromMaybe buildPlatform maybePlatform, programDb)

Expand Down
156 changes: 156 additions & 0 deletions Cabal/src/Distribution/Simple/MHS.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE DataKinds #-}

-----------------------------------------------------------------------------

-- |
-- Module : Distribution.Simple.MHS
-- Copyright : Cabal Devs 2026
-- License : BSD3
--
-- Maintainer : cabal-devel@haskell.org
-- Portability : portable
--
-- This module contains most of the MHS-specific code for configuring, building
-- and installing packages.

module Distribution.Simple.MHS
( configure
, getInstalledPackages
, buildLib
, buildExe
, installLib
, registerPackage
) where

import Distribution.Compat.Prelude
import Prelude ()

import Distribution.InstalledPackageInfo
import Distribution.PackageDescription
import Distribution.Pretty
import Distribution.Simple.Compiler
import Distribution.Simple.LocalBuildInfo
import Distribution.Simple.Program
import Distribution.Simple.Utils
import Distribution.Utils.Path
import Distribution.Verbosity
import qualified Data.Map as Map (empty)
import Distribution.System (Platform)
import Distribution.Version (mkVersion, orLaterVersion)
import Language.Haskell.Extension
import Distribution.Simple.PackageIndex (InstalledPackageIndex)
import qualified Distribution.Simple.PackageIndex as PackageIndex

-- -----------------------------------------------------------------------------
-- Configuring

configure
:: Verbosity
-> Maybe FilePath
-> ProgramDb
-> IO (Compiler, Maybe Platform, ProgramDb)
configure verbosity hcPath progdb = do
(_mhsProg, mhsVersion, progdb') <-
requireProgramVersion
verbosity
mhsProgram
(orLaterVersion (mkVersion [0, 10, 0]))
(userMaybeSpecifyPath "mhs" hcPath progdb)

let comp =
Compiler
{ compilerId = CompilerId MHS mhsVersion
, compilerAbiTag = NoAbiTag
, compilerCompat = []
, compilerLanguages = mhsLanguages
, compilerExtensions = mhsLanguageExtensions
, compilerProperties = Map.empty
, compilerWiredInUnitIds = Nothing
}
compPlatform = Nothing
info verbosity $ "MHS configured with languages: " ++ show (map fst mhsLanguages)
return (comp, compPlatform, progdb')

mhsLanguages :: [(Language, CompilerFlag)]
mhsLanguages = [(Haskell2010, ""), (Haskell98, "")] -- MHS docs say it supports 2010 but 98 should be fine too

mhsLanguageExtensions :: [(Extension, Maybe CompilerFlag)]
mhsLanguageExtensions =
[
-- TODO: use the list from the MHS documentation
]

getInstalledPackages
:: Verbosity
-> Compiler
-> Maybe (SymbolicPath CWD (Dir from))
-> PackageDBStackX (SymbolicPath from (Dir PkgDB))
-> ProgramDb
-> IO InstalledPackageIndex
getInstalledPackages _verbosity _comp _mbWorkDir _packagedbs _progdb =
return (PackageIndex.fromList [])

-- -----------------------------------------------------------------------------
-- Building

buildLib
:: Verbosity
-> PackageDescription
-> LocalBuildInfo
-> Library
-> ComponentLocalBuildInfo
-> IO ()
buildLib _verbosity _pkg_descr _lbi _lib _clbi = return ()

buildExe
:: Verbosity
-> PackageDescription
-> LocalBuildInfo
-> Executable
-> ComponentLocalBuildInfo
-> IO ()
buildExe verbosity _pkg_descr lbi exe _clbi = do
let runMhsProg = runDbProgramCwd verbosity (mbWorkDirLBI lbi) mhsProgram (withPrograms lbi)

let mbWorkDir = mbWorkDirLBI lbi
srcMainPath <- findFileCwd verbosity mbWorkDir (hsSourceDirs $ buildInfo exe) (modulePath exe)

let odir = buildDir lbi
u = interpretSymbolicPathCWD

mhsArgs =
["-i" ++ u d | d <- hsSourceDirs (buildInfo exe)]
++ ["-o", u $ odir </> makeRelativePathEx (prettyShow (exeName exe))]
++ [u srcMainPath]

runMhsProg mhsArgs

-- -----------------------------------------------------------------------------
-- Installation

installLib
:: Verbosity
-> LocalBuildInfo
-> FilePath
-> FilePath
-> FilePath
-> PackageDescription
-> Library
-> ComponentLocalBuildInfo
-> IO ()
installLib _verbosity _lbi _targetDir _dynlibTargetDir _builtDir _pkg _library _clbi = return ()

-- -----------------------------------------------------------------------------
-- Registering

registerPackage
:: Verbosity
-> Maybe (SymbolicPath CWD (Dir from))
-> Compiler
-> ProgramDb
-> PackageDBStackS from
-> InstalledPackageInfo
-> IO ()
registerPackage _verbosity _mbWorkDir _comp _progdb _packageDbs _installedPkgInfo = return ()
1 change: 1 addition & 0 deletions Cabal/src/Distribution/Simple/Program.hs
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ module Distribution.Simple.Program
, ghcjsPkgProgram
, jhcProgram
, uhcProgram
, mhsProgram
, gccProgram
, gppProgram
, arProgram
Expand Down
8 changes: 8 additions & 0 deletions Cabal/src/Distribution/Simple/Program/Builtin.hs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ module Distribution.Simple.Program.Builtin
, ghcjsPkgProgram
, jhcProgram
, uhcProgram
, mhsProgram
, gccProgram
, gppProgram
, arProgram
Expand Down Expand Up @@ -76,6 +77,7 @@ builtinPrograms =
, ghcjsPkgProgram
, jhcProgram
, uhcProgram
, mhsProgram
, hpcProgram
, -- preprocessors
hscolourProgram
Expand Down Expand Up @@ -196,6 +198,12 @@ uhcProgram =
{ programFindVersion = findProgramVersion "--version-dotted" id
}

mhsProgram :: Program
mhsProgram =
(simpleProgram "mhs")
{ programFindVersion = findProgramVersion "--numeric-version" id
}

hpcProgram :: Program
hpcProgram =
(simpleProgram "hpc")
Expand Down
Loading