| 1 | ## Copyright (C) 2009,2011,2013,2017-2018 Matthew Fluet. |
| 2 | # Copyright (C) 1999-2007 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 | # Specify C compiler and binutils. |
| 11 | # Can be used for alternative tools (e.g., `CC=clang` or `CC=gcc-7`). |
| 12 | CC := gcc |
| 13 | AR := ar |
| 14 | RANLIB := ranlib |
| 15 | STRIP := strip |
| 16 | |
| 17 | # Specify GMP include and library paths, if not on default search paths. |
| 18 | WITH_GMP_DIR := |
| 19 | ifneq ($(WITH_GMP_DIR),) |
| 20 | WITH_GMP_INC_DIR := $(WITH_GMP_DIR)/include |
| 21 | WITH_GMP_LIB_DIR := $(WITH_GMP_DIR)/lib |
| 22 | endif |
| 23 | |
| 24 | # Specify installation prefix and staged install destination. |
| 25 | PREFIX := /usr/local |
| 26 | DESTDIR := |
| 27 | |
| 28 | # Specify runtime and compile arguments given to (the to-be-built) `mlton` when |
| 29 | # compiling distributed executables ((self-compiled) `mlton`, `mllex`, `mlyacc`, |
| 30 | # `mlprof`, and `mlnlffigen`). |
| 31 | # Can be used for testing (e.g., `MLTON_COMPILE_ARGS="-codegen c"`) or for |
| 32 | # downstream packaging. |
| 33 | MLTON_RUNTIME_ARGS := |
| 34 | MLTON_COMPILE_ARGS := |
| 35 | |
| 36 | # Specify runtime and compile arguments given to "old" `mlton` when compiling |
| 37 | # "bootstrapped" `mlton`. |
| 38 | # Can be used to work around bugs in "old" `mlton` when compiling "bootstrapped" |
| 39 | # `mlton` (e.g., `BOOTSTRAP_MLTON_COMPILE_ARGS="-drop-pass 'deepFlatten'"`). |
| 40 | BOOTSTRAP_MLTON_RUNTIME_ARGS := |
| 41 | BOOTSTRAP_MLTON_COMPILE_ARGS := |
| 42 | |
| 43 | # Specify standard tools. |
| 44 | # Can be used for alternative tools (e.g., `SED=gsed`). |
| 45 | DIFF := diff |
| 46 | FIND := find |
| 47 | GIT := git |
| 48 | GREP := grep |
| 49 | GZIP := gzip |
| 50 | PATCH := patch |
| 51 | SED := sed |
| 52 | TAR := tar |
| 53 | XARGS := xargs |
| 54 | |
| 55 | ###################################################################### |
| 56 | ###################################################################### |
| 57 | |
| 58 | SRC := $(shell pwd) |
| 59 | BUILD := $(SRC)/build |
| 60 | BIN := $(BUILD)/bin |
| 61 | LIB := $(BUILD)/lib/mlton |
| 62 | INC := $(LIB)/include |
| 63 | |
| 64 | PATH := $(BIN):$(shell echo $$PATH) |
| 65 | |
| 66 | MLTON_VERSION := 20180207 |
| 67 | |
| 68 | HOST_ARCH := $(shell ./bin/host-arch) |
| 69 | HOST_OS := $(shell ./bin/host-os) |
| 70 | TARGET := self |
| 71 | TARGET_ARCH := $(HOST_ARCH) |
| 72 | TARGET_OS := $(HOST_OS) |
| 73 | |
| 74 | ifeq (mingw, $(TARGET_OS)) |
| 75 | EXE := .exe |
| 76 | else |
| 77 | EXE := |
| 78 | endif |
| 79 | |
| 80 | CP := cp -fpR |
| 81 | MKDIR := mkdir -p |
| 82 | MV := mv -f |
| 83 | RM := rm -rf |
| 84 | |
| 85 | ###################################################################### |
| 86 | |
| 87 | # If we're compiling with another version of MLton, then we want to do another |
| 88 | # round of compilation so that we get a MLton built without stubs. |
| 89 | ifeq (other, $(shell if [ ! -x "$(BIN)/mlton" ]; then echo other; fi)) |
| 90 | BOOTSTRAP:=true |
| 91 | else |
| 92 | BOOTSTRAP:=false |
| 93 | endif |
| 94 | CHECK_FIXPOINT:=false |
| 95 | |
| 96 | .PHONY: all |
| 97 | all: |
| 98 | $(MAKE) dirs runtime |
| 99 | $(MAKE) compiler CHECK_FIXPOINT=false # tools0 + mlton0 -> mlton1 |
| 100 | $(MAKE) script basis-no-check constants basis-check libraries |
| 101 | $(MAKE) tools CHECK_FIXPOINT=false # tools0 + mlton1 -> tools1 |
| 102 | ifeq (true, $(findstring true,$(BOOTSTRAP) $(CHECK_FIXPOINT))) |
| 103 | $(RM) "$(SRC)/mlton/mlton-compile$(EXE)" |
| 104 | $(MAKE) -C "$(SRC)/mlton/front-end" clean |
| 105 | $(MAKE) compiler CHECK_FIXPOINT=false # tools1 + mlton1 -> mlton2 |
| 106 | ifeq (true, $(CHECK_FIXPOINT)) |
| 107 | $(MAKE) tools-clean |
| 108 | $(MAKE) tools CHECK_FIXPOINT=true # tools1 + mlton1 -> tools2; tools2 == tools1 |
| 109 | $(RM) "$(SRC)/mlton/mlton-compile$(EXE)" |
| 110 | $(MAKE) -C "$(SRC)/mlton/front-end" clean |
| 111 | $(MAKE) compiler CHECK_FIXPOINT=true # tools2 + mlton2 -> mlton3; mlton3 == mlton2 |
| 112 | endif |
| 113 | endif |
| 114 | @echo 'Build of MLton succeeded.' |
| 115 | |
| 116 | .PHONY: basis-no-check |
| 117 | basis-no-check: |
| 118 | $(RM) "$(LIB)/sml/basis" |
| 119 | $(MKDIR) "$(LIB)/sml/basis" |
| 120 | ( \ |
| 121 | cd "$(SRC)/basis-library" && \ |
| 122 | $(FIND) . -type f '(' -name '*.mlb' -o -name '*.sml' -o -name '*.sig' -o -name '*.fun' ')' | \ |
| 123 | $(XARGS) $(TAR) cf - | \ |
| 124 | ( cd "$(LIB)/sml/basis" && $(TAR) xf - ) \ |
| 125 | ) |
| 126 | |
| 127 | .PHONY: basis-check |
| 128 | basis-check: |
| 129 | @echo 'Type checking basis.' |
| 130 | "$(BIN)/mlton" -disable-ann deadCode -stop tc '$$(SML_LIB)/basis/libs/all.mlb' >/dev/null |
| 131 | |
| 132 | .PHONY: basis |
| 133 | basis: |
| 134 | $(MAKE) basis-no-check |
| 135 | $(MAKE) basis-check |
| 136 | |
| 137 | .PHONY: bootstrap-smlnj |
| 138 | bootstrap-smlnj: |
| 139 | $(MAKE) smlnj-mlton |
| 140 | $(RM) "$(BIN)/mlton" |
| 141 | $(MAKE) BOOTSTRAP_MLTON=mlton.smlnj all |
| 142 | smlnj_heap_suffix=`echo 'TextIO.output (TextIO.stdErr, SMLofNJ.SysInfo.getHeapSuffix ());' | sml 2>&1 1> /dev/null` && $(RM) "$(LIB)/mlton/mlton-smlnj.$$smlnj_heap_suffix" |
| 143 | $(RM) "$(BIN)/mlton.smlnj" |
| 144 | |
| 145 | .PHONY: bootstrap-polyml |
| 146 | bootstrap-polyml: |
| 147 | $(MAKE) polyml-mlton |
| 148 | $(RM) "$(BIN)/mlton" |
| 149 | $(MAKE) BOOTSTRAP_MLTON=mlton.polyml all |
| 150 | $(RM) "$(LIB)/mlton-polyml$(EXE)" |
| 151 | $(RM) "$(BIN)/mlton.polyml" |
| 152 | |
| 153 | .PHONY: clean |
| 154 | clean: |
| 155 | ./bin/clean --exclude package |
| 156 | |
| 157 | .PHONY: clean-git |
| 158 | clean-git: |
| 159 | $(FIND) . -type d -name .git -prune -exec $(RM) '{}' ';' |
| 160 | |
| 161 | .PHONY: compiler |
| 162 | compiler: |
| 163 | $(MAKE) -C "$(SRC)/mlton" MLTON_OUTPUT=mlton-compile |
| 164 | ifeq (true, $(CHECK_FIXPOINT)) |
| 165 | $(DIFF) -b "$(SRC)/mlton/mlton-compile$(EXE)" "$(LIB)/mlton-compile$(EXE)" |
| 166 | endif |
| 167 | $(CP) "$(SRC)/mlton/mlton-compile$(EXE)" "$(LIB)/" |
| 168 | |
| 169 | .PHONY: constants |
| 170 | constants: |
| 171 | @echo 'Creating constants file.' |
| 172 | "$(BIN)/mlton" -target "$(TARGET)" -build-constants true > build-constants.c |
| 173 | "$(BIN)/mlton" -target "$(TARGET)" -output build-constants build-constants.c |
| 174 | ./build-constants$(EXE) >"$(LIB)/targets/$(TARGET)/constants" |
| 175 | $(RM) build-constants$(EXE) build-constants.c |
| 176 | |
| 177 | .PHONY: debugged |
| 178 | debugged: |
| 179 | $(MAKE) -C "$(SRC)/mlton" MLTON_OUTPUT=mlton-compile.debug \ |
| 180 | MLTON_COMPILE_ARGS="$(MLTON_COMPILE_ARGS) -debug true -const 'Exn.keepHistory true' -profile-val true -const 'MLton.debug true' -disable-pass 'deepFlatten'" |
| 181 | $(CP) "$(SRC)/mlton/mlton-compile.debug$(EXE)" "$(LIB)/" |
| 182 | $(SED) -e 's/mlton-compile/mlton-compile.debug/' \ |
| 183 | < "$(BIN)/mlton" \ |
| 184 | > "$(BIN)/mlton.debug" |
| 185 | chmod u+x "$(BIN)/mlton.debug" |
| 186 | |
| 187 | .PHONY: dirs |
| 188 | dirs: |
| 189 | $(MKDIR) "$(BIN)" "$(LIB)" "$(INC)" |
| 190 | $(MKDIR) "$(LIB)/targets/$(TARGET)/include" |
| 191 | $(MKDIR) "$(LIB)/targets/$(TARGET)/sml" |
| 192 | |
| 193 | .PHONY: docs |
| 194 | docs: |
| 195 | $(MAKE) -C "$(SRC)/mllex" docs |
| 196 | $(MAKE) -C "$(SRC)/mlyacc" docs |
| 197 | $(MAKE) -C "$(SRC)/doc/guide" |
| 198 | |
| 199 | define LIBRARIES_NO_CHECK_TEMPLATE |
| 200 | $(RM) "$(LIB)/sml/$(1)" |
| 201 | $(MKDIR) "$(LIB)/sml/$(1)" |
| 202 | ( \ |
| 203 | cd "$(SRC)/lib/$(1)$(2)" && \ |
| 204 | $(FIND) . '!' -path '*/.cm/*' $(3) -type f '(' -name '*.mlb' -o -name '*.sml' -o -name '*.sig' -o -name '*.fun' ')' | \ |
| 205 | $(XARGS) $(TAR) cf - | \ |
| 206 | ( cd "$(LIB)/sml/$(1)" && $(TAR) xf - ) \ |
| 207 | ) |
| 208 | |
| 209 | endef |
| 210 | |
| 211 | .PHONY: libraries-no-check |
| 212 | libraries-no-check: |
| 213 | $(MAKE) -C "$(SRC)/lib/ckit-lib" |
| 214 | $(call LIBRARIES_NO_CHECK_TEMPLATE,ckit-lib,/ckit/src,) |
| 215 | $(call LIBRARIES_NO_CHECK_TEMPLATE,cml,,'!' -path '*/tests/*') |
| 216 | $(MAKE) -C "$(SRC)/lib/mllpt-lib" |
| 217 | $(call LIBRARIES_NO_CHECK_TEMPLATE,mllpt-lib,/ml-lpt/lib,) |
| 218 | $(MAKE) -C "$(SRC)/lib/mlnlffi-lib" |
| 219 | $(call LIBRARIES_NO_CHECK_TEMPLATE,mlnlffi-lib,,) |
| 220 | $(MAKE) -C "$(SRC)/lib/mlrisc-lib" |
| 221 | $(call LIBRARIES_NO_CHECK_TEMPLATE,mlrisc-lib,/MLRISC,'!' -path '*/demo/*' '!' -path '*/Tools/*' '!' -path './autoload.sml' '!' -path './make*.sml') |
| 222 | $(call LIBRARIES_NO_CHECK_TEMPLATE,mlyacc-lib,,) |
| 223 | $(MAKE) -C "$(SRC)/lib/smlnj-lib" |
| 224 | $(call LIBRARIES_NO_CHECK_TEMPLATE,smlnj-lib,/smlnj-lib,'!' -path '*/examples/*' '!' -path '*/tests/*' '!' -path '*/Tests/*') |
| 225 | |
| 226 | define LIBRARIES_CHECK_TEMPLATE |
| 227 | @echo "Type checking $(1) library." |
| 228 | "$(BIN)/mlton" -disable-ann deadCode -stop tc '$$(SML_LIB)/$(1)/$(1).mlb' >/dev/null |
| 229 | endef |
| 230 | |
| 231 | .PHONY: libraries-check |
| 232 | libraries-check: |
| 233 | $(call LIBRARIES_CHECK_TEMPLATE,ckit-lib) |
| 234 | $(call LIBRARIES_CHECK_TEMPLATE,cml) |
| 235 | $(call LIBRARIES_CHECK_TEMPLATE,mllpt-lib) |
| 236 | $(call LIBRARIES_CHECK_TEMPLATE,mlnlffi-lib) |
| 237 | $(call LIBRARIES_CHECK_TEMPLATE,mlrisc-lib) |
| 238 | $(call LIBRARIES_CHECK_TEMPLATE,mlyacc-lib) |
| 239 | $(call LIBRARIES_CHECK_TEMPLATE,smlnj-lib) |
| 240 | |
| 241 | .PHONY: libraries |
| 242 | libraries: |
| 243 | $(MAKE) libraries-no-check |
| 244 | $(MAKE) libraries-check |
| 245 | |
| 246 | .PHONY: polyml-mlton |
| 247 | polyml-mlton: |
| 248 | $(MAKE) dirs runtime |
| 249 | $(MAKE) -C "$(SRC)/mlton" polyml-mlton |
| 250 | $(CP) "$(SRC)/mlton/mlton-polyml$(EXE)" "$(LIB)/" |
| 251 | $(MAKE) script basis-no-check constants libraries-no-check |
| 252 | $(SED) \ |
| 253 | -e 's;doitMLton "$$@";# doitMLton "$$@";' \ |
| 254 | -e 's;doitSMLNJ "$$@";# doitSMLNJ "$$@";' \ |
| 255 | < "$(BIN)/mlton" \ |
| 256 | > "$(BIN)/mlton.polyml" |
| 257 | chmod u+x "$(BIN)/mlton.polyml" |
| 258 | @echo 'Build of MLton (with Poly/ML) succeeded.' |
| 259 | |
| 260 | define PROFILED_TEMPLATE |
| 261 | $(MAKE) -C "$(SRC)/mlton" MLTON_OUTPUT=mlton-compile.$(1) \ |
| 262 | MLTON_COMPILE_ARGS="$(MLTON_COMPILE_ARGS) -profile $(1)" |
| 263 | $(CP) "$(SRC)/mlton/mlton-compile.$(1)$(EXE)" "$(LIB)/" |
| 264 | $(SED) -e "s/mlton-compile/mlton-compile.$(1)/" \ |
| 265 | < "$(BIN)/mlton" \ |
| 266 | >"$(BIN)/mlton.$(1)" |
| 267 | chmod u+x "$(BIN)/mlton.$(1)" |
| 268 | endef |
| 269 | |
| 270 | .PHONY: profiled-alloc |
| 271 | profiled-alloc: |
| 272 | $(call PROFILED_TEMPLATE,alloc) |
| 273 | |
| 274 | .PHONY: profiled-count |
| 275 | profiled-count: |
| 276 | $(call PROFILED_TEMPLATE,count) |
| 277 | |
| 278 | .PHONY: profiled-time |
| 279 | profiled-time: |
| 280 | $(call PROFILED_TEMPLATE,time) |
| 281 | |
| 282 | .PHONY: profiled |
| 283 | $(MAKE) profiled-alloc |
| 284 | $(MAKE) profiled-count |
| 285 | $(MAKE) profiled-time |
| 286 | |
| 287 | .PHONY: runtime |
| 288 | runtime: |
| 289 | @echo 'Compiling MLton runtime system for $(TARGET).' |
| 290 | $(MAKE) -C "$(SRC)/runtime" |
| 291 | $(CP) "$(SRC)/include/"*.h "$(INC)/" |
| 292 | $(CP) "$(SRC)/runtime/"*.a "$(LIB)/targets/$(TARGET)/" |
| 293 | $(CP) "$(SRC)/runtime/gen/sizes" "$(LIB)/targets/$(TARGET)/" |
| 294 | $(CP) "$(SRC)/runtime/gen/c-types.sml" "$(LIB)/targets/$(TARGET)/sml/" |
| 295 | echo "$(TARGET_OS)" > "$(LIB)/targets/$(TARGET)/os" |
| 296 | echo "$(TARGET_ARCH)" > "$(LIB)/targets/$(TARGET)/arch" |
| 297 | $(CP) "$(SRC)/runtime/gen/basis-ffi.sml" \ |
| 298 | basis-library/primitive/basis-ffi.sml |
| 299 | $(CP) "$(SRC)/runtime/"*.h "$(INC)/" |
| 300 | $(MV) "$(INC)/c-types.h" "$(LIB)/targets/$(TARGET)/include" |
| 301 | for d in basis basis/Real basis/Word gc platform util; do \ |
| 302 | $(MKDIR) "$(INC)/$$d"; \ |
| 303 | $(CP) "$(SRC)/runtime/$$d/"*.h "$(INC)/$$d"; \ |
| 304 | done |
| 305 | |
| 306 | .PHONY: script |
| 307 | script: |
| 308 | $(SED) \ |
| 309 | -e "s;^EXE=.*;EXE=\"$(EXE)\";" \ |
| 310 | -e "s;^CC=.*;CC=\"$(CC)\";" \ |
| 311 | -e "s;^GMP_INC_DIR=.*;GMP_INC_DIR=\"$(WITH_GMP_INC_DIR)\";" \ |
| 312 | -e "s;^GMP_LIB_DIR=.*;GMP_LIB_DIR=\"$(WITH_GMP_LIB_DIR)\";" \ |
| 313 | < "$(SRC)/bin/mlton-script" > "$(BIN)/mlton" |
| 314 | chmod a+x "$(BIN)/mlton" |
| 315 | $(CP) "$(SRC)/bin/static-library" "$(LIB)" |
| 316 | ifeq (mingw, $(TARGET_OS)) |
| 317 | $(CP) "$(SRC)/bin/static-library.bat" "$(LIB)" |
| 318 | endif |
| 319 | |
| 320 | .PHONY: smlnj-mlton |
| 321 | smlnj-mlton: |
| 322 | $(MAKE) dirs runtime |
| 323 | $(MAKE) -C "$(SRC)/mlton" smlnj-mlton |
| 324 | smlnj_heap_suffix=`echo 'TextIO.output (TextIO.stdErr, SMLofNJ.SysInfo.getHeapSuffix ());' | sml 2>&1 1> /dev/null` && $(CP) "$(SRC)/mlton/mlton-smlnj.$$smlnj_heap_suffix" "$(LIB)/" |
| 325 | $(MAKE) script basis-no-check constants libraries-no-check |
| 326 | $(SED) \ |
| 327 | -e 's;doitMLton "$$@";# doitMLton "$$@";' \ |
| 328 | -e 's;doitPolyML "$$@";# doitPolyML "$$@";' \ |
| 329 | < "$(BIN)/mlton" \ |
| 330 | > "$(BIN)/mlton.smlnj" |
| 331 | chmod u+x "$(BIN)/mlton.smlnj" |
| 332 | @echo 'Build of MLton (with SML/NJ) succeeded.' |
| 333 | |
| 334 | .PHONY: smlnj-mlton-x2 |
| 335 | smlnj-mlton-x2: |
| 336 | $(MAKE) SMLNJ_CM_SERVERS_NUM=2 smlnj-mlton |
| 337 | |
| 338 | .PHONY: smlnj-mlton-x4 |
| 339 | smlnj-mlton-x4: |
| 340 | $(MAKE) SMLNJ_CM_SERVERS_NUM=4 smlnj-mlton |
| 341 | |
| 342 | .PHONY: smlnj-mlton-x8 |
| 343 | smlnj-mlton-x8: |
| 344 | $(MAKE) SMLNJ_CM_SERVERS_NUM=8 smlnj-mlton |
| 345 | |
| 346 | .PHONY: smlnj-mlton-x16 |
| 347 | smlnj-mlton-x16: |
| 348 | $(MAKE) SMLNJ_CM_SERVERS_NUM=16 smlnj-mlton |
| 349 | |
| 350 | .PHONY: traced |
| 351 | traced: |
| 352 | $(MAKE) -C "$(SRC)/mlton" MLTON_OUTPUT=mlton-compile.trace \ |
| 353 | MLTON_COMPILE_ARGS="$(MLTON_COMPILE_ARGS) -const 'Exn.keepHistory true' -profile-val true -const 'MLton.debug true' -disable-pass 'deepFlatten'" |
| 354 | $(CP) "$(SRC)/mlton/mlton-compile.trace$(EXE)" "$(LIB)/" |
| 355 | $(SED) -e 's/mlton-compile/mlton-compile.trace/' \ |
| 356 | < "$(BIN)/mlton" \ |
| 357 | > "$(BIN)/mlton.trace" |
| 358 | chmod u+x "$(BIN)/mlton.trace" |
| 359 | |
| 360 | ifeq (true, $(CHECK_FIXPOINT)) |
| 361 | define TOOLS_TEMPLATE_CHECK_FIXPOINT |
| 362 | $(DIFF) -b "$(SRC)/$(1)/$(1)$(EXE)" "$(BIN)/$(1)$(EXE)" |
| 363 | endef |
| 364 | else |
| 365 | define TOOLS_TEMPLATE_CHECK_FIXPOINT |
| 366 | endef |
| 367 | endif |
| 368 | |
| 369 | define TOOLS_TEMPLATE |
| 370 | $(MAKE) -C "$(SRC)/$(1)" |
| 371 | $(call TOOLS_TEMPLATE_CHECK_FIXPOINT,$(1)) |
| 372 | $(CP) "$(1)/$(1)$(EXE)" "$(BIN)/" |
| 373 | endef |
| 374 | |
| 375 | .PHONY: tools |
| 376 | tools: |
| 377 | $(call TOOLS_TEMPLATE,mllex) |
| 378 | $(call TOOLS_TEMPLATE,mlyacc) |
| 379 | $(call TOOLS_TEMPLATE,mlprof) |
| 380 | $(call TOOLS_TEMPLATE,mlnlffigen) |
| 381 | |
| 382 | .PHONY: tools-clean |
| 383 | tools-clean: |
| 384 | $(MAKE) -C "$(SRC)/mllex" clean |
| 385 | $(MAKE) -C "$(SRC)/mlyacc" clean |
| 386 | $(MAKE) -C "$(SRC)/mlprof" clean |
| 387 | $(MAKE) -C "$(SRC)/mlnlffigen" clean |
| 388 | |
| 389 | .PHONY: check |
| 390 | check: |
| 391 | ./bin/regression $(CHECK_ARGS) |
| 392 | |
| 393 | |
| 394 | .PHONY: version |
| 395 | version: |
| 396 | @echo 'Instantiating version numbers.' |
| 397 | for f in \ |
| 398 | "$(SRC)/Makefile" \ |
| 399 | "$(SRC)/mlton/Makefile" \ |
| 400 | "$(SRC)/doc/guide/Makefile" \ |
| 401 | ; do \ |
| 402 | $(SED) -e "s/^MLTON_VERSION := .*/MLTON_VERSION := $(MLTON_VERSION)/" <"$$f" >z && \ |
| 403 | mv z "$$f"; \ |
| 404 | done |
| 405 | |
| 406 | |
| 407 | prefix := $(PREFIX) |
| 408 | exec_prefix := $(prefix) |
| 409 | bindir := $(exec_prefix)/bin |
| 410 | datarootdir := $(prefix)/share |
| 411 | docdir := $(datarootdir)/doc/mlton |
| 412 | libdir := $(exec_prefix)/lib |
| 413 | mandir := $(datarootdir)/man |
| 414 | man1dir := $(mandir)/man1 |
| 415 | |
| 416 | TBIN := $(DESTDIR)$(bindir) |
| 417 | TLIB := $(DESTDIR)$(libdir)/mlton |
| 418 | TMAN := $(DESTDIR)$(man1dir) |
| 419 | TDOC := $(DESTDIR)$(docdir) |
| 420 | TEXM := $(TDOC)/examples |
| 421 | |
| 422 | GZIP_MAN := true |
| 423 | ifeq ($(findstring $(TARGET_OS), openbsd solaris), $(TARGET_OS)) |
| 424 | GZIP_MAN := false |
| 425 | endif |
| 426 | |
| 427 | .PHONY: install |
| 428 | install: install-no-strip install-strip install-docs |
| 429 | |
| 430 | MAN_PAGES := \ |
| 431 | mllex.1 \ |
| 432 | mlnlffigen.1 \ |
| 433 | mlprof.1 \ |
| 434 | mlton.1 \ |
| 435 | mlyacc.1 |
| 436 | |
| 437 | .PHONY: install-no-strip |
| 438 | install-no-strip: |
| 439 | $(MKDIR) "$(TBIN)" "$(TLIB)" "$(TMAN)" |
| 440 | $(CP) "$(BIN)/." "$(TBIN)/" |
| 441 | $(CP) "$(LIB)/." "$(TLIB)/" |
| 442 | cd "$(SRC)/man" && $(CP) $(MAN_PAGES) "$(TMAN)/" |
| 443 | ifeq (true, $(GZIP_MAN)) |
| 444 | cd "$(TMAN)" && $(GZIP) --force --best $(MAN_PAGES); |
| 445 | endif |
| 446 | |
| 447 | .PHONY: install-strip |
| 448 | install-strip: install-no-strip |
| 449 | for f in "$(TLIB)/mlton-compile$(EXE)" \ |
| 450 | "$(TBIN)/mllex$(EXE)" \ |
| 451 | "$(TBIN)/mlyacc$(EXE)" \ |
| 452 | "$(TBIN)/mlprof$(EXE)" \ |
| 453 | "$(TBIN)/mlnlffigen$(EXE)"; do \ |
| 454 | $(STRIP) "$$f"; \ |
| 455 | done |
| 456 | |
| 457 | REGRESSION_EXAMPLES := \ |
| 458 | callcc.sml command-line.sml hello-world.sml same-fringe.sml \ |
| 459 | signals.sml size.sml taut.sml thread1.sml thread2.sml \ |
| 460 | thread-switch.sml timeout.sml |
| 461 | |
| 462 | .PHONY: install-docs |
| 463 | install-docs: |
| 464 | $(MKDIR) "$(TDOC)" "$(TDOC)/license" |
| 465 | ( \ |
| 466 | cd "$(SRC)" && \ |
| 467 | $(CP) CHANGELOG.adoc README.adoc "$(TDOC)/" && \ |
| 468 | $(CP) LICENSE "$(TDOC)/license/MLton-LICENSE" \ |
| 469 | ) |
| 470 | ( \ |
| 471 | cd "$(SRC)/doc" && \ |
| 472 | $(FIND) examples -type f '!' -name .gitignore \ |
| 473 | | $(XARGS) $(TAR) cf - \ |
| 474 | | ( cd "$(TDOC)/" && $(TAR) xf - ) \ |
| 475 | ) |
| 476 | ( \ |
| 477 | cd "$(SRC)/doc" && \ |
| 478 | $(FIND) license -type f '!' -name .gitignore \ |
| 479 | | $(XARGS) $(TAR) cf - \ |
| 480 | | ( cd "$(TDOC)/" && $(TAR) xf - ) \ |
| 481 | ) |
| 482 | if [ -d "$(SRC)/doc/guide/localhost" ]; then \ |
| 483 | $(CP) "$(SRC)/doc/guide/localhost" "$(TDOC)/guide"; \ |
| 484 | fi |
| 485 | if [ -r "$(SRC)/doc/guide/mlton-guide.pdf" ]; then \ |
| 486 | $(CP) "$(SRC)/doc/guide/mlton-guide.pdf" "$(TDOC)/"; \ |
| 487 | fi |
| 488 | if [ -r "mllex/mllex.pdf" ]; then \ |
| 489 | $(CP) "mllex/mllex.pdf" "$(TDOC)/"; \ |
| 490 | fi |
| 491 | if [ -r "mlyacc/mlyacc.pdf" ]; then \ |
| 492 | $(CP) "mlyacc/mlyacc.pdf" "$(TDOC)/"; \ |
| 493 | fi |
| 494 | ( \ |
| 495 | cd "$(SRC)/util" && \ |
| 496 | $(FIND) cm2mlb -type f '!' -name .gitignore \ |
| 497 | | $(XARGS) $(TAR) cf - \ |
| 498 | | ( cd "$(TDOC)/" && $(TAR) xf - ) \ |
| 499 | ) |
| 500 | ( \ |
| 501 | cd "$(SRC)/regression" && \ |
| 502 | $(CP) $(REGRESSION_EXAMPLES) "$(TEXM)/" \ |
| 503 | ) |
| 504 | |
| 505 | |
| 506 | .PHONY: source-release |
| 507 | source-release: |
| 508 | $(MAKE) clean |
| 509 | $(MAKE) MLTON_VERSION=$(MLTON_VERSION) version |
| 510 | ( cd "$(SRC)/mllex" ; latexmk -pdf lexgen ; latexmk -c lexgen ) |
| 511 | $(MAKE) -C "$(SRC)/mllex" mllex.pdf |
| 512 | ( cd "$(SRC)/mlyacc/doc"; latexmk -pdf mlyaccc ; latexmk -c mlyacc ) |
| 513 | $(MAKE) -C "$(SRC)/mlyacc" mlyacc.pdf |
| 514 | $(MAKE) -C doc/guide |
| 515 | $(TAR) cvzf ../mlton-$(MLTON_VERSION).src.tgz \ |
| 516 | --exclude .git --exclude package \ |
| 517 | --transform "s@^@mlton-$(MLTON_VERSION)/@S" \ |
| 518 | * |
| 519 | |
| 520 | MLTON_BINARY_RELEASE := 1 |
| 521 | MLTON_BINARY_RELEASE_SUFFIX := |
| 522 | .PHONY: binary-release |
| 523 | binary-release: |
| 524 | $(MAKE) all docs |
| 525 | $(RM) "$(SRC)/mlton-$(MLTON_VERSION)-$(MLTON_BINARY_RELEASE).$(TARGET_ARCH)-$(TARGET_OS)$(MLTON_BINARY_RELEASE_SUFFIX)" |
| 526 | $(MKDIR) "$(SRC)/mlton-$(MLTON_VERSION)-$(MLTON_BINARY_RELEASE).$(TARGET_ARCH)-$(TARGET_OS)$(MLTON_BINARY_RELEASE_SUFFIX)" |
| 527 | $(MAKE) DESTDIR="$(SRC)/mlton-$(MLTON_VERSION)-$(MLTON_BINARY_RELEASE).$(TARGET_ARCH)-$(TARGET_OS)$(MLTON_BINARY_RELEASE_SUFFIX)" PREFIX="" install |
| 528 | $(CP) "$(SRC)/Makefile.binary" "$(SRC)/mlton-$(MLTON_VERSION)-$(MLTON_BINARY_RELEASE).$(TARGET_ARCH)-$(TARGET_OS)$(MLTON_BINARY_RELEASE_SUFFIX)/Makefile" |
| 529 | $(CP) "$(SRC)/CHANGELOG.adoc" "$(SRC)/LICENSE" "$(SRC)/README.adoc" "$(SRC)/mlton-$(MLTON_VERSION)-$(MLTON_BINARY_RELEASE).$(TARGET_ARCH)-$(TARGET_OS)$(MLTON_BINARY_RELEASE_SUFFIX)/" |
| 530 | $(TAR) cvzf ../mlton-$(MLTON_VERSION)-$(MLTON_BINARY_RELEASE).$(TARGET_ARCH)-$(TARGET_OS)$(MLTON_BINARY_RELEASE_SUFFIX).tgz \ |
| 531 | mlton-$(MLTON_VERSION)-$(MLTON_BINARY_RELEASE).$(TARGET_ARCH)-$(TARGET_OS)$(MLTON_BINARY_RELEASE_SUFFIX) |
| 532 | $(RM) mlton-$(MLTON_VERSION)-$(MLTON_BINARY_RELEASE).$(TARGET_ARCH)-$(TARGET_OS)$(MLTON_BINARY_RELEASE_SUFFIX) |
| 533 | |
| 534 | BSDSRC := /tmp/mlton-$(MLTON_VERSION) |
| 535 | MLTON_FREEBSD_RELEASE := 1 |
| 536 | .PHONY: freebsd |
| 537 | freebsd: |
| 538 | $(MAKE) clean clean-git version |
| 539 | $(RM) "$(BSDSRC)" |
| 540 | $(MKDIR) "$(BSDSRC)" |
| 541 | ( cd $(SRC) && tar -cpf - . ) | ( cd "$(BSDSRC)" && tar -xpf - ) |
| 542 | cd /tmp && tar -cpf - mlton-$(MLTON_VERSION) | \ |
| 543 | $(GZIP) --force --best >/usr/ports/distfiles/mlton-$(MLTON_VERSION)-$(MLTON_FREEBSD_RELEASE).freebsd.src.tgz |
| 544 | # do not change "make" to "$(MAKE)" in the following line |
| 545 | cd "$(BSDSRC)/package/freebsd" && MAINTAINER_MODE=yes make build-package |