[Omake] Problem with OCamlPackage

Alain Frisch alain.frisch at lexifi.com
Fri Sep 28 03:14:15 PDT 2007


Hello,

I've got some problems with the OCamlPackage function in OCaml.om. If I
simply do:

OCAMLDEP_MODULES_ENABLED = false
NATIVE_ENABLED = false
OCamlPackage(p, a)

then "omake p.cmi" warns me that:

   These file are targeted separately, but appear as effects of a single
rule.
    This is likely to lead to unpredictable behavior.
    targets:
       tmp\p.cmo
          (File c:\Program Files\OMake\lib\omake\\build\OCaml.om: line
863, characters 3-31)
       tmp\p.cmi
          (File c:\Program Files\OMake\lib\omake\\build\OCaml.om: line
888, characters 4-11)
*** omake:
    These file are targeted separately, but appear as effects of a
single rule.
    This is likely to lead to unpredictable behavior.
    targets:
       tmp\p.cmi
          (File c:\Program Files\OMake\lib\omake\\build\OCaml.om: line
888, characters 4-11)
       tmp\p.cmo
          (File c:\Program Files\OMake\lib\omake\\build\OCaml.om: line
863, characters 3-31)

and indeed, I've observed strange behaviors (corrupted interfaces in
parallel build).

Why are rules duplicated in the definition of OCamlPackage? I've tried
the following, and it seems to work fine (I haven't tested the case when
the .mli file exists):

public.OCamlPackage(name, files) =
    protected.OFILES   = $(addsuffix $(EXT_OBJ), $(files))
    protected.CMOFILES = $(addsuffix .cmo, $(files))
    protected.CMXFILES = $(addsuffix .cmx, $(files))

    protected.OBJ       = $(file $(name)$(EXT_OBJ))
    protected.CMO       = $(file $(name).cmo)
    protected.CMX       = $(file $(name).cmx)
    protected.CMI       = $(file $(name).cmi)
    protected.MLI       = $(file $(name).mli)

    protected.BYTE_TARGETS   = $(CMO)
    protected.NATIVE_TARGETS = $(CMX) $(OBJ)

    protected.TARGETS = $(CMI)
    if $(NATIVE_ENABLED)
        TARGETS += $(NATIVE_TARGETS)
        export

    if $(BYTE_ENABLED)
        TARGETS += $(BYTE_TARGETS)
        export

    #
    # Link commands
    #
    protected.BYTE_DEPS = $(CMOFILES)
    protected.NATIVE_DEPS = $(CMXFILES) $(OFILES)

    if $(target-exists $(MLI))
      BYTE_DEPS += $(CMI)
      NATIVE_DEPS += $(CMI)
      $(CMI): $(MLI) :scanner: scan-ocaml-$(basename $(name)).mli
        $(OCamlC) -c $<
      export
    elseif $(NATIVE_ENABLED)
      BYTE_DEPS += $(CMI)
      NATIVE_TARGETS += $(CMI)
      export
    else
      BYTE_TARGETS += $(CMI)
      export

    $(BYTE_TARGETS): $(BYTE_DEPS)
      $(OCAMLFIND) $(OCAMLC) $(LAZY_OCAMLFINDFLAGS)
$(PREFIXED_OCAMLPACKS) $(OCAMLFLAGS) \
        $(OCAMLCFLAGS) $(OCAML_LIB_FLAGS) -pack -o $(CMO)
$(OCamlLinkSort $(CMOFILES))

    $(NATIVE_TARGETS): $(NATIVE_DEPS)
      $(OCAMLFIND) $(OCAMLOPTLINK) $(LAZY_OCAMLFINDFLAGS)
$(PREFIXED_OCAMLPACKS) $(OCAMLFLAGS) \
        $(OCAMLOPTFLAGS) $(OCAML_LIB_FLAGS) -pack -o $(CMX)
$(OCamlLinkSort $(CMXFILES))

    return $(TARGETS)

-- Alain




More information about the Omake mailing list