Backport from sid to buster
[hcoop/debian/mlton.git] / mlton / Makefile
CommitLineData
7f918cf1
CE
1## Copyright (C) 2010,2013,2016,2018 Matthew Fluet.
2 # Copyright (C) 1999-2009 Henry Cejtin, Matthew Fluet, Suresh
3 # Jagannathan, and Stephen Weeks.
4 # Copyright (C) 1997-2000 NEC Research Institute.
5 #
6 # MLton is released under a BSD-style license.
7 # See the file MLton-LICENSE for details.
8 ##
9
10MLTON_RUNTIME_ARGS :=
11MLTON_COMPILE_ARGS :=
12
13BOOTSTRAP_MLTON_RUNTIME_ARGS :=
14BOOTSTRAP_MLTON_COMPILE_ARGS :=
15
16GIT := git
17GREP := grep
18SED := sed
19
20######################################################################
21######################################################################
22
23SRC := $(shell cd .. && pwd)
24BUILD := $(SRC)/build
25BIN := $(BUILD)/bin
26
27PATH := $(BIN):$(shell echo $$PATH)
28
29MLTON_VERSION := 20180207
30
31HOST_ARCH := $(shell ../bin/host-arch)
32HOST_OS := $(shell ../bin/host-os)
33TARGET := self
34TARGET_ARCH := $(HOST_ARCH)
35TARGET_OS := $(HOST_OS)
36
37######################################################################
38
39ifeq (other, $(shell if [ ! -x "$(BIN)/mlton" ]; then echo other; fi))
40BOOTSTRAP:=true
41else
42BOOTSTRAP:=false
43endif
44
45MLTON := mlton
46BOOTSTRAP_MLTON := mlton
47
48MLTON_COMPILE_TYPECHECK_ARGS :=
49ifeq (false, $(BOOTSTRAP))
50# Older versions of `mlton` may not support `sequenceNonUnit` or `warnUnused`.
51MLTON_COMPILE_TYPECHECK_ARGS += -default-ann 'sequenceNonUnit warn'
52MLTON_COMPILE_TYPECHECK_ARGS += -default-ann 'warnUnused true'
53# MLTON_COMPILE_TYPECHECK_ARGS += -type-check true
54endif
55
56ifeq (false, $(BOOTSTRAP))
57MLTON_ACTUAL := $(MLTON)
58MLTON_RUNTIME_ARGS_ACTUAL := ram-slop 0.7 $(MLTON_RUNTIME_ARGS)
59MLTON_COMPILE_ARGS_ACTUAL := $(MLTON_COMPILE_TYPECHECK_ARGS) $(MLTON_COMPILE_ARGS)
60else
61MLTON_ACTUAL := $(BOOTSTRAP_MLTON)
62MLTON_RUNTIME_ARGS_ACTUAL := ram-slop 0.7 $(BOOTSTRAP_MLTON_RUNTIME_ARGS)
63MLTON_COMPILE_ARGS_ACTUAL := $(MLTON_COMPILE_TYPECHECK_ARGS) $(BOOTSTRAP_MLTON_COMPILE_ARGS)
64endif
65
66ifeq (false, $(BOOTSTRAP))
67# We're self-compiling, so don't use any stubs.
68FILE := mlton.mlb
69else
70ifneq (, $(findstring $(HOST_OS),cygwin mingw))
71# We're bootstrapping on Cygwin or MinGW; stubs define `spawn` in terms of
72# `fork` and `fork` doesn't work on Cygwin or MinGW, so don't use any stubs.
73FILE := mlton.mlb
74else
75# We're bootstrapping, so use stubs.
76FILE := mlton-stubs.mlb
77endif
78endif
79
80FRONT_END_SOURCES := \
81 front-end/ml.lex.sml \
82 front-end/ml.grm.sig \
83 front-end/ml.grm.sml \
84 front-end/mlb.lex.sml \
85 front-end/mlb.grm.sig \
86 front-end/mlb.grm.sml
87
88SOURCES := \
89 $(FILE) \
90 $(FRONT_END_SOURCES) \
91 $(filter-out control/version.sml,$(shell if [ -r $(FILE) ]; then mlton -stop f $(FILE) | $(GREP) -v " "; fi))
92
93.PHONY: all
94all: $(MLTON_OUTPUT)
95
96control/version.sml: control/version_sml.src
97 $(SED) "s/MLTON_VERSION/$(MLTON_VERSION)/" \
98 < control/version_sml.src \
99 > control/version.sml
100
101front-end/%.lex.sml: front-end/%.lex
102 $(MAKE) -C front-end $(<F).sml
103front-end/%.grm.sig front-end/%.grm.sml: front-end/%.grm
104 $(MAKE) -C front-end $(<F).sig $(<F).sml
105
106mlton-stubs.mlb: $(shell mlton -stop f ../lib/stubs/mlton-stubs/sources.mlb) $(shell mlton -stop f mlton.mlb)
107 ( \
108 echo '$$(SML_LIB)/basis/unsafe.mlb'; \
109 echo '$$(SML_LIB)/basis/sml-nj.mlb'; \
110 echo '$$(SML_LIB)/basis/mlton.mlb'; \
111 echo '$$(SML_LIB)/basis/basis.mlb'; \
112 mlton -stop f mlton.mlb | $(GREP) -v 'mlb$$' | $(GREP) 'mlyacc'; \
113 mlton -stop f ../lib/stubs/mlton-stubs/sources.mlb | \
114 $(GREP) -v 'mlb$$' | \
115 $(GREP) 'mlton-stubs'; \
116 mlton -stop f mlton.mlb | \
117 $(GREP) -v 'mlb$$' | \
118 $(GREP) -v 'sml/basis' | \
119 $(GREP) -v 'targets' | \
120 $(GREP) -v 'mlyacc'; \
121 ) > mlton-stubs.mlb
122
123MLTON_OUTPUT := mlton
124$(MLTON_OUTPUT): $(SOURCES)
125 rm -f control/version.sml
126 $(MAKE) control/version.sml
127 @echo 'Compiling mlton'
128 "$(MLTON_ACTUAL)" @MLton gc-summary $(MLTON_RUNTIME_ARGS_ACTUAL) -- \
129 -verbose 2 $(MLTON_COMPILE_ARGS_ACTUAL) \
130 -target $(TARGET) -output $(MLTON_OUTPUT) $(FILE)
131
132.PHONY: def-use
133def-use: mlton.def-use
134
135mlton.def-use: $(SOURCES)
136 "$(MLTON_ACTUAL)" @MLton $(MLTON_RUNTIME_ARGS_ACTUAL) -- \
137 -verbose 0 $(MLTON_COMPILE_ARGS_ACTUAL) \
138 -stop tc -prefer-abs-paths true -show-def-use mlton.def-use \
139 $(FILE)
140
141.PHONY: clean
142clean:
143 ../bin/clean
144
145#
146# The following rebuilds the heap file for the SML/NJ compiled version of MLton.
147#
148SMLNJ := sml
149SMLNJ_CM_SERVERS_NUM := 0
150
151.PHONY: smlnj-mlton
152smlnj-mlton: $(FRONT_END_SOURCES)
153 rm -f control/version.sml
154 $(MAKE) control/version.sml
155 ( \
156 echo 'SMLofNJ.Internals.GC.messages false;'; \
157 echo '#set CM.Control.verbose false;'; \
158 echo '#set CM.Control.warn_obsolete false;'; \
159 echo 'Control.polyEqWarn := false;'; \
160 echo 'local'; \
161 echo 'fun loop 0 = () | loop n = (CM.Server.start {cmd = (CommandLine.name (), ["@CMslave"]), name = "server" ^ (Int.toString n), pathtrans = NONE, pref = 0}; loop (n - 1));'; \
162 echo 'in'; \
163 echo 'val _ = loop $(SMLNJ_CM_SERVERS_NUM);'; \
164 echo 'end;'; \
165 echo 'if (CM.make "mlton-smlnj.cm") handle _ => false'; \
166 echo ' then ()'; \
167 echo ' else OS.Process.exit OS.Process.failure;'; \
168 echo 'SMLofNJ.exportFn("mlton-smlnj",Main.main);' \
169 ) | "$(SMLNJ)"
170
171#
172# The following rebuilds the executable file for the Poly/ML compiled version of
173# MLton.
174#
175POLYML := poly
176
177.PHONY: polyml-mlton
178polyml-mlton: mlton-polyml.use $(FRONT_END_SOURCES)
179 rm -f control/version.sml
180 $(MAKE) control/version.sml
181 ( \
182 echo 'use "mlton-polyml.use";'; \
183 echo 'PolyML.export("mlton-polyml", Main.mainWrapped);'; \
184 ) | "$(POLYML)"
185 $(CC) -o mlton-polyml mlton-polyml.o -lpolymain -lpolyml
186 rm -f mlton-polyml.o
187
188mlton-polyml.use: ../lib/stubs/basis-stubs-for-polyml/sources.use ../lib/stubs/mlton-stubs-for-polyml/sources.use $(shell mlton -stop f ../lib/stubs/mlton-stubs/sources.mlb) $(filter-out control/version.sml,$(shell mlton -stop f mlton.mlb))
189 ( \
190 cat ../lib/stubs/basis-stubs-for-polyml/sources.use | \
191 $(SED) 's|use "\(.*\)";|../lib/stubs/basis-stubs-for-polyml/\1|'; \
192 mlton -stop f mlton.mlb | $(GREP) -v 'mlb$$' | $(GREP) 'mlyacc'; \
193 cat ../lib/stubs/mlton-stubs-for-polyml/sources.use | \
194 $(SED) 's|use "\(.*\)";|../lib/stubs/mlton-stubs-for-polyml/\1|'; \
195 mlton -stop f ../lib/stubs/mlton-stubs/sources.mlb | \
196 $(GREP) -v 'mlb$$' | \
197 $(GREP) 'mlton-stubs'; \
198 mlton -stop f mlton.mlb | \
199 $(GREP) -v 'mlb$$' | \
200 $(GREP) -v 'sml/basis' | \
201 $(GREP) -v 'targets' | \
202 $(GREP) -v 'mlton-stubs' | \
203 $(GREP) -v 'mlyacc' | \
204 $(GREP) -v 'call-main.sml'; \
205 ) | $(SED) 's|\(.*\)|use "\1";|' > mlton-polyml.use