| 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 |