1module Pkg.Package where
7import System.FilePath ((</>), addTrailingPathSeparator)
13import Data.List.Split(splitOn)
24-- * read the package description
25-- * check all the library dependencies exist
26-- * invoke the makefile if there is one
27-- * invoke idris on each module, with idris_opts
28-- * install everything into datadir/pname, if install flag is set
30buildPkg :: Bool -> (Bool, FilePath) -> IO ()
31buildPkg warnonly (install, fp)
32 = do pkgdesc <- parseDesc fp
33 ok <- mapM (testLib warnonly (pkgname pkgdesc)) (libdeps pkgdesc)
35 do make (makefile pkgdesc)
36 dir <- getCurrentDirectory
37 setCurrentDirectory $ dir </> sourcedir pkgdesc
38 case (execout pkgdesc) of
39 Nothing -> buildMods (NoREPL : Verbose : idris_opts pkgdesc)
41 Just o -> do let exec = dir </> o
43 (NoREPL : Verbose : Output exec : idris_opts pkgdesc)
45 setCurrentDirectory dir
46 when install $ installPkg pkgdesc
48cleanPkg :: FilePath -> IO ()
50 = do pkgdesc <- parseDesc fp
51 clean (makefile pkgdesc)
52 dir <- getCurrentDirectory
53 setCurrentDirectory $ dir </> sourcedir pkgdesc
54 mapM_ rmIBC (modules pkgdesc)
55 case execout pkgdesc of
57 Just s -> do let exec = dir </> s
58 putStrLn $ "Removing " ++ exec
59 system $ "rm -f " ++ exec
62installPkg :: PkgDesc -> IO ()
64 = do dir <- getCurrentDirectory
65 setCurrentDirectory $ dir </> sourcedir pkgdesc
66 case (execout pkgdesc) of
67 Nothing -> mapM_ (installIBC (pkgname pkgdesc)) (modules pkgdesc)
68 Just o -> return () -- do nothing, keep executable locally, for noe
69 mapM_ (installObj (pkgname pkgdesc)) (objs pkgdesc)
71buildMods :: [Opt] -> [Name] -> IO ()
72buildMods opts ns = do let f = map (toPath . show) ns
73 idris (map Filename f ++ opts)
75 where toPath n = foldl1 (</>) $ splitOn "." n
77testLib :: Bool -> String -> String -> IO Bool
81 (tmpf, tmph) <- tempfile
83 let libtest = d </> "rts" </> "libtest.c"
84 e <- system $ gcc ++ " " ++ libtest ++ " -l" ++ f ++ " -o " ++ tmpf
86 ExitSuccess -> return True
88 then do putStrLn $ "Not building " ++ p ++
89 " due to missing library " ++ f
91 else fail $ "Missing library " ++ f
94rmIBC m = do let f = toIBCFile m
95 putStrLn $ "Removing " ++ f
96 system $ "rm -f " ++ f
99toIBCFile (UN n) = n ++ ".ibc"
100toIBCFile (NS n ns) = foldl1 (</>) (reverse (toIBCFile n : ns))
102installIBC :: String -> Name -> IO ()
103installIBC p m = do let f = toIBCFile m
105 let destdir = d </> p </> getDest m
106 putStrLn $ "Installing " ++ f ++ " to " ++ destdir
107 system $ "mkdir -p " ++ destdir
108 system $ "install " ++ f ++ " " ++ destdir
110 where getDest (UN n) = ""
111 getDest (NS n ns) = foldl1 (</>) (reverse (getDest n : ns))
113installObj :: String -> String -> IO ()
114installObj p o = do d <- getDataDir
115 let destdir = addTrailingPathSeparator (d </> p)
116 putStrLn $ "Installing " ++ o ++ " to " ++ destdir
117 system $ "mkdir -p " ++ destdir
118 system $ "install " ++ o ++ " " ++ destdir
121make :: Maybe String -> IO ()
122make Nothing = return ()
123make (Just s) = do system $ "make -f " ++ s
126clean :: Maybe String -> IO ()
127clean Nothing = return ()
128clean (Just s) = do system $ "make -f " ++ s ++ " clean"
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list