{
An example of building a simple application using JScheme.
} (define appName "app") ; Name of the application. ;;;Show Java backtraces. (set! jsint.BacktraceException.printJavaTrace$ #t) (load "using/command.scm") (load "elf/basic.scm") (load "elf/classpath.scm") (load "using/run.scm") {
} ;;; Assumes the a subdirectory is the first thing in the class path. (define appDir (.getParentFile (.getCanonicalFile (File. (car (crack ($ "java.class.path") ($ "path.separator"))))))) (define srcDir (File. appDir "src")) (define classDir (File. appDir "classes")) (define libDir (File. appDir "lib")) (define docDir (File. appDir "doc")) (define apiDir (File. docDir "api")) (define jarFile (File. libDir {[appName].jar})) {
} ;;; classpath - list of srcDir classDir and jar files under lib/ (define classpath (flatten (list libDir srcDir classDir (files** libDir isJarFile) ;; If you need javac or rmic include tools.jar (File. (.getParent (File. ($ "java.home"))) "lib/tools.jar")))) ;;; Grow the classpath (define (addClasspathUrl u) (.addURL# (Import.getClassLoader) (url u))) (for-each addClasspathUrl classpath) (define (compile classpath srcDir classDir files) ;; Compile all .java files under srcDir that need it. (let ((files (filter (needsUpdate? (java->class srcDir classDir)) files))) (if (> (length files) 0) (begin (display {Compiling [(length files)] files.\n}) (out (run (cmd javac -sourcepath ,srcDir -d ,classDir -classpath ,classpath ,files)))) (display {No files need compiling.\n})))) (define (directory->package d) ;; Convert a relativized directory name into a package name. (apply string-append (separate "." (crack (.toString d) ($ "file.separator"))))) {
} (define-command (-clean) "Remove all generated files." (for-each .delete (files** classDir identity)) (.delete jarFile)) (define-command (-etags) "Make a TAGS table for EMACS meta-dot. The command etags must be in your path." (out (run (cmd etags -o ,(File. srcDir "TAGS") ,(files** srcDir (lambda (f) (or (isJavaFile f) (isSchemeFile f)))))))) (define-command (-javac) "Recompile java files that need it." (mkdirs classDir) (compile (path classpath) srcDir classDir (files** srcDir isJavaFile))) (define-command (-javadoc) "Generate API documentation. Must have run -javac first." (let ((packages (map directory->package (relativize classDir (files** classDir .isDirectory))))) (out (run (cmd (javadoc -private -author -version -use -windowtitle "API" -sourcepath ,srcDir -classpath ,classDir -doctitle "API" -d ,apiDir ,packages)))))) (define-command (-jar) "Build jar from .class and .scm files" (copyFiles srcDir classDir (files** srcDir isSchemeFile)) (out (run (cmd (jar -cvf ,jarFile -C ,classDir "." )))))