258 lines
7.3 KiB
Makefile
258 lines
7.3 KiB
Makefile
#**************************************************************************
|
|
#* *
|
|
#* 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. *
|
|
#* *
|
|
#**************************************************************************
|
|
|
|
ROOTDIR = ..
|
|
|
|
include $(ROOTDIR)/Makefile.common
|
|
|
|
TARGET_BINDIR ?= $(BINDIR)
|
|
|
|
COMPILER=$(ROOTDIR)/ocamlc
|
|
CAMLC=$(CAMLRUN) $(COMPILER)
|
|
COMPFLAGS=-strict-sequence -absname -w +a-4-9-41-42-44-45-48 \
|
|
-g -warn-error A -bin-annot -nostdlib \
|
|
-safe-string -strict-formats
|
|
OPTCOMPILER=$(ROOTDIR)/ocamlopt
|
|
CAMLOPT=$(CAMLRUN) $(OPTCOMPILER)
|
|
CAMLDEP=$(BOOT_OCAMLC) -depend
|
|
DEPFLAGS=-slash
|
|
|
|
OC_CPPFLAGS += -I$(ROOTDIR)/runtime
|
|
|
|
# Object file prefix
|
|
P=stdlib__
|
|
|
|
include StdlibModules
|
|
|
|
OBJS=$(addsuffix .cmo,$(STDLIB_MODULES))
|
|
OTHERS=$(filter-out camlinternalFormatBasics.cmo stdlib.cmo,$(OBJS))
|
|
|
|
PREFIXED_OBJS=$(filter stdlib__%.cmo,$(OBJS))
|
|
UNPREFIXED_OBJS=$(PREFIXED_OBJS:stdlib__%.cmo=%)
|
|
|
|
.PHONY: all
|
|
all: stdlib.cma std_exit.cmo camlheader target_camlheader camlheader_ur
|
|
|
|
ifeq "$(RUNTIMED)" "true"
|
|
all: camlheaderd target_camlheaderd
|
|
endif
|
|
|
|
ifeq "$(RUNTIMEI)" "true"
|
|
all: camlheaderi target_camlheaderi
|
|
endif
|
|
|
|
.PHONY: allopt opt.opt # allopt and opt.opt are synonyms
|
|
allopt: stdlib.cmxa std_exit.cmx
|
|
opt.opt: allopt
|
|
|
|
LEGACY_OBJS=$(patsubst stdlib__%,"$(INSTALL_LIBDIR)/%", \
|
|
$(filter stdlib__%,$(OBJS)))
|
|
.PHONY: install
|
|
install::
|
|
# Transitional: when upgrading from 4.06 -> 4.07, module M is in stdlib__m.cm*,
|
|
# while previously it was in m.cm*, which confuses the compiler.
|
|
rm -f $(LEGACY_OBJS)
|
|
# Remove "old" pervasives.* and bigarray.* to avoid getting confused with the
|
|
# Stdlib versions.
|
|
rm -f "$(INSTALL_LIBDIR)/pervasives.*" "$(INSTALL_LIBDIR)/bigarray.*"
|
|
# End transitional
|
|
$(INSTALL_DATA) \
|
|
stdlib.cma std_exit.cmo *.cmi camlheader_ur \
|
|
"$(INSTALL_LIBDIR)"
|
|
ifeq "$(INSTALL_SOURCE_ARTIFACTS)" "true"
|
|
$(INSTALL_DATA) \
|
|
*.cmt *.cmti *.mli *.ml \
|
|
"$(INSTALL_LIBDIR)"
|
|
endif
|
|
$(INSTALL_DATA) target_camlheader "$(INSTALL_LIBDIR)/camlheader"
|
|
|
|
ifeq "$(RUNTIMED)" "true"
|
|
install::
|
|
$(INSTALL_DATA) target_camlheaderd "$(INSTALL_LIBDIR)/camlheaderd"
|
|
endif
|
|
|
|
ifeq "$(RUNTIMEI)" "true"
|
|
install::
|
|
$(INSTALL_DATA) target_camlheaderi "$(INSTALL_LIBDIR)/camlheaderi"
|
|
endif
|
|
|
|
.PHONY: installopt
|
|
installopt: installopt-default
|
|
|
|
.PHONY: installopt-default
|
|
installopt-default:
|
|
$(INSTALL_DATA) \
|
|
stdlib.cmxa stdlib.$(A) std_exit.$(O) *.cmx \
|
|
"$(INSTALL_LIBDIR)"
|
|
cd "$(INSTALL_LIBDIR)"; $(RANLIB) stdlib.$(A)
|
|
|
|
ifeq "$(UNIX_OR_WIN32)" "unix"
|
|
HEADERPROGRAM = header
|
|
HEADER_PATH = $(BINDIR)/
|
|
HEADER_TARGET_PATH = $(TARGET_BINDIR)/
|
|
else # Windows
|
|
HEADERPROGRAM = headernt
|
|
HEADER_PATH =
|
|
HEADER_TARGET_PATH =
|
|
endif
|
|
|
|
TARGETHEADERPROGRAM = target_$(HEADERPROGRAM)
|
|
|
|
# The shebang test in configure.ac will need updating if any runtime is
|
|
# introduced with a suffix more than one character long (camlheader_ur doesn't
|
|
# matter).
|
|
CAMLHEADERS =\
|
|
camlheader target_camlheader camlheader_ur \
|
|
camlheaderd target_camlheaderd \
|
|
camlheaderi target_camlheaderi
|
|
|
|
# The % in pattern rules must always match something, hence the slightly strange
|
|
# patterns and $(subst ...) since `camlheader%:` wouldn't match `camlheader`
|
|
ifeq "$(SHEBANGSCRIPTS)" "true"
|
|
camlhead%: $(ROOTDIR)/Makefile.config Makefile
|
|
ifeq "$(LONG_SHEBANG)" "true"
|
|
echo '#!/bin/sh' > $@
|
|
echo 'exec "$(BINDIR)/ocamlrun$(subst er,,$*)" "$$0" "$$@"' >> $@
|
|
else
|
|
echo '#!$(BINDIR)/ocamlrun$(subst er,,$*)' > $@
|
|
endif
|
|
|
|
# TODO This does not take long shebangs into account (since TARGET_BINDIR is not
|
|
# yet processed by configure)
|
|
target_%: $(ROOTDIR)/Makefile.config Makefile
|
|
echo '#!$(TARGET_BINDIR)/ocamlrun$(subst camlheader,,$*)' > $@
|
|
|
|
camlheader_ur: Makefile
|
|
echo '#!' | tr -d '\012' > $@
|
|
|
|
else # Hashbang scripts not supported
|
|
|
|
$(CAMLHEADERS): $(HEADERPROGRAM).c $(ROOTDIR)/Makefile.config Makefile
|
|
|
|
# $@.exe is deleted to ensure no Cygwin .exe mangling takes place
|
|
camlhead%: tmphead%.exe
|
|
rm -f $@.exe
|
|
mv $< $@
|
|
|
|
# Again, pattern weirdness here means that the dot is always present so that
|
|
# tmpheader.exe matches.
|
|
tmpheader%exe: $(HEADERPROGRAM)%$(O)
|
|
$(call MKEXE_BOOT,$@,$^ $(EXTRALIBS))
|
|
# FIXME This is wrong - mingw could invoke strip; MSVC equivalent?
|
|
ifneq "$(UNIX_OR_WIN32)" "win32"
|
|
strip $@
|
|
endif
|
|
|
|
$(HEADERPROGRAM)%$(O): \
|
|
OC_CPPFLAGS += -DRUNTIME_NAME='"$(HEADER_PATH)ocamlrun$(subst .,,$*)"'
|
|
|
|
$(HEADERPROGRAM)%$(O): $(HEADERPROGRAM).c
|
|
$(CC) -c $(OC_CFLAGS) $(OC_CPPFLAGS) $(OUTPUTOBJ)$@ $^
|
|
|
|
camlheader_ur: camlheader
|
|
cp camlheader $@
|
|
|
|
ifeq "$(UNIX_OR_WIN32)" "unix"
|
|
tmptargetcamlheader%exe: $(TARGETHEADERPROGRAM)%$(O)
|
|
$(call MKEXE_BOOT,$@,$^ $(EXTRALIBS))
|
|
strip $@
|
|
|
|
$(TARGETHEADERPROGRAM)%$(O): $(HEADERPROGRAM).c
|
|
$(CC) -c $(OC_CFLAGS) $(OC_CPPFLAGS) \
|
|
-DRUNTIME_NAME='"$(HEADER_TARGET_PATH)ocamlrun$(subst .,,$*)"' \
|
|
$(OUTPUTOBJ)$@ $^
|
|
|
|
target_%: tmptarget%.exe
|
|
rm -f $@.exe
|
|
mv $< $@
|
|
else
|
|
target_%: %
|
|
cp $< $@
|
|
endif
|
|
|
|
endif # ifeq "$(SHEBANGSCRIPTS)" "true"
|
|
|
|
stdlib.cma: $(OBJS)
|
|
$(CAMLC) -a -o $@ $^
|
|
|
|
stdlib.cmxa: $(OBJS:.cmo=.cmx)
|
|
$(CAMLOPT) -a -o $@ $^
|
|
|
|
sys.ml: $(ROOTDIR)/VERSION sys.mlp
|
|
sed -e "s|%%VERSION%%|`sed -e 1q $< | tr -d '\r'`|" sys.mlp > $@
|
|
|
|
.PHONY: clean
|
|
clean::
|
|
rm -f sys.ml
|
|
|
|
clean::
|
|
rm -f $(CAMLHEADERS)
|
|
|
|
.SUFFIXES: .mli .ml .cmi .cmo .cmx
|
|
|
|
export AWK
|
|
|
|
%.cmi: %.mli
|
|
$(CAMLC) $(COMPFLAGS) $(shell ./Compflags $@) -c $<
|
|
|
|
stdlib__%.cmi: %.mli
|
|
$(CAMLC) $(COMPFLAGS) $(shell ./Compflags $@) -o $@ -c $<
|
|
|
|
%.cmo: %.ml
|
|
$(CAMLC) $(COMPFLAGS) $(shell ./Compflags $@) -c $<
|
|
|
|
stdlib__%.cmo: %.ml
|
|
$(CAMLC) $(COMPFLAGS) $(shell ./Compflags $@) -o $@ -c $<
|
|
|
|
%.cmx: %.ml
|
|
$(CAMLOPT) $(COMPFLAGS) $(OPTCOMPFLAGS) $(shell ./Compflags $@) -c $<
|
|
|
|
stdlib__%.cmx: %.ml
|
|
$(CAMLOPT) $(COMPFLAGS) $(OPTCOMPFLAGS) $(shell ./Compflags $@) \
|
|
-o $@ -c $<
|
|
|
|
# Dependencies on the compiler
|
|
COMPILER_DEPS=$(filter-out -use-prims $(CAMLRUN), $(CAMLC))
|
|
$(OBJS) std_exit.cmo: $(COMPILER_DEPS)
|
|
$(OBJS:.cmo=.cmi) std_exit.cmi: $(COMPILER_DEPS)
|
|
$(OBJS:.cmo=.cmx) std_exit.cmx: $(OPTCOMPILER)
|
|
|
|
# Dependencies on Stdlib (not tracked by ocamlc -depend)
|
|
|
|
$(OTHERS) std_exit.cmo: stdlib.cmi
|
|
$(OTHERS:.cmo=.cmi) std_exit.cmi: stdlib.cmi
|
|
$(OBJS:.cmo=.cmx) std_exit.cmx: stdlib.cmi
|
|
$(OTHERS:.cmo=.cmx) std_exit.cmx: stdlib.cmx
|
|
|
|
clean::
|
|
rm -f *.cm* *.o *.obj *.a *.lib *.odoc
|
|
rm -f camlheader*
|
|
|
|
include .depend
|
|
|
|
EMPTY :=
|
|
SPACE := $(EMPTY) $(EMPTY)
|
|
|
|
.PHONY: depend
|
|
depend:
|
|
$(CAMLDEP) $(DEPFLAGS) $(filter-out stdlib.%,$(wildcard *.mli *.ml)) \
|
|
> .depend.tmp
|
|
$(CAMLDEP) $(DEPFLAGS) -pp "$(AWK) -f ./remove_module_aliases.awk" \
|
|
stdlib.ml stdlib.mli >> .depend.tmp
|
|
sed -Ee \
|
|
's#(^| )(${subst ${SPACE},|,${UNPREFIXED_OBJS}})[.]#\1stdlib__\2.#g' \
|
|
.depend.tmp > .depend
|
|
rm -f .depend.tmp
|