Previous week Up Next week


Here is the latest Caml Weekly News, for the week of September 01 to 08, 2009.

  1. Dynamic loading of native code : what about librairies and packs ?
  2. Windows Vista/7 specific functions
  3. Documentation to start
  4. Camomile library tutorial/examples?
  5. OCaml on Android
  6. ocamlfind and GODI packaging sprint this Wednesday, 9/9
  7. Other Caml News

Dynamic loading of native code : what about librairies and packs ?


Continuing this old thread, Pierre-Loïc Garoche asked:
I am still having some problems with the dynamic loading of native code. Allow
me to give you an extremely simple example to illustrate my problem. I hope
you can clarify my understanding of it.

My problem concerns the dynamic loading of native code where the dynamic code
loaded depends on another library.

Basically there are three files:
-, dynamically loading the plugin
-, the loaded code that depends on the external lib
-, the external lib

let _ = print_string "main\n"
let _ = Dynlink.loadfile "MyPlugin.cmxs"

compiled with ocamlopt -o MyProg dynlink.cmxa

let _ = print_string "mylib\n"
let myval : (int , int) Hashtbl.t = Hashtbl.create 13

compiled with ocamlopt -a -linkall -o mylib.cmxa

let _ = print_string "plugin\n"
let cst = Mylib.myval

compiled and linked to build a shared library with
ocamlopt -shared -linkall -o MyPlugin.cmxs mylib.cmxa

Running it gives me the following error
error loading shared library: blabla/MyPlugin.cmxs: undefined symbol: 

Remark1 : Of course, building a standalone plugin works:
ocamlopt -o PluginSelf mylib.cmxa plugin.cmx

Remark2: If I don't rely on an external module and replace myval by an integer
or any other self defined type value, it works as well.

Remark3: The linkall option does not seems to have an impact on such simple

Question: How should I link it to rely on external libraries and produce a
valid MyPlugin.cmxs ?

Any hint or comment will be greatly appreciated !
Christophe Troestler suggested:
You should reference « Hashtbl » in your main program :
 module ForLinking_1 = Hashtbl
 let () = print_string "main\n"
 let () = Dynlink.loadfile "MyPlugin.cmxs"

BTW, if you want your program to work in both bytecode and native
code, you should use:

 Dynlink.loadfile (Dynlink.adapt_filename "MyPlugin.cmo")
Alain Frisch also added:
You need to ensure that the main program is linked with all the modules that
are needed by the dynamically loaded modules (including the modules from the
standard library). Linking the main program with -linkall should solve your

Windows Vista/7 specific functions


Reed Wilson asked:
I am going to be writing a native-code 64-bit program which takes advantage of
some Windows Vista-only features (transactional NTFS), and I was wondering how
to get it working in OCaml. I have made numerous interfaces to Windows XP
functions, but the problem is that the NTFS transactional functions are only
available through MSVS 2008 and the Vista/7 SDKs, which OCaml seems to not
compile with. I tried using the new Windows 7 SDK tools to compile the program
to native code, but it kept giving me errors with not being able to find

Does anybody know if there is any way to compile a 64-bit OCaml with the newer
Windows SDKs, or failing that, to at least tell OCaml how to properly link
things with them?
David Allsopp replied:
Having hacked away with the Win64 port before I thought I’d have a go. The
first thing I noticed is that Microsoft have finally released the x86 and x64
compilers in the same package (this was a pain if you wanted to build MSVC and
MSVC64 ports as you needed two SDKs to do it...) – though I haven’t tried
building the 32-bit MSVC port from this SDK yet.

Here’s what I did (you’ll have to excuse my idiosyncratic way of copying
binary files into the OCaml tree – these can be replaced with PATH changes if
you want. I copy things around so that ocamlopt always works without needing a
special build environment or vast compiler suites permanently in my PATH).

The build is slightly complicated because you need to build flexdll directly.

Make sure you have Cygwin base with with Devel\make and Devel\subversion added

I installed the Win7 SDK to C:\Dev\WinSDK (though it still irritatingly puts
the compilers in C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC). I
didn’t bother installing Documentation, Samples or the IA64 libraries.

Add the following to your LIB environment variable:
  C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib\amd64;C:\Dev\WinSDK\lib\x64

Add the following to your INCLUDE environment variable:
  C:\Program Files (x86)\Microsoft Visual Studio 9.0\vc\include;C:\Dev\WinSDK\Include

Set OCAMLLIB to C:\Dev\OCaml-MSVC64\lib

A whole load of files now get copied to C:\Dev\OCaml-MSVC64\bin:
From C:\Cygwin\bin, copy cygpath.exe and cygwin1.dll (needed by flexlink)

Extract flexdll.h, default.manifest and flexlink.exe from the flexdll 0.19 x86
binaries (latest flexlink tool – doesn’t need to be x64)

From C:\Program Files (x86)\Microsoft Visual Studio\9.0\VC\bin\amd64, copy:
  1033\clui.dll (this needs to be in C:\Dev\OCaml-MSVC64\bin\1033)
  ml64.exe, cl.exe, c1.dll, c2.dll, cvtres.exe, link.exe and mspdb80.dll

From C:\Dev\WinSDK\Bin\x64, copy mt.exe

Or workaround that stupidity by having C:\Cygwin\bin and the other directories
in your PATH

