shithub: MicroHs

Download patch

ref: 6e642424b9080214e3ddf09d761a07938cb4a50d
parent: aa42c0ef8a45a3d912864e26c1d5939135e0badd
author: Lennart Augustsson <lennart.augustsson@epicgames.com>
date: Mon Jul 29 17:15:58 EDT 2024

Make it possible to install mhs in ~/.mcabal/bin and use base package.

--- a/Makefile
+++ b/Makefile
@@ -21,7 +21,8 @@
 GHCPROF= # -prof -fprof-late #-prof -fprof-auto
 GHCFLAGS= $(GHCEXTS) $(GHCINCS) $(GHCWARNS) $(GHCOPTS) $(GHCTOOL) $(GHCPKGS) $(GHCOUT) $(GHCPROF)
 #
-MHSINC= -i -isrc -ilib -ipaths -ilib/simple-readline
+MHSINCNP= -i -imhs -isrc -ilib -ilib/simple-readline
+MHSINC=$(MHSINCNP) -ipaths 
 #
 .PHONY:	clean bootstrap install ghcgen newmhs cachelib timecompile exampletest cachetest runtest runtestmhs everytest everytestmhs nfibtest info
 
@@ -132,7 +133,7 @@
 
 #
 clean:
-	rm -rf src/*/*.hi src/*/*.o *.comb *.tmp *~ bin/* a.out $(GHCOUTDIR) tmp/* Tools/*.o Tools/*.hi dist-newstyle generated/*-stage* .mhscache targets.conf .mhscache
+	rm -rf src/*/*.hi src/*/*.o *.comb *.tmp *~ bin/* a.out $(GHCOUTDIR) tmp/* Tools/*.o Tools/*.hi dist-newstyle generated/*-stage* .mhscache targets.conf .mhscache mdist dist-mcabal
 	make clean -f Makefile.emscripten
 	cd tests; make clean
 	-cabal clean
@@ -182,3 +183,32 @@
 
 emscripten: bin/mhs targets.conf
 	make test -f Makefile.emscripten
+
+######
+
+VERSION=0.9.15.0
+MCABAL=$(HOME)/.mcabal
+MCABALMHS=$(MCABAL)/mhs-$(VERSION)
+MCABALMHSMHS=$(MCABALMHS)/mhs-$(VERSION)
+MDATA=$(MCABALMHSMHS)/data
+MRUNTIME=$(MDATA)/src/runtime
+MCABALBIN=$(MCABAL)/bin
+MDIST=mdist
+BASE=base-$(VERSION)
+BASEMODULES=Control.Applicative Control.Arrow Control.DeepSeq Control.Error Control.Exception Control.Exception.Internal Control.Monad Control.Monad.Fail Control.Monad.ST Control.Monad.ST_Type Data.Array Data.Bits Data.Bool Data.Bool_Type Data.Bounded Data.Char Data.Char_Type Data.Complex Data.Constraint Data.Double Data.Dynamic Data.Either Data.Enum Data.Eq Data.Float Data.FloatW Data.Floating Data.Foldable Data.Fractional Data.Function Data.Functor Data.Functor.Const Data.Functor.Identity Data.IOArray Data.IORef Data.Int Data.Int.Instances Data.Int.IntN Data.Integer Data.Integer_Type Data.Integral Data.Ix Data.List Data.List.NonEmpty Data.List_Type Data.Maybe Data.Maybe_Type Data.Monoid Data.Num Data.Ord Data.Ordering_Type Data.Proxy Data.Ratio Data.Ratio_Type Data.Real Data.RealFloat Data.RealFrac Data.Records Data.STRef Data.Semigroup Data.String Data.Time.Clock Data.Time.Format Data.Traversable Data.Tuple Data.Type.Equality Data.TypeLits Data.Typeable Data.Version Data.Void Data.Word Data.ZipList Debug.Trace Foreign.C.String Foreign.C.Types Foreign.ForeignPtr Foreign.Marshal.Alloc Foreign.Marshal.Array Foreign.Marshal.Utils Foreign.Ptr Foreign.Storable GHC.Stack GHC.Types Numeric Numeric.FormatFloat Numeric.Natural Prelude Primitives System.Cmd System.Compress System.Directory System.Environment System.Exit System.IO System.IO.MD5 System.IO.PrintOrRun System.IO.Serialize System.IO.TimeMilli System.IO.Unsafe System.IO_Handle System.Info System.Process Text.Printf Text.Read Text.Read.Lex Text.Read.Numeric Text.Show TimeCompat Unsafe.Coerce
+
+$(MCABALBIN)/mhs: bin/mhs
+	@mkdir -p $(MCABALBIN)
+	@mkdir -p $(MDIST)
+	@echo 'module Paths_MicroHs where {import Data.Version; version :: Version; version = makeVersion [0,9,15,0]; getDataDir :: IO FilePath; getDataDir = return "$(MDATA)" }' > $(MDIST)/Paths_MicroHs.hs
+	bin/mhs -z $(MHSINCNP) -i$(MDIST) MicroHs.Main -o$(MCABALBIN)/mhs
+
+$(MCABALMHS)/packages/$(BASE).pkg: bin/mhs lib/*.hs
+	@mkdir -p $(MRUNTIME)
+	cp src/runtime/*.[ch] $(MRUNTIME)
+	@echo $$PATH | tr ':' '\012' | grep -q $(MCABALBIN) || echo '***' Add $(MCABALBIN) to the PATH
+	bin/mhs -P$(BASE) -o$(BASE).pkg -ilib $(BASEMODULES)
+	bin/mhs -Q -a -a$(MCABALMHS) $(BASE).pkg
+	@rm $(BASE).pkg
+
+installmcabal: bin/mhs $(MCABAL)/bin/mhs $(MCABALMHS)/packages/$(BASE).pkg
--- a/MicroHs.cabal
+++ b/MicroHs.cabal
@@ -25,6 +25,7 @@
       ghc/**/*.hs
       lib/**/*.hs
       lib/**/*.hs-boot
