[cffi-devel] The use of wrappers in deployed applications

Martin Simmons martin at lispworks.com
Thu Jan 29 11:48:13 UTC 2009


>>>>> On Thu, 29 Jan 2009 18:53:14 +0900, John Fremlin said:
> 
> cffi-wrapper has made our lives with cffi-udp very much easier. It
> generates small shared libraries for interfacing with C functionality
> that is not well specified as an ABI.
> 
> However, for Lisps that are not Allegro CL (which copies the shared
> objects to the deployment directory), it can be quite irritating to
> deploy applications because (on Lispworks and SBCL at least) the full
> path the generated shared object is hard-coded in the image, and the
> Lisp will try to reopen that file before running user code.
> 
> SBCL for example
> (http://www.sbcl.org/manual/Loading-Shared-Object-Files.html)
> 
>         load-shared-object interacts with sb-ext:save-lisp-and-die:
> 
>                    1. If dont-save is true (default is NIL), the shared object will be dropped when save-lisp-and-die is called -- otherwise shared objects are reloaded automatically when a saved core starts up. Specifying dont-save can be useful when the location of the shared object on startup is uncertain. 
> 
> --- a/addons/cffi/grovel/grovel.lisp
> +++ b/addons/cffi/grovel/grovel.lisp
> @@ -767,7 +767,10 @@ error:
>        (format out ";;;; This file was automatically generated by cffi-grovel.~%
>                     ;;;; Do not edit by hand.~%")
>        (let ((*package* (find-package '#:cl)))
> -        (format out "~%~S~%" `(cffi:load-foreign-library ,lib-file)))
> +        (format out "~%~S~%" `(cffi:load-foreign-library 
> +                               '(:or ,lib-file
> +                                 ,(file-namestring lib-file)
> +                                 (:default ,(pathname-name lib-file))))))
>        (dolist (form lisp-forms)
>          (print form out))
>        (terpri out))
> 
> This patch doesn't help, because once the shared objects are loaded
> (before delivery) the path is stored by the Lisp environment and the
> other paths are not used.
> 
> Any advice or suggestions?

I strongly recommend calling cffi:load-foreign-library at run time only (never
before delivery).  That gives you control over how the library is loaded on
startup (for example reporting errors to the user).

-- 
Martin Simmons
LispWorks Ltd
http://www.lispworks.com/




More information about the cffi-devel mailing list