UNPKG

ocaml

Version:

OCaml compiler packaged for esy

1,556 lines (1,252 loc) 87.4 kB
#************************************************************************** #* * #* OCaml * #* * #* 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 GNU Lesser General Public License version 2.1, with the * #* special exception on linking described in the file LICENSE. * #* * #************************************************************************** # The main Makefile ROOTDIR = . # NOTE: it is important that the OCAMLDEP and OCAMLLEX variables # are defined *before* Makefile.common gets included, so that # their local definitions here take precedence over their # general shared definitions in Makefile.common. OCAMLLEX ?= $(BOOT_OCAMLLEX) include Makefile.common include Makefile.best_binaries .PHONY: defaultentry defaultentry: $(DEFAULT_BUILD_TARGET) include stdlib/StdlibModules CAMLC = $(BOOT_OCAMLC) $(BOOT_STDLIBFLAGS) -use-prims runtime/primitives CAMLOPT=$(OCAMLRUN) ./ocamlopt$(EXE) $(STDLIBFLAGS) -I otherlibs/dynlink ARCHES=amd64 arm64 power s390x riscv VPATH = utils parsing typing bytecomp file_formats lambda middle_end \ middle_end/closure middle_end/flambda middle_end/flambda/base_types \ asmcomp driver toplevel tools $(addprefix otherlibs/, $(ALL_OTHERLIBS)) INCLUDES = $(addprefix -I ,$(VPATH)) ifeq "$(strip $(NATDYNLINKOPTS))" "" OCAML_NATDYNLINKOPTS= else OCAML_NATDYNLINKOPTS = -ccopt "$(NATDYNLINKOPTS)" endif OC_OCAMLDEPDIRS = $(VPATH) # This list is passed to expunge, which accepts both uncapitalized and # capitalized module names. PERVASIVES=$(STDLIB_MODULES) outcometree topprinters topdirs toploop LIBFILES=stdlib.cma std_exit.cmo *.cmi $(HEADER_NAME) COMPLIBDIR=$(LIBDIR)/compiler-libs TOPINCLUDES=$(addprefix -I otherlibs/,$(filter-out %threads,$(OTHERLIBRARIES))) expunge := expunge$(EXE) # Targets and dependencies for the compilerlibs/*.{cma,cmxa} archives utils_SOURCES = $(addprefix utils/, \ config.mli config.ml \ build_path_prefix_map.mli build_path_prefix_map.ml \ misc.mli misc.ml \ identifiable.mli identifiable.ml \ numbers.mli numbers.ml \ arg_helper.mli arg_helper.ml \ local_store.mli local_store.ml \ load_path.mli load_path.ml \ clflags.mli clflags.ml \ profile.mli profile.ml \ terminfo.mli terminfo.ml \ ccomp.mli ccomp.ml \ warnings.mli warnings.ml \ consistbl.mli consistbl.ml \ strongly_connected_components.mli strongly_connected_components.ml \ targetint.mli targetint.ml \ int_replace_polymorphic_compare.mli int_replace_polymorphic_compare.ml \ domainstate.mli domainstate.ml \ binutils.mli binutils.ml \ lazy_backtrack.mli lazy_backtrack.ml \ diffing.mli diffing.ml \ diffing_with_keys.mli diffing_with_keys.ml \ compression.mli compression.ml) parsing_SOURCES = $(addprefix parsing/, \ location.mli location.ml \ unit_info.mli unit_info.ml \ asttypes.mli \ longident.mli longident.ml \ parsetree.mli \ docstrings.mli docstrings.ml \ syntaxerr.mli syntaxerr.ml \ ast_helper.mli ast_helper.ml \ ast_iterator.mli ast_iterator.ml \ builtin_attributes.mli builtin_attributes.ml \ camlinternalMenhirLib.mli camlinternalMenhirLib.ml \ parser.mly \ lexer.mll \ pprintast.mli pprintast.ml \ parse.mli parse.ml \ printast.mli printast.ml \ ast_mapper.mli ast_mapper.ml \ attr_helper.mli attr_helper.ml \ ast_invariants.mli ast_invariants.ml \ depend.mli depend.ml) typing_SOURCES = \ typing/annot.mli \ typing/value_rec_types.mli \ typing/ident.mli typing/ident.ml \ typing/path.mli typing/path.ml \ typing/primitive.mli typing/primitive.ml \ typing/type_immediacy.mli typing/type_immediacy.ml \ typing/outcometree.mli \ typing/shape.mli typing/shape.ml \ typing/types.mli typing/types.ml \ typing/btype.mli typing/btype.ml \ typing/oprint.mli typing/oprint.ml \ typing/subst.mli typing/subst.ml \ typing/predef.mli typing/predef.ml \ typing/datarepr.mli typing/datarepr.ml \ file_formats/cmi_format.mli file_formats/cmi_format.ml \ typing/persistent_env.mli typing/persistent_env.ml \ typing/env.mli typing/env.ml \ typing/errortrace.mli typing/errortrace.ml \ typing/typedtree.mli typing/typedtree.ml \ typing/signature_group.mli typing/signature_group.ml \ typing/printtyped.mli typing/printtyped.ml \ typing/ctype.mli typing/ctype.ml \ typing/printtyp.mli typing/printtyp.ml \ typing/includeclass.mli typing/includeclass.ml \ typing/mtype.mli typing/mtype.ml \ typing/envaux.mli typing/envaux.ml \ typing/includecore.mli typing/includecore.ml \ typing/tast_iterator.mli typing/tast_iterator.ml \ typing/tast_mapper.mli typing/tast_mapper.ml \ typing/stypes.mli typing/stypes.ml \ typing/shape_reduce.mli typing/shape_reduce.ml \ file_formats/cmt_format.mli file_formats/cmt_format.ml \ typing/cmt2annot.mli typing/cmt2annot.ml \ typing/untypeast.mli typing/untypeast.ml \ typing/includemod.mli typing/includemod.ml \ typing/includemod_errorprinter.mli typing/includemod_errorprinter.ml \ typing/typetexp.mli typing/typetexp.ml \ typing/printpat.mli typing/printpat.ml \ typing/patterns.mli typing/patterns.ml \ typing/parmatch.mli typing/parmatch.ml \ typing/typedecl_properties.mli typing/typedecl_properties.ml \ typing/typedecl_variance.mli typing/typedecl_variance.ml \ typing/typedecl_unboxed.mli typing/typedecl_unboxed.ml \ typing/typedecl_immediacy.mli typing/typedecl_immediacy.ml \ typing/typedecl_separability.mli typing/typedecl_separability.ml \ typing/typeopt.mli typing/typeopt.ml \ typing/typedecl.mli typing/typedecl.ml \ typing/value_rec_check.mli typing/value_rec_check.ml \ typing/typecore.mli typing/typecore.ml \ typing/typeclass.mli typing/typeclass.ml \ typing/typemod.mli typing/typemod.ml lambda_SOURCES = $(addprefix lambda/, \ debuginfo.mli debuginfo.ml \ lambda.mli lambda.ml \ printlambda.mli printlambda.ml \ switch.mli switch.ml \ matching.mli matching.ml \ value_rec_compiler.mli value_rec_compiler.ml \ translobj.mli translobj.ml \ translattribute.mli translattribute.ml \ translprim.mli translprim.ml \ translcore.mli translcore.ml \ translclass.mli translclass.ml \ translmod.mli translmod.ml \ tmc.mli tmc.ml \ simplif.mli simplif.ml \ runtimedef.mli runtimedef.ml) comp_SOURCES = \ file_formats/cmo_format.mli \ file_formats/cmx_format.mli \ file_formats/cmxs_format.mli \ bytecomp/meta.mli bytecomp/meta.ml \ bytecomp/opcodes.mli bytecomp/opcodes.ml \ bytecomp/bytesections.mli bytecomp/bytesections.ml \ bytecomp/dll.mli bytecomp/dll.ml \ bytecomp/symtable.mli bytecomp/symtable.ml \ driver/pparse.mli driver/pparse.ml \ driver/compenv.mli driver/compenv.ml \ driver/main_args.mli driver/main_args.ml \ driver/compmisc.mli driver/compmisc.ml \ driver/makedepend.mli driver/makedepend.ml \ driver/compile_common.mli driver/compile_common.ml # All file format descriptions (including cmx{,s}) are in the # ocamlcommon library so that ocamlobjinfo can depend on them. ocamlcommon_SOURCES = \ $(utils_SOURCES) $(parsing_SOURCES) $(typing_SOURCES) \ $(lambda_SOURCES) $(comp_SOURCES) ocamlbytecomp_SOURCES = \ bytecomp/instruct.mli bytecomp/instruct.ml \ bytecomp/bytegen.mli bytecomp/bytegen.ml \ bytecomp/printinstr.mli bytecomp/printinstr.ml \ bytecomp/emitcode.mli bytecomp/emitcode.ml \ bytecomp/bytelink.mli bytecomp/bytelink.ml \ bytecomp/bytelibrarian.mli bytecomp/bytelibrarian.ml \ bytecomp/bytepackager.mli bytecomp/bytepackager.ml \ driver/errors.mli driver/errors.ml \ driver/compile.mli driver/compile.ml \ driver/maindriver.mli driver/maindriver.ml intel_SOURCES = \ x86_ast.mli \ x86_proc.mli x86_proc.ml \ x86_dsl.mli x86_dsl.ml \ x86_gas.mli x86_gas.ml \ x86_masm.mli x86_masm.ml asmcomp_SOURCES = \ $(addprefix asmcomp/, $(arch_specific_SOURCES)) \ asmcomp/arch.mli asmcomp/arch.ml \ asmcomp/cmm.mli asmcomp/cmm.ml \ asmcomp/printcmm.mli asmcomp/printcmm.ml \ asmcomp/reg.mli asmcomp/reg.ml \ asmcomp/mach.mli asmcomp/mach.ml \ asmcomp/proc.mli asmcomp/proc.ml \ asmcomp/strmatch.mli asmcomp/strmatch.ml \ asmcomp/cmmgen_state.mli asmcomp/cmmgen_state.ml \ asmcomp/cmm_helpers.mli asmcomp/cmm_helpers.ml \ asmcomp/afl_instrument.mli asmcomp/afl_instrument.ml \ asmcomp/thread_sanitizer.mli asmcomp/thread_sanitizer.ml \ asmcomp/cmmgen.mli asmcomp/cmmgen.ml \ asmcomp/cmm_invariants.mli asmcomp/cmm_invariants.ml \ asmcomp/interval.mli asmcomp/interval.ml \ asmcomp/printmach.mli asmcomp/printmach.ml \ asmcomp/dataflow.mli asmcomp/dataflow.ml \ asmcomp/polling.mli asmcomp/polling.ml \ asmcomp/selectgen.mli asmcomp/selectgen.ml \ asmcomp/selection.mli asmcomp/selection.ml \ asmcomp/comballoc.mli asmcomp/comballoc.ml \ asmcomp/CSEgen.mli asmcomp/CSEgen.ml \ asmcomp/CSE.mli asmcomp/CSE.ml \ asmcomp/liveness.mli asmcomp/liveness.ml \ asmcomp/spill.mli asmcomp/spill.ml \ asmcomp/split.mli asmcomp/split.ml \ asmcomp/interf.mli asmcomp/interf.ml \ asmcomp/coloring.mli asmcomp/coloring.ml \ asmcomp/linscan.mli asmcomp/linscan.ml \ asmcomp/reloadgen.mli asmcomp/reloadgen.ml \ asmcomp/reload.mli asmcomp/reload.ml \ asmcomp/deadcode.mli asmcomp/deadcode.ml \ asmcomp/stackframegen.mli asmcomp/stackframegen.ml \ asmcomp/stackframe.mli asmcomp/stackframe.ml \ asmcomp/linear.mli asmcomp/linear.ml \ asmcomp/printlinear.mli asmcomp/printlinear.ml \ asmcomp/linearize.mli asmcomp/linearize.ml \ file_formats/linear_format.mli file_formats/linear_format.ml \ asmcomp/schedgen.mli asmcomp/schedgen.ml \ asmcomp/scheduling.mli asmcomp/scheduling.ml \ asmcomp/branch_relaxation.mli asmcomp/branch_relaxation.ml \ asmcomp/emitaux.mli asmcomp/emitaux.ml \ asmcomp/emit.mli asmcomp/emit.ml \ asmcomp/asmgen.mli asmcomp/asmgen.ml \ asmcomp/asmlink.mli asmcomp/asmlink.ml \ asmcomp/asmlibrarian.mli asmcomp/asmlibrarian.ml \ asmcomp/asmpackager.mli asmcomp/asmpackager.ml \ driver/opterrors.mli driver/opterrors.ml \ driver/optcompile.mli driver/optcompile.ml \ driver/optmaindriver.mli driver/optmaindriver.ml # Files under middle_end/ are not to reference files under asmcomp/. # This ensures that the middle end can be linked (e.g. for objinfo) even when # the native code compiler is not present for some particular target. middle_end_closure_SOURCES = $(addprefix middle_end/closure/, \ closure.mli closure.ml \ closure_middle_end.mli closure_middle_end.ml) # Owing to dependencies through [Compilenv], which would be # difficult to remove, some of the lower parts of Flambda (anything that is # saved in a .cmx file) have to be included in the [MIDDLE_END] stanza, below. middle_end_flambda_SOURCES = \ $(addprefix middle_end/flambda/, \ import_approx.mli import_approx.ml \ lift_code.mli lift_code.ml \ closure_conversion_aux.mli closure_conversion_aux.ml \ closure_conversion.mli closure_conversion.ml \ initialize_symbol_to_let_symbol.mli initialize_symbol_to_let_symbol.ml \ lift_let_to_initialize_symbol.mli lift_let_to_initialize_symbol.ml \ find_recursive_functions.mli find_recursive_functions.ml \ invariant_params.mli invariant_params.ml \ inconstant_idents.mli inconstant_idents.ml \ alias_analysis.mli alias_analysis.ml \ lift_constants.mli lift_constants.ml \ share_constants.mli share_constants.ml \ simplify_common.mli simplify_common.ml \ remove_unused_arguments.mli remove_unused_arguments.ml \ remove_unused_closure_vars.mli remove_unused_closure_vars.ml \ remove_unused_program_constructs.mli remove_unused_program_constructs.ml \ simplify_boxed_integer_ops.mli simplify_boxed_integer_ops.ml \ simplify_primitives.mli simplify_primitives.ml \ inlining_stats_types.mli inlining_stats_types.ml \ inlining_stats.mli inlining_stats.ml \ inline_and_simplify_aux.mli inline_and_simplify_aux.ml \ inlining_decision_intf.mli \ remove_free_vars_equal_to_args.mli remove_free_vars_equal_to_args.ml \ extract_projections.mli extract_projections.ml \ augment_specialised_args.mli augment_specialised_args.ml \ unbox_free_vars_of_closures.mli unbox_free_vars_of_closures.ml \ unbox_specialised_args.mli unbox_specialised_args.ml \ unbox_closures.mli unbox_closures.ml \ inlining_transforms.mli inlining_transforms.ml \ inlining_decision.mli inlining_decision.ml \ inline_and_simplify.mli inline_and_simplify.ml \ ref_to_variables.mli ref_to_variables.ml \ flambda_invariants.mli flambda_invariants.ml \ traverse_for_exported_symbols.mli traverse_for_exported_symbols.ml \ build_export_info.mli build_export_info.ml \ closure_offsets.mli closure_offsets.ml \ un_anf.mli un_anf.ml \ flambda_to_clambda.mli flambda_to_clambda.ml \ flambda_middle_end.mli flambda_middle_end.ml \ simplify_boxed_integer_ops_intf.mli) ocamlmiddleend_SOURCES = \ $(addprefix middle_end/, \ internal_variable_names.mli internal_variable_names.ml \ linkage_name.mli linkage_name.ml \ compilation_unit.mli compilation_unit.ml \ variable.mli variable.ml \ $(addprefix flambda/base_types/, \ closure_element.mli closure_element.ml \ closure_id.mli closure_id.ml) \ symbol.mli symbol.ml \ backend_var.mli backend_var.ml \ clambda_primitives.mli clambda_primitives.ml \ printclambda_primitives.mli printclambda_primitives.ml \ clambda.mli clambda.ml \ printclambda.mli printclambda.ml \ semantics_of_primitives.mli semantics_of_primitives.ml \ convert_primitives.mli convert_primitives.ml \ $(addprefix flambda/, \ $(addprefix base_types/, \ id_types.mli id_types.ml \ export_id.mli export_id.ml \ tag.mli tag.ml \ mutable_variable.mli mutable_variable.ml \ set_of_closures_id.mli set_of_closures_id.ml \ set_of_closures_origin.mli set_of_closures_origin.ml \ closure_origin.mli closure_origin.ml \ var_within_closure.mli var_within_closure.ml \ static_exception.mli static_exception.ml) \ pass_wrapper.mli pass_wrapper.ml \ allocated_const.mli allocated_const.ml \ parameter.mli parameter.ml \ projection.mli projection.ml \ flambda.mli flambda.ml \ flambda_iterators.mli flambda_iterators.ml \ flambda_utils.mli flambda_utils.ml \ freshening.mli freshening.ml \ effect_analysis.mli effect_analysis.ml \ inlining_cost.mli inlining_cost.ml \ simple_value_approx.mli simple_value_approx.ml \ export_info.mli export_info.ml \ export_info_for_pack.mli export_info_for_pack.ml) \ compilenv.mli compilenv.ml \ backend_intf.mli) \ $(middle_end_closure_SOURCES) \ $(middle_end_flambda_SOURCES) ocamloptcomp_SOURCES = $(ocamlmiddleend_SOURCES) $(asmcomp_SOURCES) ocamltoplevel_SOURCES = $(addprefix toplevel/, \ genprintval.mli genprintval.ml \ topcommon.mli topcommon.ml \ native/tophooks.mli native/tophooks.ml \ byte/topeval.mli byte/topeval.ml \ native/topeval.mli native/topeval.ml \ byte/trace.mli byte/trace.ml \ native/trace.mli native/trace.ml \ toploop.mli toploop.ml \ topprinters.mli topprinters.ml \ topdirs.mli topdirs.ml \ byte/topmain.mli byte/topmain.ml \ native/topmain.mli native/topmain.ml) TOPLEVEL_SHARED_MLIS = topeval.mli trace.mli topmain.mli TOPLEVEL_SHARED_CMIS = $(TOPLEVEL_SHARED_MLIS:%.mli=%.cmi) TOPLEVEL_SHARED_ARTEFACTS = $(TOPLEVEL_SHARED_MLIS) $(TOPLEVEL_SHARED_CMIS) $(addprefix toplevel/byte/, $(TOPLEVEL_SHARED_CMIS)):\ toplevel/byte/%.cmi: toplevel/%.cmi cp $< toplevel/$*.mli $(@D) $(addprefix toplevel/native/, $(TOPLEVEL_SHARED_CMIS)):\ toplevel/native/%.cmi: toplevel/%.cmi cp $< toplevel/$*.mli $(@D) beforedepend:: cd toplevel ; cp $(TOPLEVEL_SHARED_MLIS) byte/ cd toplevel ; cp $(TOPLEVEL_SHARED_MLIS) native/ partialclean:: cd toplevel/byte ; rm -f $(TOPLEVEL_SHARED_ARTEFACTS) cd toplevel/native ; rm -f $(TOPLEVEL_SHARED_ARTEFACTS) ALL_CONFIG_CMO = utils/config_main.cmo utils/config_boot.cmo utils/config_%.mli: utils/config.mli cp $^ $@ beforedepend:: utils/config_main.mli utils/config_boot.mli $(addprefix compilerlibs/ocamlcommon., cma cmxa): \ OC_COMMON_LINKFLAGS += -linkall COMPRESSED_MARSHALING_FLAGS=-cclib -lcomprmarsh \ $(patsubst %, -ccopt %, $(filter-out -l%,$(ZSTD_LIBS))) \ $(patsubst %, -cclib %, $(filter -l%,$(ZSTD_LIBS))) \ compilerlibs/ocamlcommon.cmxa: \ OC_NATIVE_LINKFLAGS += $(COMPRESSED_MARSHALING_FLAGS) compilerlibs/ocamlcommon.cmxa: stdlib/libcomprmarsh.$(A) partialclean:: rm -f compilerlibs/ocamlcommon.cma partialclean:: rm -f compilerlibs/ocamlcommon.cmxa \ compilerlibs/ocamlcommon.a compilerlibs/ocamlcommon.lib partialclean:: rm -f compilerlibs/ocamlbytecomp.cma partialclean:: rm -f compilerlibs/ocamlbytecomp.cmxa \ compilerlibs/ocamlbytecomp.a compilerlibs/ocamlbytecomp.lib partialclean:: rm -f compilerlibs/ocamlmiddleend.cma \ compilerlibs/ocamlmiddleend.cmxa \ compilerlibs/ocamlmiddleend.a \ compilerlibs/ocamlmiddleend.lib partialclean:: rm -f compilerlibs/ocamloptcomp.cma partialclean:: rm -f compilerlibs/ocamloptcomp.cmxa \ compilerlibs/ocamloptcomp.a compilerlibs/ocamloptcomp.lib compilerlibs/ocamltoplevel.cma: VPATH += toplevel/byte partialclean:: rm -f compilerlibs/ocamltoplevel.cma compilerlibs/ocamltoplevel.cmxa: VPATH += toplevel/native partialclean:: rm -f compilerlibs/ocamltoplevel.cmxa \ compilerlibs/ocamltoplevel.a compilerlibs/ocamltoplevel.lib # The configuration file utils/config.ml: \ utils/config_$(if $(filter true,$(IN_COREBOOT_CYCLE)),boot,main).ml $(V_GEN)cp $< $@ utils/config_boot.ml: utils/config.fixed.ml utils/config.common.ml $(V_GEN)cat $^ > $@ utils/config_main.ml: utils/config.generated.ml utils/config.common.ml $(V_GEN)cat $^ > $@ .PHONY: reconfigure reconfigure: ac_read_git_config=true ./configure $(CONFIGURE_ARGS) utils/domainstate.ml: utils/domainstate.ml.c runtime/caml/domain_state.tbl $(V_GEN)$(CPP) -I runtime/caml $< > $@ utils/domainstate.mli: utils/domainstate.mli.c runtime/caml/domain_state.tbl $(V_GEN)$(CPP) -I runtime/caml $< > $@ configure: tools/autogen configure.ac aclocal.m4 build-aux/ocaml_version.m4 $< .PHONY: partialclean partialclean:: rm -f utils/config.ml \ utils/config_main.ml utils/config_main.mli \ utils/config_boot.ml utils/config_boot.mli \ utils/domainstate.ml utils/domainstate.mli .PHONY: beforedepend beforedepend:: \ utils/config.ml utils/config_boot.ml utils/config_main.ml \ utils/domainstate.ml utils/domainstate.mli ocamllex_PROGRAMS = $(addprefix lex/,ocamllex ocamllex.opt) ocamlyacc_PROGRAM = yacc/ocamlyacc # Tools to be compiled to native and bytecode, then installed TOOLS_TO_INSTALL_NAT = ocamldep ocamlobjinfo # Tools to be compiled to bytecode only, then installed TOOLS_TO_INSTALL_BYT = \ ocamlcmt ocamlprof ocamlcp ocamlmklib ocamlmktop ifeq "$(NATIVE_COMPILER)" "true" TOOLS_TO_INSTALL_BYT += ocamloptp endif # Clean should remove tools/ocamloptp etc. unconditionally because # the configuration is not available during clean so we don't # know whether they have been configured / built or not clean:: rm -f $(addprefix tools/ocamlopt,p p.opt p.exe p.opt.exe) TOOLS_NAT = $(TOOLS_TO_INSTALL_NAT) TOOLS_BYT = $(TOOLS_TO_INSTALL_BYT) dumpobj primreq stripdebug cmpbyt TOOLS_NAT_PROGRAMS = $(addprefix tools/,$(TOOLS_NAT)) TOOLS_BYT_PROGRAMS = $(addprefix tools/,$(TOOLS_BYT)) TOOLS_MODULES = tools/profiling # C programs C_PROGRAMS = $(ocamlyacc_PROGRAM) $(foreach PROGRAM, $(C_PROGRAMS),\ $(eval $(call PROGRAM_SYNONYM,$(PROGRAM)))) # OCaml programs that are compiled in both bytecode and native code OCAML_PROGRAMS = ocamlc ocamlopt lex/ocamllex $(TOOLS_NAT_PROGRAMS) \ ocamldoc/ocamldoc ocamltest/ocamltest $(foreach PROGRAM, $(OCAML_PROGRAMS),\ $(eval $(call OCAML_PROGRAM,$(PROGRAM)))) # OCaml programs that are compiled only in bytecode # Note: the bytecode toplevel, ocaml, is a bytecode program but at the # moment it's a special one, because it needs to be expunged, so we # cannot declare it as we do for other bytecode-only programs. # We have to use dedicated rules to build it OCAML_BYTECODE_PROGRAMS = expunge \ $(TOOLS_BYT_PROGRAMS) \ $(addprefix tools/, cvt_emit make_opcodes ocamltex) \ $(OPTIONAL_BYTECODE_TOOLS) $(foreach PROGRAM, $(OCAML_BYTECODE_PROGRAMS),\ $(eval $(call OCAML_BYTECODE_PROGRAM,$(PROGRAM)))) # OCaml programs that are compiled only in native code OCAML_NATIVE_PROGRAMS = \ ocamlnat tools/lintapidiff.opt $(OPTIONAL_NATIVE_TOOLS) $(foreach PROGRAM, $(OCAML_NATIVE_PROGRAMS),\ $(eval $(call OCAML_NATIVE_PROGRAM,$(PROGRAM)))) # OCaml libraries that are compiled in both bytecode and native code # List of compilerlibs COMPILERLIBS = $(addprefix compilerlibs/, \ ocamlbytecomp \ ocamlcommon \ ocamlmiddleend \ ocamloptcomp \ ocamltoplevel) # Since the compiler libraries are necessarily compiled with boot/ocamlc, # make sure they *always are*, even when rebuilding a program compiled # with ./ocamlc (e.g. ocamltex) $(COMPILERLIBS:=.cma): \ CAMLC = $(BOOT_OCAMLC) $(BOOT_STDLIBFLAGS) -use-prims runtime/primitives # The following dependency ensures that the two versions of the # configuration module (the one for the bootstrap compiler and the # one for the compiler to be installed) are compiled. This is to make # sure these two versions remain in sync with each other compilerlibs/ocamlcommon.cma: $(ALL_CONFIG_CMO) OCAML_LIBRARIES = $(COMPILERLIBS) $(OPTIONAL_LIBRARIES) $(foreach LIBRARY, $(OCAML_LIBRARIES),\ $(eval $(call OCAML_LIBRARY,$(LIBRARY)))) # OCaml libraries that are compiled only in bytecode OCAML_BYTECODE_LIBRARIES = $(foreach LIBRARY, $(OCAML_BYTECODE_LIBRARIES),\ $(eval $(call OCAML_BYTECODE_LIBRARY,$(LIBRARY)))) # OCaml libraries that are compiled only in native code OCAML_NATIVE_LIBRARIES = $(foreach LIBRARY, $(OCAML_NATIVE_LIBRARIES),\ $(eval $(call OCAML_NATIVE_LIBRARY,$(LIBRARY)))) USE_RUNTIME_PRIMS = -use-prims ../runtime/primitives USE_STDLIB = -nostdlib -I ../stdlib FLEXDLL_OBJECTS = \ flexdll_$(FLEXDLL_CHAIN).$(O) flexdll_initer_$(FLEXDLL_CHAIN).$(O) FLEXLINK_BUILD_ENV = \ MSVCC_ROOT= \ MSVC_DETECT=0 OCAML_CONFIG_FILE=../Makefile.config \ CHAINS=$(FLEXDLL_CHAIN) ROOTDIR=.. FLEXDLL_SOURCES = \ $(addprefix $(FLEXDLL_SOURCE_DIR)/, flexdll.c flexdll_initer.c flexdll.h) \ $(wildcard $(FLEXDLL_SOURCE_DIR)/*.ml*) $(BYTE_BINDIR) $(OPT_BINDIR): $(MKDIR) $@ flexlink.byte$(EXE): $(FLEXDLL_SOURCES) rm -f $(FLEXDLL_SOURCE_DIR)/flexlink.exe $(MAKE) -C $(FLEXDLL_SOURCE_DIR) $(FLEXLINK_BUILD_ENV) \ OCAMLRUN='$$(ROOTDIR)/boot/ocamlrun$(EXE)' NATDYNLINK=false \ OCAMLOPT='$(value BOOT_OCAMLC) $(USE_RUNTIME_PRIMS) $(USE_STDLIB)' \ flexlink.exe support cp $(FLEXDLL_SOURCE_DIR)/flexlink.exe $@ partialclean:: rm -f flexlink.byte flexlink.byte.exe $(BYTE_BINDIR)/flexlink$(EXE): \ boot/ocamlrun$(EXE) flexlink.byte$(EXE) | $(BYTE_BINDIR) rm -f $@ # Start with a copy to ensure that the result is always executable cp boot/ocamlrun$(EXE) $@ cat flexlink.byte$(EXE) >> $@ cp $(addprefix $(FLEXDLL_SOURCE_DIR)/, $(FLEXDLL_OBJECTS)) $(BYTE_BINDIR) partialclean:: rm -f $(BYTE_BINDIR)/flexlink $(BYTE_BINDIR)/flexlink.exe ifeq "$(BOOTSTRAPPING_FLEXDLL)" "true" # The recipe for runtime/ocamlruns$(EXE) also produces runtime/primitives boot/ocamlrun$(EXE): runtime/ocamlruns$(EXE) $(foreach runtime, ocamlrun ocamlrund ocamlruni, \ $(eval runtime/$(runtime)$(EXE): | $(BYTE_BINDIR)/flexlink$(EXE))) tools/checkstack$(EXE): | $(BYTE_BINDIR)/flexlink$(EXE) else boot/ocamlrun$(EXE): runtime/ocamlrun$(EXE) runtime/primitives endif # $< refers to runtime/ocamlruns when bootstrapping flexlink and # runtime/ocamlrun otherwise (see above). boot/ocamlrun$(EXE): cp $< $@ # Start up the system from the distribution compiler .PHONY: coldstart coldstart: boot/ocamlrun$(EXE) runtime/libcamlrun.$(A) $(MAKE) -C stdlib OCAMLRUN='$$(ROOTDIR)/$<' USE_BOOT_OCAMLC=true all rm -f $(addprefix boot/, libcamlrun.$(A) $(LIBFILES)) cp $(addprefix stdlib/, $(LIBFILES)) boot cd boot; $(LN) ../runtime/libcamlrun.$(A) . # Recompile the core system using the bootstrap compiler .PHONY: coreall coreall: runtime $(MAKE) ocamlc $(MAKE) ocamllex ocamltools library # Build the core system: the minimum needed to make depend and bootstrap .PHONY: core core: coldstart $(MAKE) coreall # Check if fixpoint reached # We use tools/cmpbyt because it has better error reporting, but cmp could also # be used. CMPCMD ?= $(OCAMLRUN) tools/cmpbyt$(EXE) .PHONY: compare compare: # The core system has to be rebuilt after bootstrap anyway, so strip ocamlc # and ocamllex, which means the artefacts should be identical. mv ocamlc$(EXE) ocamlc.tmp $(OCAMLRUN) tools/stripdebug -all ocamlc.tmp ocamlc$(EXE) mv lex/ocamllex$(EXE) ocamllex.tmp $(OCAMLRUN) tools/stripdebug -all ocamllex.tmp lex/ocamllex$(EXE) rm -f ocamllex.tmp ocamlc.tmp @if $(CMPCMD) boot/ocamlc ocamlc$(EXE) \ && $(CMPCMD) boot/ocamllex lex/ocamllex$(EXE); \ then echo "Fixpoint reached, bootstrap succeeded."; \ else \ echo "Fixpoint not reached, try one more bootstrapping cycle."; \ exit 1; \ fi # Promote a compiler PROMOTE ?= cp .PHONY: promote-common promote-common: $(PROMOTE) ocamlc$(EXE) boot/ocamlc $(PROMOTE) lex/ocamllex$(EXE) boot/ocamllex cd stdlib; cp $(LIBFILES) ../boot # Promote the newly compiled system to the rank of cross compiler # (Runs on the old runtime, produces code for the new runtime) .PHONY: promote-cross promote-cross: promote-common # Promote the newly compiled system to the rank of bootstrap compiler # (Runs on the new runtime, produces code for the new runtime) .PHONY: promote promote: PROMOTE = $(OCAMLRUN) tools/stripdebug -all promote: promote-common rm -f boot/ocamlrun$(EXE) cp runtime/ocamlrun$(EXE) boot/ocamlrun$(EXE) # Compile the native-code compiler .PHONY: opt-core opt-core: runtimeopt $(MAKE) ocamlopt $(MAKE) libraryopt .PHONY: opt opt: checknative $(MAKE) runtimeopt $(MAKE) ocamlopt $(MAKE) libraryopt $(MAKE) otherlibrariesopt ocamltoolsopt # Native-code versions of the tools .PHONY: opt.opt opt.opt: checknative $(MAKE) checkstack $(MAKE) coreall $(MAKE) ocaml $(MAKE) opt-core ifeq "$(BOOTSTRAPPING_FLEXDLL)" "true" $(MAKE) flexlink.opt$(EXE) endif $(MAKE) ocamlc.opt # TODO: introduce OPTIONAL_LIBRARIES and OPTIONAL_TOOLS variables to be # computed at configure time to keep track of which tools and libraries # need to be built $(MAKE) otherlibraries $(WITH_DEBUGGER) $(OCAMLDOC_TARGET) \ $(OCAMLTEST_TARGET) $(MAKE) ocamlopt.opt $(MAKE) otherlibrariesopt $(MAKE) ocamllex.opt ocamltoolsopt ocamltoolsopt.opt \ $(OCAMLDOC_OPT_TARGET) \ $(OCAMLTEST_OPT_TARGET) othertools ocamlnat ifeq "$(build_libraries_manpages)" "true" $(MAKE) manpages endif # Core bootstrapping cycle .PHONY: coreboot ifeq "$(FLAT_FLOAT_ARRAY)" "true" coreboot: # Promote the new compiler but keep the old runtime # This compiler runs on boot/ocamlrun and produces bytecode for # runtime/ocamlrun $(MAKE) promote-cross # Rebuild ocamlc and ocamllex (run on runtime/ocamlrun) # utils/config.ml will have the fixed bootstrap configuration $(MAKE) partialclean $(MAKE) IN_COREBOOT_CYCLE=true ocamlc ocamllex ocamltools # Rebuild the library (using runtime/ocamlrun ./ocamlc) $(MAKE) library-cross # Promote the new compiler and the new runtime $(MAKE) OCAMLRUN=runtime/ocamlrun$(EXE) promote # Rebuild the core system # utils/config.ml must still have the fixed bootstrap configuration $(MAKE) partialclean $(MAKE) IN_COREBOOT_CYCLE=true core # Check if fixpoint reached $(MAKE) compare else coreboot: $(error Cannot bootstrap when configured with \ --disable-flat-float-array) endif # Recompile the system using the bootstrap compiler .PHONY: all all: coreall $(MAKE) ocaml $(MAKE) otherlibraries $(WITH_DEBUGGER) $(OCAMLDOC_TARGET) \ $(OCAMLTEST_TARGET) $(MAKE) othertools ifeq "$(build_libraries_manpages)" "true" $(MAKE) manpages endif # Bootstrap and rebuild the whole system. # The compilation of ocaml will fail if the runtime has changed. # Never mind, just do make bootstrap to reach fixpoint again. .PHONY: bootstrap bootstrap: coreboot # utils/config.ml must be restored to config.status's configuration # lex/ocamllex$(EXE) was stripped in order to compare it rm -f utils/config.ml lex/ocamllex$(EXE) $(MAKE) all # Compile everything the first time .PHONY: world world: coldstart $(MAKE) all # Compile also native code compiler and libraries, fast .PHONY: world.opt world.opt: checknative $(MAKE) coldstart $(MAKE) opt.opt # FlexDLL sources missing error messages # Different git mechanism displayed depending on whether this source tree came # from a git clone or a source tarball. .PHONY: flexdll flexlink flexlink.opt ifeq "$(BOOTSTRAPPING_FLEXDLL)" "true" .PHONY: flexdll flexdll: flexdll/Makefile @echo WARNING! make flexdll is no longer required @echo This target will be removed in a future release. .PHONY: flexlink flexlink: @echo Bootstrapping just flexlink.exe is no longer supported @echo Bootstrapping FlexDLL is now enabled with @echo ./configure --with-flexdll @false ifeq "$(wildcard ocamlopt.opt$(EXE))" "" FLEXLINK_OCAMLOPT=../runtime/ocamlrun$(EXE) ../ocamlopt$(EXE) else FLEXLINK_OCAMLOPT=../ocamlopt.opt$(EXE) endif flexlink.opt$(EXE): \ $(FLEXDLL_SOURCES) | $(BYTE_BINDIR)/flexlink$(EXE) $(OPT_BINDIR) rm -f $(FLEXDLL_SOURCE_DIR)/flexlink.exe $(MAKE) -C $(FLEXDLL_SOURCE_DIR) $(FLEXLINK_BUILD_ENV) \ OCAMLOPT='$(FLEXLINK_OCAMLOPT) -nostdlib -I ../stdlib' flexlink.exe cp $(FLEXDLL_SOURCE_DIR)/flexlink.exe $@ rm -f $(OPT_BINDIR)/flexlink$(EXE) cd $(OPT_BINDIR); $(LN) $(call ROOT_FROM, $(OPT_BINDIR))/$@ flexlink$(EXE) cp $(addprefix $(BYTE_BINDIR)/, $(FLEXDLL_OBJECTS)) $(OPT_BINDIR) partialclean:: rm -f flexlink.opt$(EXE) $(OPT_BINDIR)/flexlink$(EXE) else flexdll flexlink flexlink.opt: @echo It is no longer necessary to bootstrap FlexDLL with a separate @echo make invocation. Simply place the sources for FlexDLL in a @echo sub-directory. @echo This can either be done by downloading a source tarball from @echo \ https://github.com/ocaml/flexdll/releases @if [ -d .git ]; then \ echo or by checking out the flexdll submodule with; \ echo \ git submodule update --init; \ else \ echo or by cloning the git repository; \ echo \ git clone https://github.com/ocaml/flexdll.git; \ fi @echo "Then pass --with-flexdll=<dir> to configure and build as normal." @false endif # ifeq "$(BOOTSTRAPPING_FLEXDLL)" "true" INSTALL_COMPLIBDIR = $(DESTDIR)$(COMPLIBDIR) INSTALL_FLEXDLLDIR = $(INSTALL_LIBDIR)/flexdll FLEXDLL_MANIFEST = default_$(ARCH).manifest DOC_FILES=\ Changes \ README.adoc \ README.win32.adoc \ LICENSE # Run all tests .PHONY: tests tests: $(MAKE) -C testsuite all # Make clean in the test suite .PHONY: clean clean:: $(MAKE) -C testsuite clean # Build the manual latex files from the etex source files # (see manual/README.md) .PHONY: manual-pregen manual-pregen: opt.opt cd manual; $(MAKE) clean && $(MAKE) pregen-etex clean:: $(MAKE) -C manual clean # The clean target clean:: partialclean rm -f configure~ rm -f $(C_PROGRAMS) $(C_PROGRAMS:=.exe) rm -f $(OCAML_PROGRAMS) $(OCAML_PROGRAMS:=.exe) rm -f $(OCAML_PROGRAMS:=.opt) $(OCAML_PROGRAMS:=.opt.exe) rm -f $(OCAML_BYTECODE_PROGRAMS) $(OCAML_BYTECODE_PROGRAMS:=.exe) rm -f $(OCAML_NATIVE_PROGRAMS) $(OCAML_NATIVE_PROGRAMS:=.exe) # The bytecode compiler ocamlc_LIBRARIES = $(addprefix compilerlibs/,ocamlcommon ocamlbytecomp) ocamlc_SOURCES = driver/main.mli driver/main.ml ocamlc$(EXE): OC_BYTECODE_LINKFLAGS += -compat-32 -g partialclean:: rm -f ocamlc ocamlc.exe ocamlc.opt ocamlc.opt.exe # The native-code compiler ocamlopt_LIBRARIES = $(addprefix compilerlibs/,ocamlcommon ocamloptcomp) ocamlopt_SOURCES = driver/optmain.mli driver/optmain.ml ocamlopt$(EXE): OC_BYTECODE_LINKFLAGS += -g partialclean:: rm -f ocamlopt ocamlopt.exe ocamlopt.opt ocamlopt.opt.exe # The toplevel # At the moment, the toplevel can't be built with the general build macros # because its build involves calling expunge. We thus give its build # rules explicitly until the day expunge can hopefully be removed. ocaml_LIBRARIES = \ $(addprefix compilerlibs/,ocamlcommon ocamlbytecomp ocamltoplevel) ocaml_CMA_FILES = $(ocaml_LIBRARIES:=.cma) ocaml_SOURCES = toplevel/topstart.mli toplevel/topstart.ml ocaml_CMO_FILES = toplevel/topstart.cmo .INTERMEDIATE: ocaml.tmp ocaml.tmp: OC_BYTECODE_LINKFLAGS += -I toplevel/byte -linkall -g ocaml.tmp: $(ocaml_CMA_FILES) $(ocaml_CMO_FILES) $(V_LINKC)$(LINK_BYTECODE_PROGRAM) -o $@ $^ $(eval $(call PROGRAM_SYNONYM,ocaml)) ocaml$(EXE): $(expunge) ocaml.tmp - $(V_GEN)$(OCAMLRUN) $^ $@ $(PERVASIVES) partialclean:: rm -f ocaml ocaml.exe # Use TOPFLAGS to pass additional flags to the bytecode or native toplevel # when running make runtop or make natruntop TOPFLAGS ?= OC_TOPFLAGS = $(STDLIBFLAGS) -I toplevel -noinit $(TOPINCLUDES) $(TOPFLAGS) RUN_OCAML = $(RLWRAP) $(OCAMLRUN) ./ocaml$(EXE) $(OC_TOPFLAGS) RUN_OCAMLNAT = $(RLWRAP) ./ocamlnat$(EXE) $(OC_TOPFLAGS) # Note: Beware that, since these rules begin with a coldstart, both # boot/ocamlrun and runtime/ocamlrun will be the same when the toplevel # is run. .PHONY: runtop runtop: coldstart $(MAKE) ocamlc $(MAKE) ocaml @$(RUN_OCAML) .PHONY: runtop-with-otherlibs runtop-with-otherlibs: coldstart $(MAKE) ocamlc $(MAKE) otherlibraries $(MAKE) ocaml @$(RUN_OCAML) .PHONY: natruntop natruntop: $(MAKE) core $(MAKE) opt $(MAKE) ocamlnat @$(RUN_OCAMLNAT) # Native dynlink otherlibs/dynlink/dynlink.cmxa: otherlibs/dynlink/native/dynlink.ml $(MAKE) -C otherlibs/dynlink allopt # Cleanup the lexer partialclean:: rm -f parsing/lexer.ml beforedepend:: parsing/lexer.ml # The predefined exceptions and primitives lambda/runtimedef.ml: lambda/generate_runtimedef.sh runtime/caml/fail.h \ runtime/primitives $(V_GEN)$^ > $@ partialclean:: rm -f lambda/runtimedef.ml beforedepend:: lambda/runtimedef.ml # Choose the right machine-dependent files asmcomp/arch.mli: asmcomp/$(ARCH)/arch.mli cd asmcomp; $(LN) $(ARCH)/arch.mli . asmcomp/arch.ml: asmcomp/$(ARCH)/arch.ml cd asmcomp; $(LN) $(ARCH)/arch.ml . asmcomp/proc.ml: asmcomp/$(ARCH)/proc.ml cd asmcomp; $(LN) $(ARCH)/proc.ml . asmcomp/selection.ml: asmcomp/$(ARCH)/selection.ml cd asmcomp; $(LN) $(ARCH)/selection.ml . asmcomp/CSE.ml: asmcomp/$(ARCH)/CSE.ml cd asmcomp; $(LN) $(ARCH)/CSE.ml . asmcomp/reload.ml: asmcomp/$(ARCH)/reload.ml cd asmcomp; $(LN) $(ARCH)/reload.ml . asmcomp/scheduling.ml: asmcomp/$(ARCH)/scheduling.ml cd asmcomp; $(LN) $(ARCH)/scheduling.ml . asmcomp/stackframe.ml: asmcomp/$(ARCH)/stackframe.ml cd asmcomp; $(LN) $(ARCH)/stackframe.ml . # Preprocess the code emitters cvt_emit = tools/cvt_emit$(EXE) beforedepend:: tools/cvt_emit.ml asmcomp/emit.ml: asmcomp/$(ARCH)/emit.mlp $(cvt_emit) $(V_GEN)echo \# 1 \"asmcomp/$(ARCH)/emit.mlp\" > $@ && \ $(OCAMLRUN) $(cvt_emit) < $< >> $@ \ || { rm -f $@; exit 2; } partialclean:: rm -f asmcomp/emit.ml tools/cvt_emit.ml beforedepend:: asmcomp/emit.ml cvt_emit_LIBRARIES = cvt_emit_SOURCES = tools/cvt_emit.mli tools/cvt_emit.mll # The "expunge" utility expunge_LIBRARIES = $(addprefix compilerlibs/,ocamlcommon ocamlbytecomp) expunge_SOURCES = toplevel/expunge.mli toplevel/expunge.ml partialclean:: rm -f expunge expunge.exe # The runtime system ## Lists of source files runtime_COMMON_C_SOURCES = \ addrmap \ afl \ alloc \ array \ backtrace \ bigarray \ blake2 \ callback \ codefrag \ compare \ custom \ debugger \ domain \ dynlink \ extern \ fiber \ finalise \ floats \ gc_ctrl \ gc_stats \ globroots \ hash \ intern \ ints \ io \ lexing \ lf_skiplist \ main \ major_gc \ md5 \ memory \ memprof \ meta \ minor_gc \ misc \ obj \ parsing \ platform \ printexc \ prng \ roots \ runtime_events \ shared_heap \ signals \ skiplist \ startup_aux \ str \ sync \ sys \ $(TSAN_NATIVE_RUNTIME_C_SOURCES) \ $(UNIX_OR_WIN32) \ weak runtime_BYTECODE_ONLY_C_SOURCES = \ backtrace_byt \ fail_byt \ fix_code \ interp \ startup_byt \ zstd runtime_BYTECODE_C_SOURCES = \ $(runtime_COMMON_C_SOURCES:%=runtime/%.c) \ $(runtime_BYTECODE_ONLY_C_SOURCES:%=runtime/%.c) runtime_NATIVE_ONLY_C_SOURCES = \ backtrace_nat \ clambda_checks \ dynlink_nat \ fail_nat \ frame_descriptors \ startup_nat \ signals_nat runtime_NATIVE_C_SOURCES = \ $(runtime_COMMON_C_SOURCES:%=runtime/%.c) \ $(runtime_NATIVE_ONLY_C_SOURCES:%=runtime/%.c) ## Header files generated by configure runtime_CONFIGURED_HEADERS = \ $(addprefix runtime/caml/, exec.h m.h s.h version.h) ## Header files generated by make runtime_BUILT_HEADERS = $(addprefix runtime/, \ caml/opnames.h caml/jumptbl.h build_config.h) ## Targets to build and install runtime_PROGRAMS = runtime/ocamlrun$(EXE) runtime_BYTECODE_STATIC_LIBRARIES = $(addprefix runtime/, \ ld.conf libcamlrun.$(A)) runtime_BYTECODE_SHARED_LIBRARIES = runtime_NATIVE_STATIC_LIBRARIES = \ runtime/libasmrun.$(A) runtime/libcomprmarsh.$(A) runtime_NATIVE_SHARED_LIBRARIES = ifeq "$(RUNTIMED)" "true" runtime_PROGRAMS += runtime/ocamlrund$(EXE) runtime_BYTECODE_STATIC_LIBRARIES += runtime/libcamlrund.$(A) runtime_NATIVE_STATIC_LIBRARIES += runtime/libasmrund.$(A) endif ifeq "$(INSTRUMENTED_RUNTIME)" "true" runtime_PROGRAMS += runtime/ocamlruni$(EXE) runtime_BYTECODE_STATIC_LIBRARIES += runtime/libcamlruni.$(A) runtime_NATIVE_STATIC_LIBRARIES += runtime/libasmruni.$(A) endif ifeq "$(UNIX_OR_WIN32)" "unix" ifeq "$(SUPPORTS_SHARED_LIBRARIES)" "true" runtime_BYTECODE_STATIC_LIBRARIES += runtime/libcamlrun_pic.$(A) runtime_BYTECODE_SHARED_LIBRARIES += runtime/libcamlrun_shared.$(SO) runtime_NATIVE_STATIC_LIBRARIES += runtime/libasmrun_pic.$(A) runtime_NATIVE_SHARED_LIBRARIES += runtime/libasmrun_shared.$(SO) endif endif ## List of object files for each target libcamlrun_OBJECTS = $(runtime_BYTECODE_C_SOURCES:.c=.b.$(O)) libcamlrun_non_shared_OBJECTS = \ $(subst $(UNIX_OR_WIN32).b.$(O),$(UNIX_OR_WIN32)_non_shared.b.$(O), \ $(libcamlrun_OBJECTS)) libcamlrund_OBJECTS = $(runtime_BYTECODE_C_SOURCES:.c=.bd.$(O)) \ runtime/instrtrace.bd.$(O) libcamlruni_OBJECTS = $(runtime_BYTECODE_C_SOURCES:.c=.bi.$(O)) libcamlrunpic_OBJECTS = $(runtime_BYTECODE_C_SOURCES:.c=.bpic.$(O)) libasmrun_OBJECTS = \ $(runtime_NATIVE_C_SOURCES:.c=.n.$(O)) $(runtime_ASM_OBJECTS) libasmrund_OBJECTS = \ $(runtime_NATIVE_C_SOURCES:.c=.nd.$(O)) $(runtime_ASM_OBJECTS:.$(O)=.d.$(O)) libasmruni_OBJECTS = \ $(runtime_NATIVE_C_SOURCES:.c=.ni.$(O)) $(runtime_ASM_OBJECTS:.$(O)=.i.$(O)) libasmrunpic_OBJECTS = $(runtime_NATIVE_C_SOURCES:.c=.npic.$(O)) \ $(runtime_ASM_OBJECTS:.$(O)=_libasmrunpic.$(O)) libcomprmarsh_OBJECTS = runtime/zstd.npic.$(O) ## General (non target-specific) assembler and compiler flags runtime_CPPFLAGS = -DCAMLDLLIMPORT= -DIN_CAML_RUNTIME ocamlrund_CPPFLAGS = -DDEBUG ocamlruni_CPPFLAGS = -DCAML_INSTR ## Runtime targets .PHONY: runtime-all runtime-all: \ $(runtime_BYTECODE_STATIC_LIBRARIES) $(runtime_BYTECODE_SHARED_LIBRARIES) \ $(runtime_PROGRAMS) $(SAK) .PHONY: runtime-allopt ifeq "$(NATIVE_COMPILER)" "true" runtime-allopt: \ $(runtime_NATIVE_STATIC_LIBRARIES) $(runtime_NATIVE_SHARED_LIBRARIES) else runtime-allopt: $(error The build has been configured with --disable-native-compiler) endif ## Generated non-object files runtime/ld.conf: $(ROOTDIR)/Makefile.config $(V_GEN)echo "$(STUBLIBDIR)" > $@ && \ echo "$(LIBDIR)" >> $@ runtime/primitives: runtime/gen_primitives.sh $(runtime_BYTECODE_C_SOURCES) $(V_GEN)runtime/gen_primitives.sh $@ $(runtime_BYTECODE_C_SOURCES) runtime/prims.c: runtime/gen_primsc.sh runtime/primitives $(V_GEN)runtime/gen_primsc.sh \ runtime/primitives $(runtime_BYTECODE_C_SOURCES) \ > $@ runtime/caml/opnames.h : runtime/caml/instruct.h $(V_GEN)tr -d '\r' < $< | \ sed -e '/\/\*/d' \ -e '/^#/d' \ -e 's/enum /static char * names_of_/' \ -e 's/{$$/[] = {/' \ -e 's/\([[:upper:]][[:upper:]_0-9]*\)/"\1"/g' > $@ # runtime/caml/jumptbl.h is required only if you have GCC 2.0 or later runtime/caml/jumptbl.h : runtime/caml/instruct.h $(V_GEN)tr -d '\r' < $< | \ sed -n -e '/^ /s/ \([A-Z]\)/ \&\&lbl_\1/gp' \ -e '/^}/q' > $@ # These are provided as a temporary shim to allow cross-compilation systems # to supply a host C compiler and different flags and a linking macro. SAK_CC ?= $(CC) SAK_CFLAGS ?= $(OC_CFLAGS) $(CFLAGS) $(OC_CPPFLAGS) $(CPPFLAGS) SAK_LINK ?= $(MKEXE_VIA_CC) $(SAK): runtime/sak.$(O) $(V_MKEXE)$(call SAK_LINK,$@,$^) runtime/sak.$(O): runtime/sak.c runtime/caml/misc.h runtime/caml/config.h $(V_CC)$(SAK_CC) -c $(SAK_CFLAGS) $(OUTPUTOBJ)$@ $< C_LITERAL = $(shell $(SAK) encode-C-literal '$(1)') runtime/build_config.h: $(ROOTDIR)/Makefile.config $(SAK) $(V_GEN)echo '/* This file is generated from $(ROOTDIR)/Makefile.config */' > $@ && \ echo '#define OCAML_STDLIB_DIR $(call C_LITERAL,$(LIBDIR))' >> $@ && \ echo '#define HOST "$(HOST)"' >> $@ ## Runtime libraries and programs runtime/ocamlrun$(EXE): runtime/prims.$(O) runtime/libcamlrun.$(A) $(V_MKEXE)$(MKEXE) -o $@ $^ $(BYTECCLIBS) runtime/ocamlruns$(EXE): runtime/prims.$(O) runtime/libcamlrun_non_shared.$(A) $(V_MKEXE)$(call MKEXE_VIA_CC,$@,$^ $(BYTECCLIBS)) runtime/libcamlrun.$(A): $(libcamlrun_OBJECTS) $(V_MKLIB)$(call MKLIB,$@, $^) runtime/libcamlrun_non_shared.$(A): $(libcamlrun_non_shared_OBJECTS) $(V_MKLIB)$(call MKLIB,$@, $^) runtime/ocamlrund$(EXE): runtime/prims.$(O) runtime/libcamlrund.$(A) $(V_MKEXE)$(MKEXE) $(MKEXEDEBUGFLAG) -o $@ $^ $(BYTECCLIBS) runtime/libcamlrund.$(A): $(libcamlrund_OBJECTS) $(V_MKLIB)$(call MKLIB,$@, $^) runtime/ocamlruni$(EXE): runtime/prims.$(O) runtime/libcamlruni.$(A) $(V_MKEXE)$(MKEXE) -o $@ $^ $(INSTRUMENTED_RUNTIME_LIBS) $(BYTECCLIBS) runtime/libcamlruni.$(A): $(libcamlruni_OBJECTS) $(V_MKLIB)$(call MKLIB,$@, $^) runtime/libcamlrun_pic.$(A): $(libcamlrunpic_OBJECTS) $(V_MKLIB)$(call MKLIB,$@, $^) runtime/libcamlrun_shared.$(SO): $(libcamlrunpic_OBJECTS) $(V_MKDLL)$(MKDLL) -o $@ $^ $(BYTECCLIBS) runtime/libasmrun.$(A): $(libasmrun_OBJECTS) $(V_MKLIB)$(call MKLIB,$@, $^) runtime/libasmrund.$(A): $(libasmrund_OBJECTS) $(V_MKLIB)$(call MKLIB,$@, $^) runtime/libasmruni.$(A): $(libasmruni_OBJECTS) $(V_MKLIB)$(call MKLIB,$@, $^) runtime/libasmrun_pic.$(A): $(libasmrunpic_OBJECTS) $(V_MKLIB)$(call MKLIB,$@, $^) runtime/libasmrun_shared.$(SO): $(libasmrunpic_OBJECTS) $(V_MKDLL)$(MKDLL) -o $@ $^ $(NATIVECCLIBS) runtime/libcomprmarsh.$(A): $(libcomprmarsh_OBJECTS) $(V_MKLIB)$(call MKLIB,$@, $^) ## Runtime target-specific preprocessor and compiler flags runtime/%.$(O): OC_CPPFLAGS += $(runtime_CPPFLAGS) $(DEPDIR)/runtime/%.$(D): OC_CPPFLAGS += $(runtime_CPPFLAGS) runtime/%.bd.$(O): OC_CPPFLAGS += $(ocamlrund_CPPFLAGS) $(DEPDIR)/runtime/%.bd.$(D): OC_CPPFLAGS += $(ocamlrund_CPPFLAGS) runtime/%.bi.$(O): OC_CPPFLAGS += $(ocamlruni_CPPFLAGS) $(DEPDIR)/runtime/%.bi.$(D): OC_CPPFLAGS += $(ocamlruni_CPPFLAGS) runtime/%.bpic.$(O): OC_CFLAGS += $(SHAREDLIB_CFLAGS) runtime/%.n.$(O): OC_CFLAGS += $(OC_NATIVE_CFLAGS) runtime/%.n.$(O): OC_CPPFLAGS += $(OC_NATIVE_CPPFLAGS) $(DEPDIR)/runtime/%.n.$(D): OC_CPPFLAGS += $(OC_NATIVE_CPPFLAGS) runtime/%.nd.$(O): OC_CFLAGS += $(OC_NATIVE_CFLAGS) runtime/%.nd.$(O): OC_CPPFLAGS += $(OC_NATIVE_CPPFLAGS) $(ocamlrund_CPPFLAGS) $(DEPDIR)/runtime/%.nd.$(D): \ OC_CPPFLAGS += $(OC_NATIVE_CPPFLAGS) $(ocamlrund_CPPFLAGS) runtime/%.ni.$(O): OC_CFLAGS += $(OC_NATIVE_CFLAGS) runtime/%.ni.$(O): OC_CPPFLAGS += $(OC_NATIVE_CPPFLAGS) $(ocamlruni_CPPFLAGS) $(DEPDIR)/runtime/%.ni.$(D): \ OC_CPPFLAGS += $(OC_NATIVE_CPPFLAGS) $(ocamlruni_CPPFLAGS) runtime/%.npic.$(O): OC_CFLAGS += $(OC_NATIVE_CFLAGS) $(SHAREDLIB_CFLAGS) runtime/%.npic.$(O): OC_CPPFLAGS += $(OC_NATIVE_CPPFLAGS) $(DEPDIR)/runtime/%.npic.$(D): OC_CPPFLAGS += $(OC_NATIVE_CPPFLAGS) ## Compilation of runtime C files # The COMPILE_C_FILE macro below receives as argument the pattern # that corresponds to the name of the generated object file # (without the extension, which is added by the macro) define COMPILE_C_FILE ifeq "$(COMPUTE_DEPS)" "true" ifneq "$(1)" "%" # -MG would ensure that the dependencies are generated even if the files listed # in $$(runtime_BUILT_HEADERS) haven't been assembled yet. However, # this goes subtly wrong if the user has the headers installed, # as gcc will pick up a dependency on those instead and the local # ones will not be generated. For this reason, we don't use -MG and # instead include $(runtime_BUILT_HEADERS) in the order only dependencies # to ensure that they exist before dependencies are computed. $(DEPDIR)/$(1).$(D): runtime/%.c | $(DEPDIR)/runtime $(runtime_BUILT_HEADERS) $$(V_CCDEPS)$$(DEP_CC) $$(OC_CPPFLAGS) $$(CPPFLAGS) $$< -MT \ 'runtime/$$*$(subst runtime/%,,$(1)).$(O)' -MF $$@ endif # ifneq "$(1)" "%" $(1).$(O): $(2).c else $(1).$(O): $(2).c \ $(runtime_CONFIGURED_HEADERS) $(runtime_BUILT_HEADERS) \ $(RUNTIME_HEADERS) endif # ifeq "$(COMPUTE_DEPS)" "true" $$(V_CC)$$(CC) -c $$(OC_CFLAGS) $$(CFLAGS) $$(OC_CPPFLAGS) $$(CPPFLAGS) \ $$(OUTPUTOBJ)$$@ $$< endef $(DEPDIR)/runtime: $(MKDIR) $@ runtime_OBJECT_TYPES = % %.b %.bd %.bi %.bpic ifeq "$(NATIVE_COMPILER)" "true" runtime_OBJECT_TYPES += %.n %.nd %.ni %.np %.npic endif $(foreach runtime_OBJECT_TYPE, $(runtime_OBJECT_TYPES), \ $(eval $(call COMPILE_C_FILE,runtime/$(runtime_OBJECT_TYPE),runtime/%))) runtime/$(UNIX_OR_WIN32)_non_shared.%.$(O): \ OC_CPPFLAGS += -DBUILDING_LIBCAMLRUNS $(eval $(call COMPILE_C_FILE,runtime/$(UNIX_OR_WIN32)_non_shared.%, \ runtime/$(UNIX_OR_WIN32))) $(foreach runtime_OBJECT_TYPE,$(subst %,,$(runtime_OBJECT_TYPES)), \ $(eval \ runtime/dynlink$(runtime_OBJECT_TYPE).$(O): $(ROOTDIR)/Makefile.config)) ## Compilation of runtime assembly files ASPP_ERROR = \ { echo "If your assembler produced syntax errors, it is probably";\ echo "unhappy with the preprocessor. Check your assembler, or";\ echo "try producing $*.o by hand.";\ exit 2; } runtime/%.o: runtime/%.S $(V_ASM)$(ASPP) $(OC_ASPPFLAGS) -o $@ $< || $(ASPP_ERROR) runtime/%.d.o: runtime/%.S $(V_ASM)$(ASPP) $(OC_ASPPFLAGS) $(ocamlrund_CPPFLAGS) -o $@ $< || $(ASPP_ERROR) runtime/%.i.o: runtime/%.S $(V_ASM)$(ASPP) $(OC_ASPPFLAGS) $(ocamlruni_CPPFLAGS) -o $@ $< || $(ASPP_ERROR) runtime/%_libasmrunpic.o: runtime/%.S $(V_ASM)$(ASPP) $(OC_ASPPFLAGS) $(SHAREDLIB_CFLAGS) -o $@ $< runtime/domain_state.inc: runtime/caml/domain_state.tbl $(V_GEN)$(CPP) $< > $@ runtime/amd64nt.obj: runtime/amd64nt.asm runtime/domain_state.inc $(V_ASM)$(ASM)$@ $< runtime/amd64nt.d.obj: runtime/amd64nt.asm runtime/domain_state.inc $(V_ASM)$(ASM)$@ $(ocamlrund_CPPFLAGS) $< runtime/amd64nt.i.obj: runtime/amd64nt.asm runtime/domain_state.inc $(V_ASM)$(ASM)$@ $(ocamlruni_CPPFLAGS) $< runtime/%_libasmrunpic.obj: runtime/%.asm $(V_ASM)$(ASM)$@ $< ## Runtime dependencies runtime_DEP_FILES := $(addsuffix .b, \ $(basename $(runtime_BYTECODE_C_SOURCES) runtime/instrtrace)) ifeq "$(NATIVE_COMPILER)" "true" runtime_DEP_FILES += $(addsuffix .n, $(basename $(runtime_NATIVE_C_SOURCES))) endif runtime_DEP_FILES += $(addsuffix d, $(runtime_DEP_FILES)) \ $(addsuffix i, $(runtime_DEP_FILES)) \ $(addsuffix pic, $(runtime_DEP_FILES)) runtime_DEP_FILES := $(addsuffix .$(D), $(runtime_DEP_FILES)) ifeq "$(COMPUTE_DEPS)" "true" include $(addprefix $(DEPDIR)/, $(runtime_DEP_FILES)) endif .PHONY: runtime runtime: stdlib/libcamlrun.$(A) .PHONY: makeruntime makeruntime: runtime-all stdlib/libcamlrun.$(A): runtime-all cd stdlib; $(LN) ../runtime/libcamlrun.$(A) . clean:: rm -f $(addprefix runtime/, *.o *.obj *.a *.lib *.so *.dll ld.conf) rm -f $(addprefix runtime/, ocamlrun ocamlrund ocamlruni ocamlruns sak) rm -f $(addprefix runtime/, \ ocamlrun.exe ocamlrund.exe ocamlruni.exe ocamlruns.exe sak.exe) rm -f runtime/primitives runtime/primitives*.new runtime/prims.c \ $(runtime_BUILT_HEADERS) rm -f runtime/domain_state.inc rm -rf $(DEPDIR) rm -f stdlib/libcamlrun.a stdlib/libcamlrun.lib .PHONY: runtimeopt runtimeopt: stdlib/libasmrun.$(A) .PHONY: makeruntimeopt makeruntimeopt: runtime-allopt stdlib/libasmrun.$(A): runtime-allopt cd stdlib; $(LN) ../runtime/libasmrun.$(A) . stdlib/libcomprmarsh.$(A): runtime/libcomprmarsh.$(A) cd stdlib; $(LN) ../runtime/libcomprmarsh.$(A) . clean:: rm -f stdlib/libasmrun.a stdlib/libasmrun.lib rm -f stdlib/libcomprmarsh.a stdlib/libcomprmarsh.lib # Dependencies subdirs = stdlib $(addprefix otherlibs/, $(ALL_OTHERLIBS)) .PHONY: alldepend alldepend: depend for dir in $(subdirs); do \ $(MAKE) -C $$dir depend || exit; \ done # The standard library .PHONY: library library: ocamlc $(MAKE) -C stdlib all .PHONY: library-cross library-cross: $(MAKE) -C stdlib OCAMLRUN=../runtime/ocamlrun$(EXE) all .PHONY: libraryopt libraryopt: $(MAKE) -C stdlib allopt partialclean:: $(MAKE) -C stdlib clean # The lexer generator ocamllex_LIBRARIES = ocamllex_SOURCES = $(addprefix lex/,\ cset.mli cset.ml \ syntax.mli syntax.ml \ parser.mly \ lexer.mli lexer.mll \ table.mli table.ml \ l