An example software project might contain four files; an ASDF file, a package definition file, an implementation file, and a CFFI-Grovel specification file.
The ASDF file defines the system and its dependencies.
Notice the use of
eval-when to ensure CFFI-Grovel is present
and the use of
(cffi-grovel:grovel-file name &key cc-flags)
The example-software.asd file would look like that:
;;; CFFI-Grovel is needed for processing grovel-file components (defsystem "example-software" :defsystem-depends-on ("cffi-grovel") :depends-on ("cffi") :serial t :components ((:file "package") (:cffi-grovel-file "example-grovelling") (:cffi-wrapper-file "example-wrappers") (:file "example")))
The package.lisp file would contain one or several
defpackage forms, to remove circular dependencies and make
building the project easier. Note that you may or may not want to
:use your internal package.
Implementor’s note: Note that it’s a not a good idea to
:usewhen names may clash with, say, CL symbols. Or you could use
(defpackage #:example-internal (:use) (:nicknames #:exampleint)) (defpackage #:example-software (:export ...) (:use #:cl #:cffi #:exampleint))
The internal package is created by Lisp code output from the C program written by CFFI-Grovel; if your specification file is exampleint.lisp, the exampleint.cffi.lisp file will contain the CFFI definitions needed by the rest of your project. See Groveller Syntax.