Automated commit for debian release 6.6.3-2
[clsql.git] / uffi / clsql-uffi-loader.lisp
index ab6702ab3c0e9c7089a6e0dddb61f80888f8964c..8b12cc8e9163321a036dbd9300bb50536575060c 100644 (file)
@@ -2,52 +2,51 @@
 ;;;; *************************************************************************
 ;;;; 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.3 2002/10/17 22:13:20 kevin Exp $
-;;;;
-;;;; This file, part of CLSQL, is Copyright (c) 2002 by Kevin M. Rosenberg
+;;;; This file, part of CLSQL, is Copyright (c) 2002-2010 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
 ;;;; (http://opensource.franz.com/preamble.html), also known as the LLGPL.
 ;;;; *************************************************************************
 
-(declaim (optimize (debug 3) (speed 3) (safety 1) (compilation-speed 0)))
-(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" "D" "E" "F" "G")))
+(in-package #:clsql-uffi)
+
+(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 nil)))) ;(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
+                          (try-load pn)
+                          (loop for search-path in clsql:*foreign-library-search-paths*
+                                thereis (try-load (merge-pathnames pn search-path))))))
+     (when errorp
+       (error "Couldn't load foreign librar~@P ~{~S~^, ~}. (searched ~S: ~S)"
+              (length filenames) filenames
+              'clsql:*foreign-library-search-paths* clsql:*foreign-library-search-paths*)))))
+
+;; searches clsql_uffi64 to accomodate both 32-bit and 64-bit libraries on same system
+(defvar *clsql-uffi-library-filenames*
+  `(,@(when (> most-positive-fixnum (expt 2 32)) (list "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
 load the MySQL client library succesfully.  If this differs at your site,
 set to the right path before compiling or loading the system.")
-
-(defvar *uffi-library-loaded* nil
-  "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*)))
-
-(load-uffi-foreign-library)
-
-
-