From: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - 2008-11-05 22:03:48
|
Given our recent Ant system related changes, does the patch below still apply? Bye, Erik. 2008/8/27 Mark Evenson <ev...@pa...>: > Attached please find patches to ABCL for the Lisp build system that I find > quite useful (I don't really use the Ant build system, but maybe I am > atypical). > > This change: > > o Provides an ASDF description for BUILD-ABCL, to make building > ABCL easier from other Lisps (sbcl, clisp tested) and ABCL itself. Use > of ASDF is used to provide location for components in BUILD-ABCL. > > o a new special BUILD-ABCL::*ADDITIONAL-JARS* which contains a list of > pathnames to include on the CLASSPATH when using the UNIX 'abcl' shell > script entry point (BUILD-ABCL::MAKE-LAUNCH-SCRIPT). This does not work > under WIN32 currently. An example of loading Alan Ruttenburg's JSS (aka > 'invoke.lisp') is included. > > o Reorders 'build-abcl.lisp' to get all the special variables declared > before attempting to load BUILD-ABCL::*CUSTOMIZATIONS-FILE* > > > o The default launch script no longer includes the ABCL 'src' directory, > relying purely on the stuff in 'abcl.jar'. This seems to provide a two > order of magnitude speed-up on ABCL boot time once the JAR gets mapped into > memory. > > > I am not fully happy with the code, mainly with how much I changed > BUILD-ABCL wrt. to arguments (I had a lot of useless and tricky &optional > forms that should be gone now, but I need to review.) > > Comments welcome, > Mark <ev...@pa...> > > > -- > "A screaming comes across the sky. It has happened before, but there is > nothing to compare to it now." > > ;;; -*- Mode: LISP; Syntax: COMMON-LISP -*- > > (defpackage :abcl-asdf > (:use :cl :asdf)) > (in-package :abcl-asdf) > > (defsystem :build-abcl > :components ((:file "build-abcl"))) > ;; ((:module build-abcl :pathname "" :components > ;; ((:file "build-abcl"))))) > > > > > > > > Index: build-abcl.lisp > =================================================================== > --- build-abcl.lisp (revision 11287) > +++ build-abcl.lisp (working copy) > @@ -6,13 +6,21 @@ > (defpackage build-abcl > (:use "COMMON-LISP") > (:export #:build-abcl #:make-dist) > + (:nicknames #:build-abcl) > #+abcl (:import-from #:extensions #:run-shell-command #:probe-directory) > #+allegro (:import-from #:excl #:probe-directory) > - #+clisp (:import-from #:ext #:probe-directory) > - ) > + #+clisp (:import-from #:ext #:probe-directory)) > > (in-package #:build-abcl) > > +(defparameter *jdk* nil) > +(defparameter *java-compiler* nil) > +(defparameter *javac-options* nil) > +(defparameter *jikes-options* nil) > +(defparameter *jar* nil) > +(defparameter *additional-jars* '() > + "List of pathnames of additional jar files to include on the Java > CLASSPATH of the ABCL process.") > + > ;; Platform detection. > > (defun platform () > @@ -39,6 +47,25 @@ > > (defparameter *platform* (platform)) > > +(defparameter *build-root* > + (make-pathname :device (pathname-device *load-truename*) > + :directory (pathname-directory *load-truename*))) > + > +(defparameter *customizations-file* > + (merge-pathnames "customizations.lisp" *build-root*)) > + > +(defun safe-namestring (pathname) > + (let ((string (namestring pathname))) > + (when (position #\space string) > + (setf string (concatenate 'string "\"" string "\""))) > + string)) > + > +(eval-when (:load-toplevel) > + (load *customizations-file*)) > + > +(defparameter *abcl-dir* > + (merge-pathnames "src/org/armedbear/lisp/" *build-root*)) > + > (defparameter *file-separator-char* > (if (eq *platform* :windows) #\\ #\/)) > > @@ -149,26 +176,12 @@ > (eql (char namestring (1- (length namestring))) > *file-separator-char*) > truename))) > > -(defparameter *build-root* > - (make-pathname :device (pathname-device *load-truename*) > - :directory (pathname-directory *load-truename*))) > > -(defparameter *customizations-file* > - (merge-pathnames "customizations.lisp" *build-root*)) > - > -(defparameter *abcl-dir* > - (merge-pathnames "src/org/armedbear/lisp/" *build-root*)) > - > -(defparameter *jdk* nil) > -(defparameter *java-compiler* nil) > -(defparameter *javac-options* nil) > -(defparameter *jikes-options* nil) > -(defparameter *jar* nil) > - > (defvar *classpath*) > (defvar *java*) > (defvar *java-compiler-options*) > (defvar *java-compiler-command-line-prefix*) > +(defvar *built-libabcl*) > > (defun initialize-build () > (setf *jdk* nil > @@ -321,8 +334,8 @@ > (write-char #\space stream) > (write-string > (if zip > - "org.armedbear.lisp.Main --eval \"(compile-system :zip t > :quit t)\"" > - "org.armedbear.lisp.Main --eval \"(compile-system :zip nil > :quit t)\"") > + "org.armedbear.lisp.Main --noinit --eval \"(compile-system > :zip t :quit t)\"" > + "org.armedbear.lisp.Main --noinit --eval \"(compile-system > :zip nil :quit t)\"") > stream) > (terpri stream)) > (setf status > @@ -337,8 +350,8 @@ > (write-char #\space s) > (write-string > (if zip > - "org.armedbear.lisp.Main --eval \"(compile-system > :zip t :quit t)\"" > - "org.armedbear.lisp.Main --eval \"(compile-system > :zip nil :quit t)\"") > + "org.armedbear.lisp.Main --noinit --eval > \"(compile-system :zip t :quit t)\"" > + "org.armedbear.lisp.Main --noinit --eval > \"(compile-system :zip nil :quit t)\"") > s)))) > (setf status > (run-shell-command cmdline > @@ -371,36 +384,59 @@ > (format t "~A returned ~S~%" command status)) > (zerop status)))) > > -;; abcl/abcl.bat > -(defun make-launch-script () > +;; abcl.bat or abcl > +(defun make-launch-script (&key > + (include-libabcl t) > + (include-src t) > + (additional-jars *additional-jars*)) > + > + "Create a script wrapper for the invocation of ABCL on the local > platform. ~ > + > +Keywords: > +:include-libabcl t > + Whether to include the dynamic library for ABCL signal handlers. > + > +:additional-jars *additional-jars* > + List of pathnames for JAR files to include in the ABCL CLASSPATH." > + > + > ;; Use the -Xss4M and -Xmx256M flags so that the default launch script can > be > ;; used to build sbcl. > - (cond ((eq *platform* :windows) > - (with-open-file (s > - (merge-pathnames "abcl.bat" *build-root*) > - :direction :output > - :if-exists :supersede) > - (format s "~A -Xss4M -Xmx256M -cp \"~A;~A\" > org.armedbear.lisp.Main %1 %2 %3 %4 %5 %6 %7 %8 %9~%" > + (format t "~&additional-jars: ~A" additional-jars) > + (let ((java-options "-Xss4M -Xmx256M ") > + (additional (if additional-jars > + additional-jars > + *additional-jars*)) > + (classpath nil)) > + (cond ((eq *platform* :windows) > + (with-open-file (s > + (merge-pathnames "abcl.bat" *build-root*) > + :direction :output > + :if-exists :supersede) > + (format s "~A ~A -cp \"~A;~A\" org.armedbear.lisp.Main %1 %2 %3 > %4 %5 %6 %7 %8 %9~%" > (safe-namestring *java*) > + java-options > (namestring (merge-pathnames "src" *build-root*)) > (namestring (merge-pathnames "abcl.jar" *build-root*))))) > - (t > - (let ((pathname (merge-pathnames "abcl" *build-root*))) > - (with-open-file (s pathname :direction :output :if-exists > :supersede) > - (if (eq *platform* :linux) > - ;; On Linux, set java.library.path for libabcl.so. > - (format s "#!/bin/sh~%exec ~A -Xss4M -Xmx256M -Xrs > -Djava.library.path=~A -cp ~A:~A org.armedbear.lisp.Main \"$@\"~%" > + (t > + (let ((pathname (merge-pathnames "abcl" *build-root*))) > + (with-open-file (s pathname :direction :output :if-exists > :supersede) > + (when include-src > + (push (safe-namestring (merge-pathnames "src" > *build-root*)) > + classpath)) > + (push (safe-namestring (merge-pathnames "abcl.jar" > *build-root*)) > + classpath) > + (when include-libabcl > + (setf java-options "~A ~A" java-options > + (format nil "-Xrs -Djava.library-path=~A " > (safe-namestring *abcl-dir*)))) > + (when additional > + (setf classpath (append classpath additional))) > + (format s "#!/bin/sh~%exec ~A \\~% ~A \\~% -cp ~A \\~% > org.armedbear.lisp.Main \\~% \"$@\"~%" > (safe-namestring *java*) > - (safe-namestring *abcl-dir*) > - (safe-namestring (merge-pathnames "src" > *build-root*)) > - (safe-namestring (merge-pathnames "abcl.jar" > *build-root*))) > - ;; Not Linux. > - (format s "#!/bin/sh~%exec ~A -Xss4M -Xmx256M -cp ~A:~A > org.armedbear.lisp.Main \"$@\"~%" > - (safe-namestring *java*) > - (safe-namestring (merge-pathnames "src" > *build-root*)) > - (safe-namestring (merge-pathnames "abcl.jar" > *build-root*))))) > - (run-shell-command (format nil "chmod +x ~A" (safe-namestring > pathname)) > - :directory *build-root*))))) > + java-options > + (format nil "~{~A~^:~}" classpath)) > + (run-shell-command (format nil "chmod +x ~A" (safe-namestring > pathname)) > + :directory *build-root*))))))) > > (defun build-stamp () > (multiple-value-bind > @@ -439,12 +475,6 @@ > (with-current-directory ((merge-pathnames "java/awt/" *abcl-dir*)) > (delete-files (directory "*.class")))) > > -(defun safe-namestring (pathname) > - (let ((string (namestring pathname))) > - (when (position #\space string) > - (setf string (concatenate 'string "\"" string "\""))) > - string)) > - > (defun build-abcl (&key force > (batch t) > compile-system > @@ -452,6 +482,7 @@ > clean > libabcl > full) > + "Build ABCL from local source with available Lisp as specified in > 'customizations.lisp'" > (let ((start (get-internal-real-time))) > > #+lispworks > @@ -487,14 +518,16 @@ > (format t "Build failed.~%") > (return-from build-abcl nil)))) > ;; libabcl.so > - (when (and (or full libabcl) > - (or (eq *platform* :linux) > - (search "SunOS" (software-type)) > - (search "FreeBSD" (software-type)))) > - ;; A failure here is not fatal. > - (make-libabcl)) > - ;; abcl/abcl.bat > - (make-launch-script) > + (let ((built-libabcl)) > + (when (and (or full libabcl) > + (or (eq *platform* :linux) > + (search "SunOS" (software-type)) > + (search "FreeBSD" (software-type)))) > + ;; A failure here is not fatal. > + (setf built-libabcl (make-libabcl))) > + ;; abcl/abcl.bat > + (make-launch-script :include-libabcl built-libabcl > + :additional-jars *additional-jars*)) > (make-build-stamp) > (let ((end (get-internal-real-time))) > (format t "Build completed successfully in ~A seconds.~%" > @@ -595,3 +628,11 @@ > (status (run-shell-command command :directory parent-dir))) > (unless (zerop status) > (format t "~A returned ~S~%" command status))))) > + > +;;; BEGIN Experimental section > + > +(defun make-tags (&key (directory (asdf:find-system :build-abcl))) > + "Try to make a TAGS for ABCL if etags(1L), find(1), xargs(1), and > + grep(1) are in the Lisp's PATH." > + (run-shell-command "find . | grep .lisp | xargs etags" > + :directory directory)) > Index: customizations.lisp.in > =================================================================== > --- customizations.lisp.in (revision 11287) > +++ customizations.lisp.in (working copy) > @@ -17,6 +17,8 @@ > ;;; Directories should be specified with a trailing slash (or, on Windows, > a > ;;; trailing backslash). > > +(load "build-abcl") ; Need all specials declared. XXX is there something > more elegant? > + > (in-package "BUILD-ABCL") > > ;; Standard compiler options. > @@ -36,3 +38,17 @@ > ((:linux :unknown) > (setq *jdk* "/home/peter/sun/jdk1.5.0_11/") > (setq *jar* "fastjar"))) > + > +;;; Merge in additional jars to the ABCL load path. > +(let ((lsw-root (merge-pathnames "work/lsw/lib/" (user-homedir-pathname))) > + (jss-jars '("bsh-2.0b4.jar" "jscheme.jar"))) > + (flet ((normalize-to-pathname (dir files) > + (loop :for file in files > + :collecting (safe-namestring > + (merge-pathnames file dir))))) > + (setf *additional-jars* > + (union *additional-jars* > + (normalize-to-pathname lsw-root jss-jars) > + :test #'equal)))) > + > + > > ------------------------------------------------------------------------- > This SF.Net email is sponsored by the Moblin Your Move Developer's challenge > Build the coolest Linux based applications with Moblin SDK & win great > prizes > Grand prize is a trip for two to an Open Source event anywhere in the world > http://moblin-contest.org/redirect.php?banner_id=100&url=/ > _______________________________________________ > armedbear-j-devel mailing list > arm...@li... > https://lists.sourceforge.net/lists/listinfo/armedbear-j-devel > > |