0 | module Pack.Runner.Develop
3 | import Data.SortedMap
4 | import Idris.Package.Types
8 | import Pack.Runner.Database
9 | import Pack.Runner.Install
10 | import Pack.Runner.Query
17 | -> {auto _ : IdrisEnv}
18 | -> (logLevel : LogLevel)
19 | -> (cleanBuild : Bool)
20 | -> (cmd : CmdArgList)
22 | -> EitherT PackErr io ()
23 | runIdrisOn lvl cleanBuild c d@(MkDesc x _ _ _) = do
25 | info "Building\: \{name x}"
26 | libPkg [] lvl cleanBuild c d
32 | -> EitherT PackErr io (Maybe $
File Abs)
33 | findIpkg (Search $
CD dir) fi =
34 | let searchDir := maybe dir parent fi
35 | in findInParentDirs isIpkgBody searchDir
36 | findIpkg None _ = pure Nothing
37 | findIpkg (Use x) _ = pure (Just x)
43 | -> {auto e : IdrisEnv}
44 | -> Maybe (Desc Safe)
46 | -> EitherT PackErr io (List PkgName)
47 | replDeps _ (ForcePkgs ps) = pure ps
48 | replDeps (Just d) _ = pure $
dependencies d
49 | replDeps Nothing NoPkgs = pure $
[]
50 | replDeps Nothing AutoLibs = pure $
e.env.config.autoLibs
51 | replDeps Nothing (AutoPkgs ps) = pure $
ps
52 | replDeps Nothing Installed =
53 | map name . filter installedLib . snd <$> resolveAll
58 | -> {auto e : IdrisEnv}
59 | -> (file : Maybe $
File Abs)
60 | -> EitherT PackErr io (CmdArgList, Codegen, Maybe $
File Abs)
62 | mp <- findIpkg e.env.config.withIpkg mf
63 | for_ mp $
\p => info "Found `.ipkg` file at \{p}"
64 | md <- traverse (\p => parseLibIpkg p p) mp
65 | libs <- map (Library,) <$> replDeps md e.env.config.autoLoad
66 | tds <- mapMaybe libName <$> transitiveDeps libs
68 | let srcDir := maybe [] (\s => ["--source-dir", s]) (md >>= sourcedir . desc)
69 | pkgs := concatMap (\td => ["-p", value td]) tds
70 | cg := maybe e.env.config.codegen (ipkgCodeGen . desc) md
75 | pure (srcDir ++ cgOpt ++ pkgs, cg, mp)
78 | srcFileRelativeToIpkg : (ipkg,idr : Maybe (File Abs)) -> CmdArgList
79 | srcFileRelativeToIpkg _ Nothing = []
80 | srcFileRelativeToIpkg Nothing (Just idr) = [ idr ]
81 | srcFileRelativeToIpkg (Just ipkg) (Just idr) =
82 | let rel := relativeTo ipkg.parent idr.parent
83 | in [ MkF rel idr.file ]
90 | -> (file : Maybe $
File Abs)
92 | -> EitherT PackErr io ()
94 | (opts, _, mp) <- replOpts mf
97 | let arg := srcFileRelativeToIpkg mp mf
100 | cmd <- case e.env.config.rlwrap of
101 | UseRlwrap rargs => pure $
["rlwrap"] ++ rargs ++ exe ++ opts ++ arg
102 | DoNotUseRlwrap => pure $
exe ++ opts ++ arg
105 | Just af => inDir af.parent $
\_ => sysWithEnv cmd env
106 | Nothing => sysWithEnv cmd env
112 | {auto _ : HasIO io}
113 | -> (file : File Abs)
114 | -> (args : CmdArgList)
116 | -> EitherT PackErr io ()
117 | exec file args e = do
118 | (opts, cg, mp) <- replOpts (Just file)
121 | let interp := case cg of
124 | relFile := srcFileRelativeToIpkg mp (Just file)
126 | cmd := exe ++ opts ++ ["-o", e.env.config.output] ++ relFile
127 | run := interp ++ ["build/exec/\{e.env.config.output}"] ++ args
130 | Just af => inDir af.parent $
\_ => do
131 | sysWithEnvAndLog Build cmd env
133 | Nothing => sysWithEnvAndLog Build cmd env >> sys run
136 | export covering %inline
137 | build : HasIO io => PkgOrIpkg -> IdrisEnv -> EitherT PackErr io ()
138 | build f e = findAndParseLocalIpkg f >>= runIdrisOn Build True ["--build"]
142 | buildDeps : HasIO io => PkgOrIpkg -> IdrisEnv -> EitherT PackErr io ()
144 | d <- findAndParseLocalIpkg f
148 | export covering %inline
149 | typecheck : HasIO io => PkgOrIpkg -> IdrisEnv -> EitherT PackErr io ()
151 | findAndParseLocalIpkg f >>= runIdrisOn Build True ["--typecheck"]
154 | export covering %inline
155 | clean : HasIO io => PkgOrIpkg -> IdrisEnv -> EitherT PackErr io ()
157 | p <- findAndParseLocalIpkg f
158 | libPkg [] Build False ["--clean"] p
159 | rmDir (buildPath p)
164 | {auto _ : HasIO io}
166 | -> (args : CmdArgList)
168 | -> EitherT PackErr io ()
169 | runIpkg p args e = do
170 | d <- parseLibIpkg p p
171 | Just exe <- pure (execPath d) | Nothing => throwE (NoAppIpkg p)
173 | case ipkgCodeGen d.desc of
174 | Node => sys $
["node", exe] ++ args
175 | _ => sys $
[exe] ++ args
180 | {auto _ : HasIO io}
182 | -> (args : CmdArgList)
184 | -> EitherT PackErr io ()
185 | runTest n args e = case lookup n e.env.all of
186 | Nothing => throwE (UnknownPkg n)
187 | Just (Git u c _ _ (Just t) _) => do
188 | d <- withGit n u c False pure
189 | runIpkg (d </> t) args e
190 | Just (Local d _ _ $
Just t) => runIpkg (d </> t) args e
192 | warn "No test suite found for \{n}. I'll just typecheck it."
193 | typecheck (Pkg n) e
198 | {auto _ : HasIO io}
200 | -> (args : CmdArgList)
202 | -> EitherT PackErr io ()
203 | execApp p args e = do
206 | install [(App False,p)]
207 | case ipkgCodeGen ra.desc.desc of
208 | Node => sys $
["node", pkgExec ra.name ra.hash ra.pkg ra.exec] ++ args
209 | _ => sys $
[pkgExec ra.name ra.hash ra.pkg ra.exec] ++ args
213 | {auto _ : HasIO io}
215 | -> (args : CmdArgList)
217 | -> EitherT PackErr io ()
218 | runApp (Pkg p) = execApp p
219 | runApp (Ipkg p) = runIpkg p