ref: a17402fee562ecbcd8b526e4ed7e8610d4f5b771
parent: 80f3f6aa81fddda5a9e1d36d6482e3cf863f16f5
author: Lennart Augustsson <lennart.augustsson@epicgames.com>
date: Fri Mar 29 11:34:52 EDT 2024
Better package naming.
--- a/MicroHs.cabal
+++ b/MicroHs.cabal
@@ -43,7 +43,7 @@
ghc-options: -Wall -Wno-unrecognised-warning-flags -Wno-x-partial -main-is MicroHs.Main
-fwrite-ide-info
main-is: MicroHs/Main.hs
- default-extensions: ScopedTypeVariables PatternGuards TypeSynonymInstances TupleSections MultiParamTypeClasses
+ default-extensions: ScopedTypeVariables PatternGuards TypeSynonymInstances MultiParamTypeClasses
FlexibleInstances BangPatterns
other-modules: MicroHs.Abstract
MicroHs.Compile
--- a/src/MicroHs/Main.hs
+++ b/src/MicroHs/Main.hs
@@ -3,6 +3,7 @@
{-# OPTIONS_GHC -Wno-unused-do-bind -Wno-unused-imports #-}module MicroHs.Main(main) where
import Prelude
+import Data.Char
import Data.List
import Control.DeepSeq
import Control.Monad
@@ -79,22 +80,30 @@
_ -> decodeArgs f (mdls ++ [arg]) args
mainBuildPkg :: Flags -> String -> [String] -> IO ()
-mainBuildPkg flags pkgn amns = do
+mainBuildPkg flags namever amns = do
when (verbose flags > 0) $
- putStrLn $ "Building package " ++ pkgn
+ putStrLn $ "Building package " ++ namever
let mns = map mkIdent amns
cash <- compileMany flags mns emptyCache
let mdls = getCompMdls cash
+ (name, ver) = splitNameVer namever
(exported, other) = partition ((`elem` mns) . tModuleName) mdls
- pkgDeps = map pkgName $ getPkgs cash
- pkg = Package { pkgName = mkIdent pkgn, pkgVersion = makeVersion [0]+ pkgDeps = map (\ p -> (pkgName p, pkgVersion p)) $ getPkgs cash
+ pkg = Package { pkgName = mkIdent name, pkgVersion = ver, pkgExported = exported, pkgOther = other
- , pkgDepends = map (,makeVersion [0]) pkgDeps }
+ , pkgDepends = pkgDeps }
print (map tModuleName $ pkgOther pkg)
when (verbose flags > 0) $
- putStrLn $ "Writing package " ++ pkgn ++ " to " ++ output flags
+ putStrLn $ "Writing package " ++ namever ++ " to " ++ output flags
writeSerializedCompressed (output flags) pkg
+splitNameVer :: String -> (String, Version)
+splitNameVer s =
+ case span (\ c -> isDigit c || c == '.') (reverse s) of
+ (rver, '-':rname) | is@(_:_) <- readVersion (reverse rver) -> (reverse rname, makeVersion is)
+ _ -> error $ "package name not of the form name-version:" ++ show s
+ where readVersion = map read . words . map (\ c -> if c == '.' then ' ' else c)
+
mainCompile :: Flags -> Ident -> IO ()
mainCompile flags mn = do
(rmn, allDefs) <-
@@ -169,9 +178,9 @@
putStrLn $ "Installing package " ++ pkgfn ++ " in " ++ dir
pkg <- readSerialized pkgfn
let pdir = dir ++ "/" ++ packageDir
- pkgfn' = dropSuffix pkgfn ++ packageSuffix
+ pkgout = unIdent (pkgName pkg) ++ "-" ++ showVersion (pkgVersion pkg) ++ packageSuffix
createDirectoryIfMissing True pdir
- copyFile pkgfn (pdir ++ "/" ++ pkgfn')
+ copyFile pkgfn (pdir ++ "/" ++ pkgout)
let mk tm = do
let fn = dir ++ "/" ++ moduleToFile (tModuleName tm)
d = dropWhileEnd (/= '/') fn
@@ -178,13 +187,7 @@
when (verbosityGT flags 1) $
putStrLn $ "create " ++ fn
createDirectoryIfMissing True d
- writeFile fn pkgfn
+ writeFile fn pkgout
mapM_ mk (pkgExported pkg)
mainInstallPackage flags [pkgfn] = mainInstallPackage flags [pkgfn, head (pkgPath flags)]
mainInstallPackage _ _ = error usage
-
-dropSuffix :: FilePath -> FilePath
-dropSuffix s =
- case dropWhileEnd (/= '.') s of
- [] -> s
- r -> r
--
⑨