X-Git-Url: http://git.kpe.io/?p=clsql.git;a=blobdiff_plain;f=uffi%2Fclsql-uffi-loader.lisp;h=084f66ae160fded631dbe9e4e33d623844c3d511;hp=10ac4451dde91a28d11cd9ba8d16c4c15595708d;hb=78489032c6f66ce666ffe5e2e726503b61b94616;hpb=02e4933f6db6ce5b91a90b6b236acb9eb960de70 diff --git a/uffi/clsql-uffi-loader.lisp b/uffi/clsql-uffi-loader.lisp index 10ac445..084f66a 100644 --- a/uffi/clsql-uffi-loader.lisp +++ b/uffi/clsql-uffi-loader.lisp @@ -18,12 +18,34 @@ (in-package #:clsql-uffi) -(defvar *clsql-uffi-library-filename* - (uffi:find-foreign-library - "uffi" - `(,clsql-uffi-system::*library-file-dir* - "/usr/lib/clsql/") - :drive-letters '("C"))) +(defun find-and-load-foreign-library (filenames &key module supporting-libraries (errorp t)) + "Attempt to load a foreign library. This will search for any of the filenames, as +well as any of the filenames in any of the clsql:*foreign-library-search-paths*" + (setq filenames (if (listp filenames) filenames (list filenames))) + + (flet ((try-load (testpath) + (handler-case + (uffi:load-foreign-library testpath + :module module + :supporting-libraries supporting-libraries) + (error (c) (warn "~A" c) nil)))) + (or + (loop for type in (uffi:foreign-library-types) + thereis + (loop for name in filenames + for pn = (make-pathname :name name :type type) + thereis (or + (loop for search-path in clsql:*foreign-library-search-paths* + thereis (try-load (merge-pathnames pn search-path))) + (try-load pn)))) + (when errorp + (error "Couldn't load foreign librar~@P ~{~S~^, ~}. (searched ~S)" + (length filenames) filenames + 'clsql:*foreign-library-search-paths*))))) + +(defvar *clsql-uffi-library-filenames* + (list #+(or 64bit x86-64) "clsql_uffi64" + "clsql_uffi")) (defvar *clsql-uffi-supporting-libraries* '("c") "Used only by CMU. List of library flags needed to be passed to ld to @@ -34,15 +56,11 @@ set to the right path before compiling or loading the system.") "T if foreign library was able to be loaded successfully") (defun load-uffi-foreign-library () - (unless (probe-file *clsql-uffi-library-filename*) - (error "Unable to find uffi.so")) - - (if (uffi:load-foreign-library *clsql-uffi-library-filename* - :module "clsql-uffi" - :supporting-libraries - *clsql-uffi-supporting-libraries*) - (setq *uffi-library-loaded* t) - (error "Unable to load helper library ~A" *clsql-uffi-library-filename*))) + (clsql:push-library-path clsql-uffi-system::*clsql-uffi-library-dir*) + (find-and-load-foreign-library *clsql-uffi-library-filenames* + :module "clsql-uffi" + :supporting-libraries + *clsql-uffi-supporting-libraries*) + (setq *uffi-library-loaded* t)) (load-uffi-foreign-library) -