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.
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!)
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