Version française
Home     About     Download     Resources     Contact us    
Browse thread
[Caml-list] ocamlmklib missing in win32 ?
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Dmitry Bely <dbely@m...>
Subject: Re: [Caml-list] ocamlmklib missing in win32 ?
Xavier Leroy <xavier.leroy@inria.fr> writes:

>> I had been trying to install some additional packages in my system.
>> My original intention was to install PXP.  I am getting closer now. I have
>> managed PCRE (with some hints and files from Yutaka OIWA).
>> 
>> I needed to build (I think) the wlex - runtime to get PXP built.
>> But while building wlex broke because there is no ocamlmklib in my system.
>
> Correct: ocamlmklib is only available under Unix (and Cygwin), but not
> for the native Win32 port of OCaml.
>
> The reason is as follows: ocamlmklib builds both a DLL and a static
> library from a common set of C object files.  This works fine under
> Unix because (with the right compilation options) the same object
> files can be used in both DLL and static contexts.  But this isn't so
> under Windows: object files for a DLL need to be compiled with
> different, incompatible flags than object files for a static library.

IMHO that's wrong. /M* compiler flags specify which Microsoft runtime library our
compiled module (no matter dll, static lib, or standalone exe) will be
linked with. _DLL macro, that /MD also defines, is just intended for use in
Microsoft headers (they are slightly different for DLL-packaged
runtime). So you can build a DLL with /MT flag and using #if _DLL in misc.h
seems to not be very correct. As a solution that requires mininal changes,
but uses the same compiler flags for building both static and dynamic
libraries, I would suggest

[byterun/misc.h]
#if defined(_WIN32)
# if defined(_MSC_VER) 
/* Supress the warning, generated by dllimport declaration */
/* and dllexport definition if both are present            */
#  pragma warning(disable: 4273)
# endif
# define CAMLexport __declspec(dllexport)
# define CAMLprim __declspec(dllexport)
# define CAMLextern __declspec(dllimport) extern
#else
# define CAMLexport
# define CAMLprim
# define CAMLextern extern
#endif

[byterun/custom.c]
replace CAMLextern with CAMLexport in function definitions (looks like a
bug)

[config/Makefile]
BYTECCCOMPOPTS=/Ox /MD
BYTECCLINKOPTS=$(BYTECCCOMPOPTS)
DLLCCCOMPOPTS=$(BYTECCCOMPOPTS)
NATIVECCCOMPOPTS=$(BYTECCCOMPOPTS)
NATIVECCLINKOPTS=$(NATIVECCCOMPOPTS)

It works -- I have just done "make -f Makefile.nt clean world opt bootstrap".

> Hence, the Windows Makefiles for a mixed OCaml/C library must be
> written in such a way that C files are compiled twice, with the
> correct flags, and the building of the DLL and of the static library
> must be done by hand.  To see how to proceed, refer to 
> otherlibs/*/Makefile.nt in the OCaml source distribution.
>
> Sorry for the inconvenience, but once more Windows makes things more
> complex than they really need to be :-)

- Dmitry Bely


-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners