ocaml
Version:
OCaml compiler packaged for esy
330 lines (272 loc) • 11.8 kB
Plain Text
#**************************************************************************
#* *
#* OCaml *
#* *
#* Xavier Leroy, projet Cristal, INRIA Rocquencourt *
#* Mark Shinwell, Jane Street Europe *
#* *
#* Copyright 1999 Institut National de Recherche en Informatique et *
#* en Automatique. *
#* Copyright 2018--2019 Jane Street Group LLC *
#* *
#* 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. *
#* *
#**************************************************************************
# Makefile for the dynamic link library
# FIXME reduce redundancy by including ../Makefile
ROOTDIR = ../..
include $(ROOTDIR)/Makefile.common
include $(ROOTDIR)/Makefile.best_binaries
OCAMLC=$(BEST_OCAMLC) $(STDLIBFLAGS) -g
OCAMLOPT=$(BEST_OCAMLOPT) $(STDLIBFLAGS) -g
# COMPFLAGS should be in sync with the toplevel Makefile's COMPFLAGS.
COMPFLAGS=-strict-sequence -principal -absname \
-w +a-4-9-40-41-42-44-45-48 -warn-error +A \
-bin-annot -strict-formats
ifeq "$(FLAMBDA)" "true"
OPTCOMPFLAGS += -O3
endif
%.cmo: COMPFLAGS += -I byte
%.cmi: COMPFLAGS += -I byte
OPTCOMPFLAGS += -I native
LOCAL_SRC=dynlink_compilerlibs
OBJS=byte/dynlink_compilerlibs.cmo dynlink_types.cmo \
dynlink_platform_intf.cmo dynlink_common.cmo byte/dynlink.cmo
NATOBJS=native/dynlink_compilerlibs.cmx dynlink_types.cmx \
dynlink_platform_intf.cmx dynlink_common.cmx native/dynlink.cmx
# We need/desire access to compilerlibs for various reasons:
# - The bytecode dynamic linker is in compilerlibs and has many dependencies
# from there.
# - It stops duplication of code (e.g. magic numbers from [Config]).
# - It allows future improvement by re-using various types.
# We have to pack our own version of compilerlibs (even if compilerlibs
# becomes packed in the future by default) otherwise problems will be caused
# if a user tries to link dynlink.cm{x,}a with code either having modules
# of the same names or code that is already linked against compilerlibs.
#
# The modules needed from compilerlibs have to be recompiled so that the
# -for-pack option can be specified. Packing without such option having been
# specified, as used to be performed in this Makefile, is currently permitted
# for bytecode (but may be disallowed in the future) but not native.
# .mli files from compilerlibs that don't have a corresponding .ml file.
COMPILERLIBS_INTFS=\
parsing/asttypes.mli \
parsing/parsetree.mli \
typing/outcometree.mli \
typing/value_rec_types.mli \
file_formats/cmo_format.mli \
file_formats/cmxs_format.mli
# .ml files from compilerlibs that have corresponding .mli files.
COMPILERLIBS_SOURCES=\
utils/binutils.ml \
utils/config.ml \
utils/build_path_prefix_map.ml \
utils/misc.ml \
utils/identifiable.ml \
utils/numbers.ml \
utils/arg_helper.ml \
utils/local_store.ml \
utils/load_path.ml \
utils/clflags.ml \
utils/profile.ml \
utils/consistbl.ml \
utils/terminfo.ml \
utils/warnings.ml \
utils/int_replace_polymorphic_compare.ml \
utils/lazy_backtrack.ml \
utils/compression.ml \
parsing/location.ml \
parsing/unit_info.ml \
parsing/longident.ml \
parsing/docstrings.ml \
parsing/syntaxerr.ml \
parsing/ast_helper.ml \
parsing/ast_iterator.ml \
parsing/builtin_attributes.ml \
parsing/ast_mapper.ml \
parsing/camlinternalMenhirLib.ml \
parsing/parser.ml \
parsing/lexer.ml \
parsing/attr_helper.ml \
typing/ident.ml \
typing/path.ml \
typing/primitive.ml \
typing/type_immediacy.ml \
typing/shape.ml \
typing/types.ml \
typing/btype.ml \
typing/subst.ml \
typing/predef.ml \
typing/datarepr.ml \
file_formats/cmi_format.ml \
typing/persistent_env.ml \
typing/env.ml \
typing/shape_reduce.ml \
typing/typedtree.ml \
lambda/debuginfo.ml \
lambda/lambda.ml \
lambda/runtimedef.ml \
bytecomp/instruct.ml \
bytecomp/opcodes.ml \
bytecomp/bytesections.ml \
bytecomp/dll.ml \
bytecomp/meta.ml \
bytecomp/symtable.ml
# For the native-code version of this library, we need much fewer modules
MINI_COMPILERLIBS_INTFS=\
file_formats/cmxs_format.mli
MINI_COMPILERLIBS_SOURCES=\
utils/binutils.ml \
utils/config.ml \
utils/build_path_prefix_map.ml \
utils/misc.ml
# Rules to make a local copy of the .ml and .mli files required. We also
# provide .ml files for .mli-only modules---without this, such modules do
# not seem to be located by the type checker inside bytecode packs.
# Note: .ml-only modules are not supported by the (.mli.cmi) rule below.
$(LOCAL_SRC)/Makefile: $(LOCAL_SRC)/Makefile.copy-sources Makefile
$(V_GEN)cp -f $< $@ && \
for ml in $(COMPILERLIBS_SOURCES); do \
echo "$(LOCAL_SRC)/$$(basename $$ml): $(ROOTDIR)/$$ml" \
>> $@; \
echo "$(LOCAL_SRC)/$$(basename $$ml)i: $(ROOTDIR)/$${ml}i" \
>> $@; \
done && \
for mli in $(COMPILERLIBS_INTFS); do \
echo "$(LOCAL_SRC)/$$(basename $$mli): $(ROOTDIR)/$$mli" \
>> $@; \
echo \
"$(LOCAL_SRC)/$$(basename $$mli .mli).ml: $(ROOTDIR)/$$mli"\
>> $@; \
done
# Rules to automatically generate dependencies for the local copy of the
# compilerlibs sources.
COMPILERLIBS_SOURCES_NO_DIRS=$(notdir $(COMPILERLIBS_SOURCES))
COMPILERLIBS_INTFS_NO_DIRS=$(notdir $(COMPILERLIBS_INTFS))
COMPILERLIBS_INTFS_BASE_NAMES=$(basename $(COMPILERLIBS_INTFS_NO_DIRS))
COMPILERLIBS_INTFS_ML_NO_DIRS=$(addsuffix .ml, $(COMPILERLIBS_INTFS_BASE_NAMES))
COMPILERLIBS_COPIED_INTFS=\
$(addprefix $(LOCAL_SRC)/, $(COMPILERLIBS_INTFS_ML_NO_DIRS))
COMPILERLIBS_COPIED_SOURCES=\
$(addprefix $(LOCAL_SRC)/, $(COMPILERLIBS_SOURCES_NO_DIRS)) \
$(COMPILERLIBS_COPIED_INTFS)
COMPILERLIBS_SOURCES_INTFS=\
$(addsuffix i, $(COMPILERLIBS_SOURCES))
COMPILERLIBS_COPIED_SOURCES_INTFS=\
$(addsuffix i, $(COMPILERLIBS_COPIED_SOURCES))
MINI_COMPILERLIBS_COPIED_SOURCES=\
$(addprefix $(LOCAL_SRC)/, $(notdir $(MINI_COMPILERLIBS_SOURCES))) \
$(addprefix $(LOCAL_SRC)/, $(notdir $(MINI_COMPILERLIBS_INTFS)))
# $(LOCAL_SRC)/Makefile uses the variables above in dependencies, so must be
# include'd after they've been defined.
-include $(LOCAL_SRC)/Makefile
# Rules to build the local copy of the compilerlibs sources in such a way
# that the resulting .cm{o,x} files can be packed.
COMPILERLIBS_CMO=$(COMPILERLIBS_COPIED_SOURCES:.ml=.cmo)
COMPILERLIBS_CMX=$(MINI_COMPILERLIBS_COPIED_SOURCES:.ml=.cmx)
$(LOCAL_SRC)/%.cmi: $(LOCAL_SRC)/%.mli
$(V_OCAMLC)$(OCAMLC) -c -for-pack Dynlink_compilerlibs $(COMPFLAGS) \
-I $(LOCAL_SRC) -o $@ $(LOCAL_SRC)/$*.mli
$(LOCAL_SRC)/%.cmo: $(LOCAL_SRC)/%.ml
$(V_OCAMLC)$(OCAMLC) -c -for-pack Dynlink_compilerlibs $(COMPFLAGS) \
-I $(LOCAL_SRC) -o $@ $(LOCAL_SRC)/$*.ml
$(LOCAL_SRC)/%.cmx: $(LOCAL_SRC)/%.ml
$(V_OCAMLOPT)$(OCAMLOPT) -c -for-pack Dynlink_compilerlibs $(COMPFLAGS) \
$(OPTCOMPFLAGS) -I $(LOCAL_SRC) -o $@ $(LOCAL_SRC)/$*.ml
# Rules for building the [Dynlink_compilerlibs] bytecode and native packs
# from their components.
# A multi-target pattern rule can tell GNU make that the recipe simultaneously
# produces both the cmo and cmi file for Dynlink_compilerlibs. GNU make 4.3+
# would be required to do the same thing with a static rule (with its grouped
# targets feature).
byt%/dynlink_compilerlibs.cmo byt%/dynlink_compilerlibs.cmi: $(COMPILERLIBS_CMO)
@$(if $(filter-out e,$*),\
$(error Should only build byte/dynlink_compilerlibs.cmo!))
$(V_OCAMLC)$(OCAMLC) $(COMPFLAGS) -pack -o byte/dynlink_compilerlibs.cmo $^
native/dynlink_compilerlibs.cmx: $(COMPILERLIBS_CMX)
$(V_OCAMLOPT)$(OCAMLOPT) $(COMPFLAGS) $(OPTCOMPFLAGS) -pack -o $@ $(COMPILERLIBS_CMX)
%/dynlink.cmi: dynlink.cmi dynlink.mli
cp $^ $*/
# Rules for building the interface of the [Dynlink_compilerlibs] packs.
# To avoid falling foul of the problem described below, the .cmo and .cmx
# files for the dynlink-specific compilerlibs packs generated here---and in
# particular the corresponding .cmi files -- are kept in separate directories.
# The main dynlink rules start here.
all: dynlink.cma
allopt: dynlink.cmxa
dynlink.cma: $(OBJS)
$(V_LINKC)$(OCAMLC) $(COMPFLAGS) -ccopt "$(NATDYNLINKOPTS)" -a -I byte -o $@ $^
dynlink.cmxa: $(NATOBJS)
$(V_LINKOPT)$(OCAMLOPT) $(COMPFLAGS) -ccopt "$(NATDYNLINKOPTS)" -a -I native \
-o $@ $^
# As for all other .cmxa files, ensure that the .cmx files are in the same
# directory. If this were omitted, ocamldoc in particular will fail to build
# with a -opaque warning. Note that installopt refers to $(NATOBJS) so doesn't
# require this file to exist, hence its inclusion in the recipe for dynlink.cmxa
# rather than as a dependency elsewhere.
cp native/dynlink.cmx dynlink.cmx
# Since there is no .mli for [Dynlink_platform_intf], we need to be
# careful that compilation of the .cmx file does not write the .cmi file again,
# which would cause rebuilding of ocamlopt. The easiest way to do this seems
# to be to copy the .ml file, which is a valid .mli, to the .mli.
dynlink_platform_intf.mli: dynlink_platform_intf.ml
cp $< $@
INSTALL_LIBDIR_DYNLINK = $(INSTALL_LIBDIR)/dynlink
install:
# If installing over a previous OCaml version, ensure dynlink is removed from
# the previous installation.
rm -f "$(INSTALL_LIBDIR)"/dynlink.cm* "$(INSTALL_LIBDIR)/dynlink.mli" \
"$(INSTALL_LIBDIR)/dynlink.$(A)" \
$(addprefix "$(INSTALL_LIBDIR)/", $(notdir $(NATOBJS)))
$(MKDIR) "$(INSTALL_LIBDIR_DYNLINK)"
$(INSTALL_DATA) \
dynlink.cmi dynlink.cma META \
"$(INSTALL_LIBDIR_DYNLINK)"
ifeq "$(INSTALL_SOURCE_ARTIFACTS)" "true"
$(INSTALL_DATA) \
dynlink.cmti dynlink.mli \
"$(INSTALL_LIBDIR_DYNLINK)"
endif
installopt:
ifeq "$(strip $(NATDYNLINK))" "true"
$(INSTALL_DATA) \
$(NATOBJS) dynlink.cmxa dynlink.$(A) \
"$(INSTALL_LIBDIR_DYNLINK)"
endif
partialclean:
rm -f *.cm[ioaxt] *.cmti *.cmxa \
byte/*.cm[iot] byte/*.cmti \
native/*.cm[ixt] native/*.cmti native/*.o native/*.obj \
$(LOCAL_SRC)/*.cm[ioaxt] $(LOCAL_SRC)/*.cmti \
$(LOCAL_SRC)/*.o $(LOCAL_SRC)/*.obj
clean: partialclean
rm -f *.a *.lib *.o *.obj *.so *.dll dynlink_platform_intf.mli \
$(LOCAL_SRC)/*.ml $(LOCAL_SRC)/*.mli $(LOCAL_SRC)/Makefile \
$(LOCAL_SRC)/.depend byte/dynlink.mli native/dynlink.mli
distclean: clean
rm -f META
beforedepend: dynlink_platform_intf.mli
DEPEND_DUMMY_FILES=\
native/dynlink_compilerlibs.ml \
byte/dynlink_compilerlibs.mli \
byte/dynlink.mli \
native/dynlink.mli
depend: beforedepend
$(V_GEN)touch $(DEPEND_DUMMY_FILES) && \
$(OCAMLRUN) $(ROOTDIR)/boot/ocamlc -depend -slash \
-I byte -bytecode *.mli *.ml byte/dynlink.ml > .depend && \
$(OCAMLRUN) $(ROOTDIR)/boot/ocamlc -depend -slash \
-I native -native *.ml native/dynlink.ml >> .depend && \
rm -f $(DEPEND_DUMMY_FILES)
include .depend
%.cmi: %.mli
$(V_OCAMLC)$(OCAMLC) -c $(COMPFLAGS) $<
%.cmo: %.ml
$(V_OCAMLC)$(OCAMLC) -c $(COMPFLAGS) $<
%.cmx: %.ml
$(V_OCAMLOPT)$(OCAMLOPT) -c $(COMPFLAGS) $(OPTCOMPFLAGS) $<