;;;;
;;;; $Id$
;;;;
-;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg
+;;;; This file, part of UFFI, is Copyright (c) 2002-2005 by Kevin M. Rosenberg
;;;;
-;;;; UFFI users are granted the rights to distribute and use this software
-;;;; as governed by the terms of the Lisp Lesser GNU Public License
-;;;; (http://opensource.franz.com/preamble.html), also known as the LLGPL.
;;;; *************************************************************************
(in-package #:uffi)
#-(or win32 mswindows macosx darwin ccl-5.0) '("so" "a" "o")
)
-(defun find-foreign-library (names directories &key types drive-letters)
+(defun find-foreign-library (names directories &key types drive-letters)
"Looks for a foreign library. directories can be a single
string or a list of strings of candidate directories. Use default
library type if type is not specified."
(dolist (name names)
(dolist (dir directories)
(dolist (type types)
- (let ((path (make-pathname
+ (let ((path (make-pathname
#+lispworks :host
#+lispworks (when drive-letter drive-letter)
#-lispworks :device
#-lispworks (when drive-letter drive-letter)
- :name name
+ :name name
:type type
- :directory
+ :directory
(etypecase dir
(pathname
(pathname-directory dir))
(list
dir)
(string
- (pathname-directory
+ (pathname-directory
(parse-namestring dir)))))))
(when (probe-file path)
(return-from find-foreign-library path)))))))
(defun load-foreign-library (filename &key module supporting-libraries
force-load)
- #+(or allegro mcl) (declare (ignore module supporting-libraries))
- #+(or cmu scl sbcl) (declare (ignore module))
-
- (when (and filename (probe-file filename))
- (if (pathnamep filename) ;; ensure filename is a string to check if
- (setq filename (namestring filename))) ; already loaded
+ #+(or allegro openmcl digitool sbcl) (declare (ignore module supporting-libraries))
+ #+(or cmu scl) (declare (ignore module))
+ #+lispworks (declare (ignore supporting-libraries))
+
+ (when (and filename (or (null (pathname-directory filename))
+ (probe-file filename)))
+ (if (pathnamep filename) ;; ensure filename is a string to check if already loaded
+ (setq filename (namestring (if (null (pathname-directory filename))
+ filename
+ ;; lispworks treats as UNC, so use truename
+ #+(and lispworks win32) (truename filename)
+ #-(and lispworks win32) filename))))
(if (and (not force-load)
(find filename *loaded-libraries* :test #'string-equal))
(let ((type (pathname-type (parse-namestring filename))))
(if (string-equal type "so")
(sys::load-object-file filename)
- (alien:load-foreign filename
+ (alien:load-foreign filename
:libraries
(convert-supporting-libraries-to-string
supporting-libraries))))
#+scl
(let ((type (pathname-type (parse-namestring filename))))
- (alien:load-foreign filename
+ (alien:load-foreign filename
:libraries
(convert-supporting-libraries-to-string
supporting-libraries)))
(funcall (intern "LOAD-SHARED-OBJECT" :sb-alien) filename)
(error c))))
- #+lispworks (fli:register-module module :real-name filename)
+ #+lispworks (fli:register-module module :real-name filename
+ :connection-style :immediate)
#+allegro (load filename)
#+openmcl (ccl:open-shared-library filename)
- #+(and mcl (not openmcl)) (ccl:add-to-shared-library-search-path filename t)
-
+ #+digitool (ccl:add-to-shared-library-search-path filename t)
+
(push filename *loaded-libraries*)
t))))