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