2010/2/12 Mark Evenson <evenson@panix.com>
On 2/11/10 7:45 PM, Paul Griffioen wrote:
[…]

> I work with Netbeans 6.8 (just upgraded for ANT) and run the build from
> the menu. Running the generated jar with 'java -jar abcl.jar geeft'
> gives the following message:
>
> Failed to load Main-Class manifest attribute from
> abcl.jar
>
> I noticed that the manifest.mf just contains the following:
>
> Manifest-Version: 1.0
> Ant-Version: Apache Ant 1.7.1
> Created-By: 1.6.0_0-b11 (Sun Microsystems Inc.)
> Class-Path:
>
> Is the Netbeans build supposed to work? Does anybody have any idea why
> the Main is not in the generated manifest?

You have found a bug for which I've applied a fix to make the Netbeans
produced runnable JARs in [svn r12449][1].


Thanks for the fix! Works perfectly now.
 
Although we use Netbeans for interactive debugging, we typically do
final packaging of ABCL by running the Ant task 'abcl.jar', which is
unfortunately a different code path than the way Netbeans generates the
jar.  Although Netbeans creates 'dist/abcl.jar' it never executes it
itself, instead using the buildpath elements, so we hadn't really tested
the Netbeans produced JAR.

[1]: http://trac.common-lisp.net/armedbear/changeset/12449

> A second question is what the best way is to include the jna library.
> I'm trying to compile CFFI with ABCL but that required jna as the
> following quote from CFFI's code shows:
>
> ;;; This implementation requires the Java Native Access (JNA) library.
> ;;; <http://jna.dev.java.net/>
>
> I downloaded the required jna.jar and figured that I could include it
> somehow in abcl.jar after building that. Unfortunately that build failed
> but I would like to be able to use it from Netbeans anyway. Does anybody
> know how to do that? My knowledge of the Java ecosystem is limited so
> figuring this out for ABCL specifically is not easy.

Which version CFFI?  I know that [Luís Olivera had created some
patches][2] last Summer, but I didn't know if they had been merged back
into the CFFI main distribution.  Fleshing out his implementation (it
was missing callbacks) is one of my many todo items. I'd be interested
in hearing about your experiences (when you have some!)

[2]: http://common-lisp.net/~loliveira/patches/cffi-abcl.diff


I checked out the latest version of CFFI and worked with the code in there. That compiles if I apply the following patch:

diff -rN old-cffi/src/cffi-abcl.lisp new-cffi/src/cffi-abcl.lisp
350c350
< (defmacro %foreign-funcall (name args &key library calling-convention)
---
> (defmacro %foreign-funcall (name args &key library convention)
356c356
< (defmacro %foreign-funcall-pointer (ptr args &key calling-convention)
---
> (defmacro %foreign-funcall-pointer (ptr args &key convention)
359c359
<     `(%%foreign-funcall (make-function-pointer ,ptr ',calling-convention)
---
>     `(%%foreign-funcall (make-function-pointer ,ptr ',convention)
369c369
<                         &key calling-convention)
---
>                         &key convention)

The :calling-convention keyword seems to be replaced by :convention.

I don't use CFFI directly but it is used by cl-sqlite. This seams to work, although I have some problem with the FIXNUM size. Untill I figure out what in cl-sqlite causes that I cannot tell much more, but ABCL works just fine.

I tried to run the test-suite in TRIVIAL-FEATURES (it uses cffi for its tests) but that doesn't work. It looks like it is related to cffi-grovel but I didn't exactly understand what was going on there. I guess grovel needs something added for ABCL because it works in other Lisps.

I would be interested in getting CFFI working for ABCL because that would make my application run in ABCL. If I can help in any way please let me know.
 
Incorporating additional JAR files in the Netbeans build involves 1)
Opening  the project properties dialog by choosing "File >> Project
Properties" from the main menu bar.  2) Under categories choosing
"Libraries".  3) Choosing "Run"  from the type of libraries.  4) Choose
"Add JAR/Folder" 5) choose the local path location of 'jna.jar'.

But the preferred way to add JAR files to the ABCL runtime classpath is
to set the 'additional.jars' property and use the 'abcl.wrapper' task.
To do this first copy the file 'build.properties.in' to
'build.properties'.  Then add a line

       additional.jars=/Path/to/jna.jar

specifying the local location of 'jna.jar'.  Now, when the task
'abcl.wrapper' is executed an 'abcl' ('abcl.bat' under Microsoft
Windows) script is created which includes the contents of this property
in the classpath.  Note that this wrapper script can't be executed
directly by Netbeans, which is was goal of your question.

To execute 'abcl.wrapper' from Netbeans, open 'build.xml' in the
Navigator view.  Right click on the 'abcl.wrapper' target,  the choose
"Run Target" from the popup menu.


Thanks again. Building from Netbeans works fine now
 
>
> Finally I would appreciate feedback on the following patch for
> TRIVIAL-FEATURES I needed to write to get CFFI to compile. It turned out
> that the endianess feature wasn't set.
>
> diff -rN old-trivial-features/src/tf-abcl.lisp
> new-trivial-features/src/tf-abcl.lisp
> 31c31,38
> < ;;; TODO
> ---
>  > (pushnew (let ((order (jcall "toString"
>  >                              (jstatic "nativeOrder"
> "java.nio.ByteOrder"))))
>  >            (cond ((string-equal order "LITTLE_ENDIAN")
>  >                   :little-endian)
>  >                  ((string-equal order "BIG_ENDIAN")
>  >                   :big-endian)
>  >                  (t (error "Byte order ~A unknown" order))))
>  >          *features*)
>
> Like I said, I'm no Java expert and feedback would be helpful.

Your Java code looks fine.  I don't know the semantics of
TRIVIAL-FEATURES, but note that ABCL itself is :BIG-ENDIAN as that is
the standard for the JVM.  Of course, CFFI needs to know the endian
nature of the external interface, so your code is reasonable for CFFI's
usage.

--
"A screaming comes across the sky.  It has happened before, but there
is nothing to compare to it now."

_______________________________________________
armedbear-devel mailing list
armedbear-devel@common-lisp.net
http://common-lisp.net/cgi-bin/mailman/listinfo/armedbear-devel