Start Bash (possibly as Administrator depending on permissions set on C:\Dev)

I placed the ocaml 3.11.1 tarball in C:\Dev\Src-MSVC64

Note that the sed instruction not only sets PREFIX but it also removes
bufferoverflowu.lib from EXTRALIBS – apparently this is no longer needed in
this version of the SDK (presumably the compiler has started to include all
the required support natively or perhaps the runtime now has it).

$ cd /cygdrive/c/Dev/Src-MSVC64
$ svn co svn:// flexdll-dev
$ cd flexdll-dev
$ make CHAINS=msvc flexdll_msvc.obj flexdll_initer_msvc.obj
$ cp *.obj /cygdrive/c/Dev/OCaml-MSVC64/bin
$ cd ..
$ tar -xzf ocaml-3.11.tar.gz
$ cd ocaml-3.11
$ cp config/m-nt.h config/m.h
$ cp config/s-nt.h config/s.h
$ sed -e '20s/=.*$/=C:\/Dev\/OCaml-MSVC64/' -e '92s/=.*/=/' config/Makefile.msvc64 > config/Makefile
$ make -f Makefile.nt world opt opt.opt install

And you should have a fully working MSVC64 build with the Win7 SDK Compilers
(and therefore be able to link against the newer libraries). If you wish,
quite reasonably, to be a purist and have everything 64-bit you can now go
back to flexdll-dev and say:

$ sed -i -e 's/"afxres.h"/<windows.h>/' version.rc
$ rc version.rc
$ cvtres /nologo /machine:amd64 /out:version_res.obj version.res
$ make
$ ocamlopt -o flexlink.exe -ccopt "-link version_res.obj"
$ cp flexlink.exe /cygdrive/c/Dev/OCaml-MSVC64/bin

And you’ll have flexlink.exe as a 64-bit executable as well.

Documentation to start


vernade asked and Philip answered:
> I just downloaded ocaml (and caml-light) . I am looking for documentation on pdf 
> or any format that I can easily download , read and print. I need basic 
> information. All I found was on line and the "help" didn't come with the file I 
> downloaded to install ocaml and caml-light. 

a first place to start is: 

Installation is quite easy on fedora 11: 
just do a 'yum install' 
David Mentre also replied:
As you probably speak French, take a look at "Le Langage Caml" book: 

It is dedicated to Caml Light but code examples can be adapted fairly 
easily to OCaml. 

It is a very good book! 
Ashish Agarwal also replied:
I would recommend Jason Hickey's excellent book [1]. You can also look at 
the OCaml manual [2], but in my opinion this is better as reference. 
The easiest way to install OCaml depends on the OS you are using, but GODI 
[3] is a good choice for most systems. 


Camomile library tutorial/examples?


Morozov Matvey asked and Dmitry Grebeniuk replied:
> Recently I tried to add some unicode support to my project (for instance I 
> need to convert Cyrillic characters from uppercase to lowercase and vice 
> versa). 

I don't know of any good documentation on Camomile, but here is a 
code that converts line from terminal to uppercase and lowercase, 
assuming that your terminal's encoding is utf8. 

===== ===== 
open Printf 
module PREF = CamomileLibrary.Default.Camomile 
module CE = PREF.CharEncoding 
module CM = PREF.CaseMap.Make(PREF.UTF8) 

let _ = 
    while true do printf "> %!"; 
      let line = input_line stdin in 
      let up = CM.uppercase line 
      and low = CM.lowercase line 
      in printf "ORIG : %s\nUPPER: %s\nLOWER: %s\n%!" line up low 
  | End_of_file -> () 
===== / ===== 

$ ocamlfind ocamlc -package camomile -linkpkg -o camotest 
$ ./camotest

OCaml on Android


Keigo Imai announced:
I built an O'Caml cross-compiler for Google Android!

The porting step is available at

The example shows that Unison is invoked from android's shell.
(Since Android app works on java VM, we cannot build Android application
diretly with O'Caml yet. But anyway, it works!)

The patch itself is not so big, and nothing special (removing reference to
unsupported functions, modify 'ar' to '$(AR)', and so on), so I encourage you
to extend it for your use, such as adapting it to O'Jacare or OCaml-Java.

ARM-EABI with software floating-point support[1] saved much time.
Many thanks to Xavier!


ocamlfind and GODI packaging sprint this Wednesday, 9/9


Hezekiah M. Carty announced:
There will be an informal GODI packaging sprint for OCaml libraries
this Wednesday, 9/9, with coordination taking place via IRC (#ocaml on
Freenode).  Some information (documentation, ideas for libraries to
package) is available here:

The site is a wiki, so please feel free to add links to packaging
documentation, ideas for libraries to package or other relevant

Everyone is welcome!  The plan is to continue the packaging efforts
throughout the day.  If you are interested, please drop by for as long
or short a time as you like.

Many thanks to bluestorm for suggesting and initiating this effort!

Other Caml News

From the ocamlcore planet blog:
Thanks to Alp Mestan, we now include in the Caml Weekly News the links to the
recent posts from the ocamlcore planet blog at

Constructive stone: finite sets:

Constructive gems and stones:

ocamlviz: First version available:

Old cwn

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a look at the archive or the RSS feed of the archives.

If you also wish to receive it every week by mail, you may subscribe online.

Alan Schmitt