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
119
120
121
122
123
124
125
126
127
128
|
module clpm
from StdFunc import flip, o
import StdFile
import StdList
import StdOverloaded
import StdString
import StdTuple
import Control.Applicative
import Control.Monad
import Data.Error
from Data.Func import $
import Data.Functor
import Data.Maybe
import Data.Tuple
from Text import instance + String
import Text.JSON
import System.CommandLine
import System.Directory
import System.File
import CLPM.Package
import CLPM.Repository
:: Action
= NoAction
| Install
| Make
:: Arguments
= { package_file :: String
, action :: Action
, repository :: String
, clm_options :: [String]
}
instance zero Arguments
where
zero
= { package_file = PACKAGE_FILE
, action = NoAction
, repository = REPOSITORY
, clm_options = []
}
Start w
# (io,w) = stdio w
# ((missed, args), w) = appFst (parseArgs [] zero o tl) $ getCommandLine w
| not (isEmpty missed)
# io = foldr (flip (<<<)) io ["Unknown option: " + m + "\n" \\ m <- missed]
# (_,w) = fclose io w
= w
# (pkg,w) = readPackage args.package_file w
| isError pkg
# io = io <<< fromError pkg <<< "\n"
# (_,w) = fclose io w
= w
# (Ok pkg) = pkg
# (io,w) = do args pkg io w
# (_,w) = fclose io w
= w
do :: Arguments Package *File *World -> *(*File, *World)
do args pkg io w = case args.action of
NoAction = (io,w)
Install = install pkg io w
Make = make args.clm_options pkg io w
install :: Package *File *World -> *(*File, *World)
install pkg io w
# (e,w) = fileExists MODULE_DIR w
# w = if e w (snd $ createDirectory MODULE_DIR w)
# (repo,w) = getRepository REPOSITORY w
| isError repo
= (io <<< fromError repo <<< "\n", w)
# (Ok repo) = repo
# io = foldl printRepo io repo
# solv = resolveDependencies repo pkg
| isError solv
= (io <<< fromError solv <<< "\n", w)
# (Ok solv) = solv
# io = io <<< "Dependencies:\n"
# io = printDeps io solv
= (io,w)
where
printRepo :: *File RepositoryItem -> *File
printRepo f ri = f <<< ri.RepositoryItem.name <<< "\t" <<<
foldl (+++) "" [toString v.RepositoryItemVersion.version + ", " \\ v <- ri.RepositoryItem.versions]
<<< "\n"
printDeps :: *File [(Dependency, Version)] -> *File
printDeps f ds = foldl (<<<) f [depName d + "\t" + toString v + "\n" \\ (d,v) <- ds]
make :: [String] Package *File *World -> *(*File, *World)
make opts pkg io w
# (ps,w) = getRecursivePaths pkg w
| isError ps
= (io <<< fromError ps <<< "\n", w)
# ps = fromOk ps
# (r,w) = syscall (foldl (+) "clm" [" -I " + p \\ p <- ps] +
foldl (+) "" [" " + f \\ f <- optionsToFlags pkg.options ++ opts] +
" " + pkg.main + " -o " + pkg.main) w
= (io,w)
parseArgs :: [String] Arguments [String] -> ([String], Arguments)
parseArgs miss args []
= (miss, args)
parseArgs miss args ["-p":name:rest]
= parseArgs miss {args & package_file = name} rest
parseArgs miss args ["-r":repo:rest]
= parseArgs miss {args & repository = repo} rest
parseArgs miss args ["-c":opt:rest]
= parseArgs miss {args & clm_options = args.clm_options ++ [opt]} rest
parseArgs miss args ["install":rest]
= parseArgs miss {args & action = Install} rest
parseArgs miss args ["make":rest]
= parseArgs miss {args & action = Make} rest
parseArgs miss args [a:rest]
= parseArgs [a:miss] args rest
syscall :: !String !*World -> !*(!Int, !*World)
syscall cmd w = code {
ccall system "s:I:A"
}
|