caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Gerd Stolpmann <info@gerd-stolpmann.de>
To: Hongbo Zhang <bobzhang1988@gmail.com>
Cc: caml users <caml-list@inria.fr>
Subject: [Caml-list] Re: working %.pp.ml target with ocamfind/ocamlbuild
Date: Wed, 12 Sep 2012 01:13:59 +0200	[thread overview]
Message-ID: <1347405239.3496.12@samsung> (raw)
In-Reply-To: <504F9DFD.1010204@gmail.com> (from bobzhang1988@gmail.com on Tue Sep 11 22:24:29 2012)

Am 11.09.2012 22:24:29 schrieb(en) Hongbo Zhang:
> On 9/11/12 2:27 PM, Gerd Stolpmann wrote:
>> Am 10.09.2012 14:18:42 schrieb(en) bob zhang:
>>> Btw, there's something wrong with the rule "%.pp.ml", I don't  
>>> remember
>>> exactly where it's, for your interest, you can have a look at
>>> 
>>> https://bitbucket.org/HongboZhang/camlp4/src/e88f431db722/myocamlbuild.ml
>>> 
>>> ocaml has a really really *high quality* compiler, but all the tools
>>> around
>>> it is not that satisfied, contribution is much harder than bug  
>>> fixes :-(
>>> 
>>> If you take a look at ICFP 12's paper about Shake, the idea is
>>> essentially
>>> the same as 'ocamlbuild', and the idea is cool, but the  
>>> implementation of
>>> ocamlbuild is fragile and buggy.
>> 
>> And I wonder why ocamlbuild is actually used. There is a *high  
>> quality*
>> build tool for ocaml: omake
> Well, IMHO, using a general purpose programming language with some  
> combinators is *way more better* than a DSL, I used ocamlbuild to  
> build a quite complex project: which includes bootstrapping,  
> different preprocessing flags, nested directories, packing  
> modules(byte code, native coce), (I even dynamically caculated the  
> preprocess flags).

Fully agreed - just FYI, your statement is also completely true for the  
omake DSL. As said, it is a functional language adapted to the special  
needs of build processes. The effects you mention are surprisingly  
simple to get from omake.

Just a few examples:

- nested directories: A build project is always a tree. You add a
   subdirectory by listing it in .SUBDIRS. You can refer to files in
   other directories with relative path, or by $(rootname path), which
   turns it into a path relative to the project root. omake understands
   when different paths mean the same file. Dependencies work
   cross-directory, of course.

- preprocessing flags: Here is a function that adds some flags for
   a certain top-level module:

   Camlp4o(module) =
       section
           OCAMLPACKS += camlp4
           OCAMLFINDFLAGS += -syntax camlp4o
           $(module).cmi:
           $(module).cmo:
           $(module).o $(module).cmx:

   You call it as Camlp4o(my_module), and the effect is that the
   flags are added to the default ones. Easy, isn't it? (Unfortunately,
   this example is missing in the manual.)

   This is possible because omake has scoped dependencies. This is
   ultra-cool, and I haven't this seen anywhere else in a build tool
   yet.

