X-Git-Url: http://git.kpe.io/?p=clsql.git;a=blobdiff_plain;f=uffi%2Fclsql-uffi-loader.lisp;h=dc6eebc87c26618bc5b0e0d20c171bdb80dcf395;hp=fc9f3d842b9c38ae727d0ec4a9a50c230aedc2cc;hb=18e34efea688a6758b6e997401fbc3f241da98f3;hpb=eb21ebac347671b183a2250bbb4f233e66bf86d6 diff --git a/uffi/clsql-uffi-loader.lisp b/uffi/clsql-uffi-loader.lisp index fc9f3d8..dc6eebc 100644 --- a/uffi/clsql-uffi-loader.lisp +++ b/uffi/clsql-uffi-loader.lisp @@ -2,14 +2,14 @@ ;;;; ************************************************************************* ;;;; FILE IDENTIFICATION ;;;; -;;;; Name: clsql-uffi-loader.sql -;;;; Purpose: library loader using CLSQL UFFI helper library -;;;; Programmers: Kevin M. Rosenberg -;;;; Date Started: Mar 2002 +;;;; Name: clsql-uffi-loader.sql +;;;; Purpose: Library loader using CLSQL UFFI helper library +;;;; Author: Kevin M. Rosenberg +;;;; Created: Mar 2002 ;;;; -;;;; $Id: clsql-uffi-loader.lisp,v 1.5 2003/07/08 20:15:13 kevin Exp $ +;;;; $Id$ ;;;; -;;;; This file, part of CLSQL, is Copyright (c) 2002 by Kevin M. Rosenberg +;;;; This file, part of CLSQL, is Copyright (c) 2002-2004 by Kevin M. Rosenberg ;;;; ;;;; CLSQL users are granted the rights to distribute and use this software ;;;; as governed by the terms of the Lisp Lesser GNU Public License @@ -18,14 +18,35 @@ (in-package #:clsql-uffi) -(defvar *clsql-uffi-library-filename* - (uffi:find-foreign-library - "clsql-uffi" - `(,(make-pathname :directory (pathname-directory *load-truename*)) - "/usr/lib/clsql/" - "/opt/lisp/clsql/uffi/" - "/home/kevin/debian/src/clsql/uffi/") - :drive-letters '("C"))) +(defun find-and-load-foreign-library (filenames &key module supporting-libraries (errorp t)) + (setq filenames (if (listp filenames) filenames (list filenames)) + filenames + (append + (loop for search-path in clsql:*foreign-library-search-paths* + nconc (loop for filename in filenames + collect (merge-pathnames filename search-path))) + filenames)) + (or (loop for type in (uffi:foreign-library-types) + for suffix = (make-pathname :type type) + thereis (loop for filename in filenames + thereis (handler-case + (uffi:load-foreign-library (merge-pathnames filename suffix) + :module module + :supporting-libraries supporting-libraries) + (error (c) + (warn "~A" c) + nil)))) + (when errorp + (error "Couldn't load foreign librar~@P ~{~S~^, ~}." + (length filenames) filenames)))) + +(defvar *clsql-uffi-library-filenames* + (list #+(or 64bit x86-64) "clsql_uffi64" + #+(or 64bit x86-64) (make-pathname :name "clsql_uffi64" + :directory clsql-uffi-system::*library-file-dir*) + "clsql_uffi" + (make-pathname :name "clsql_uffi" + :directory clsql-uffi-system::*library-file-dir*))) (defvar *clsql-uffi-supporting-libraries* '("c") "Used only by CMU. List of library flags needed to be passed to ld to @@ -36,17 +57,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 clsql-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*))) + (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) - -