summaryrefslogtreecommitdiff
path: root/Makefile.best_binaries
blob: 4f05f698d15cd356e165f2ea91b326f6f7a9c40a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#**************************************************************************
#*                                                                        *
#*                                 OCaml                                  *
#*                                                                        *
#*            Gabriel Scherer, projet Parsifal, INRIA Saclay              *
#*                                                                        *
#*   Copyright 2019 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.          *
#*                                                                        *
#**************************************************************************

# This Makefile should be included.

# It expects:
# - Makefile.common to be included as well
# - a ROOTDIR variable pointing to the repository root
#   relative to the including Makefile

# It exports definitions of BEST_OCAML{C,OPT,LEX,DEP} commands that
# run to either the bytecode binary built in the repository or the
# native binary, if available. Note that they never use the boot/
# versions: we assume that ocamlc, ocamlopt, etc. have been run first.

# Set this to empty to force use of the bytecode compilers at all times
USE_BEST_BINARIES ?= true

check_not_stale = \
  $(if $(shell test $(ROOTDIR)/$1 -nt $(ROOTDIR)/$2 && echo stale), \
    $(info Warning: we are not using the native binary $2 \
because it is older than the bytecode binary $1; \
you should silence this warning by either removing $2 \
or rebuilding it (or `touch`-ing it) if you want it used.), \
    ok)

choose_best = $(strip $(if \
   $(and $(USE_BEST_BINARIES),$(wildcard $(ROOTDIR)/$1.opt$(EXE)),$(strip \
      $(call check_not_stale,$1$(EXE),$1.opt$(EXE)))), \
    $(ROOTDIR)/$1.opt$(EXE), \
    $(OCAMLRUN) $(ROOTDIR)/$1$(EXE)))

BEST_OCAMLC := $(call choose_best,ocamlc)
BEST_OCAMLOPT := $(call choose_best,ocamlopt)
BEST_OCAMLLEX := $(call choose_best,lex/ocamllex)

# We want to be able to compute dependencies even if the bytecode compiler
# is not built yet, using the bootstrap compiler.

# Unlike other tools, there is no risk of mixing incompatible
# bootstrap-compiler and host-compiler object files, as ocamldep only
# produces text output.
BEST_OCAMLDEP := $(strip $(if \
   $(and $(USE_BEST_BINARIES),$(wildcard $(ROOTDIR)/ocamlc.opt$(EXE)),$(strip \
      $(call check_not_stale,boot/ocamlc,ocamlc.opt$(EXE)))), \
    $(ROOTDIR)/ocamlc.opt$(EXE) -depend, \
    $(BOOT_OCAMLC) -depend))