1#**************************************************************************
2#*                                                                        *
3#*                                 OCaml                                  *
4#*                                                                        *
5#*            Xavier Leroy, projet Cristal, INRIA Rocquencourt            *
6#*                                                                        *
7#*   Copyright 1999 Institut National de Recherche en Informatique et     *
8#*     en Automatique.                                                    *
9#*                                                                        *
10#*   All rights reserved.  This file is distributed under the terms of    *
11#*   the GNU Lesser General Public License version 2.1, with the          *
12#*   special exception on linking described in the file LICENSE.          *
13#*                                                                        *
14#**************************************************************************
15
16# The main Makefile
17
18# Hard bootstrap how-to:
19# (only necessary in some cases, for example if you remove some primitive)
20#
21# make coreboot     [old system -- you were in a stable state]
22# <change the source>
23# make clean runtime coreall
24# <debug your changes>
25# make clean runtime coreall
26# make coreboot [new system -- now in a stable state]
27
28include config/Makefile
29
30# For users who don't read the INSTALL file
31.PHONY: defaultentry
32defaultentry:
33ifeq "$(UNIX_OR_WIN32)" "unix"
34	@echo "Please refer to the installation instructions in file INSTALL."
35	@echo "If you've just unpacked the distribution, something like"
36	@echo "	./configure"
37	@echo "	make world.opt"
38	@echo "	make install"
39	@echo "should work.  But see the file INSTALL for more details."
40else
41	@echo "Please refer to the instructions in file README.win32.adoc."
42endif
43
44MKDIR=mkdir -p
45ifeq "$(UNIX_OR_WIN32)" "win32"
46LN = cp
47else
48LN = ln -sf
49endif
50
51CAMLRUN ?= boot/ocamlrun
52CAMLYACC ?= boot/ocamlyacc
53include stdlib/StdlibModules
54
55CAMLC=$(CAMLRUN) boot/ocamlc -g -nostdlib -I boot -use-prims byterun/primitives
56CAMLOPT=$(CAMLRUN) ./ocamlopt -g -nostdlib -I stdlib -I otherlibs/dynlink
57ARCHES=amd64 i386 arm arm64 power sparc s390x
58INCLUDES=-I utils -I parsing -I typing -I bytecomp -I middle_end \
59        -I middle_end/base_types -I asmcomp -I driver -I toplevel
60
61COMPFLAGS=-strict-sequence -principal -absname -w +a-4-9-41-42-44-45-48 \
62	  -warn-error A \
63          -bin-annot -safe-string -strict-formats $(INCLUDES)
64LINKFLAGS=
65
66ifeq "$(strip $(NATDYNLINKOPTS))" ""
67OCAML_NATDYNLINKOPTS=
68else
69OCAML_NATDYNLINKOPTS = -ccopt "$(NATDYNLINKOPTS)"
70endif
71
72ifeq "$(strip $(BYTECCLINKOPTS))" ""
73OCAML_BYTECCLINKOPTS=
74else
75OCAML_BYTECCLINKOPTS = -ccopt "$(BYTECCLINKOPTS)"
76endif
77
78YACCFLAGS=-v --strict
79CAMLLEX=$(CAMLRUN) boot/ocamllex
80CAMLDEP=$(CAMLRUN) tools/ocamldep
81DEPFLAGS=$(INCLUDES)
82
83OCAMLDOC_OPT=$(WITH_OCAMLDOC:=.opt)
84
85UTILS=utils/config.cmo utils/misc.cmo \
86  utils/identifiable.cmo utils/numbers.cmo utils/arg_helper.cmo \
87  utils/clflags.cmo utils/tbl.cmo utils/timings.cmo \
88  utils/terminfo.cmo utils/ccomp.cmo utils/warnings.cmo \
89  utils/consistbl.cmo \
90  utils/strongly_connected_components.cmo \
91  utils/targetint.cmo
92
93PARSING=parsing/location.cmo parsing/longident.cmo \
94  parsing/docstrings.cmo parsing/syntaxerr.cmo \
95  parsing/ast_helper.cmo parsing/parser.cmo \
96  parsing/lexer.cmo parsing/parse.cmo parsing/printast.cmo \
97  parsing/pprintast.cmo \
98  parsing/ast_mapper.cmo parsing/ast_iterator.cmo parsing/attr_helper.cmo \
99  parsing/builtin_attributes.cmo parsing/ast_invariants.cmo parsing/depend.cmo
100
101TYPING=typing/ident.cmo typing/path.cmo \
102  typing/primitive.cmo typing/types.cmo \
103  typing/btype.cmo typing/oprint.cmo \
104  typing/subst.cmo typing/predef.cmo \
105  typing/datarepr.cmo typing/cmi_format.cmo typing/env.cmo \
106  typing/typedtree.cmo typing/printtyped.cmo typing/ctype.cmo \
107  typing/printtyp.cmo typing/includeclass.cmo \
108  typing/mtype.cmo typing/envaux.cmo typing/includecore.cmo \
109  typing/typedtreeIter.cmo typing/typedtreeMap.cmo \
110  typing/tast_mapper.cmo \
111  typing/cmt_format.cmo typing/untypeast.cmo \
112  typing/includemod.cmo typing/typetexp.cmo typing/parmatch.cmo \
113  typing/stypes.cmo typing/typedecl.cmo typing/typecore.cmo \
114  typing/typeclass.cmo \
115  typing/typemod.cmo
116
117COMP=bytecomp/lambda.cmo bytecomp/printlambda.cmo \
118  bytecomp/semantics_of_primitives.cmo \
119  bytecomp/typeopt.cmo bytecomp/switch.cmo bytecomp/matching.cmo \
120  bytecomp/translobj.cmo bytecomp/translattribute.cmo \
121  bytecomp/translcore.cmo \
122  bytecomp/translclass.cmo bytecomp/translmod.cmo \
123  bytecomp/simplif.cmo bytecomp/runtimedef.cmo \
124  driver/pparse.cmo driver/main_args.cmo \
125  driver/compenv.cmo driver/compmisc.cmo
126
127COMMON=$(UTILS) $(PARSING) $(TYPING) $(COMP)
128
129BYTECOMP=bytecomp/meta.cmo bytecomp/instruct.cmo bytecomp/bytegen.cmo \
130  bytecomp/printinstr.cmo bytecomp/opcodes.cmo bytecomp/emitcode.cmo \
131  bytecomp/bytesections.cmo bytecomp/dll.cmo bytecomp/symtable.cmo \
132  bytecomp/bytelink.cmo bytecomp/bytelibrarian.cmo bytecomp/bytepackager.cmo \
133  driver/compdynlink.cmo driver/compplugin.cmo \
134  driver/errors.cmo driver/compile.cmo
135
136ARCH_SPECIFIC =\
137  asmcomp/arch.ml asmcomp/proc.ml asmcomp/CSE.ml asmcomp/selection.ml \
138  asmcomp/scheduling.ml asmcomp/reload.ml
139
140INTEL_ASM=\
141  asmcomp/x86_proc.cmo \
142  asmcomp/x86_dsl.cmo \
143  asmcomp/x86_gas.cmo \
144  asmcomp/x86_masm.cmo
145
146ARCH_SPECIFIC_ASMCOMP=
147ifeq ($(SYSTEM_ARCH),i386)
148ARCH_SPECIFIC_ASMCOMP=$(INTEL_ASM)
149endif
150ifeq ($(SYSTEM_ARCH),amd64)
151ARCH_SPECIFIC_ASMCOMP=$(INTEL_ASM)
152endif
153
154ASMCOMP=\
155  $(ARCH_SPECIFIC_ASMCOMP) \
156  asmcomp/arch.cmo \
157  asmcomp/cmm.cmo asmcomp/printcmm.cmo \
158  asmcomp/reg.cmo asmcomp/mach.cmo asmcomp/proc.cmo \
159  asmcomp/clambda.cmo asmcomp/printclambda.cmo \
160  asmcomp/export_info.cmo \
161  asmcomp/export_info_for_pack.cmo \
162  asmcomp/compilenv.cmo \
163  asmcomp/closure.cmo \
164  asmcomp/build_export_info.cmo \
165  asmcomp/closure_offsets.cmo \
166  asmcomp/flambda_to_clambda.cmo \
167  asmcomp/import_approx.cmo \
168  asmcomp/un_anf.cmo \
169  asmcomp/afl_instrument.cmo \
170  asmcomp/strmatch.cmo asmcomp/cmmgen.cmo \
171  asmcomp/printmach.cmo asmcomp/selectgen.cmo \
172  asmcomp/spacetime_profiling.cmo asmcomp/selection.cmo \
173  asmcomp/comballoc.cmo \
174  asmcomp/CSEgen.cmo asmcomp/CSE.cmo \
175  asmcomp/liveness.cmo \
176  asmcomp/spill.cmo asmcomp/split.cmo \
177  asmcomp/interf.cmo asmcomp/coloring.cmo \
178  asmcomp/reloadgen.cmo asmcomp/reload.cmo \
179  asmcomp/deadcode.cmo \
180  asmcomp/printlinear.cmo asmcomp/linearize.cmo \
181  asmcomp/schedgen.cmo asmcomp/scheduling.cmo \
182  asmcomp/branch_relaxation_intf.cmo \
183  asmcomp/branch_relaxation.cmo \
184  asmcomp/emitaux.cmo asmcomp/emit.cmo asmcomp/asmgen.cmo \
185  asmcomp/asmlink.cmo asmcomp/asmlibrarian.cmo asmcomp/asmpackager.cmo \
186  driver/opterrors.cmo driver/optcompile.cmo
187
188MIDDLE_END=\
189  middle_end/debuginfo.cmo \
190  middle_end/base_types/tag.cmo \
191  middle_end/base_types/linkage_name.cmo \
192  middle_end/base_types/compilation_unit.cmo \
193  middle_end/base_types/variable.cmo \
194  middle_end/base_types/mutable_variable.cmo \
195  middle_end/base_types/id_types.cmo \
196  middle_end/base_types/set_of_closures_id.cmo \
197  middle_end/base_types/set_of_closures_origin.cmo \
198  middle_end/base_types/closure_element.cmo \
199  middle_end/base_types/closure_id.cmo \
200  middle_end/base_types/var_within_closure.cmo \
201  middle_end/base_types/static_exception.cmo \
202  middle_end/base_types/export_id.cmo \
203  middle_end/base_types/symbol.cmo \
204  middle_end/pass_wrapper.cmo \
205  middle_end/allocated_const.cmo \
206  middle_end/projection.cmo \
207  middle_end/flambda.cmo \
208  middle_end/flambda_iterators.cmo \
209  middle_end/flambda_utils.cmo \
210  middle_end/inlining_cost.cmo \
211  middle_end/effect_analysis.cmo \
212  middle_end/freshening.cmo \
213  middle_end/simple_value_approx.cmo \
214  middle_end/lift_code.cmo \
215  middle_end/closure_conversion_aux.cmo \
216  middle_end/closure_conversion.cmo \
217  middle_end/initialize_symbol_to_let_symbol.cmo \
218  middle_end/lift_let_to_initialize_symbol.cmo \
219  middle_end/find_recursive_functions.cmo \
220  middle_end/invariant_params.cmo \
221  middle_end/inconstant_idents.cmo \
222  middle_end/alias_analysis.cmo \
223  middle_end/lift_constants.cmo \
224  middle_end/share_constants.cmo \
225  middle_end/simplify_common.cmo \
226  middle_end/remove_unused_arguments.cmo \
227  middle_end/remove_unused_closure_vars.cmo \
228  middle_end/remove_unused_program_constructs.cmo \
229  middle_end/simplify_boxed_integer_ops.cmo \
230  middle_end/simplify_primitives.cmo \
231  middle_end/inlining_stats_types.cmo \
232  middle_end/inlining_stats.cmo \
233  middle_end/inline_and_simplify_aux.cmo \
234  middle_end/remove_free_vars_equal_to_args.cmo \
235  middle_end/extract_projections.cmo \
236  middle_end/augment_specialised_args.cmo \
237  middle_end/unbox_free_vars_of_closures.cmo \
238  middle_end/unbox_specialised_args.cmo \
239  middle_end/unbox_closures.cmo \
240  middle_end/inlining_transforms.cmo \
241  middle_end/inlining_decision.cmo \
242  middle_end/inline_and_simplify.cmo \
243  middle_end/ref_to_variables.cmo \
244  middle_end/flambda_invariants.cmo \
245  middle_end/middle_end.cmo
246
247TOPLEVEL=toplevel/genprintval.cmo toplevel/toploop.cmo \
248  toplevel/trace.cmo toplevel/topdirs.cmo toplevel/topmain.cmo
249
250OPTTOPLEVEL=toplevel/genprintval.cmo toplevel/opttoploop.cmo \
251  toplevel/opttopdirs.cmo toplevel/opttopmain.cmo
252BYTESTART=driver/main.cmo
253
254OPTSTART=driver/optmain.cmo
255
256TOPLEVELSTART=toplevel/topstart.cmo
257
258OPTTOPLEVELSTART=toplevel/opttopstart.cmo
259
260PERVASIVES=$(STDLIB_MODULES) outcometree topdirs toploop
261
262LIBFILES=stdlib.cma std_exit.cmo *.cmi camlheader
263
264MAXSAVED=boot/Saved/Saved.prev/Saved.prev/Saved.prev/Saved.prev/Saved.prev
265
266COMPLIBDIR=$(LIBDIR)/compiler-libs
267
268INSTALL_BINDIR=$(DESTDIR)$(BINDIR)
269INSTALL_LIBDIR=$(DESTDIR)$(LIBDIR)
270INSTALL_COMPLIBDIR=$(DESTDIR)$(COMPLIBDIR)
271INSTALL_STUBLIBDIR=$(DESTDIR)$(STUBLIBDIR)
272INSTALL_MANDIR=$(DESTDIR)$(MANDIR)
273INSTALL_FLEXDLL=$(INSTALL_LIBDIR)/flexdll
274
275RUNTOP=./byterun/ocamlrun ./ocaml \
276  -nostdlib -I stdlib \
277  -noinit $(TOPFLAGS) \
278  -I otherlibs/$(UNIXLIB)
279NATRUNTOP=./ocamlnat$(EXE) -nostdlib -I stdlib -noinit $(TOPFLAGS)
280ifeq "UNIX_OR_WIN32" "unix"
281EXTRAPATH=
282else
283EXTRAPATH = PATH="otherlibs/win32unix:$(PATH)"
284endif
285
286BOOT_FLEXLINK_CMD=
287
288ifeq "$(UNIX_OR_WIN32)" "win32"
289FLEXDLL_SUBMODULE_PRESENT := $(wildcard flexdll/Makefile)
290ifeq "$(FLEXDLL_SUBMODULE_PRESENT)" ""
291  BOOT_FLEXLINK_CMD=
292  FLEXDLL_DIR=
293else
294  BOOT_FLEXLINK_CMD = FLEXLINK_CMD="../boot/ocamlrun ../flexdll/flexlink.exe"
295  CAMLOPT := OCAML_FLEXLINK="boot/ocamlrun flexdll/flexlink.exe" $(CAMLOPT)
296  FLEXDLL_DIR=$(if $(wildcard flexdll/flexdll_*.$(O)),"+flexdll")
297endif
298else
299  FLEXDLL_DIR=
300endif
301
302# The configuration file
303
304utils/config.ml: utils/config.mlp config/Makefile
305	sed -e 's|%%AFL_INSTRUMENT%%|$(AFL_INSTRUMENT)|' \
306	    -e 's|%%ARCH%%|$(SYSTEM_ARCH)|' \
307	    -e 's|%%ARCMD%%|$(ARCMD)|' \
308	    -e 's|%%ASM%%|$(ASM)|' \
309	    -e 's|%%ASM_CFI_SUPPORTED%%|$(ASM_CFI_SUPPORTED)|' \
310	    -e 's|%%BYTECCLIBS%%|$(BYTECCLIBS)|' \
311	    -e 's|%%BYTECODE_C_COMPILER%%|$(BYTECODE_C_COMPILER)|' \
312	    -e 's|%%BYTERUN%%|$(BYTERUN)|' \
313	    -e 's|%%CCOMPTYPE%%|$(CCOMPTYPE)|' \
314	    -e 's|%%CC_PROFILE%%|$(CC_PROFILE)|' \
315	    -e 's|%%EXT_ASM%%|$(EXT_ASM)|' \
316	    -e 's|%%EXT_DLL%%|$(EXT_DLL)|' \
317	    -e 's|%%EXT_EXE%%|$(EXE)|' \
318	    -e 's|%%EXT_LIB%%|$(EXT_LIB)|' \
319	    -e 's|%%EXT_OBJ%%|$(EXT_OBJ)|' \
320	    -e 's|%%FLAMBDA%%|$(FLAMBDA)|' \
321	    -e 's|%%FLEXLINK_FLAGS%%|$(subst \,\\,$(FLEXLINK_FLAGS))|' \
322	    -e 's|%%FLEXDLL_DIR%%|$(FLEXDLL_DIR)|' \
323	    -e 's|%%HOST%%|$(HOST)|' \
324	    -e 's|%%LIBDIR%%|$(LIBDIR)|' \
325	    -e 's|%%LIBUNWIND_AVAILABLE%%|$(LIBUNWIND_AVAILABLE)|' \
326	    -e 's|%%LIBUNWIND_LINK_FLAGS%%|$(LIBUNWIND_LINK_FLAGS)|' \
327	    -e 's|%%MKDLL%%|$(subst \,\\,$(MKDLL))|' \
328	    -e 's|%%MKEXE%%|$(subst \,\\,$(MKEXE))|' \
329	    -e 's|%%MKMAINDLL%%|$(subst \,\\,$(MKMAINDLL))|' \
330	    -e 's|%%MODEL%%|$(MODEL)|' \
331	    -e 's|%%NATIVECCLIBS%%|$(NATIVECCLIBS)|' \
332	    -e 's|%%NATIVE_C_COMPILER%%|$(NATIVE_C_COMPILER)|' \
333	    -e 's|%%PACKLD%%|$(PACKLD)|' \
334	    -e 's|%%PROFILING%%|$(PROFILING)|' \
335	    -e 's|%%PROFINFO_WIDTH%%|$(PROFINFO_WIDTH)|' \
336	    -e 's|%%RANLIBCMD%%|$(RANLIBCMD)|' \
337	    -e 's|%%SAFE_STRING%%|$(SAFE_STRING)|' \
338	    -e 's|%%SYSTEM%%|$(SYSTEM)|' \
339	    -e 's|%%SYSTHREAD_SUPPORT%%|$(SYSTHREAD_SUPPORT)|' \
340	    -e 's|%%TARGET%%|$(TARGET)|' \
341	    -e 's|%%WITH_FRAME_POINTERS%%|$(WITH_FRAME_POINTERS)|' \
342	    -e 's|%%WITH_PROFINFO%%|$(WITH_PROFINFO)|' \
343	    -e 's|%%WITH_SPACETIME%%|$(WITH_SPACETIME)|' \
344	    $< > $@
345
346ifeq "$(UNIX_OR_WIN32)" "unix"
347.PHONY: reconfigure
348reconfigure:
349	./configure $(CONFIGURE_ARGS)
350endif
351
352.PHONY: partialclean
353partialclean::
354	rm -f utils/config.ml
355
356.PHONY: beforedepend
357beforedepend:: utils/config.ml
358
359# Start up the system from the distribution compiler
360.PHONY: coldstart
361coldstart:
362	$(MAKE) -C byterun $(BOOT_FLEXLINK_CMD) all
363	cp byterun/ocamlrun$(EXE) boot/ocamlrun$(EXE)
364	$(MAKE) -C yacc $(BOOT_FLEXLINK_CMD) all
365	cp yacc/ocamlyacc$(EXE) boot/ocamlyacc$(EXE)
366	$(MAKE) -C stdlib $(BOOT_FLEXLINK_CMD) \
367	  COMPILER="../boot/ocamlc -use-prims ../byterun/primitives" all
368	cd stdlib; cp $(LIBFILES) ../boot
369	cd boot; $(LN) ../byterun/libcamlrun.$(A) .
370
371# Recompile the core system using the bootstrap compiler
372.PHONY: coreall
373coreall:
374	$(MAKE) ocamlc
375	$(MAKE) ocamllex ocamlyacc ocamltools library
376
377# Build the core system: the minimum needed to make depend and bootstrap
378.PHONY: core
379core:
380ifeq "$(UNIX_OR_WIN32)" "unix"
381	$(MAKE) coldstart
382else # Windows, to be fixed!
383	$(MAKE) runtime
384endif
385	$(MAKE) coreall
386
387# Save the current bootstrap compiler
388.PHONY: backup
389backup:
390	$(MKDIR) boot/Saved
391	if test -d $(MAXSAVED); then rm -r $(MAXSAVED); fi
392	mv boot/Saved boot/Saved.prev
393	mkdir boot/Saved
394	mv boot/Saved.prev boot/Saved/Saved.prev
395	cp boot/ocamlrun$(EXE) boot/Saved
396	cd boot; mv ocamlc ocamllex ocamlyacc$(EXE) ocamldep Saved
397	cd boot; cp $(LIBFILES) Saved
398
399# Restore the saved bootstrap compiler if a problem arises
400.PHONY: restore
401restore:
402	cd boot; mv Saved/* .; rmdir Saved; mv Saved.prev Saved
403
404# Check if fixpoint reached
405.PHONY: compare
406compare:
407	@if $(CAMLRUN) tools/cmpbyt boot/ocamlc ocamlc \
408         && $(CAMLRUN) tools/cmpbyt boot/ocamllex lex/ocamllex \
409         && $(CAMLRUN) tools/cmpbyt boot/ocamldep tools/ocamldep; \
410	then echo "Fixpoint reached, bootstrap succeeded."; \
411	else echo "Fixpoint not reached, try one more bootstrapping cycle."; \
412	fi
413
414# Promote the newly compiled system to the rank of cross compiler
415# (Runs on the old runtime, produces code for the new runtime)
416.PHONY: promote-cross
417promote-cross:
418	$(CAMLRUN) tools/stripdebug ocamlc boot/ocamlc
419	$(CAMLRUN) tools/stripdebug lex/ocamllex boot/ocamllex
420	cp yacc/ocamlyacc$(EXE) boot/ocamlyacc$(EXE)
421	$(CAMLRUN) tools/stripdebug tools/ocamldep boot/ocamldep
422	cd stdlib; cp $(LIBFILES) ../boot
423
424# Promote the newly compiled system to the rank of bootstrap compiler
425# (Runs on the new runtime, produces code for the new runtime)
426.PHONY: promote
427promote: promote-cross
428	cp byterun/ocamlrun$(EXE) boot/ocamlrun$(EXE)
429
430# Remove old bootstrap compilers
431.PHONY: cleanboot
432cleanboot:
433	rm -rf boot/Saved/Saved.prev/*
434
435# Compile the native-code compiler
436.PHONY: opt-core
437opt-core: runtimeopt
438	$(MAKE) ocamlopt
439	$(MAKE) libraryopt
440
441.PHONY: opt
442opt:
443ifeq "$(UNIX_OR_WIN32)" "unix"
444	$(MAKE) runtimeopt
445	$(MAKE) ocamlopt
446	$(MAKE) libraryopt
447	$(MAKE) otherlibrariesopt ocamltoolsopt
448else
449	$(MAKE) opt-core
450	$(MAKE) otherlibrariesopt ocamltoolsopt
451endif
452
453# Native-code versions of the tools
454.PHONY: opt.opt
455ifeq "$(UNIX_OR_WIN32)" "unix"
456opt.opt:
457	$(MAKE) checkstack
458	$(MAKE) runtime
459	$(MAKE) core
460	$(MAKE) ocaml
461	$(MAKE) opt-core
462	$(MAKE) ocamlc.opt
463	$(MAKE) otherlibraries $(WITH_DEBUGGER) $(WITH_OCAMLDOC)
464	$(MAKE) ocamlopt.opt
465	$(MAKE) otherlibrariesopt
466	$(MAKE) ocamllex.opt ocamltoolsopt ocamltoolsopt.opt $(OCAMLDOC_OPT)
467else
468opt.opt: core opt-core ocamlc.opt all ocamlopt.opt ocamllex.opt \
469         ocamltoolsopt ocamltoolsopt.opt otherlibrariesopt $(OCAMLDOC_OPT)
470endif
471
472.PHONY: base.opt
473base.opt:
474	$(MAKE) checkstack
475	$(MAKE) runtime
476	$(MAKE) core
477	$(MAKE) ocaml
478	$(MAKE) opt-core
479	$(MAKE) ocamlc.opt
480	$(MAKE) otherlibraries $(WITH_DEBUGGER) $(WITH_OCAMLDOC)
481	$(MAKE) ocamlopt.opt
482	$(MAKE) otherlibrariesopt
483
484# Core bootstrapping cycle
485.PHONY: coreboot
486coreboot:
487# Save the original bootstrap compiler
488	$(MAKE) backup
489# Promote the new compiler but keep the old runtime
490# This compiler runs on boot/ocamlrun and produces bytecode for
491# byterun/ocamlrun
492	$(MAKE) promote-cross
493# Rebuild ocamlc and ocamllex (run on byterun/ocamlrun)
494	$(MAKE) partialclean
495	$(MAKE) ocamlc ocamllex ocamltools
496# Rebuild the library (using byterun/ocamlrun ./ocamlc)
497	$(MAKE) library-cross
498# Promote the new compiler and the new runtime
499	$(MAKE) CAMLRUN=byterun/ocamlrun promote
500# Rebuild the core system
501	$(MAKE) partialclean
502	$(MAKE) core
503# Check if fixpoint reached
504	$(MAKE) compare
505
506# Recompile the system using the bootstrap compiler
507
508.PHONY: all
509all: runtime
510	$(MAKE) coreall
511	$(MAKE) ocaml
512	$(MAKE) otherlibraries $(WITH_DEBUGGER) $(WITH_OCAMLDOC)
513
514# Bootstrap and rebuild the whole system.
515# The compilation of ocaml will fail if the runtime has changed.
516# Never mind, just do make bootstrap to reach fixpoint again.
517.PHONY: bootstrap
518bootstrap: coreboot
519	$(MAKE) all
520	$(MAKE) compare
521
522# Compile everything the first time
523
524.PHONY: world
525world: coldstart
526	$(MAKE) all
527
528# Compile also native code compiler and libraries, fast
529.PHONY: world.opt
530world.opt: coldstart
531	$(MAKE) opt.opt
532
533# FlexDLL sources missing error messages
534# Different git mechanism displayed depending on whether this source tree came
535# from a git clone or a source tarball.
536
537flexdll/Makefile:
538	@echo In order to bootstrap FlexDLL, you need to place the sources in
539	@echo flexdll.
540	@echo This can either be done by downloading a source tarball from
541	@echo \  http://alain.frisch.fr/flexdll.html
542	@if [ -d .git ]; then \
543	  echo or by checking out the flexdll submodule with; \
544	  echo \  git submodule update --init; \
545	else \
546	  echo or by cloning the git repository; \
547	  echo \  git clone https://github.com/alainfrisch/flexdll.git; \
548	fi
549	@false
550
551.PHONY: flexdll
552flexdll: flexdll/Makefile flexlink
553	$(MAKE) -C flexdll \
554             MSVC_DETECT=0 CHAINS=$(FLEXDLL_CHAIN) NATDYNLINK=false support
555
556# Bootstrapping flexlink - leaves a bytecode image of flexlink.exe in flexdll/
557.PHONY: flexlink
558flexlink: flexdll/Makefile
559	$(MAKE) -C byterun BOOTSTRAPPING_FLEXLINK=yes ocamlrun$(EXE)
560	cp byterun/ocamlrun$(EXE) boot/ocamlrun$(EXE)
561	$(MAKE) -C stdlib COMPILER=../boot/ocamlc stdlib.cma std_exit.cmo
562	cd stdlib && cp stdlib.cma std_exit.cmo *.cmi ../boot
563	$(MAKE) -C flexdll MSVC_DETECT=0 TOOLCHAIN=$(TOOLCHAIN) \
564	  TOOLPREF=$(TOOLPREF) CHAINS=$(FLEXDLL_CHAIN) NATDYNLINK=false \
565	  OCAMLOPT="../boot/ocamlrun ../boot/ocamlc -I ../boot" \
566	  flexlink.exe
567	$(MAKE) -C byterun clean
568	$(MAKE) partialclean
569
570.PHONY: flexlink.opt
571flexlink.opt:
572	cd flexdll && \
573	mv flexlink.exe flexlink && \
574	$(MAKE) OCAML_FLEXLINK="../boot/ocamlrun ./flexlink" MSVC_DETECT=0 \
575	           TOOLCHAIN=$(TOOLCHAIN) TOOLPREF=$(TOOLPREF) \
576	           OCAMLOPT="../ocamlopt.opt -I ../stdlib" flexlink.exe && \
577	mv flexlink.exe flexlink.opt && \
578	mv flexlink flexlink.exe
579
580.PHONY: install-flexdll
581install-flexdll:
582	cat stdlib/camlheader flexdll/flexlink.exe > \
583	  "$(INSTALL_BINDIR)/flexlink.exe"
584ifneq "$(filter-out mingw,$(TOOLCHAIN))" ""
585	cp flexdll/default$(filter-out _i386,_$(SYSTEM_ARCH)).manifest \
586    "$(INSTALL_BINDIR)/"
587endif
588	if test -n "$(wildcard flexdll/flexdll_*.$(O))" ; then \
589	  $(MKDIR) "$(INSTALL_FLEXDLL)" ; \
590	  cp flexdll/flexdll_*.$(O) "$(INSTALL_FLEXDLL)" ; \
591	fi
592
593# Installation
594.PHONY: install
595install:
596	$(MKDIR) "$(INSTALL_BINDIR)"
597	$(MKDIR) "$(INSTALL_LIBDIR)"
598	$(MKDIR) "$(INSTALL_STUBLIBDIR)"
599	$(MKDIR) "$(INSTALL_COMPLIBDIR)"
600	cp VERSION "$(INSTALL_LIBDIR)"
601	$(MAKE) -C byterun install
602	cp ocaml "$(INSTALL_BINDIR)/ocaml$(EXE)"
603	cp ocamlc "$(INSTALL_BINDIR)/ocamlc.byte$(EXE)"
604	$(MAKE) -C stdlib install
605	cp lex/ocamllex "$(INSTALL_BINDIR)/ocamllex.byte$(EXE)"
606	cp yacc/ocamlyacc$(EXE) "$(INSTALL_BINDIR)/ocamlyacc$(EXE)"
607	cp utils/*.cmi utils/*.cmt utils/*.cmti utils/*.mli \
608	   parsing/*.cmi parsing/*.cmt parsing/*.cmti parsing/*.mli \
609	   typing/*.cmi typing/*.cmt typing/*.cmti typing/*.mli \
610	   bytecomp/*.cmi bytecomp/*.cmt bytecomp/*.cmti bytecomp/*.mli \
611	   driver/*.cmi driver/*.cmt driver/*.cmti driver/*.mli \
612	   toplevel/*.cmi toplevel/*.cmt toplevel/*.cmti toplevel/*.mli \
613	   "$(INSTALL_COMPLIBDIR)"
614	cp compilerlibs/ocamlcommon.cma compilerlibs/ocamlbytecomp.cma \
615	   compilerlibs/ocamltoplevel.cma $(BYTESTART) $(TOPLEVELSTART) \
616	   "$(INSTALL_COMPLIBDIR)"
617	cp expunge "$(INSTALL_LIBDIR)/expunge$(EXE)"
618	cp toplevel/topdirs.cmi toplevel/topdirs.cmt toplevel/topdirs.cmti \
619           toplevel/topdirs.mli "$(INSTALL_LIBDIR)"
620	$(MAKE) -C tools install
621ifeq "$(UNIX_OR_WIN32)" "unix" # Install manual pages only on Unix
622	$(MKDIR) "$(INSTALL_MANDIR)/man$(MANEXT)"
623	-$(MAKE) -C man install
624endif
625	for i in $(OTHERLIBRARIES); do \
626	  $(MAKE) -C otherlibs/$$i install || exit $$?; \
627	done
628	if test -n "$(WITH_OCAMLDOC)"; then \
629	  $(MAKE) -C ocamldoc install; \
630	fi
631	if test -n "$(WITH_DEBUGGER)"; then \
632	  $(MAKE) -C debugger install; \
633	fi
634ifeq "$(UNIX_OR_WIN32)" "win32"
635	if test -n "$(FLEXDLL_SUBMODULE_PRESENT)"; then \
636	  $(MAKE) install-flexdll; \
637	fi
638endif
639	cp config/Makefile "$(INSTALL_LIBDIR)/Makefile.config"
640	if test -f ocamlopt; then $(MAKE) installopt; else \
641	   cd "$(INSTALL_BINDIR)"; \
642	   $(LN) ocamlc.byte$(EXE) ocamlc$(EXE); \
643	   $(LN) ocamllex.byte$(EXE) ocamllex$(EXE); \
644	fi
645
646# Installation of the native-code compiler
647.PHONY: installopt
648installopt:
649	$(MAKE) -C asmrun install
650	cp ocamlopt "$(INSTALL_BINDIR)/ocamlopt.byte$(EXE)"
651	$(MAKE) -C stdlib installopt
652	cp middle_end/*.cmi middle_end/*.cmt middle_end/*.cmti \
653	    middle_end/*.mli \
654		"$(INSTALL_COMPLIBDIR)"
655	cp middle_end/base_types/*.cmi middle_end/base_types/*.cmt \
656	    middle_end/base_types/*.cmti middle_end/base_types/*.mli \
657		"$(INSTALL_COMPLIBDIR)"
658	cp asmcomp/*.cmi asmcomp/*.cmt asmcomp/*.cmti asmcomp/*.mli \
659		"$(INSTALL_COMPLIBDIR)"
660	cp compilerlibs/ocamloptcomp.cma $(OPTSTART) "$(INSTALL_COMPLIBDIR)"
661	if test -n "$(WITH_OCAMLDOC)"; then \
662	  $(MAKE) -C ocamldoc installopt; \
663	fi
664	for i in $(OTHERLIBRARIES); do \
665	  $(MAKE) -C otherlibs/$$i installopt || exit $$?; \
666	done
667	if test -f ocamlopt.opt ; then $(MAKE) installoptopt; else \
668	   cd "$(INSTALL_BINDIR)"; \
669	   $(LN) ocamlc.byte$(EXE) ocamlc$(EXE); \
670	   $(LN) ocamlopt.byte$(EXE) ocamlopt$(EXE); \
671	   $(LN) ocamllex.byte$(EXE) ocamllex$(EXE); \
672	fi
673	$(MAKE) -C tools installopt
674	if test -f ocamlopt.opt -a -f flexdll/flexlink.opt ; then \
675	  cp -f flexdll/flexlink.opt "$(INSTALL_BINDIR)/flexlink$(EXE)" ; \
676	fi
677
678
679
680.PHONY: installoptopt
681installoptopt:
682	cp ocamlc.opt "$(INSTALL_BINDIR)/ocamlc.opt$(EXE)"
683	cp ocamlopt.opt "$(INSTALL_BINDIR)/ocamlopt.opt$(EXE)"
684	cp lex/ocamllex.opt "$(INSTALL_BINDIR)/ocamllex.opt$(EXE)"
685	cd "$(INSTALL_BINDIR)"; \
686	   $(LN) ocamlc.opt$(EXE) ocamlc$(EXE); \
687	   $(LN) ocamlopt.opt$(EXE) ocamlopt$(EXE); \
688	   $(LN) ocamllex.opt$(EXE) ocamllex$(EXE)
689	cp utils/*.cmx parsing/*.cmx typing/*.cmx bytecomp/*.cmx \
690	   driver/*.cmx asmcomp/*.cmx "$(INSTALL_COMPLIBDIR)"
691	cp compilerlibs/ocamlcommon.cmxa compilerlibs/ocamlcommon.$(A) \
692	   compilerlibs/ocamlbytecomp.cmxa compilerlibs/ocamlbytecomp.$(A) \
693	   compilerlibs/ocamloptcomp.cmxa compilerlibs/ocamloptcomp.$(A) \
694	   $(BYTESTART:.cmo=.cmx) $(BYTESTART:.cmo=.$(O)) \
695	   $(OPTSTART:.cmo=.cmx) $(OPTSTART:.cmo=.$(O)) \
696	   "$(INSTALL_COMPLIBDIR)"
697	if test -f ocamlnat$(EXE) ; then \
698	  cp ocamlnat$(EXE) "$(INSTALL_BINDIR)/ocamlnat$(EXE)"; \
699	  cp toplevel/opttopdirs.cmi "$(INSTALL_LIBDIR)"; \
700	  cp compilerlibs/ocamlopttoplevel.cmxa \
701	     compilerlibs/ocamlopttoplevel.$(A) \
702	     $(OPTTOPLEVELSTART:.cmo=.cmx) $(OPTTOPLEVELSTART:.cmo=.$(O)) \
703	     "$(INSTALL_COMPLIBDIR)"; \
704	fi
705	cd "$(INSTALL_COMPLIBDIR)" && \
706	   $(RANLIB) ocamlcommon.$(A) ocamlbytecomp.$(A) ocamloptcomp.$(A)
707
708# Installation of the *.ml sources of compiler-libs
709.PHONY: install-compiler-sources
710install-compiler-sources:
711	cp utils/*.ml parsing/*.ml typing/*.ml bytecomp/*.ml driver/*.ml \
712	   toplevel/*.ml middle_end/*.ml middle_end/base_types/*.ml \
713	   asmcomp/*.ml $(INSTALL_COMPLIBDIR)
714
715# Run all tests
716
717.PHONY: tests
718tests: opt.opt
719	cd testsuite; $(MAKE) clean && $(MAKE) all
720
721# Make clean in the test suite
722
723.PHONY: clean
724clean::
725	$(MAKE) -C testsuite clean
726
727# Build the manual latex files from the etex source files
728# (see manual/README.md)
729.PHONY: manual-pregen
730manual-pregen: opt.opt
731	cd manual; $(MAKE) clean && $(MAKE) pregen-etex
732
733# The clean target
734clean:: partialclean
735
736# Shared parts of the system
737
738compilerlibs/ocamlcommon.cma: $(COMMON)
739	$(CAMLC) -a -linkall -o $@ $^
740partialclean::
741	rm -f compilerlibs/ocamlcommon.cma
742
743# The bytecode compiler
744
745compilerlibs/ocamlbytecomp.cma: $(BYTECOMP)
746	$(CAMLC) -a -o $@ $^
747partialclean::
748	rm -f compilerlibs/ocamlbytecomp.cma
749
750ocamlc: compilerlibs/ocamlcommon.cma compilerlibs/ocamlbytecomp.cma $(BYTESTART)
751	$(CAMLC) $(LINKFLAGS) -compat-32 -o $@ $^
752
753partialclean::
754	rm -rf ocamlc
755
756# The native-code compiler
757
758compilerlibs/ocamloptcomp.cma: $(MIDDLE_END) $(ASMCOMP)
759	$(CAMLC) -a -o $@ $^
760
761partialclean::
762	rm -f compilerlibs/ocamloptcomp.cma
763
764ocamlopt: compilerlibs/ocamlcommon.cma compilerlibs/ocamloptcomp.cma \
765          compilerlibs/ocamlbytecomp.cma $(OPTSTART)
766	$(CAMLC) $(LINKFLAGS) -o $@ $^
767
768partialclean::
769	rm -f ocamlopt
770
771# The toplevel
772
773compilerlibs/ocamltoplevel.cma: $(TOPLEVEL)
774	$(CAMLC) -a -o $@ $^
775partialclean::
776	rm -f compilerlibs/ocamltoplevel.cma
777
778ocaml_dependencies := \
779  compilerlibs/ocamlcommon.cma \
780  compilerlibs/ocamlbytecomp.cma \
781  compilerlibs/ocamltoplevel.cma $(TOPLEVELSTART)
782
783.INTERMEDIATE: ocaml.tmp
784ocaml.tmp: $(ocaml_dependencies)
785	$(CAMLC) $(LINKFLAGS) -linkall -o $@ $^
786
787ocaml: expunge ocaml.tmp
788	- $(CAMLRUN) $^ $@ $(PERVASIVES)
789
790partialclean::
791	rm -f ocaml
792
793.PHONY: runtop
794runtop:
795ifeq "$(UNIX_OR_WIN32)" "unix"
796	$(MAKE) runtime
797	$(MAKE) coreall
798	$(MAKE) ocaml
799else
800	$(MAKE) core
801	$(MAKE) ocaml
802endif
803	@rlwrap --help 2>/dev/null && $(EXTRAPATH) rlwrap $(RUNTOP) ||\
804	  $(EXTRAPATH) $(RUNTOP)
805
806.PHONY: natruntop
807natruntop:
808	$(MAKE) runtime
809	$(MAKE) coreall
810	$(MAKE) opt.opt
811	$(MAKE) ocamlnat
812	@rlwrap --help 2>/dev/null && $(EXTRAPATH) rlwrap $(NATRUNTOP) ||\
813	  $(EXTRAPATH) $(NATRUNTOP)
814
815# Native dynlink
816
817otherlibs/dynlink/dynlink.cmxa: otherlibs/dynlink/natdynlink.ml
818	$(MAKE) -C otherlibs/dynlink allopt
819
820# The parser
821
822parsing/parser.mli parsing/parser.ml: parsing/parser.mly
823	$(CAMLYACC) $(YACCFLAGS) $<
824
825partialclean::
826	rm -f parsing/parser.mli parsing/parser.ml parsing/parser.output
827
828beforedepend:: parsing/parser.mli parsing/parser.ml
829
830# The lexer
831
832parsing/lexer.ml: parsing/lexer.mll
833	$(CAMLLEX) $<
834
835partialclean::
836	rm -f parsing/lexer.ml
837
838beforedepend:: parsing/lexer.ml
839
840# Shared parts of the system compiled with the native-code compiler
841
842compilerlibs/ocamlcommon.cmxa: $(COMMON:.cmo=.cmx)
843	$(CAMLOPT) -a -linkall -o $@ $^
844partialclean::
845	rm -f compilerlibs/ocamlcommon.cmxa compilerlibs/ocamlcommon.$(A)
846
847# The bytecode compiler compiled with the native-code compiler
848
849compilerlibs/ocamlbytecomp.cmxa: $(BYTECOMP:.cmo=.cmx)
850	$(CAMLOPT) -a $(OCAML_NATDYNLINKOPTS) -o $@ $^
851partialclean::
852	rm -f compilerlibs/ocamlbytecomp.cmxa compilerlibs/ocamlbytecomp.$(A)
853
854ocamlc.opt: compilerlibs/ocamlcommon.cmxa compilerlibs/ocamlbytecomp.cmxa \
855            $(BYTESTART:.cmo=.cmx)
856	$(CAMLOPT) $(LINKFLAGS) $(OCAML_BYTECCLINKOPTS) -o $@ \
857	  $^ -cclib "$(BYTECCLIBS)"
858
859partialclean::
860	rm -f ocamlc.opt
861
862# The native-code compiler compiled with itself
863
864compilerlibs/ocamloptcomp.cmxa: $(MIDDLE_END:.cmo=.cmx) $(ASMCOMP:.cmo=.cmx)
865	$(CAMLOPT) -a -o $@ $^
866partialclean::
867	rm -f compilerlibs/ocamloptcomp.cmxa compilerlibs/ocamloptcomp.$(A)
868
869ocamlopt.opt: compilerlibs/ocamlcommon.cmxa compilerlibs/ocamloptcomp.cmxa \
870              compilerlibs/ocamlbytecomp.cmxa  \
871              $(OPTSTART:.cmo=.cmx)
872	$(CAMLOPT) $(LINKFLAGS) -o $@ $^
873
874partialclean::
875	rm -f ocamlopt.opt
876
877$(COMMON:.cmo=.cmx) $(BYTECOMP:.cmo=.cmx) $(MIDDLE_END:.cmo=.cmx) \
878$(ASMCOMP:.cmo=.cmx): ocamlopt
879
880# The predefined exceptions and primitives
881
882byterun/primitives:
883	$(MAKE) -C byterun primitives
884
885bytecomp/runtimedef.ml: byterun/primitives byterun/caml/fail.h
886	(echo 'let builtin_exceptions = [|'; \
887	 cat byterun/caml/fail.h | tr -d '\r' | \
888	 sed -n -e 's|.*/\* \("[A-Za-z_]*"\) \*/$$|  \1;|p'; \
889	 echo '|]'; \
890	 echo 'let builtin_primitives = [|'; \
891	 sed -e 's/.*/  "&";/' byterun/primitives; \
892	 echo '|]') > $@
893
894partialclean::
895	rm -f bytecomp/runtimedef.ml
896
897beforedepend:: bytecomp/runtimedef.ml
898
899# Choose the right machine-dependent files
900
901asmcomp/arch.ml: asmcomp/$(SYSTEM_ARCH)/arch.ml
902	cd asmcomp; $(LN) $(SYSTEM_ARCH)/arch.ml .
903
904asmcomp/proc.ml: asmcomp/$(SYSTEM_ARCH)/proc.ml
905	cd asmcomp; $(LN) $(SYSTEM_ARCH)/proc.ml .
906
907asmcomp/selection.ml: asmcomp/$(SYSTEM_ARCH)/selection.ml
908	cd asmcomp; $(LN) $(SYSTEM_ARCH)/selection.ml .
909
910asmcomp/CSE.ml: asmcomp/$(SYSTEM_ARCH)/CSE.ml
911	cd asmcomp; $(LN) $(SYSTEM_ARCH)/CSE.ml .
912
913asmcomp/reload.ml: asmcomp/$(SYSTEM_ARCH)/reload.ml
914	cd asmcomp; $(LN) $(SYSTEM_ARCH)/reload.ml .
915
916asmcomp/scheduling.ml: asmcomp/$(SYSTEM_ARCH)/scheduling.ml
917	cd asmcomp; $(LN) $(SYSTEM_ARCH)/scheduling.ml .
918
919# Preprocess the code emitters
920
921asmcomp/emit.ml: asmcomp/$(SYSTEM_ARCH)/emit.mlp tools/cvt_emit
922	echo \# 1 \"$(SYSTEM_ARCH)/emit.mlp\" > $@
923	$(CAMLRUN) tools/cvt_emit < $< >> $@ \
924	|| { rm -f $@; exit 2; }
925
926partialclean::
927	rm -f asmcomp/emit.ml
928
929beforedepend:: asmcomp/emit.ml
930
931tools/cvt_emit: tools/cvt_emit.mll
932	$(MAKE) -C tools cvt_emit
933
934# The "expunge" utility
935
936expunge: compilerlibs/ocamlcommon.cma compilerlibs/ocamlbytecomp.cma \
937         toplevel/expunge.cmo
938	$(CAMLC) $(LINKFLAGS) -o $@ $^
939
940partialclean::
941	rm -f expunge
942
943# The runtime system for the bytecode compiler
944
945.PHONY: runtime
946runtime: stdlib/libcamlrun.$(A)
947
948.PHONY: makeruntime
949makeruntime:
950	$(MAKE) -C byterun $(BOOT_FLEXLINK_CMD) all
951byterun/libcamlrun.$(A): makeruntime ;
952stdlib/libcamlrun.$(A): byterun/libcamlrun.$(A)
953	cd stdlib; $(LN) ../byterun/libcamlrun.$(A) .
954clean::
955	$(MAKE) -C byterun clean
956	rm -f stdlib/libcamlrun.$(A)
957
958.PHONY: alldepend
959alldepend::
960	$(MAKE) -C byterun depend
961
962# The runtime system for the native-code compiler
963
964.PHONY: runtimeopt
965runtimeopt: stdlib/libasmrun.$(A)
966
967.PHONY: makeruntimeopt
968makeruntimeopt:
969	$(MAKE) -C asmrun $(BOOT_FLEXLINK_CMD) all
970asmrun/libasmrun.$(A): makeruntimeopt ;
971stdlib/libasmrun.$(A): asmrun/libasmrun.$(A)
972	cp $< $@
973clean::
974	$(MAKE) -C asmrun clean
975	rm -f stdlib/libasmrun.$(A)
976alldepend::
977	$(MAKE) -C asmrun depend
978
979# The standard library
980
981.PHONY: library
982library: ocamlc
983	$(MAKE) -C stdlib $(BOOT_FLEXLINK_CMD) all
984
985.PHONY: library-cross
986library-cross:
987	$(MAKE) -C stdlib $(BOOT_FLEXLINK_CMD) CAMLRUN=../byterun/ocamlrun all
988
989.PHONY: libraryopt
990libraryopt:
991	$(MAKE) -C stdlib $(BOOT_FLEXLINK_CMD) allopt
992
993partialclean::
994	$(MAKE) -C stdlib clean
995
996alldepend::
997	$(MAKE) -C stdlib depend
998
999# The lexer and parser generators
1000
1001.PHONY: ocamllex
1002ocamllex: ocamlyacc ocamlc
1003	$(MAKE) -C lex all
1004
1005.PHONY: ocamllex.opt
1006ocamllex.opt: ocamlopt
1007	$(MAKE) -C lex allopt
1008
1009partialclean::
1010	$(MAKE) -C lex clean
1011
1012alldepend::
1013	$(MAKE) -C lex depend
1014
1015.PHONY: ocamlyacc
1016ocamlyacc:
1017	$(MAKE) -C yacc $(BOOT_FLEXLINK_CMD) all
1018
1019clean::
1020	$(MAKE) -C yacc clean
1021
1022# OCamldoc
1023
1024.PHONY: ocamldoc
1025ocamldoc: ocamlc ocamlyacc ocamllex otherlibraries
1026	$(MAKE) -C ocamldoc all
1027
1028.PHONY: ocamldoc.opt
1029ocamldoc.opt: ocamlc.opt ocamlyacc ocamllex
1030	$(MAKE) -C ocamldoc opt.opt
1031
1032# Documentation
1033
1034.PHONY: html_doc
1035html_doc: ocamldoc
1036	$(MAKE) -C ocamldoc $@
1037	@echo "documentation is in ./ocamldoc/stdlib_html/"
1038
1039partialclean::
1040	$(MAKE) -C ocamldoc clean
1041
1042alldepend::
1043	$(MAKE) -C ocamldoc depend
1044
1045# The extra libraries
1046
1047.PHONY: otherlibraries
1048otherlibraries: ocamltools
1049	for i in $(OTHERLIBRARIES); do \
1050	  ($(MAKE) -C otherlibs/$$i all) || exit $$?; \
1051	done
1052
1053.PHONY: otherlibrariesopt
1054otherlibrariesopt:
1055	for i in $(OTHERLIBRARIES); do \
1056	  ($(MAKE) -C otherlibs/$$i allopt) || exit $$?; \
1057	done
1058
1059partialclean::
1060	for i in $(OTHERLIBRARIES); do \
1061	  ($(MAKE) -C otherlibs/$$i partialclean); \
1062	done
1063
1064clean::
1065	for i in $(OTHERLIBRARIES); do \
1066	  ($(MAKE) -C otherlibs/$$i clean); \
1067	done
1068
1069alldepend::
1070	for i in $(OTHERLIBRARIES); do \
1071	  ($(MAKE) -C otherlibs/$$i depend); \
1072	done
1073
1074# The replay debugger
1075
1076.PHONY: ocamldebugger
1077ocamldebugger: ocamlc ocamlyacc ocamllex otherlibraries
1078	$(MAKE) -C debugger all
1079
1080partialclean::
1081	$(MAKE) -C debugger clean
1082
1083alldepend::
1084	$(MAKE) -C debugger depend
1085
1086# Check that the stack limit is reasonable.
1087ifeq "$(UNIX_OR_WIN32)" "unix"
1088.PHONY: checkstack
1089checkstack:
1090	if $(MKEXE) -o tools/checkstack$(EXE) tools/checkstack.c; \
1091	  then tools/checkstack$(EXE); \
1092	  else :; \
1093	fi
1094	rm -f tools/checkstack$(EXE)
1095endif
1096
1097# Lint @since and @deprecated annotations
1098
1099.PHONY: lintapidiff
1100lintapidiff:
1101	$(MAKE) -C tools lintapidiff.opt
1102	git ls-files -- 'otherlibs/*/*.mli' 'stdlib/*.mli' |\
1103	    grep -Ev internal\|obj\|spacetime\|stdLabels\|moreLabels |\
1104	    tools/lintapidiff.opt $(shell git tag|grep '^[0-9]*.[0-9]*.[0-9]*$$'|grep -v '^[12].')
1105
1106# Make clean in the test suite
1107
1108clean::
1109	cd testsuite; $(MAKE) clean
1110
1111# Make MacOS X package
1112ifeq "$(UNIX_OR_WIN32)" "unix"
1113.PHONY: package-macosx
1114package-macosx:
1115	sudo rm -rf package-macosx/root
1116	$(MAKE) PREFIX="`pwd`"/package-macosx/root install
1117	tools/make-package-macosx
1118	sudo rm -rf package-macosx/root
1119
1120clean::
1121	rm -rf package-macosx/*.pkg package-macosx/*.dmg
1122endif
1123
1124# The middle end (whose .cma library is currently only used for linking
1125# the "ocamlobjinfo" program, since we cannot depend on the whole native code
1126# compiler for "make world" and the list of dependencies for
1127# asmcomp/export_info.cmo is long).
1128
1129compilerlibs/ocamlmiddleend.cma: $(MIDDLE_END)
1130	$(CAMLC) -a -o $@ $^
1131compilerlibs/ocamlmiddleend.cmxa: $(MIDDLE_END:%.cmo=%.cmx)
1132	$(CAMLOPT) -a -o $@ $^
1133partialclean::
1134	rm -f compilerlibs/ocamlmiddleend.cma \
1135	      compilerlibs/ocamlmiddleend.cmxa \
1136	      compilerlibs/ocamlmiddleend.$(A)
1137
1138# Tools
1139
1140.PHONY: ocamltools
1141ocamltools: ocamlc ocamlyacc ocamllex asmcomp/cmx_format.cmi \
1142            asmcomp/printclambda.cmo compilerlibs/ocamlmiddleend.cma \
1143            asmcomp/export_info.cmo
1144	$(MAKE) -C tools all
1145
1146.PHONY: ocamltoolsopt
1147ocamltoolsopt: ocamlopt
1148	$(MAKE) -C tools opt
1149
1150.PHONY: ocamltoolsopt.opt
1151ocamltoolsopt.opt: ocamlc.opt ocamlyacc ocamllex.opt asmcomp/cmx_format.cmi \
1152                   asmcomp/printclambda.cmx compilerlibs/ocamlmiddleend.cmxa \
1153                   asmcomp/export_info.cmx
1154	$(MAKE) -C tools opt.opt
1155
1156partialclean::
1157	$(MAKE) -C tools clean
1158
1159alldepend::
1160	$(MAKE) -C tools depend
1161
1162## Test compilation of backend-specific parts
1163
1164partialclean::
1165	rm -f $(ARCH_SPECIFIC)
1166
1167beforedepend:: $(ARCH_SPECIFIC)
1168
1169# This rule provides a quick way to check that machine-dependent
1170# files compiles fine for a foreign architecture (passed as ARCH=xxx).
1171
1172.PHONY: check_arch
1173check_arch:
1174	@echo "========= CHECKING asmcomp/$(SYSTEM_ARCH) =============="
1175	@rm -f $(ARCH_SPECIFIC) asmcomp/emit.ml asmcomp/*.cm*
1176	@$(MAKE) compilerlibs/ocamloptcomp.cma \
1177	            >/dev/null
1178	@rm -f $(ARCH_SPECIFIC) asmcomp/emit.ml asmcomp/*.cm*
1179
1180.PHONY: check_all_arches
1181check_all_arches:
1182	@STATUS=0; \
1183	 for i in $(ARCHES); do \
1184	   $(MAKE) --no-print-directory check_arch ARCH=$$i || STATUS=1; \
1185	 done; \
1186	 exit $$STATUS
1187
1188# Compiler Plugins
1189
1190DYNLINK_DIR=otherlibs/dynlink
1191
1192driver/compdynlink.mlbyte: $(DYNLINK_DIR)/dynlink.ml driver/compdynlink.mli
1193	grep -v 'REMOVE_ME for ../../debugger/dynlink.ml' \
1194	     $(DYNLINK_DIR)/dynlink.ml >driver/compdynlink.mlbyte
1195
1196ifeq ($(NATDYNLINK),true)
1197driver/compdynlink.mlopt: $(DYNLINK_DIR)/natdynlink.ml driver/compdynlink.mli
1198	cp $(DYNLINK_DIR)/natdynlink.ml driver/compdynlink.mlopt
1199else
1200driver/compdynlink.mlopt: driver/compdynlink.mlno driver/compdynlink.mli
1201	cp driver/compdynlink.mlno driver/compdynlink.mlopt
1202endif
1203
1204driver/compdynlink.mli: $(DYNLINK_DIR)/dynlink.mli
1205	cp $(DYNLINK_DIR)/dynlink.mli driver/compdynlink.mli
1206
1207driver/compdynlink.cmo: driver/compdynlink.mlbyte driver/compdynlink.cmi
1208	$(CAMLC) $(COMPFLAGS) -c -impl $<
1209
1210driver/compdynlink.cmx: driver/compdynlink.mlopt driver/compdynlink.cmi
1211	$(CAMLOPT) $(COMPFLAGS) -c -impl $<
1212
1213beforedepend:: driver/compdynlink.mlbyte driver/compdynlink.mlopt \
1214               driver/compdynlink.mli
1215partialclean::
1216	rm -f driver/compdynlink.mlbyte
1217	rm -f driver/compdynlink.mli
1218	rm -f driver/compdynlink.mlopt
1219
1220# The native toplevel
1221
1222compilerlibs/ocamlopttoplevel.cmxa: $(OPTTOPLEVEL:.cmo=.cmx)
1223	$(CAMLOPT) -a -o $@ $^
1224partialclean::
1225	rm -f compilerlibs/ocamlopttoplevel.cmxa
1226
1227# When the native toplevel executable has an extension (e.g. ".exe"),
1228# provide a phony 'ocamlnat' synonym
1229
1230ifneq ($(EXE),)
1231.PHONY: ocamlnat
1232ocamlnat: ocamlnat$(EXE)
1233endif
1234
1235ocamlnat$(EXE): compilerlibs/ocamlcommon.cmxa compilerlibs/ocamloptcomp.cmxa \
1236    compilerlibs/ocamlbytecomp.cmxa \
1237    compilerlibs/ocamlopttoplevel.cmxa \
1238    $(OPTTOPLEVELSTART:.cmo=.cmx)
1239	$(CAMLOPT) $(LINKFLAGS) -linkall -o $@ $^
1240
1241partialclean::
1242	rm -f ocamlnat$(EXE)
1243
1244toplevel/opttoploop.cmx: otherlibs/dynlink/dynlink.cmxa
1245
1246# The numeric opcodes
1247
1248bytecomp/opcodes.ml: byterun/caml/instruct.h tools/make_opcodes
1249	$(CAMLRUN) tools/make_opcodes -opcodes < $< > $@
1250
1251tools/make_opcodes: tools/make_opcodes.mll
1252	$(MAKE) -C tools make_opcodes
1253
1254partialclean::
1255	rm -f bytecomp/opcodes.ml
1256
1257beforedepend:: bytecomp/opcodes.ml
1258
1259# Default rules
1260
1261.SUFFIXES: .ml .mli .cmo .cmi .cmx
1262
1263.ml.cmo:
1264	$(CAMLC) $(COMPFLAGS) -c $<
1265
1266.mli.cmi:
1267	$(CAMLC) $(COMPFLAGS) -c $<
1268
1269.ml.cmx:
1270	$(CAMLOPT) $(COMPFLAGS) -c $<
1271
1272partialclean::
1273	for d in utils parsing typing bytecomp asmcomp middle_end \
1274	         middle_end/base_types driver toplevel tools; do \
1275	  rm -f $$d/*.cm[ioxt] $$d/*.cmti $$d/*.annot $$d/*.$(S) \
1276	    $$d/*.$(O) $$d/*.$(SO) $d/*~; \
1277	done
1278	rm -f *~
1279
1280.PHONY: depend
1281depend: beforedepend
1282	(for d in utils parsing typing bytecomp asmcomp middle_end \
1283	 middle_end/base_types driver toplevel; \
1284	 do $(CAMLDEP) -slash $(DEPFLAGS) $$d/*.mli $$d/*.ml; \
1285	 done) > .depend
1286	$(CAMLDEP) -slash $(DEPFLAGS) -native \
1287		-impl driver/compdynlink.mlopt >> .depend
1288	$(CAMLDEP) -slash $(DEPFLAGS) -bytecode \
1289		-impl driver/compdynlink.mlbyte >> .depend
1290
1291alldepend:: depend
1292
1293.PHONY: distclean
1294distclean: clean
1295	rm -f asmrun/.depend.nt byterun/.depend.nt \
1296	            otherlibs/bigarray/.depend.nt  \
1297		    otherlibs/str/.depend.nt
1298	rm -f boot/ocamlrun boot/ocamlrun$(EXE) boot/camlheader \
1299	      boot/ocamlyacc boot/*.cm* boot/libcamlrun.$(A)
1300	rm -f config/Makefile config/m.h config/s.h
1301	rm -f tools/*.bak
1302	rm -f ocaml ocamlc
1303	rm -f testsuite/_log
1304
1305include .depend
1306