+      mhs/*.hs
       paths/Paths_MicroHs.hs
       src/runtime/*.c
       src/runtime/*.h
--- a/lib/Compat.hs
+++ /dev/null
@@ -1,5 +1,0 @@
--- Copyright 2023 Lennart Augustsson
--- See LICENSE file for full license.
-module Compat() where
-import Prelude()              -- do not import Prelude
--- So we can import Compat, which is full of stuff for GHC.
--- a/lib/PrimTable.hs
+++ /dev/null
@@ -1,4 +1,0 @@
--- Copyright 2023 Lennart Augustsson
--- See LICENSE file for full license.
-module PrimTable() where
-import Prelude()              -- do not import Prelude
--- a/lib/libs.cabal
+++ b/lib/libs.cabal
@@ -21,7 +21,6 @@
         Control.Monad
         Control.Monad.Fail
         Control.Monad.ST
-        Control.Monad.State.Strict
         Data.Bits
         Data.Bool
         Data.Bounded
--- /dev/null
+++ b/mhs/Compat.hs
@@ -1,0 +1,5 @@
+-- Copyright 2023 Lennart Augustsson
+-- See LICENSE file for full license.
+module Compat() where
+import Prelude()              -- do not import Prelude
+-- So we can import Compat, which is full of stuff for GHC.
--- /dev/null
+++ b/mhs/PrimTable.hs
@@ -1,0 +1,4 @@
+-- Copyright 2023 Lennart Augustsson
+-- See LICENSE file for full license.
+module PrimTable() where
+import Prelude()              -- do not import Prelude
--- a/src/MicroHs/Compile.hs
+++ b/src/MicroHs/Compile.hs
@@ -356,7 +356,7 @@
 loadPkg :: Flags -> FilePath -> StateIO Cache ()
 loadPkg flags fn = do
   when (loading flags || verbosityGT flags 0) $
-    liftIO $ putStrLn $ "loading package " ++ fn
+    liftIO $ putStrLn $ "Loading package " ++ fn
   pkg <- liftIO $ readSerialized fn
   modify $ addPackage pkg
 
--- a/src/MicroHs/FFI.hs
+++ b/src/MicroHs/FFI.hs
@@ -14,7 +14,7 @@
       wrappers = [ t | (ImpWrapper, t) <- ffiImports]
       dynamics = [ t | (ImpDynamic, t) <- ffiImports]
       includes = "mhsffi.h" : catMaybes [ inc | (ImpStatic inc _addr _name, _) <- ffiImports ]
-      addrs    = [ (name, t) | (ImpStatic _inc True  name, t) <- ffiImports ]
+      addrs    = [ (name, t) | (ImpStatic _inc True  name, t) <- ffiImports, name `notElem` runtimeFFI ]
       funcs    = [ (name, t) | (ImpStatic _inc False name, t) <- ffiImports, name `notElem` runtimeFFI ]
       funcs'   = uniqFst funcs
       addrs'   = uniqFst addrs
--- a/src/MicroHs/Flags.hs
+++ b/src/MicroHs/Flags.hs
@@ -19,7 +19,7 @@
   installPkg :: Bool,       -- install a package
   target     :: String      -- Compile target defined in target.conf
   }
-  -- deriving (Show)
+  deriving (Show)
 
 verbosityGT :: Flags -> Int -> Bool
 verbosityGT flags v = verbose flags > v
--- a/src/MicroHs/Main.hs
+++ b/src/MicroHs/Main.hs
@@ -41,13 +41,15 @@
 main = do
   args <- getArgs
   dir <- getMhsDir
-  home <- getHomeDirectory
+  dataDir <- getDataDir
   case args of
    ["--version"] -> putStrLn $ "MicroHs, version " ++ mhsVersion ++ ", combinator file version " ++ combVersion
    ["--numeric-version"] -> putStrLn mhsVersion
    _ -> do
-    let dflags = (defaultFlags dir){ pkgPath = [home ++ "/.mcabal/mhs-" ++ mhsVersion] }
+    let dflags = (defaultFlags dir){ pkgPath = pkgPaths }
         (flags, mdls, rargs) = decodeArgs dflags [] args
+        pkgPaths | dir == dataDir && dir /= "." = [dataDir ++ "/../.."]  -- This is a bit ugly
+                 | otherwise                    = []                     -- No package search path
     case listPkg flags of
       Just p -> mainListPkg flags p
       Nothing ->
@@ -55,7 +57,9 @@
           Just p -> mainBuildPkg flags p mdls
           Nothing ->
             if installPkg flags then mainInstallPackage flags mdls else
-            withArgs rargs $
+            withArgs rargs $ do
+              when (verbosityGT flags 0) $
+                putStrLn $ "flags = " ++ show flags
               case mdls of
                 []  -> mainInteractive flags
                 [s] -> mainCompile flags (mkIdentSLoc (SLoc "command-line" 0 0) s)
--