caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Dmitry Bely <dbely@mail.ru>
To: caml-list@inria.fr
Subject: Re: [Caml-list] ocamlmklib missing in win32 ?
Date: Sat, 07 Sep 2002 15:26:28 +0400	[thread overview]
Message-ID: <fzwmm463.fsf@mail.ru> (raw)
In-Reply-To: <20020826152250.A604@pauillac.inria.fr>

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


      reply	other threads:[~2002-09-07 11:27 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-08-21 21:17 PJ Durai
2002-08-26 13:22 ` Xavier Leroy
2002-09-07 11:26   ` Dmitry Bely [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=fzwmm463.fsf@mail.ru \
    --to=dbely@mail.ru \
    --cc=caml-list@inria.fr \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).