travis: add vimscript to matrix
[jackhill/mal.git] / Makefile
index a1077f4..389c9d8 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -16,7 +16,7 @@ mal_TEST_OPTS = --start-timeout 60 --test-timeout 120
 # Settings
 #
 
-IMPLS = awk bash c clojure coffee cpp crystal cs erlang elixir es6 factor forth fsharp go groovy \
+IMPLS = awk bash c clojure coffee cpp crystal cs erlang elixir es6 factor forth fsharp go groovy \
        guile haskell java julia js kotlin lua make mal ocaml matlab miniMAL nim \
        perl php ps python r racket rpython ruby rust scala swift tcl vb vimscript
 
@@ -37,6 +37,7 @@ EXCLUDE_TESTS += test^bash^step5 # no stack exhaustion or completion
 EXCLUDE_TESTS += test^c^step5    # segfault
 EXCLUDE_TESTS += test^cpp^step5  # completes at 10,000
 EXCLUDE_TESTS += test^cs^step5   # fatal stack overflow fault
+EXCLUDE_TESTS += test^d^step5    # completes at 10,000, fatal stack overflow at 1,000,000
 EXCLUDE_TESTS += test^erlang^step5 # erlang is TCO, test passes
 EXCLUDE_TESTS += test^elixir^step5 # elixir is TCO, test passes
 EXCLUDE_TESTS += test^fsharp^step5 # completes at 10,000, fatal stack overflow at 100,000
@@ -65,6 +66,7 @@ STEP_TEST_FILES = $(strip $(wildcard $(1)/tests/$($(2)).mal) $(wildcard tests/$(
 awk_STEP_TO_PROG =     awk/$($(1)).awk
 bash_STEP_TO_PROG =    bash/$($(1)).sh
 c_STEP_TO_PROG =       c/$($(1))
+d_STEP_TO_PROG =       d/$($(1))
 clojure_STEP_TO_PROG = clojure/src/$($(1)).clj
 coffee_STEP_TO_PROG =  coffee/$($(1)).coffee
 cpp_STEP_TO_PROG =     cpp/$($(1))
@@ -115,6 +117,7 @@ export FACTOR_ROOTS := .
 awk_RUNSTEP =     awk -O -f ../$(2) $(3)
 bash_RUNSTEP =    bash ../$(2) $(3)
 c_RUNSTEP =       ../$(2) $(3)
+d_RUNSTEP =       ../$(2) $(3)
 clojure_RUNSTEP = lein with-profile +$(1) trampoline run $(3)
 coffee_RUNSTEP =  coffee ../$(2) $(3)
 cpp_RUNSTEP =     ../$(2) $(3)
@@ -152,7 +155,7 @@ ruby_RUNSTEP =    ruby ../$(2) $(3)
 rust_RUNSTEP =    ../$(2) $(3)
 scala_RUNSTEP =   sbt 'run-main $($(1))$(if $(3), $(3),)'
 swift_RUNSTEP =   ../$(2) $(3)
-tcl_RUNSTEP =     tclsh ../$(2) $(3)
+tcl_RUNSTEP =     tclsh ../$(2) --raw $(3)
 vb_RUNSTEP =      mono ../$(2) --raw $(3)
 vimscript_RUNSTEP = ./run_vimscript.sh ../$(2) $(3)
 # needs TERM=dumb to work with readline
@@ -181,13 +184,22 @@ DOCKER_BUILD = $(foreach impl,$(DO_IMPLS),docker-build^$(impl))
 
 IMPL_PERF = $(filter-out $(EXCLUDE_PERFS),$(foreach impl,$(DO_IMPLS),perf^$(impl)))
 
+IMPL_REPL = $(foreach impl,$(DO_IMPLS),repl^$(impl))
+ALL_REPL = $(strip $(sort \
+             $(foreach impl,$(DO_IMPLS),\
+               $(foreach step,$(STEPS),repl^$(impl)^$(step)))))
+
 #
 # Build rules
 #
 
 # Build a program in an implementation directory
+# Make sure we always try and build first because the dependencies are
+# encoded in the implementation Makefile not here
+.PHONY: $(foreach i,$(DO_IMPLS),$(foreach s,$(STEPS),$(call $(i)_STEP_TO_PROG,$(s))))
 $(foreach i,$(DO_IMPLS),$(foreach s,$(STEPS),$(call $(i)_STEP_TO_PROG,$(s)))):
-       $(MAKE) -C $(dir $(@)) $(notdir $(@))
+       $(foreach impl,$(word 1,$(subst /, ,$(@))),\
+         $(MAKE) -C $(impl) $(subst $(impl)/,,$(@)))
 
 # Allow test, test^STEP, test^IMPL, and test^IMPL^STEP
 .SECONDEXPANSION:
@@ -257,3 +269,18 @@ $(IMPL_PERF):
           $(call $(impl)_RUNSTEP,stepA,$(call $(impl)_STEP_TO_PROG,stepA),../tests/perf2.mal); \
          echo 'Running: $(call $(impl)_RUNSTEP,stepA,$(call $(impl)_STEP_TO_PROG,stepA),../tests/perf3.mal)'; \
           $(call $(impl)_RUNSTEP,stepA,$(call $(impl)_STEP_TO_PROG,stepA),../tests/perf3.mal))
+
+# REPL invocation rules
+# Allow repl^IMPL^STEP and repl^IMPL (which starts REPL of stepA)
+
+.SECONDEXPANSION:
+$(IMPL_REPL): $$@^stepA
+
+.SECONDEXPANSION:
+$(ALL_REPL): $$(call $$(word 2,$$(subst ^, ,$$(@)))_STEP_TO_PROG,$$(word 3,$$(subst ^, ,$$(@))))
+       @$(foreach impl,$(word 2,$(subst ^, ,$(@))),\
+         $(foreach step,$(word 3,$(subst ^, ,$(@))),\
+           cd $(if $(filter mal,$(impl)),$(MAL_IMPL),$(impl)); \
+           echo 'REPL implementation $(impl), step file: $+'; \
+           echo 'Running: $(call $(impl)_RUNSTEP,$(step),$(+))'; \
+           $(call $(impl)_RUNSTEP,$(step),$(+));))