diff options
author | Fabrice Le Fessant <Fabrice.Le_fessant@inria.fr> | 2001-03-26 11:08:00 +0000 |
---|---|---|
committer | Fabrice Le Fessant <Fabrice.Le_fessant@inria.fr> | 2001-03-26 11:08:00 +0000 |
commit | 79be2d767e0dac2516c246abad8dd574edb8c5c2 (patch) | |
tree | e36ce31a1b3822003da8a35faded3e52db66d299 | |
parent | 40e7d220d7c2ebe6523accba1df40a7ab89bb27b (diff) | |
download | ocaml-79be2d767e0dac2516c246abad8dd574edb8c5c2.tar.gz |
*** empty log message ***
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@3474 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
-rw-r--r-- | Makefile | 566 |
1 files changed, 555 insertions, 11 deletions
@@ -1,15 +1,559 @@ -include Makefile.ocaml +######################################################################### +# # +# Objective Caml # +# # +# Xavier Leroy, projet Cristal, INRIA Rocquencourt # +# # +# Copyright 1999 Institut National de Recherche en Informatique et # +# en Automatique. All rights reserved. This file is distributed # +# under the terms of the Q Public License version 1.0. # +# # +######################################################################### -ASMTOP=$(UTILS) $(PARSING) $(TYPING) $(COMP) $(BYTECOMP) \ - driver/errors.cmo driver/compile.cmo toplevel/genprintval.cmo +# $Id$ -toplevellib.cmxa: $(ASMTOP:.cmo=.cmx) - $(CAMLOPT) -a -o toplevellib.cmxa $(ASMTOP:.cmo=.cmx) - cp toplevellib.cmxa toplevellib.a $(LIBDIR)/ +# The main Makefile -INTERFACES=parsing/asttypes.cmi +include config/Makefile -install_top: - mkdir -p $(LIBDIR)/ocamlsrc - cp -f $(ASMTOP:.cmo=.cmi) $(COMPOBJS:.cmo=.cmi) \ - $(INTERFACES) $(LIBDIR)/ocamlsrc
\ No newline at end of file +CAMLC=boot/ocamlrun boot/ocamlc -I boot +CAMLOPT=boot/ocamlrun ./ocamlopt -I stdlib +COMPFLAGS=$(INCLUDES) +LINKFLAGS= +CAMLYACC=boot/ocamlyacc +YACCFLAGS=-v +CAMLLEX=boot/ocamlrun boot/ocamllex +CAMLDEP=boot/ocamlrun tools/ocamldep +DEPFLAGS=$(INCLUDES) +CAMLRUN=byterun/ocamlrun +SHELL=/bin/sh +MKDIR=mkdir -p + +INCLUDES=-I utils -I parsing -I typing -I bytecomp -I asmcomp -I driver -I toplevel + +UTILS=utils/misc.cmo utils/tbl.cmo utils/config.cmo \ + utils/clflags.cmo utils/terminfo.cmo utils/ccomp.cmo utils/warnings.cmo + +OPTUTILS=$(UTILS) + +PARSING=parsing/linenum.cmo parsing/location.cmo parsing/longident.cmo \ + parsing/syntaxerr.cmo parsing/pstream.cmo parsing/parser.cmo \ + parsing/lexer.cmo parsing/parse.cmo parsing/printast.cmo + +TYPING=typing/ident.cmo typing/path.cmo \ + typing/primitive.cmo typing/types.cmo \ + typing/btype.cmo \ + typing/subst.cmo typing/predef.cmo \ + typing/datarepr.cmo typing/env.cmo \ + typing/typedtree.cmo typing/ctype.cmo \ + typing/printtyp.cmo typing/includeclass.cmo \ + typing/mtype.cmo typing/includecore.cmo \ + typing/includemod.cmo typing/parmatch.cmo \ + typing/typetexp.cmo typing/typecore.cmo \ + typing/typedecl.cmo typing/typeclass.cmo \ + typing/typemod.cmo + +COMP=bytecomp/lambda.cmo bytecomp/printlambda.cmo \ + bytecomp/typeopt.cmo bytecomp/switch.cmo bytecomp/matching.cmo \ + bytecomp/translobj.cmo bytecomp/translcore.cmo \ + bytecomp/translclass.cmo bytecomp/translmod.cmo \ + bytecomp/simplif.cmo bytecomp/runtimedef.cmo + +BYTECOMP=bytecomp/meta.cmo bytecomp/instruct.cmo bytecomp/bytegen.cmo \ + bytecomp/printinstr.cmo bytecomp/opcodes.cmo bytecomp/emitcode.cmo \ + bytecomp/bytesections.cmo bytecomp/symtable.cmo \ + bytecomp/bytelibrarian.cmo bytecomp/bytelink.cmo + +ASMCOMP=asmcomp/arch.cmo asmcomp/cmm.cmo asmcomp/printcmm.cmo \ + asmcomp/reg.cmo asmcomp/mach.cmo asmcomp/proc.cmo \ + asmcomp/clambda.cmo asmcomp/compilenv.cmo \ + asmcomp/closure.cmo asmcomp/cmmgen.cmo \ + asmcomp/printmach.cmo asmcomp/selectgen.cmo asmcomp/selection.cmo \ + asmcomp/comballoc.cmo asmcomp/liveness.cmo \ + asmcomp/spill.cmo asmcomp/split.cmo \ + asmcomp/interf.cmo asmcomp/coloring.cmo \ + asmcomp/reloadgen.cmo asmcomp/reload.cmo \ + asmcomp/printlinear.cmo asmcomp/linearize.cmo \ + asmcomp/schedgen.cmo asmcomp/scheduling.cmo \ + asmcomp/emitaux.cmo asmcomp/emit.cmo asmcomp/asmgen.cmo \ + asmcomp/asmlink.cmo asmcomp/asmlibrarian.cmo + +DRIVER=driver/errors.cmo driver/compile.cmo driver/main_args.cmo \ + driver/main.cmo + +OPTDRIVER=driver/opterrors.cmo driver/optcompile.cmo driver/optmain.cmo + +TOPLEVEL=driver/errors.cmo driver/compile.cmo \ + toplevel/genprintval.cmo toplevel/toploop.cmo \ + toplevel/trace.cmo toplevel/topdirs.cmo + +TOPLEVELLIB=toplevel/toplevellib.cma +TOPLEVELMAIN=toplevel/topmain.cmo + +COMPOBJS=$(UTILS) $(PARSING) $(TYPING) $(COMP) $(BYTECOMP) $(DRIVER) + +TOPLIB=$(UTILS) $(PARSING) $(TYPING) $(COMP) $(BYTECOMP) $(TOPLEVEL) + +TOPOBJS=toplevel/toplevellib.cma $(TOPLEVELMAIN) + +OPTOBJS=$(OPTUTILS) $(PARSING) $(TYPING) $(COMP) $(ASMCOMP) $(OPTDRIVER) + +EXPUNGEOBJS=utils/misc.cmo utils/tbl.cmo \ + utils/config.cmo utils/clflags.cmo \ + typing/ident.cmo typing/path.cmo typing/types.cmo typing/btype.cmo \ + typing/predef.cmo bytecomp/runtimedef.cmo bytecomp/bytesections.cmo \ + bytecomp/symtable.cmo toplevel/expunge.cmo + +PERVASIVES=arg array buffer callback char digest filename format gc hashtbl \ + lexing list map obj parsing pervasives printexc printf queue random \ + set sort stack string stream sys oo genlex topdirs toploop weak lazy \ + marshal int32 int64 nativeint + +# Recompile the system using the bootstrap compiler +all: runtime ocamlc ocamllex ocamlyacc ocamltools library ocaml \ + otherlibraries $(DEBUGGER) + +# The compilation of ocaml will fail if the runtime has changed. +# Never mind, just do make bootstrap to reach fixpoint again. + +# Compile everything the first time +world: coldstart all + +# Complete bootstrapping cycle +bootstrap: +# Save the original bootstrap compiler + $(MAKE) backup +# Promote the new compiler but keep the old runtime +# This compiler runs on boot/ocamlrun and produces bytecode for +# byterun/ocamlrun + $(MAKE) promote-cross +# Rebuild ocamlc and ocamllex (run on byterun/ocamlrun) + $(MAKE) partialclean + $(MAKE) ocamlc ocamllex +# Rebuild the library (using byterun/ocamlrun ./ocamlc) + $(MAKE) library-cross +# Promote the new compiler and the new runtime + $(MAKE) promote +# Rebuild everything, including ocaml and the tools + $(MAKE) partialclean + $(MAKE) all +# Check if fixpoint reached + $(MAKE) compare + +LIBFILES=stdlib.cma std_exit.cmo *.cmi camlheader + +# Start up the system from the distribution compiler +coldstart: + cd byterun; $(MAKE) all + cp byterun/ocamlrun$(EXE) boot/ocamlrun$(EXE) + cd yacc; $(MAKE) all + cp yacc/ocamlyacc$(EXE) boot/ocamlyacc$(EXE) + cd stdlib; $(MAKE) COMPILER=../boot/ocamlc all + cd stdlib; cp $(LIBFILES) ../boot + if test -f boot/libcamlrun.a; then :; else \ + ln -s ../byterun/libcamlrun.a boot/libcamlrun.a; fi + if test -d stdlib/caml; then :; else \ + ln -s ../byterun stdlib/caml; fi + +# Build the core system: the minimum needed to make depend and bootstrap +core : runtime ocamlc ocamllex ocamlyacc ocamltools library + +# Save the current bootstrap compiler +MAXSAVED=boot/Saved/Saved.prev/Saved.prev/Saved.prev/Saved.prev/Saved.prev +backup: + if test -d boot/Saved; then : ; else mkdir boot/Saved; fi + if test -d $(MAXSAVED); then rm -r $(MAXSAVED); else : ; fi + mv boot/Saved boot/Saved.prev + mkdir boot/Saved + mv boot/Saved.prev boot/Saved/Saved.prev + cp boot/ocamlrun$(EXE) boot/Saved + mv boot/ocamlc boot/ocamllex boot/ocamlyacc$(EXE) boot/Saved + cd boot; cp $(LIBFILES) Saved + +# Promote the newly compiled system to the rank of cross compiler +# (Runs on the old runtime, produces code for the new runtime) +promote-cross: + cp ocamlc boot/ocamlc + cp lex/ocamllex boot/ocamllex + cp yacc/ocamlyacc$(EXE) boot/ocamlyacc$(EXE) + cd stdlib; cp $(LIBFILES) ../boot + +# Promote the newly compiled system to the rank of bootstrap compiler +# (Runs on the new runtime, produces code for the new runtime) +promote: promote-cross + cp byterun/ocamlrun$(EXE) boot/ocamlrun$(EXE) + +# Restore the saved bootstrap compiler if a problem arises +restore: + mv boot/Saved/* boot + rmdir boot/Saved + mv boot/Saved.prev boot/Saved + +# Check if fixpoint reached +compare: + @if cmp boot/ocamlc ocamlc && cmp boot/ocamllex lex/ocamllex; \ + then echo "Fixpoint reached, bootstrap succeeded."; \ + else echo "Fixpoint not reached, try one more bootstrapping cycle."; \ + fi + +# Remove old bootstrap compilers +cleanboot: + rm -rf boot/Saved/Saved.prev/* + +# Compile the native-code compiler +opt: runtimeopt ocamlopt libraryopt otherlibrariesopt + +# Native-code versions of the tools +opt.opt: ocamlc.opt ocamlopt.opt ocamllex.opt + +# Installation +install: FORCE + if test -d $(BINDIR); then : ; else $(MKDIR) $(BINDIR); fi + if test -d $(LIBDIR); then : ; else $(MKDIR) $(LIBDIR); fi + if test -d $(MANDIR); then : ; else $(MKDIR) $(MANDIR); fi + cd byterun; $(MAKE) install + cp ocamlc $(BINDIR)/ocamlc$(EXE) + cp ocaml $(BINDIR)/ocaml$(EXE) + cd stdlib; $(MAKE) install + cp lex/ocamllex $(BINDIR)/ocamllex$(EXE) + cp yacc/ocamlyacc$(EXE) $(BINDIR)/ocamlyacc$(EXE) + cp toplevel/toplevellib.cma $(LIBDIR)/toplevellib.cma + cp expunge $(LIBDIR)/expunge$(EXE) + cp toplevel/topmain.cmo $(LIBDIR) + cp toplevel/toploop.cmi toplevel/topdirs.cmi $(LIBDIR) + cd tools; $(MAKE) install + -cd man; $(MAKE) install + set -e; for i in $(OTHERLIBRARIES); do (cd otherlibs/$$i; $(MAKE) install); done + if test -f ocamlopt; then $(MAKE) installopt; else :; fi + if test -f debugger/ocamldebug; then (cd debugger; $(MAKE) install); else :; fi + +# Installation of the native-code compiler +installopt: + cd asmrun; $(MAKE) install + cp ocamlopt $(BINDIR)/ocamlopt$(EXE) + cd stdlib; $(MAKE) installopt + set -e; for i in $(OTHERLIBRARIES); do (cd otherlibs/$$i; $(MAKE) installopt); done + if test -f ocamlc.opt; then cp ocamlc.opt $(BINDIR)/ocamlc.opt$(EXE); else :; fi + if test -f ocamlopt.opt; then cp ocamlopt.opt $(BINDIR)/ocamlopt.opt$(EXE); else :; fi + if test -f lex/ocamllex.opt; then cp lex/ocamllex.opt $(BINDIR)/ocamllex.opt$(EXE); else :; fi + +clean:: partialclean + +# The compiler + +ocamlc: $(COMPOBJS) + $(CAMLC) $(LINKFLAGS) -o ocamlc $(COMPOBJS) + +partialclean:: + rm -f ocamlc + +# The native-code compiler + +ocamlopt: $(OPTOBJS) + $(CAMLC) $(LINKFLAGS) -o ocamlopt $(OPTOBJS) + +partialclean:: + rm -f ocamlopt + +# The toplevel + +ocaml: $(TOPOBJS) expunge + $(CAMLC) $(LINKFLAGS) -linkall -o ocaml.tmp $(TOPOBJS) + - $(CAMLRUN) ./expunge ocaml.tmp ocaml $(PERVASIVES) + rm -f ocaml.tmp + +toplevel/toplevellib.cma: $(TOPLIB) + $(CAMLC) -a -o $@ $(TOPLIB) + +partialclean:: + rm -f ocaml toplevel/toplevellib.cma + +# The configuration file + +utils/config.ml: utils/config.mlp config/Makefile + @rm -f utils/config.ml + sed -e 's|%%LIBDIR%%|$(LIBDIR)|' \ + -e 's|%%BYTERUN%%|$(BINDIR)/ocamlrun|' \ + -e 's|%%BYTECC%%|$(BYTECC) $(BYTECCCOMPOPTS)|' \ + -e 's|%%BYTELINK%%|$(BYTECC) $(BYTECCLINKOPTS)|' \ + -e 's|%%NATIVECC%%|$(NATIVECC) $(NATIVECCCOMPOPTS)|' \ + -e 's|%%NATIVELINK%%|$(NATIVECC) $(NATIVECCLINKOPTS)|' \ + -e 's|%%PARTIALLD%%|ld -r $(NATIVECCLINKOPTS)|' \ + -e 's|%%BYTECCLIBS%%|$(BYTECCLIBS)|' \ + -e 's|%%NATIVECCLIBS%%|$(NATIVECCLIBS)|' \ + -e 's|%%RANLIBCMD%%|$(RANLIBCMD)|' \ + -e 's|%%ARCH%%|$(ARCH)|' \ + -e 's|%%MODEL%%|$(MODEL)|' \ + -e 's|%%SYSTEM%%|$(SYSTEM)|' \ + -e 's|%%EXT_OBJ%%|.o|' \ + -e 's|%%EXT_ASM%%|.s|' \ + -e 's|%%EXT_LIB%%|.a|' \ + utils/config.mlp > utils/config.ml + @chmod -w utils/config.ml + +partialclean:: + rm -f utils/config.ml + +beforedepend:: utils/config.ml + +# The parser + +parsing/parser.mli parsing/parser.ml: parsing/parser.mly + $(CAMLYACC) $(YACCFLAGS) parsing/parser.mly + +partialclean:: + rm -f parsing/parser.mli parsing/parser.ml parsing/parser.output + +beforedepend:: parsing/parser.mli parsing/parser.ml + +# The lexer + +parsing/lexer.ml: parsing/lexer.mll + $(CAMLLEX) parsing/lexer.mll + +partialclean:: + rm -f parsing/lexer.ml + +beforedepend:: parsing/lexer.ml + +# The auxiliary lexer for counting line numbers + +parsing/linenum.ml: parsing/linenum.mll + $(CAMLLEX) parsing/linenum.mll + +partialclean:: + rm -f parsing/linenum.ml + +beforedepend:: parsing/linenum.ml + +# The bytecode compiler compiled with the native-code compiler + +ocamlc.opt: $(COMPOBJS:.cmo=.cmx) + cd asmrun; $(MAKE) meta.o + $(CAMLOPT) $(LINKFLAGS) -o ocamlc.opt $(COMPOBJS:.cmo=.cmx) asmrun/meta.o + +partialclean:: + rm -f ocamlc.opt + +# The native-code compiler compiled with itself + +ocamlopt.opt: $(OPTOBJS:.cmo=.cmx) + $(CAMLOPT) $(LINKFLAGS) -o ocamlopt.opt $(OPTOBJS:.cmo=.cmx) + +partialclean:: + rm -f ocamlopt.opt + +$(OPTOBJS:.cmo=.cmx): ocamlopt + +# The numeric opcodes + +bytecomp/opcodes.ml: byterun/instruct.h + sed -n -e '/^enum/p' -e 's/,//g' -e '/^ /p' byterun/instruct.h | \ + awk -f tools/make-opcodes > bytecomp/opcodes.ml + +partialclean:: + rm -f bytecomp/opcodes.ml + +beforedepend:: bytecomp/opcodes.ml + +# The predefined exceptions and primitives + +byterun/primitives: + cd byterun; $(MAKE) primitives + +bytecomp/runtimedef.ml: byterun/primitives byterun/fail.h + (echo 'let builtin_exceptions = [|'; \ + sed -n -e 's|.*/\* \("[A-Za-z_]*"\) \*/$$| \1;|p' byterun/fail.h | \ + sed -e '$$s/;$$//'; \ + echo '|]'; \ + echo 'let builtin_primitives = [|'; \ + sed -e 's/.*/ "&";/' -e '$$s/;$$//' byterun/primitives; \ + echo '|]') > bytecomp/runtimedef.ml + +partialclean:: + rm -f bytecomp/runtimedef.ml + +beforedepend:: bytecomp/runtimedef.ml + +# Choose the right machine-dependent files + +asmcomp/arch.ml: asmcomp/$(ARCH)/arch.ml + ln -s $(ARCH)/arch.ml asmcomp/arch.ml + +partialclean:: + rm -f asmcomp/arch.ml + +beforedepend:: asmcomp/arch.ml + +asmcomp/proc.ml: asmcomp/$(ARCH)/proc.ml + ln -s $(ARCH)/proc.ml asmcomp/proc.ml + +partialclean:: + rm -f asmcomp/proc.ml + +beforedepend:: asmcomp/proc.ml + +asmcomp/selection.ml: asmcomp/$(ARCH)/selection.ml + ln -s $(ARCH)/selection.ml asmcomp/selection.ml + +partialclean:: + rm -f asmcomp/selection.ml + +beforedepend:: asmcomp/selection.ml + +asmcomp/reload.ml: asmcomp/$(ARCH)/reload.ml + ln -s $(ARCH)/reload.ml asmcomp/reload.ml + +partialclean:: + rm -f asmcomp/reload.ml + +beforedepend:: asmcomp/reload.ml + +asmcomp/scheduling.ml: asmcomp/$(ARCH)/scheduling.ml + ln -s $(ARCH)/scheduling.ml asmcomp/scheduling.ml + +partialclean:: + rm -f asmcomp/scheduling.ml + +beforedepend:: asmcomp/scheduling.ml + +# Preprocess the code emitters + +asmcomp/emit.ml: asmcomp/$(ARCH)/emit.mlp tools/cvt_emit + $(CAMLRUN) tools/cvt_emit < asmcomp/$(ARCH)/emit.mlp > asmcomp/emit.ml \ + || { rm -f asmcomp/emit.ml; exit 2; } + +partialclean:: + rm -f asmcomp/emit.ml + +beforedepend:: asmcomp/emit.ml + +tools/cvt_emit: tools/cvt_emit.mll + cd tools; $(MAKE) CAMLC="../$(CAMLRUN) ../ocamlc -I ../stdlib" cvt_emit + +# The "expunge" utility + +expunge: $(EXPUNGEOBJS) + $(CAMLC) $(LINKFLAGS) -o expunge $(EXPUNGEOBJS) + +partialclean:: + rm -f expunge + +# The runtime system for the bytecode compiler + +runtime: + cd byterun; $(MAKE) all + if test -f stdlib/libcamlrun.a; then :; else \ + ln -s ../byterun/libcamlrun.a stdlib/libcamlrun.a; fi +clean:: + cd byterun; $(MAKE) clean + rm -f stdlib/libcamlrun.a +alldepend:: + cd byterun; $(MAKE) depend + +# The runtime system for the native-code compiler + +runtimeopt: + cd asmrun; $(MAKE) all + if test -f stdlib/libasmrun.a; then :; else \ + ln -s ../asmrun/libasmrun.a stdlib/libasmrun.a; fi +clean:: + cd asmrun; $(MAKE) clean + rm -f stdlib/libasmrun.a +alldepend:: + cd asmrun; $(MAKE) depend + +# The library + +library: ocamlc + cd stdlib; $(MAKE) all +library-cross: + cd stdlib; $(MAKE) RUNTIME=../byterun/ocamlrun all +libraryopt: + cd stdlib; $(MAKE) allopt +partialclean:: + cd stdlib; $(MAKE) clean +alldepend:: + cd stdlib; $(MAKE) depend + +# The lexer and parser generators + +ocamllex: ocamlyacc ocamlc + cd lex; $(MAKE) all +ocamllex.opt: ocamlopt + cd lex; $(MAKE) allopt +partialclean:: + cd lex; $(MAKE) clean +alldepend:: + cd lex; $(MAKE) depend + +ocamlyacc: + cd yacc; $(MAKE) all +clean:: + cd yacc; $(MAKE) clean + +# Tools + +ocamltools: ocamlc ocamlyacc ocamllex + cd tools; $(MAKE) all +partialclean:: + cd tools; $(MAKE) clean +alldepend:: + cd tools; $(MAKE) depend + +# The extra libraries + +otherlibraries: + set -e; for i in $(OTHERLIBRARIES); do (cd otherlibs/$$i; $(MAKE) RUNTIME=$(RUNTIME) all); done +otherlibrariesopt: + set -e; for i in $(OTHERLIBRARIES); do (cd otherlibs/$$i; $(MAKE) allopt); done +partialclean:: + for i in $(OTHERLIBRARIES); do (cd otherlibs/$$i; $(MAKE) partialclean); done +clean:: + for i in $(OTHERLIBRARIES); do (cd otherlibs/$$i; $(MAKE) clean); done +alldepend:: + for i in $(OTHERLIBRARIES); do (cd otherlibs/$$i; $(MAKE) depend); done + +# The replay debugger + +ocamldebugger: ocamlc ocamlyacc ocamllex + cd debugger; $(MAKE) all +partialclean:: + cd debugger; $(MAKE) clean +alldepend:: + cd debugger; $(MAKE) depend + +# Default rules + +.SUFFIXES: .ml .mli .cmo .cmi .cmx + +.ml.cmo: + $(CAMLC) $(COMPFLAGS) -c $< + +.mli.cmi: + $(CAMLC) $(COMPFLAGS) -c $< + +.ml.cmx: + $(CAMLOPT) $(COMPFLAGS) -c $< + +partialclean:: + rm -f utils/*.cm[iox] utils/*.[so] utils/*~ + rm -f parsing/*.cm[iox] parsing/*.[so] parsing/*~ + rm -f typing/*.cm[iox] typing/*.[so] typing/*~ + rm -f bytecomp/*.cm[iox] bytecomp/*.[so] bytecomp/*~ + rm -f asmcomp/*.cm[iox] asmcomp/*.[so] asmcomp/*~ + rm -f driver/*.cm[iox] driver/*.[so] driver/*~ + rm -f toplevel/*.cm[iox] toplevel/*.[so] toplevel/*~ + rm -f tools/*.cm[iox] tools/*.[so] tools/*~ + rm -f *~ + +depend: beforedepend + (for d in utils parsing typing bytecomp asmcomp driver toplevel; \ + do $(CAMLDEP) $(DEPFLAGS) $$d/*.mli $$d/*.ml; \ + done) > .depend + +alldepend:: depend + +FORCE: + +include .depend |