From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail1-relais-roc.national.inria.fr (mail1-relais-roc.national.inria.fr [192.134.164.82]) by sympa.inria.fr (Postfix) with ESMTPS id 270F27ED7A for ; Wed, 12 Sep 2012 07:16:22 +0200 (CEST) Received-SPF: None (mail1-smtp-roc.national.inria.fr: no sender authenticity information available from domain of bobzhang1988@gmail.com) identity=pra; client-ip=209.85.212.174; receiver=mail1-smtp-roc.national.inria.fr; envelope-from="bobzhang1988@gmail.com"; x-sender="bobzhang1988@gmail.com"; x-conformance=sidf_compatible Received-SPF: Pass (mail1-smtp-roc.national.inria.fr: domain of bobzhang1988@gmail.com designates 209.85.212.174 as permitted sender) identity=mailfrom; client-ip=209.85.212.174; receiver=mail1-smtp-roc.national.inria.fr; envelope-from="bobzhang1988@gmail.com"; x-sender="bobzhang1988@gmail.com"; x-conformance=sidf_compatible; x-record-type="v=spf1" Received-SPF: None (mail1-smtp-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@mail-wi0-f174.google.com) identity=helo; client-ip=209.85.212.174; receiver=mail1-smtp-roc.national.inria.fr; envelope-from="bobzhang1988@gmail.com"; x-sender="postmaster@mail-wi0-f174.google.com"; x-conformance=sidf_compatible X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjACAEQZUFDRVdSujWdsb2JhbABFqXeRWAgiAQEBAQkJCwkSBiOCIAEBAQQBAQEPAiQIARsSBgUBAwwGBQsDCgkEIQ8CEAIRAQUBChIGDQEFAgEBDgkHh1sBAwwEB5x7CQOMI4JzhT4KGScDClmIdAEFDIohY4ZCA5QKgVWBFIoBgys/hAg X-IronPort-AV: E=Sophos;i="4.80,407,1344204000"; d="scan'208";a="172778284" Received: from mail-wi0-f174.google.com ([209.85.212.174]) by mail1-smtp-roc.national.inria.fr with ESMTP/TLS/RC4-SHA; 12 Sep 2012 07:16:21 +0200 Received: by wibhr14 with SMTP id hr14so3778707wib.9 for ; Tue, 11 Sep 2012 22:16:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:newsgroups:to:cc :subject:references:in-reply-to:content-type :content-transfer-encoding; bh=ax1tzvGv9FQ8IbZPYI/EfE6Xc/lwSl+COtcrnHGcHPQ=; b=F6Git/5SNNzUCK0sdhTpvUu+MKrzqs6m3kcrznP/8n8lsTYNAx00bzKVxnpewZEAnt 2fum8Evtd44BQXc6dzLZIc0cHipAtGEwXJ5Ixr55QBdY6h+8K01MbhWb21RD54ufRu83 Tip6jzHiPHDlIcsG/J89AQpCrCEKip1Bpy6qDNrj0UH4rBS2I8XRjOVuoHebW/c9J//4 dTg/N9Es+BlL0yvMmsCtX73o0bXWpDVh1Ie5+9yA+v+R53Jd68th2ybw///wJZNwHs4C RZR4EPfwXg18+3MRgsDDCsyv5chVNIySkeEUNHaX07n1XW+UiQkJw9P/4n3/gkmg/dEq YAbg== Received: by 10.216.198.10 with SMTP id u10mr11170345wen.80.1347426980835; Tue, 11 Sep 2012 22:16:20 -0700 (PDT) Received: from Hongbos-MacBook-Air.local ([91.143.127.68]) by mx.google.com with ESMTPS id w7sm6249917wiz.0.2012.09.11.22.16.18 (version=SSLv3 cipher=OTHER); Tue, 11 Sep 2012 22:16:19 -0700 (PDT) Message-ID: <50501AA2.50808@gmail.com> Date: Wed, 12 Sep 2012 07:16:18 +0200 From: Hongbo Zhang User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:15.0) Gecko/20120907 Thunderbird/15.0.1 MIME-Version: 1.0 Newsgroups: gmane.comp.lang.caml.inria To: Gerd Stolpmann CC: caml users References: <504F9DFD.1010204@gmail.com> <1347405239.3496.12@samsung> In-Reply-To: <1347405239.3496.12@samsung> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: [Caml-list] Re: working %.pp.ml target with ocamfind/ocamlbuild Thanks for your interesting input. I admit omake is a high quality tool if well maintained. But DSL is not enough, for example, can it do the 'io', calling my self customized lexing rules to generate dependency dynamically?(This is fairly simple in ocamlbuild). The DSL solution is wrong since you never know how complex rules your customer needs in advance. If ocamlbuild accept binary input(not only one myocamlbuild.ml), it will be much more powerful. On 9/12/12 1:13 AM, Gerd Stolpmann wrote: > 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 >>>> wrote: >>>> >>>> > Greetings, >>>> > On 9/9/12 6:29 PM, Wojciech Meyer wrote: >>>> > >>>> >> Gabriel Scherer 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 >>>> >>>> >>> >> >> > >