source: trunk/abcl/src/org/armedbear/lisp/abcl-contrib.lisp @ 14656

Last change on this file since 14656 was 14656, checked in by Mark Evenson, 10 years ago

Find the versioned system and contrib jars when building with Maven

File size: 3.7 KB
Line 
1(in-package :system)
2
3(require :asdf)
4
5(defconstant +get-classloader+
6  (java:jmethod "java.lang.Class" "getClassLoader"))
7
8(defun boot-classloader ()
9  (let ((boot-class (java:jclass "org.armedbear.lisp.Main")))
10    (java:jcall +get-classloader+ boot-class)))
11
12(defun system-jar-p (p)
13  (named-jar-p "abcl" p))
14
15(defun contrib-jar-p (p)
16  (named-jar-p "abcl-contrib" p))
17
18(defun named-jar-p (name p)
19  (and (pathnamep p)
20       (equal (pathname-type p) "jar")
21       (or
22        (java:jstatic "matches"
23                      "java.util.regex.Pattern"
24                      (concatenate 'string name "(-[0-9]\\.[0-9]\\.[0-9]([+~-].+)?)?")
25                      (pathname-name p))
26        (java:jstatic "matches"
27                      "java.util.regex.Pattern"
28                      (concatenate 'string name "(-[0-9]\\.[0-9]\\.[0-9]\\.[0-9]([+~-]+)?)?")
29                      (pathname-name p)))
30       p))
31
32(defun find-system ()
33  "Find the location of the system.
34
35Used to determine relative pathname to find 'abcl-contrib.jar'."
36  (or
37   (ignore-errors
38     (find-system-jar))
39   (ignore-errors
40     (some
41      (lambda (u)
42        (probe-file (make-pathname
43                     :defaults (java:jcall "toString" u)
44                     :name "abcl")))
45      (java:jcall "getURLs" (boot-classloader))))
46   (ignore-errors
47     #p"http://abcl.org/releases/current/abcl.jar")))
48
49(defun find-jar (predicate)
50  (dolist (loader (java:dump-classpath))
51    (let ((jar (some predicate loader)))
52      (when jar
53        (return jar)))))
54
55(defun find-system-jar ()
56  "Return the pathname of the system jar, one of `abcl.jar` or
57`abcl-m.n.p.jar` or `abcl-m.n.p[.~-]something.jar`."
58  (find-jar #'system-jar-p))
59
60(defun find-contrib-jar ()
61  "Return the pathname of the contrib jar, one of `abcl-contrib.jar` or
62`abcl-contrib-m.n.p.jar` or `abcl-contrib-m.n.p[.~-]something.jar`."
63  (find-jar #'contrib-jar-p))
64
65(defvar *abcl-contrib* nil
66  "Pathname of the ABCL contrib.
67Initialized via SYSTEM:FIND-CONTRIB.")
68
69(defparameter *verbose* t)
70
71(defun add-contrib (abcl-contrib-jar)
72  "Introspects ABCL-CONTRIB-JAR for asdf systems to add to ASDF:*CENTRAL-REGISTRY*"
73  (when abcl-contrib-jar
74    (dolist (asdf-file
75             (directory (make-pathname :device (list abcl-contrib-jar)
76                                       :directory '(:absolute :wild)
77                                       :name :wild
78                                       :type "asd")))
79      (let ((asdf-directory (make-pathname :defaults asdf-file :name nil :type nil)))
80        (unless (find asdf-directory asdf:*central-registry* :test #'equal)
81          (push asdf-directory asdf:*central-registry*)
82          (format *verbose* "~&Added ~A to ASDF.~&" asdf-directory))))))
83
84(defun find-and-add-contrib (&key (verbose nil))
85  "Attempt to find the ABCL contrib jar and add its contents to ASDF.
86Returns the pathname of the contrib if it can be found."
87  (if *abcl-contrib*
88      (format verbose "~&Using already initialized value of abcl-contrib:~&'~A'.~%"
89              *abcl-contrib*)
90    (progn
91      (setf *abcl-contrib* (find-contrib))
92      (format verbose "~&Using probed value of abcl-contrib:~&'~A'.~%"
93              *abcl-contrib*)))
94  (add-contrib *abcl-contrib*))
95
96(defun find-contrib ()
97  "Introspect runtime classpaths to find a loadable ABCL-CONTRIB."
98  (or (ignore-errors
99        (find-contrib-jar))
100      (some
101       (lambda (u)
102         (probe-file (make-pathname
103                      :defaults (java:jcall "toString" u)
104                      :name "abcl-contrib")))
105       (java:jcall "getURLs" (boot-classloader)))))
106
107(export `(find-system
108          find-contrib
109          *abcl-contrib*))
110
111(when (find-and-add-contrib :verbose t)
112  (provide :abcl-contrib))
Note: See TracBrowser for help on using the repository browser.