- Dynamically calculated flags: Well, variables can be lazily evaluated,
   so you can include function calls, e.g.

   OCAMLFLAGS = -pp -Dbuild_time=$`(gettimeofday)

   gettimeofday is here first called just before the compiler is invoked
   (because of the backtick, which makes it lazily called). Depending
   on when you want to calculate the flags, there are lots of  
alternatives.
   An example:

   OCAMLFLAGS += $(if $(multithreaded),-thread,)

   (when "multithreaded" is a boolean variable).

- You can vmount directories over each other. This is very useful for
   bootstrapping somthing, e.g.

   if $(eq $(stage),1)
       vmount(-l,src,stage_1)

   if $(eq $(stage),2)
       vmount(-l,src,stage_2)

   The binary output of stage 1 is written to directory stage_1, and the
   output of stage 2 to stage_2. Both directories can have different
   build rules, so you can declare to build stage_2 with the tools from
   stage_1.

The omake DSL is different from ocaml in the following points (apart  
from supporting special syntax for describing dependencies, and a nice  
standard library):

- It has dynamically scoped variables by default (i.e. closures take
   the bindings from where the function is called, not defined). This
   makes variables work more like normal arguments, and this is very
   useful here - build actions can be modified by the user in a
   context-dependent way.
- It is dynamically typed (but supports strings, lists/arrays, maps,  
objects,
   functions, and a number of other types). The dynamic typing is not  
crucial
   here, though - it is more a matter of a simple implementation.
- You can mix eager and lazy evaluation arbitrarily
- The expression syntax can be directly embedded in shell commands

Summarized, you can instruct omake with a few definitions to support  
even complex builds. It's just a time saver.

Gerd

> The problem with ocamlbuild is its implementation, not the idea, the  
> idea is pretty good.
>> 
>>> 
>>> On Mon, Sep 10, 2012 at 2:08 PM, Hongbo Zhang
>>> <bobzhang1988@gmail.com>wrote:
>>> 
>>> > Greetings,
>>> > On 9/9/12 6:29 PM, Wojciech Meyer wrote:
>>> >
>>> >> Gabriel Scherer <gabriel.scherer@gmail.com> writes:
>>> >>
>>> >>  This is useful for debugging purposes, and for some (minor)  
>>> modes of
>>> >>> use of Camlp4. However, for most Camlp4 development, this has  
>>> the
>>> >>> severe downside of losing the location information of the  
>>> original
>>> >>> file, if I understand correctly. This means that you don't want  
>>> to
>>> use
>>> >>> it as a transparent step towards compilation, but only in  
>>> exceptional
>>> >>> situations where the developers will re-edit the output code.
>>> >>>
>>> >>
>>> >> I think I've to say I disagree it's not useful, when I'm  
>>> developing a
>>> >> syntax extension on top of Camlp4 I really want to see the  
>>> generated
>>> >> code. Moreover to understand some of the more complicated syntax
>>> >> extensions like type_conv, deriving, FoldGenerator I need to look
>>> at the
>>> >> expanded code to understand how to use it - last time I hit the  
>>> same
>>> >>
>>> > Yes, it's damn useful not only for bootstrapping, but also for
>>> developing
>>> > to locate type errors. But there's something wrong with Camlp4's
>>> printer,
>>> > it has *4* printers in total, writing a printer for an Ast which  
>>> has no
>>> > backend is totally useless. In my branch of camlp4, *I removed all
>>> those 4
>>> > printers and using tools/pprintast.ml* in ocaml's compiler source
>>> > tree(with some my own bug fixes), and it works very well.
>>> > Btw, are you in ICFP? we could have a talk about Camlp4 :-)
>>> >
>>> >> problem it was actually 'deriving-ocsigen' when I needed to
>>> implement my
>>> >> own Show module - it's just much faster to see what's being  
>>> generated
>>> >> for the usual case, then trying to figure out from the recipe in  
>>> the
>>> >> documentation.  Otherwise for bootstrapping purposes, you might
>>> want to
>>> >> pre-generate some code too and put into the repository.
>>> >>
>>> >> --
>>> >> Wojciech Meyer
>>> >> http://danmey.org
>>> >>
>>> >>
>>> >
>>> 
>>> 
>>> --
>>> Regards
>>> -- Bob
>>> 
>>> --
>>> Caml-list mailing list.  Subscription management and archives:
>>> https://sympa-roc.inria.fr/wws/info/caml-list
>>> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
>>> Bug reports: http://caml.inria.fr/bin/caml-bugs
>>> 
>>> 
>> 
> 
> 


-- 
------------------------------------------------------------
Gerd Stolpmann, Darmstadt, Germany    gerd@gerd-stolpmann.de
Creator of GODI and camlcity.org.
Contact details:        http://www.camlcity.org/contact.html
Company homepage:       http://www.gerd-stolpmann.de
------------------------------------------------------------

  reply	other threads:[~2012-09-11 23:14 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-12-30 23:19 [Caml-list] " Anil Madhavapeddy
2011-12-31  9:22 ` Gabriel Scherer
2012-09-09 16:29   ` Wojciech Meyer
2012-09-10 12:08     ` [Caml-list] " Hongbo Zhang
2012-09-10 12:18       ` bob zhang
2012-09-10 13:04         ` Wojciech Meyer
2012-09-11 12:27         ` AW: " Gerd Stolpmann
2012-09-11 12:50           ` Wojciech Meyer
2012-09-11 13:41             ` AW: " Gerd Stolpmann
     [not found]             ` <1347370879.3496.9@samsung>
2012-09-11 14:02               ` Wojciech Meyer
2012-09-11 20:24           ` [Caml-list] Re: AW: " Hongbo Zhang
2012-09-11 23:13             ` Gerd Stolpmann [this message]
2012-09-12  5:16               ` [Caml-list] " Hongbo Zhang
2012-09-10 12:55       ` Wojciech Meyer
2012-09-10 13:52         ` Alain Frisch
2012-09-10 14:36           ` Paolo Donadeo
2012-09-18  6:08             ` [Caml-list] Slides of ML workshop (was: working %.pp.ml target with ocamfind/ocamlbuild) Alain Frisch
2012-09-20 21:04     ` [Caml-list] working %.pp.ml target with ocamfind/ocamlbuild Anil Madhavapeddy

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=1347405239.3496.12@samsung \
    --to=info@gerd-stolpmann.de \
    --cc=bobzhang1988@gmail.com \
    --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).