/
generate-cabal
executable file
·41 lines (32 loc) · 1.69 KB
/
generate-cabal
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
#!/usr/bin/env runhaskell
import Control.Monad
import Data.List
import Data.Maybe
import System.Directory
import System.FilePath
main :: IO ()
main = do
let directories = ["libcharsetdetect",
"libcharsetdetect" </> "mozilla" </> "extensions" </> "universalchardet" </> "src" </> "base",
"libcharsetdetect" </> "nspr-emu",
"libcharsetdetect" </> "nspr-emu" </> "obsolete"]
fps <- fmap concat $ forM directories $ \directory -> do
files <- getDirectoryContents directory
fmap catMaybes $ forM files $ \file -> do
let fp = directory </> file
ok <- doesFileExist fp
if ok then return (Just fp)
else return Nothing
let buildable = filter (\fp -> takeExtension fp `elem` [".cpp", ".c"]) fps
extras = filter (\fp -> takeExtension fp `elem` [".h", ".tab"]) fps
include_dirs = nub $ map takeDirectory extras
showBlock header n xs = [padRight (if is_first then header else "") n ' ' ++ x | (is_first, x) <- (True : repeat False) `zip` xs]
padRight xs n x | len < n = xs ++ replicate (n - len) x
| otherwise = xs
where len = length xs
extra_source_files = unlines $ showBlock "Extra-Source-Files:" (length "Extra-Source-Files: ") extras
c_sources = unlines $ map (" " ++) $ showBlock "C-Sources:" (length "C-Sources: ") buildable
include_dirs_block = unlines $ map (" " ++) $ showBlock "Include-Dirs:" (length "Include-Dirs: ") include_dirs
putStr include_dirs_block
putStr extra_source_files
putStr c_sources