summaryrefslogtreecommitdiff
path: root/deprecated/old-lib/resource/Make.hs
diff options
context:
space:
mode:
Diffstat (limited to 'deprecated/old-lib/resource/Make.hs')
-rw-r--r--deprecated/old-lib/resource/Make.hs193
1 files changed, 193 insertions, 0 deletions
diff --git a/deprecated/old-lib/resource/Make.hs b/deprecated/old-lib/resource/Make.hs
new file mode 100644
index 000000000..eff24eb06
--- /dev/null
+++ b/deprecated/old-lib/resource/Make.hs
@@ -0,0 +1,193 @@
+module Main where
+
+import Control.Monad
+import Data.Maybe
+import System.Cmd
+import System.Directory
+import System.Environment
+import System.Exit
+
+-- Make commands for compiling and testing resource grammars.
+-- usage: runghc Make ((present? OPT?) | (clone FILE))? LANGS?
+-- where
+-- - OPT = (lang | api | math | pgf | test | demo | clean)
+-- - LANGS has the form e.g. langs=Eng,Fin,Rus
+-- - clone with a flag file=FILENAME clones the file to the specified languages,
+-- by replacing the 3-letter language name of the original in both
+-- the filename and the body
+-- with each name in the list (default: all languages)
+-- With no argument, lang and api are done, in this order.
+-- See 'make' below for what is done by which command.
+
+default_gf = "../../dist/build/gf/gf"
+
+presApiPath = "-path=api:present"
+
+-- the languages have long directory names and short ISO codes (3 letters)
+-- we also give the decodings for postprocessing linearizations, as long as grammars
+-- don't support all flags needed; they are used in tests
+
+langsCoding = [
+ (("arabic", "Ara"),""),
+ (("bulgarian","Bul"),""),
+ (("catalan", "Cat"),""),
+ (("danish", "Dan"),""),
+ (("english", "Eng"),""),
+ (("finnish", "Fin"),""),
+ (("french", "Fre"),""),
+ (("hindi", "Hin"),"to_devanagari"),
+ (("german", "Ger"),""),
+ (("interlingua","Ina"),""),
+ (("italian", "Ita"),""),
+ (("norwegian","Nor"),""),
+ (("russian", "Rus"),""),
+ (("spanish", "Spa"),""),
+ (("swedish", "Swe"),""),
+ (("thai", "Tha"),"to_thai")
+ ]
+
+langs = map fst langsCoding
+
+-- languagues for which to compile Lang
+langsLang = langs `except` ["Ara"]
+
+-- languages for which to compile Try
+langsAPI = langsLang `except` ["Ara","Bul","Hin","Ina","Rus","Tha"]
+
+-- languages for which to compile Mathematical
+langsMath = langsAPI
+
+-- languages for which to run treebank test
+langsTest = langsLang `except` ["Ara","Bul","Cat","Hin","Rus","Spa","Tha"]
+
+-- languages for which to run demo test
+langsDemo = langsLang `except` ["Ara","Hin","Ina","Tha"]
+
+-- languages for which langs.pgf is built
+langsPGF = langsTest `only` ["Eng","Fre","Swe"]
+
+-- languages for which Compatibility exists (to be extended)
+langsCompat = langsLang `only` ["Cat","Eng","Fin","Fre","Ita","Spa","Swe"]
+
+treebankExx = "exx-resource.gft"
+treebankResults = "exx-resource.gftb"
+
+main = do
+ xx <- getArgs
+ make xx
+
+make :: [String] -> IO ()
+make xx = do
+ let ifx opt act = if null xx || elem opt xx then act >> return () else return ()
+ let ifxx opt act = if elem opt xx then act >> return () else return ()
+ let pres = elem "present" xx
+ let dir = if pres then "../present" else "../alltenses"
+
+ let optl ls = maybe ls id $ getOptLangs xx
+
+ ifx "lang" $ do
+ mapM_ (gfc pres [] . lang) (optl langsLang)
+ copy "*/*.gfo" dir
+ ifx "compat" $ do
+ mapM_ (gfc pres [] . compat) (optl langsCompat)
+ copy "*/Compatibility*.gfo" dir
+ ifx "api" $ do
+ mapM_ (gfc pres presApiPath . try) (optl langsAPI)
+ copy "*/*.gfo" dir
+ ifx "math" $ do
+ mapM_ (gfc False [] . math) (optl langsMath)
+ copy "mathematical/*.gfo" "../mathematical"
+ mapM_ (gfc False [] . symbolic) (optl langsMath)
+ copy "mathematical/Symbolic*.gfo" "../mathematical"
+ ifxx "pgf" $ do
+ run_gfc $ ["-s","--make","--name=langs","--parser=off",
+ "--output-dir=" ++ dir]
+ ++ [dir ++ "/Lang" ++ la ++ ".gfo" | (_,la) <- optl langsPGF]
+ ifxx "test" $ do
+ let ls = optl langsTest
+ gf (treeb "Lang" ls) $ unwords [dir ++ "/Lang" ++ la ++ ".gfo" | (_,la) <- ls]
+ ifxx "demo" $ do
+ let ls = optl langsDemo
+ gf (demos "Demo" ls) $ unwords ["demo/Demo" ++ la ++ ".gf" | (_,la) <- ls]
+ ifxx "clean" $ do
+ system "rm -f */*.gfo ../alltenses/*.gfo ../present/*.gfo"
+ ifxx "clone" $ do
+ let (pref,lang) = case getLangName xx of
+ Just pl -> pl
+ _ -> error "expected flag option file=ppppppLLL.gf"
+ s <- readFile (pref ++ lang ++ ".gf")
+ mapM_ (\la -> writeFile (pref ++ la ++ ".gf") (replaceLang lang la s)) (map snd (optl langs))
+ return ()
+
+gfc pres ppath file = do
+ let preproc = if pres then "-preproc=./mkPresent" else ""
+ let path = if pres then ppath else ""
+ putStrLn $ "Compiling " ++ file
+ run_gfc ["-s","-src", preproc, path, file]
+
+gf comm file = do
+ putStrLn $ "Reading " ++ file
+ let cmd = "echo \"" ++ comm ++ "\" | gf -s " ++ file
+ putStrLn cmd
+ system cmd
+
+treeb abstr ls = "rf -lines -tree -file=" ++ treebankExx ++
+ " | l -treebank " ++ unlexer abstr ls ++ " | wf -file=" ++ treebankResults
+
+demos abstr ls = "gr -number=100 | l -treebank " ++ unlexer abstr ls ++
+ " | ps -to_html | wf -file=resdemo.html"
+
+lang (lla,la) = lla ++ "/All" ++ la ++ ".gf"
+compat (lla,la) = lla ++ "/Compatibility" ++ la ++ ".gf"
+try (lla,la) = "api/Try" ++ la ++ ".gf"
+math (lla,la) = "mathematical/Mathematical" ++ la ++ ".gf"
+symbolic (lla,la) = "mathematical/Symbolic" ++ la ++ ".gf"
+
+except ls es = filter (flip notElem es . snd) ls
+only ls es = filter (flip elem es . snd) ls
+
+-- list of languages overriding the definitions above
+getOptLangs args = case [ls | a <- args, let (f,ls) = splitAt 6 a, f=="langs="] of
+ ls:_ -> return $ findLangs $ seps ls
+ _ -> Nothing
+ where
+ seps = words . map (\c -> if c==',' then ' ' else c)
+ findLangs ls = [lang | lang@(_,la) <- langs, elem la ls]
+
+-- the file name has the form p....pLLL.gf, i.e. 3-letter lang name, suffix .gf
+getLangName args = case [ls | a <- args, let (f,ls) = splitAt 5 a, f=="file="] of
+ fi:_ -> let (nal,ferp) = splitAt 3 (drop 3 (reverse fi)) in return (reverse ferp,reverse nal)
+ _ -> Nothing
+
+replaceLang s1 s2 = repl where
+ repl s = case s of
+ c:cs -> case splitAt lgs s of
+ (pre,rest) | pre == s1 -> s2 ++ repl rest
+ _ -> c : repl cs
+ _ -> s
+ lgs = 3 -- length s1
+
+unlexer abstr ls =
+ "-unlexer=\\\"" ++ unwords
+ [abstr ++ la ++ "=" ++ unl |
+ lla@(_,la) <- ls, let unl = unlex lla, not (null unl)] ++
+ "\\\""
+ where
+ unlex lla = maybe "" id $ lookup lla langsCoding
+
+-- | Runs the gf executable in compile mode with the given arguments.
+run_gfc :: [String] -> IO ()
+run_gfc args =
+ do let args' = ["-batch","-gf-lib-path=../"] ++ filter (not . null) args ++ ["+RTS"] ++ rts_flags ++ ["-RTS"]
+ putStrLn $ "Running: " ++ default_gf ++ " " ++ unwords (map showArg args')
+ e <- rawSystem default_gf args'
+ case e of
+ ExitSuccess -> return ()
+ ExitFailure i -> putStrLn $ "gf exited with exit code: " ++ show i
+ where rts_flags = ["-K100M"]
+ showArg arg = "'" ++ arg ++ "'"
+
+copy :: String -> String -> IO ()
+copy from to =
+ do system $ "cp " ++ from ++ " " ++ to
+ return ()