Luis,
Got this report from a fello Lispnyk (thx, dimitri). Looks to my uninformed eyes as if the x86 and >0.9.3 requirements for callbacks are met. Thoughts?
kenny
-------- Original Message -------- Subject: Re: [Lisp] testing CFFI Date: Sat, 17 Sep 2005 12:19:59 -0400 From: Dimitry Gashinsky digash@gmail.com Reply-To: i@digash.com To: Kenny Tilton ktilton@nyc.rr.com CC: LISP NYC lisp@lispnyc.org References: 432AE74A.9060603@nyc.rr.com
Hi Kenny,
I just tried running CFFI on Linux X86_64. I found couple of problems.
CL-USER(3): :c cffi-tests
; loading system definition from ; /home/dig/src/cffi-luis-050916-0148/cffi-tests.asd into #<PACKAGE "ASDF4061"> ; registering #<SYSTEM CFFI-TESTS {1000F01F11}> as CFFI-TESTS ; loading system definition from /usr/share/common-lisp/systems/rt.asd into ; #<PACKAGE "ASDF4088"> ; registering #<SYSTEM :RT {10009C6D51}> as RT ; $ cd /home/dig/src/cffi-luis-050916-0148/tests/; make gcc -o libtest.so -shared -lm -Wall -ansi -pedantic libtest.c /usr/lib/gcc/x86_64-pc-linux-gnu/3.4.4/../../../../x86_64-pc-linux-gnu/bin/ld: /tmp/ccsyYRJ7.o: relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC /tmp/ccsyYRJ7.o: could not read symbols: Bad value collect2: ld returned 1 exit status make: *** [libtest.so] Error 1
debugger invoked on a ASDF:OPERATION-ERROR in thread #<THREAD "initial thread" {1000003981}>: erred while invoking #<COMPILE-OP NIL {100105BA71}> on #<C-TEST-LIB "libtest" {10011559F1}>
Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name): 0: [RETRY ] Retry performing #<ASDF:COMPILE-OP NIL {100105BA71}> on #<CFFI-TESTS-SYSTEM::C-TEST-LIB "libtest" {10011559F1}>. 1: [ACCEPT] Continue, treating #<ASDF:COMPILE-OP NIL {100105BA71}> on #<CFFI-TESTS-SYSTEM::C-TEST-LIB "libtest" {10011559F1}> as having been successful. 2: [ABORT ] Exit debugger, returning to top level.
((SB-PCL::FAST-METHOD ASDF:PERFORM (ASDF:COMPILE-OP CFFI-TESTS-SYSTEM::C-TEST-LIB)) #<unused argument> #<unused argument> #<ASDF:COMPILE-OP NIL {100105BA71}> #<CFFI-TESTS-SYSTEM::C-TEST-LIB "libtest" {10011559F1}>) source: (ERROR 'ASDF:OPERATION-ERROR :COMPONENT CFFI-TESTS-SYSTEM::C :OPERATION CFFI-TESTS-SYSTEM::O) 0]
The first problem coud be easily resolved by adding -fPIC to LDFLAGS.
; file: /home/dig/src/cffi-luis-050916-0148/tests/callbacks.lisp ; in: DEFCALLBACK SUM-CHAR ; (CFFI:DEFCALLBACK CFFI-TESTS::SUM-CHAR ; :CHAR ; ((CFFI-TESTS::A :CHAR) (CFFI-TESTS::B :CHAR)) ; "Test if the named block is present and the docstring too." ; (RETURN-FROM CFFI-TESTS::SUM-CHAR ; (+ CFFI-TESTS::A CFFI-TESTS::B))) ; --> PROGN CFFI-SYS:%DEFCALLBACK SETF LET* LET* MULTIPLE-VALUE-BIND LET ; --> ALIEN-SAP LOCALLY PROGN ALIEN-SAP SB-ALIEN::ALIEN-LAMBDA ; ==> ; (SB-ALIEN-INTERNALS:ALIEN-CALLBACK (FUNCTION CHAR CHAR CHAR) ; (LAMBDA (CFFI-TESTS::A CFFI-TESTS::B) ; (CFFI::INVERSE-TRANSLATE-OBJECTS ; (CFFI-TESTS::A CFFI-TESTS::B) ; (:CHAR :CHAR) ; :CHAR ; (BLOCK CFFI-TESTS::SUM-CHAR ; (RETURN-FROM CFFI-TESTS::SUM-CHAR ; #))))) ; ; caught ERROR: ; (in macroexpansion of (SB-ALIEN-INTERNALS:ALIEN-CALLBACK # #)) ; (hint: For more precise location, try *BREAK-ON-SIGNALS*.) ; The function SB-ALIEN-INTERNALS:ALIEN-CALLBACK-ACCESSOR-FORM is undefined.
This seems that my SBCL does not support ALIEN-CALLBACK-ACCESSOR-FORM. Here is my features.
This is SBCL 0.9.4, an implementation of ANSI Common Lisp. ... (:ASDF :SB-THREAD :ANSI-CL :COMMON-LISP :SBCL :UNIX :SB-DOC :SB-PACKAGE-LOCKS :SB-UNICODE :IEEE-FLOATING-POINT :X86-64 :ELF :LINUX :GENCGC :STACK-GROWS-DOWNWARD-NOT-UPWARD :C-STACK-IS-CONTROL-STACK :LINKAGE-TABLE :STACK-ALLOCATABLE-CLOSURES :OS-PROVIDES-DLOPEN :OS-PROVIDES-DLADDR)
If I accept callback failure and continue with testing all the tests pass! I guess there is no tests for CALLBACK yet.
Hope this helps, Dig
On 9/16/05, Kenny Tilton ktilton@nyc.rr.com wrote:
Thought I would make it a little easier:
Download latest CFFI-LUIS from here (last is latest):
Download RT from here:
3: Adjust the following to match where you put stuff:
#-asdf (load "/0devtools/asdf.lisp")
(progn #+lispworks (setf hcl::*handle-existing-defpackage* (list :add))
(push (make-pathname :directory '(:absolute "0devtools" "cffi")) asdf:*central-registry*)
(push (make-pathname :directory '(:absolute "0devtools" "rt")) asdf:*central-registry*)
(asdf:operate 'asdf:load-op 'cffi-tests))
Ok, now you can run the tests:
(cffi-tests::do-tests) ;; runs all tests trapping errors, reporting only number of failures
To see what the first failure (if any) is:
(let ((cffi-tests::*catch-errors* nil)) (cffi-tests::do-tests))
Thx.
-- Kenny
Why Lisp? http://wiki.alu.org/RtL_Highlight_Film
"I've wrestled with reality for 35 years, Doctor, and I'm happy to state I finally won out over it." Elwood P. Dowd, "Harvey", 1950
Lisp mailing list Lisp@lispnyc.org http://www.lispnyc.org/mailman/listinfo.cgi/lisp