// $Id$ $use Access Apply Arithm Box Compare Convert Dir File JavaMangle List StdIO System Table; $use "rfp_lex"; $table RFPJ-Opts; $box RFPATH LIBRFI; $func Parse-Arguments = e.module-name-and-arguments; $func Print-Help e = ; $func Print-Usage e = ; $func Build (e.make) (e.keep) (e.force) e.module-name = ; $func Compute-Deps (e.make) e.module-name = ; $func Run-rfpc e.files = ; $func Run-javac e.files = ; $func? Search e.files = s.path-group (e.dir) e.file; $func Parse-Path e.path = e.dir-list; $func Subst (e.patterns) (e.replaces) term = term; $box Verb-Level; $func Verbose s.N e.msg = ; $func Default-Handler s.N s.param e = s.N; Default-Handler s.N s.param e = , <"+" s.N 1>; $func Path-Handler s.N s.param (e.opt) = s.N; Path-Handler s.N s.param (e.opt) = > : { /*empty*/ = $error ("Option -"e.opt" requires an argument:") ("'" "'-separated list of directories"); e.dirs = { ;; } :: e.path, )>, <"+" s.N 2>; }; $func File-Handler s.N s.param (e.opt) = s.N; File-Handler s.N s.param (e.opt) = > : { /*empty*/ = $error ("Option -"e.opt" requires a pathname argument"); e.file = , <"+" s.N 2>; }; $func Flags-Handler s.N s.param (e.opt) = s.N; Flags-Handler s.N s.param (e.opt) = > : { /*empty*/ = $error ("Option -"e.opt" requires an argument"); e.file = , <"+" s.N 2>; }; $func Verb-Handler s.N e = s.N; Verb-Handler s.N e = : s.L, >, <"+" s.N 1>; $func Version-Handler s.N e = s.N; Version-Handler s.N e = , , , <"+" s.N 1>; $func EndOpt-Handler s.N e = s.N e.module-name-and-arguments; EndOpt-Handler s.N e = > 0 >; $const Options = ((('c')) (&Default-Handler COMPILE) () "compile to class-file(s), but don't run the program") ((('m') ('-make')) (&Default-Handler MAKE) () "build a program by following module dependencies" "(recompile all needed modules)") ((('k') ('-keep')) (&Default-Handler KEEP) () "keep intermediate java files") ((('f') ('-force')) (&Default-Handler FORCE) () "force compilation even if class-files are up to date") ((('i')) (&Path-Handler RFPATH) ('') "set the refal modules search path") ((('v') ('-verbose')) (&Verb-Handler) () "be verbose, more -v = more verbosity") ((('-rfpdir')) (&File-Handler RFPDIR) ('') "Refal+ installation directory" "(overrides RFPDIR environment variable)") ((('-rfpc')) (&File-Handler RFPC) ('') "Refal+ compiler") ((('-rfpc-flags')) (&Flags-Handler RFPC-FLAGS) ('') "Refal+ compiler options") ((('-librfi')) (&Path-Handler LIBRFI) ('') "set path to the Refal+ library rfi-files") ((('-javac')) (&File-Handler JAVAC) ('') "Java compiler") ((('-java')) (&File-Handler JAVA) ('') "JVM executable") ((('-')) (&EndOpt-Handler) () "end of rfpj options, refal module name should follow") ((('-version')) (&Version-Handler) () "print version info") ((('h') ('-help')) (&Print-Help) ()); Parse-Arguments = 1 $iter : { '-' e.opt = { &Options : e ((e (e.opt) e) (s.func e.args) e.descr) e = : s.Next e.maybe-mod, s.Next e.maybe-mod; $error ("Unknown option: -"e.opt); }; v.module-name = 0 >; empty = , $fail; } :: s.N e.module, e.module : v = e.module; Print-Help e = , , , , > :: e.opt-list, )> :: e.opt-list, )> :: e.param-list, ) ()> :: e.1st-col, :: e.1st-col, >)> : s.1st-col-end, <"+" s.1st-col-end 2> :: s.2nd-col-start, :: e.1st-fill, { &Options : e1 ((e.opts) (e.handler) (e.params) t.descr1 e.descr2) e2, e.1st-col> : (e.1st), > ' '> t.descr1>, { e.descr2 : e t.d e, , $fail;; }, $fail; ; }; Print-Usage e = , , , , ; Main = , , , , )>, $trap { : (e.module-name) e.module-args, :: e.rfpdir, { e.rfpdir : v; $error ("Please set RFPDIR environment variable to Refal+ installation directory") ("or use --rfpdir option"); }, : s.dir-sep, { ; e.rfpdir s.dir-sep "lib"; } :: e.librfi, , { )>; ; }, { ; : v1 = v1 ;; } e.rfpdir s.dir-sep "java" e.rfpdir s.dir-sep "rfp.jar")>; }, { >; >>; }, : { $r e.path s.dir-sep e.name = (e.path s.dir-sep) e.name; e.name = () e.name; } :: (e.path) e.name, > :: e.java-name, { ;; } :: e.make, { ;; } :: e.keep, { ;; } :: e.force, { ;; } :: e.comp, { e.make : /*empty*/, e.force : /*empty*/, e.comp : /*empty*/, : e; ; }, ) >> :: e.rfpath, " -classpath "e.rfpath " " " " e.java-name " "> :: e.java-cmd, { e.comp : v; , >; }; } $with { v.err, { v.err : e1 t2 e3 \? { t2 : (e) \! $fail; = $fail; };; }, v.err : (err1) err2, , { err2 : e1 (e2) e3, , $fail; ; }; err = $error err; }; $table Deps; $func Get-Src e = e; $func Get-Needed-Src e = e; $func Get-Needed-Java e = e; Build (e.make) (e.keep) (e.force) e.module-name = , , :: e.deps, , { e.keep : v, e.force : /*empty*/ = )>>>, >; { e.force : v = ; ; } :: e.src-list, > :: e.rf-list, > :: e.java-list, , { e.keep : v; : e; , // Paranoia : e; }; }; Compute-Deps (e.make) e.module-name = { ; :: s.path-grp (e.path) e.file = : s.dir-sep, e.path s.dir-sep e.module-name :: e.mod, , { e.file : e.f ".rf", s.path-grp : RFPATH = { e.f : $r e.p s.dir-sep e.n = (e.path s.dir-sep e.p s.dir-sep) e.n; (e.path s.dir-sep) e.f; } :: (e.path) e.f, e.path > :: e.java-mod, { e.make : v = ; /*empty*/; } :: e.includes, (e.mod) (e.java-mod) e.includes)>, : e; )>; }; $error ("Can't find refal module "e.module-name) ("Searched in:") )>; }; Get-Src { ((e.module-name) (s.rfi-time (e.mod) (e.java-mod) e.includes)) = ((e.mod ".rf") (e.java-mod ".java")); e = /*empty*/; }; Get-Needed-Src { s.ext ((e.module-name) (s.rfi-time (e.mod) (e.java-mod) e.includes)), :: s.java-time, \{ <">" (s.rfi-time) (s.java-time)>; <">" () (s.java-time)>; e.includes : e (e.inc-mod) e, : s.inc-time e, <">" (s.inc-time) (s.java-time)>; } = ((e.mod ".rf") (e.java-mod ".java")); s.ext e = /*empty*/; }; Get-Needed-Java { ((e.module-name) (s.rfi-time (e.mod) (e.java-mod) e.includes)), <">" () ()> = (e.java-mod ".java"); e = /*empty*/; }; Run-rfpc { v.files = > :: e.files, { ; "compiler""rfpc" :: e.rfpc, \{ = e.rfpc; e.rfpc ".exe" :: e.rfcp, = e.rfpc; }; " -classpath " " "" org.refal.plus.compiler.rfpc"; } :: e.rfpc, e.rfpc" " )>>" "e.files :: e.rfpc-cmd, , $trap { : { 0; s.N = , ; }; } $with { "System" err = , $error ("Can't run Refal+ compiler because something goes utterly wrong.") ("Does RFPDIR correctly point to Refal+ installation directory?") (" RFPDIR=") ("Command to run Refal+ compiler was:") (" "e.rfpc-cmd) ("If it is wrong, try setting --rfpc, --rfpc-flags,") (" --java, and --java-flags options."); err = $error err; }; /*empty*/ = /*empty*/; }; Run-javac { v.files = > :: e.files, ) ()>> :: e.rfpath, " -classpath "e.rfpath " "" "e.files :: e.javac-cmd, , $trap { : { 0; s.N = , ; }; } $with { "System" err = , $error ("Can't run Java compiler because something goes utterly wrong.") ("Command to run Java compiler was:") (" "e.javac-cmd) ("Try setting --javac option to Java compiler executable."); err = $error err; }; /*empty*/ = /*empty*/; }; $func? Search-In-Path (e.path) e.files = (e.dir) e.file; Search e.files = \{ RFPATH ) e.files>; LIBRFI ) e.files>; }; Search-In-Path (e.path) e.files = e.path : e (e.dir) e, e.files : e (e.f) e, e.f> = (e.dir) e.f; Parse-Path e.path = : s.sep, e.path : { e1 s.sep e2 = { e1 : v = (e1) ; ; }; v1 = (v1); /*empty*/ = /*empty*/; }; Subst (e.patterns) (e.replaces) term = { e.patterns : e1 term e2 = e.replaces>; term; }; Verbose s.N e.msg = { : s.L, <">=" (s.L) (s.N)> = ;; };