Makefile
dans le répertoire où réside votre programme.
Makefile
doit être écrit dans le répertoire
où réside les sources de votre programme.camlc
, camllex
et
camlyacc
, liste des fichiers source Caml et des fichiers
objets à créer)..depend
(touch .depend
). Vide au départ, ce fichier contiendra la
liste des dépendances de compilation entre les fichiers des modules de
votre programme, calculées automatiquement par la commande make
depend
.make
. Recommencer à chaque nouvelle
modification de l'un des fichiers du programme.
Plus précisément, ce fichier Makefile
vous offre les
«entrées» suivantes:
make
reconstruit le programme exécutable.make depend
recalcule les dépendances entre
les modules du programme et donc recalcule l'ordre dans lequel il
faut compiler les fichiers.make clean
supprime les fichiers compilés
et le programme exécutable.make all
recalcule les dépendances et
recompile le programme.make clean; make all
recompile
entièrement tous les modules du programme et recrée l'exécutable.
L'idéal est d'utiliser make
avec l'éditeur
emacs
: on appelle make
avec la commande
emacs Meta-X compile
. S'il se produit une erreur à la
compilation, l'éditeur se positionnera automatiquement sur la ligne
signalée par le compilateur Caml, en ouvrant le fichier correspondant
Meta-X next-error
. La commande Meta-X
compile
est généralement liée à la combinaison de touche
CTRL-C CTRL-C
, tandis que Meta-X next-error
est lié à CTRL-X `
.
Ce qui signifie qu'on recompile le programme et positionne le curseur
sur l'erreur détectée en 4 appuis de touches.
En outre ce Makefile générique vous propose la liaison avec les
librairies du système Caml. Pour cela il vous faut ajouter des options
$(WITH*)
, par exemple $(WITHUNIX)
pour
utiliser la librairie d'interface avec Unix dans votre programme.
(Voir le mode d'emploi dans le Makefile lui-même).
Le Makefile
proposé ci-dessous prend pour exemple un
petit programme composé de:
lexer.mll
parser.mly
types
composé des fichiers
types.mli
et types.ml
.main.ml
On suppose en outre que le programme exécutable à créer se nomme
a.out
.
#*********************************************************************# # # # Objective Caml # # # # Pierre Weis, projet Cristal, INRIA Rocquencourt # # # # Copyright 1998 Institut National de Recherche en Informatique et # # en Automatique. Distributed only by permission. # # # #*********************************************************************# # Generic Makefile for Objective Caml Programs ############################ Documentation ###################### # # To use this Makefile: # -- You must fix the value of the variable SOURCES below. # (The variable SOURCES is the list of your Caml source files.) # -- You must create a file .depend, using # $touch .depend # (This file will contain the dependancies between your Caml modules, # automatically computed by this Makefile.) # Usage of this Makefile: # To incrementally recompile the system, type # make # To recompute dependancies between modules, type # make depend # To remove the executable and all the compiled files, type # make clean # To compile using the native code compiler # make opt # ################################################################## ################################################################## # # Advanced usage: # --------------- # If you want to fix the name of the executable, set the variable # EXEC, for instance, if you want to obtain a program named my_prog: # EXEC = my_prog # If you need special libraries provided with the Caml system, # (graphics, arbitrary precision numbers, regular expression on strings, ...), # you must set the variable LIBS to the proper set of libraries. For # instance, to use the graphics library set LIBS to $(WITHGRAPHICS): # LIBS=$(WITHGRAPHICS) # You may use any of the following predefined variable # WITHGRAPHICS : provides the graphics library # WITHUNIX : provides the Unix interface library # WITHSTR : provides the regular expression string manipulation library # WITHNUMS : provides the arbitrary precision arithmetic package # WITHTHREADS : provides the byte-code threads library # WITHDBM : provides the Data Base Manager library # # ########################## End of Documentation #################### ########################## User's variables ##################### # # The Caml sources (including camlyacc and camllex source files) SOURCES = lexer.mll parser.mly types.mli types.ml main.ml # The executable file to generate EXEC = a.out ########################## Advanced user's variables ##################### # # The Caml compilers. # You may fix here the path to access the Caml compiler on your machine # You may also have to add various -I options. CAMLC = ocamlc CAMLOPT = ocamlopt CAMLDEP = ocamldep CAMLLEX = ocamllex CAMLYACC = ocamlyacc # The list of Caml libraries needed by the program # For instance: # LIBS=$(WITHGRAPHICS) $(WITHUNIX) $(WITHSTR) $(WITHNUMS) $(WITHTHREADS)\ # $(WITHDBM) LIBS=$(WITHGRAPHICS) # Should be set to -custom if you use any of the libraries above # or if any C code have to be linked with your program # (irrelevant for ocamlopt) CUSTOM=-custom # Default setting of the WITH* variables. Should be changed if your # local libraries are not found by the compiler. WITHGRAPHICS =graphics.cma -cclib -lgraphics -cclib -L/usr/X11R6/lib -cclib -lX11 WITHUNIX =unix.cma -cclib -lunix WITHSTR =str.cma -cclib -lstr WITHNUMS =nums.cma -cclib -lnums WITHTHREADS =threads.cma -cclib -lthreads WITHDBM =dbm.cma -cclib -lmldbm -cclib -lndbm ################ End of user's variables ##################### ############################################################## ################ This part should be generic ################ Nothing to set up or fix here ############################################################## all: depend $(EXEC) opt : $(EXEC).opt #ocamlc -custom other options graphics.cma other files -cclib -lgraphics -cclib -lX11 #ocamlc -thread -custom other options threads.cma other files -cclib -lthreads #ocamlc -custom other options str.cma other files -cclib -lstr #ocamlc -custom other options nums.cma other files -cclib -lnums #ocamlc -custom other options unix.cma other files -cclib -lunix #ocamlc -custom other options dbm.cma other files -cclib -lmldbm -cclib -lndbm SOURCES1 = $(SOURCES:.mly=.ml) SOURCES2 = $(SOURCES1:.mll=.ml) OBJS = $(SOURCES2:.ml=.cmo) OPTOBJS = $(SOURCES2:.ml=.cmx) $(EXEC): $(OBJS) $(CAMLC) $(CUSTOM) -o $(EXEC) $(LIBS) $(OBJS) $(EXEC).opt: $(OPTOBJS) $(CAMLOPT) -o $(EXEC) $(LIBS:.cma=.cmxa) $(OPTOBJS) .SUFFIXES: .SUFFIXES: .ml .mli .cmo .cmi .cmx .mll .mly .ml.cmo: $(CAMLC) -c $< .mli.cmi: $(CAMLC) -c $< .ml.cmx: $(CAMLOPT) -c $< .mll.cmo: $(CAMLLEX) $< $(CAMLC) -c $*.ml .mll.cmx: $(CAMLLEX) $< $(CAMLOPT) -c $*.ml .mly.cmo: $(CAMLYACC) $< $(CAMLC) -c $*.mli $(CAMLC) -c $*.ml .mly.cmx: $(CAMLYACC) $< $(CAMLOPT) -c $*.mli $(CAMLOPT) -c $*.ml .mly.cmi: $(CAMLYACC) $< $(CAMLC) -c $*.mli .mll.ml: $(CAMLLEX) $< .mly.ml: $(CAMLYACC) $< clean: rm -f *.cm[iox] *~ .*~ #*# rm -f $(EXEC) rm -f $(EXEC).opt depend: $(SOURCES2) $(CAMLDEP) *.mli *.ml > .depend include .depend
Contacter l'auteur Pierre.Weis@inria.fr