Since 4.01, ocamlbuild supports a new (experimental) option "-plugin-tag" that allows to specify (built-in) ocamlbuild tags to use when compiling myocamlbuild.ml. If you package coq-paths using findlib, you can then use

  ocamlbuild -use-ocamlfind -plugin-tag "package(coq-path)" ...


On Tue, Dec 10, 2013 at 11:20 PM, Gregory Malecha <gmalecha@cs.harvard.edu> wrote:
Hello --

I have several ocamlbuild plugins that are very similar and I'm trying to figure out how to refactor them. I pulled out a bunch of definitions into another file (coq_paths.ml) and then said 'open Coq_paths' in 'myocamlbuild.ml'. But when I do this, ocamlbuild can no longer build the plugin, not even if foo.cmo already exists in the _build directory.

After hacking on this for a long time (and digging through the ocamlbuild sources) I found that you can write a Makefile that will build myocamlbuild.cmo using ocamlbuild without a plugin, and then manually link this against ocamlbuild.cmo and to produce a custom version of ocamlbuild that uses the plugin (this is exactly what ocamlbuild does). My question is: 'is there any nicer way to do this?' I'm including my Makefile below:

OCAMLBUILDDIR=$(shell ocamlfind query ocamlbuild)

all: _build/coq_builder
        @ ./_build/coq_builder -no-plugin coq.otarget

_build/coq_builder: myocamlbuild.ml coq_paths.ml
        @ echo "building builder...."
        @ ocamlbuild -cflags -I,`ocamlfind query ocamlbuild` -no-plugin myocamlbuild.cmo
        @ ocamlc.opt unix.cma -I $(OCAMLBUILDDIR) $(OCAMLBUILDDIR)/ocamlbuildlib.cma \
           _build/coq_paths.cmo _build/myocamlbuild.cmo \
           $(OCAMLBUILDDIR)/ocamlbuild.cmo -o _build/coq_builder
        @ echo "done"

clean:
        ocamlbuild -clean

Thanks in advance.

--