(concatenate-strings (rest strings) delimiter))))
;;; The following code is more or less copied frm sb-bsd-sockets.asd,
-;;; but extended to allow flags set in a general way
+;;; but extended to allow flags to be set in a general way
(defclass unix-dso (module) ())
(defun unix-name (pathname)
(module-components dso)))))
(error 'operation-error :operation operation :component dso))))
-;; Taken from foreign.lisp in the CMUCL tree, but modified to delay
-;; resolving of symbols until they are used
-(defun load-dso (file)
- (system::ensure-lisp-table-opened)
- ; rtld global: so it can find all the symbols previously loaded
- ; rtld lazy: that way dlopen will not fail if not all symbols are defined.
- (let ((filename (namestring file)))
- (format t ";;; Loading shared library ~A ...~%" filename)
- (let ((sap (system::dlopen filename (logior system::rtld-lazy system::rtld-global))))
- (cond ((zerop (system:sap-int sap))
- (let ((err-string (system::dlerror)))
-
- ;; For some reason dlerror always seems to return NIL,
- ;; which isn't very informative.
- (error "Can't open object ~S: ~S" file err-string)))
- ((null (assoc sap system::*global-table* :test #'system:sap=))
- (setf system::*global-table* (acons sap file system::*global-table*))
- t)
- (t nil)))))
+
+(defun load-dso (filename)
+ #+sbcl(sb-alien:load-shared-object filename)
+ #+cmu(ext:load-foreign filename))
(defmethod perform ((o load-op) (c unix-dso))
(defmethod output-files ((op compile-op) (c c-source-file))
- (list
- (make-pathname :type "o" :defaults
- (component-pathname c))))
+ (list (make-pathname :type "o" :defaults (component-pathname c))))
(defmethod perform ((op compile-op) (c c-source-file))
t)
+;;; Shared libraries
-(defclass library (static-file)
+(defclass library (component)
((libdir :initarg :libdir)))
(defmethod perform ((o load-op) (c library))
(load-dso (component-pathname c)))
+
+(defmethod perform ((operation operation) (c library))
+ nil)
+
+(defmethod operation-done-p ((o load-op) (c library))
+ #+sbcl(find (sb-ext::unix-namestring (component-pathname c)) sb-alien::*shared-objects* :key #'sb-alien::shared-object-file :test #'equal)
+ #+cmu(rassoc (unix::unix-namestring (component-pathname c))
+ system::*global-table*
+ :key #'(lambda (pathname)
+ (when pathname (unix::unix-namestring pathname)))
+ :test #'equal))
+
+(defmethod operation-done-p ((o operation) (c library))
+ t)