OK, I have a first working version and so I wanted to share it with you.
I have not yet the time to start writing the doc since I just finished the first pass on the code. Tomorrow I will start with the doc. But I thought some of you may be interested in taking a look even without formal “doc” (and some feedback/iteration may avoid re-writing docs..).
If you have no clue what I am talking about, then this summary is for you:
When we use FFI to call a certain library it’s quite common that we need to pass as argument certain constants (for example, SIGKILL to kill()). These constants are defined in C header files and can even change it’s value in different paltforms.
These constants also are sometimes defined by the C preprocessor and so there is not way to get those values from FFI. If you don’t have the value of those constants, you cannot make the FFI call.
I have tested the tool in OSX and CentOS using latest Pharo 5.0. It won’t work in Windows right now. As usual, all classes and methods have comments and there are enough tests.
At the end, I decided the C program will output a very naive Smalltalk literal array kind of thingy. The tool then parses that output and directly creates a init method (which is compiled into the SharedPool class) for that platform which is then called automatically at startup (only if initialization is needed).
As for real examples, I started to write constants for libc: signal.h (to use kill()) , wait.h (to use wait() famility), fcntl.h (to use … xxx()) , and errno.h. You can take a look to the package ‘FFICHeaderExtractor-LibC’.
Note that for running the tests you need ‘cc’ findable by path in OSX and ‘gcc’ in Unix.
To load the code in a latest Pharo 5.0, execute:
Any feedback is appreciated.
I will start writing the doc now.
BTW: Big thanks to Eliot Miranda which helped me answering noob questions and providing useful code and guidelines.