[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: | 2007-03-28 (21:01) |
From: | Aleksey Nogin <nogin@m...> |
Subject: | Re: [Caml-list] Can this OMakefile be simplified? |
On 28.03.2007 01:28, Joel Reymont wrote: > I found this OMakefile in the sqlite3 bindings for OCaml. I'm trying to > package my translator as a set of C bindings and I wonder if this > Omakefile can be made simpler. [...] > ########################################### > > SubstVersion(output, input) = > # should use fsubst, but it doesn't seem to be > # working properly in 0.9.2. > $(output) : $(input) > sed "s%@VERSION@%$(VERSION)%g" < $< > $@ I wonder what the problem was here - I would imagine it is fixed now. In any case, a lot of this version mangling stuff is probably specific to how the sqlite3 build environment is set up. A lot of the code below can be simplified using some of the features of the more recent versions of OMake. > ########################################### > OCamlLibraryExt(name, files, cfiles) = > OFILES = $(addsuffix $(EXT_OBJ), $(cfiles)) > CMOFILES = $(addsuffix .cmo, $(files)) > CMXFILES = $(addsuffix .cmx, $(files)) > CMIFILES = $(addsuffix .cmi, $(files)) > CLIB = $(file $(name)$(EXT_LIB)) > BYTELIB = $(file $(name).cma) > NATIVELIB = $(file $(name).cmxa) > STUBLIB = lib$(name)_stubs > # Create C library to contain all the object files... > StaticCLibrary($(STUBLIB), $(cfiles)) > # Link commands > # TODO: Doesn't work with ddls... > $(BYTELIB): $(CMOFILES) $(STUBLIB)$(EXT_LIB) > $(OCAMLFIND) $(OCAMLLINK) $(OCAMLFLAGS) $(OCAMLCFLAGS) \ > $(OCAML_LIB_FLAGS) -a -custom -cclib -l$(name)_stubs \ > -o $@ $(OCamlLinkSort $(CMOFILES)) > > $(NATIVELIB) $(CLIB): $(CMXFILES) $(STUBLIB)$(EXT_LIB) > $(OCAMLFIND) $(OCAMLOPTLINK) $(OCAMLFLAGS) $(OCAMLOPTFLAGS) \ > $(OCAML_LIB_FLAGS) -a -cclib -l$(name)_stubs -o \ > $(NATIVELIB) $(OCamlLinkSort $(CMXFILES)) > > # Add to targets > if $(NATIVE_ENABLED) > library: $(NATIVELIB) > > if $(BYTE_ENABLED) > library: $(BYTELIB) The above can be significantly simplified, using something like the code below (untested). OCamlLibraryExt(name, files, cfiles) = STUBLIB = lib$(name)_stubs STUBLIB_BIN = $(StaticCLibrary $(STUBLIB), $(cfiles)) OCAMLCFLAGS += -custom OCAML_LIB_FLAGS += -cclib -l$(STUBLIB) LIB_FILES = $(OCamlLibrary $(name), $(files)) $(LIB_FILES): $(STUBLIB_BIN) library: $(LIB_FILES) return $(LIB_FILES) The "return" line is option - it is only needed if somebody wants to know with files just got their build rules defined (can be very helpful, as the usage of the StaticCLibrary and OCamlLibrary functions above demonstrates). > # Program with tag for executables > OCamlProgramExt(tag, name, sources) = > OCamlProgram($(name), $(sources)) > > if $(NATIVE_ENABLED) > $(tag) : $(name).opt > > if $(BYTE_ENABLED) > $(tag) : $(name).run The above is IMO unnecessary. The function can be defined as OCamlProgramExt(tag, name, sources) = $(tag): $(OCamlProgram $(name), $(sources)) but it is better to simply inline the corresponding code. > OCAMLLIBDIR = $(shell ocamlfind printconf stdlib) OCAMLLIBDIR = $(shell $(OCAMLC) -where) might be a slightly better idea (it's nice not to rely on having ocamlfind installed). Aleksey