Backport from sid to buster
[hcoop/debian/mlton.git] / mlton / Makefile
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
10 MLTON_RUNTIME_ARGS :=
11 MLTON_COMPILE_ARGS :=
12
13 BOOTSTRAP_MLTON_RUNTIME_ARGS :=
14 BOOTSTRAP_MLTON_COMPILE_ARGS :=
15
16 GIT := git
17 GREP := grep
18 SED := sed
19
20 ######################################################################
21 ######################################################################
22
23 SRC := $(shell cd .. && pwd)
24 BUILD := $(SRC)/build
25 BIN := $(BUILD)/bin
26
27 PATH := $(BIN):$(shell echo $$PATH)
28
29 MLTON_VERSION := 20180207
30
31 HOST_ARCH := $(shell ../bin/host-arch)
32 HOST_OS := $(shell ../bin/host-os)
33 TARGET := self
34 TARGET_ARCH := $(HOST_ARCH)
35 TARGET_OS := $(HOST_OS)
36
37 ######################################################################
38
39 ifeq (other, $(shell if [ ! -x "$(BIN)/mlton" ]; then echo other; fi))
40 BOOTSTRAP:=true
41 else
42 BOOTSTRAP:=false
43 endif
44
45 MLTON := mlton
46 BOOTSTRAP_MLTON := mlton
47
48 MLTON_COMPILE_TYPECHECK_ARGS :=
49 ifeq (false, $(BOOTSTRAP))
50 # Older versions of `mlton` may not support `sequenceNonUnit` or `warnUnused`.
51 MLTON_COMPILE_TYPECHECK_ARGS += -default-ann 'sequenceNonUnit warn'
52 MLTON_COMPILE_TYPECHECK_ARGS += -default-ann 'warnUnused true'
53 # MLTON_COMPILE_TYPECHECK_ARGS += -type-check true
54 endif
55
56 ifeq (false, $(BOOTSTRAP))
57 MLTON_ACTUAL := $(MLTON)
58 MLTON_RUNTIME_ARGS_ACTUAL := ram-slop 0.7 $(MLTON_RUNTIME_ARGS)
59 MLTON_COMPILE_ARGS_ACTUAL := $(MLTON_COMPILE_TYPECHECK_ARGS) $(MLTON_COMPILE_ARGS)
60 else
61 MLTON_ACTUAL := $(BOOTSTRAP_MLTON)
62 MLTON_RUNTIME_ARGS_ACTUAL := ram-slop 0.7 $(BOOTSTRAP_MLTON_RUNTIME_ARGS)
63 MLTON_COMPILE_ARGS_ACTUAL := $(MLTON_COMPILE_TYPECHECK_ARGS) $(BOOTSTRAP_MLTON_COMPILE_ARGS)
64 endif
65
66 ifeq (false, $(BOOTSTRAP))
67 # We're self-compiling, so don't use any stubs.
68 FILE := mlton.mlb
69 else
70 ifneq (, $(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.
73 FILE := mlton.mlb
74 else
75 # We're bootstrapping, so use stubs.
76 FILE := mlton-stubs.mlb
77 endif
78 endif
79
80 FRONT_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
88 SOURCES := \
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
94 all: $(MLTON_OUTPUT)
95
96 control/version.sml: control/version_sml.src
97 $(SED) "s/MLTON_VERSION/$(MLTON_VERSION)/" \
98 < control/version_sml.src \
99 > control/version.sml
100
101 front-end/%.lex.sml: front-end/%.lex
102 $(MAKE) -C front-end $(<F).sml
103 front-end/%.grm.sig front-end/%.grm.sml: front-end/%.grm
104 $(MAKE) -C front-end $(<F).sig $(<F).sml
105
106 mlton-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
123 MLTON_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
133 def-use: mlton.def-use
134
135 mlton.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
142 clean:
143 ../bin/clean
144
145 #
146 # The following rebuilds the heap file for the SML/NJ compiled version of MLton.
147 #
148 SMLNJ := sml
149 SMLNJ_CM_SERVERS_NUM := 0
150
151 .PHONY: smlnj-mlton
152 smlnj-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 #
175 POLYML := poly
176
177 .PHONY: polyml-mlton
178 polyml-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
188 mlton-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