Skip to content

Commit

Permalink
Refactor to use run scripts, remove *_RUNSTEP
Browse files Browse the repository at this point in the history
- Add */run script for every implementation.

- Refactor Clojure build to allow individual jar files for each step.

- Update FFI version for es6 and miniMAL to work with newer node
  versions.

The run scripts for the following could use some additional
refactoring:
- java: build individual step jar, use java -jar instead of mvn to run
- plpgsql: maybe combine plpgsql/run and plpgsql/wrap.sh
- vhdl: combine vhdl/run and vhdl/run_vhdl.sh
- vimscript: combine vimscript/run and vimscript/run_vimscript.sh
  • Loading branch information
kanaka committed May 19, 2016
1 parent f8985c0 commit 20e8dea
Show file tree
Hide file tree
Showing 65 changed files with 233 additions and 114 deletions.
127 changes: 45 additions & 82 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -125,12 +125,7 @@ haxe_STEP_TO_PROG_python = haxe/$($(1)).py
haxe_STEP_TO_PROG_cpp = haxe/cpp/$($(1))
haxe_STEP_TO_PROG_js = haxe/$($(1)).js

haxe_RUNSTEP_neko = neko ../$(2) $(3)
haxe_RUNSTEP_python = python3 ../$(2) $(3)
haxe_RUNSTEP_cpp = ../$(2) $(3)
haxe_RUNSTEP_js = node ../$(2) $(3)

opt_DEFERRABLE = $(if $(strip $(DEFERRABLE)),$(if $(filter t true T True TRUE 1 y yes Yes YES,$(DEFERRABLE)),--deferrable,--no-deferrable),--no-deferrable)
opt_DEFERRABLE = $(if $(strip $(DEFERRABLE)),$(if $(filter t true T True TRUE 1 y yes Yes YES,$(DEFERRABLE)),--deferrable,--no-deferrable),--no-deferrable)
opt_OPTIONAL = $(if $(strip $(OPTIONAL)),$(if $(filter t true T True TRUE 1 y yes Yes YES,$(OPTIONAL)),--optional,--no-optional),--no-optional)

# Return list of test files for a given step. If REGRESS is set then
Expand All @@ -146,7 +141,7 @@ 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
clojure_STEP_TO_PROG = clojure/target/$($(1)).jar
coffee_STEP_TO_PROG = coffee/$($(1)).coffee
cpp_STEP_TO_PROG = cpp/$($(1))
crystal_STEP_TO_PROG = crystal/$($(1))
Expand Down Expand Up @@ -202,76 +197,44 @@ noop =
SPACE = $(noop) $(noop)
export FACTOR_ROOTS := .

# Macro for running a step:
# $(1): step (e.g. "stepA")
# $(2): program for step (e.g. result of *_STEP_TO_PROG
# $(3): program arguments
ada_RUNSTEP = ../$(2) $(3)
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)
crystal_RUNSTEP = ../$(2) $(3)
cs_RUNSTEP = mono ../$(2) --raw $(3)
elisp_RUNSTEP = emacs -Q --batch --load ../$(2) $(3)
elixir_RUNSTEP = mix $(notdir $(basename $(2))) $(3)
erlang_RUNSTEP = ../$(2) $(3)
es6_RUNSTEP = node ../$(2) $(3)
factor_RUNSTEP = factor ../$(2) $(3)
forth_RUNSTEP = gforth ../$(2) $(3)
fsharp_RUNSTEP = mono ../$(2) --raw $(3)
go_RUNSTEP = ../$(2) $(3)
groovy_RUNSTEP = groovy ../$(2) $(3)
# needs TERM=dumb to work with readline
guile_RUNSTEP = guile --no-auto-compile -L ../guile ../$(2) $(3)
haskell_RUNSTEP = ../$(2) $(3)
haxe_RUNSTEP = python3 ../$(2) $(3)
haxe_RUNSTEP = $(haxe_RUNSTEP_$(HAXE_MODE))
io_RUNSTEP = env STEP=$($(1)) ./run $(3)
java_RUNSTEP = env STEP=$($(1)) ./run $(3)
julia_RUNSTEP = ../$(2) $(3)
js_RUNSTEP = node ../$(2) $(3)
kotlin_RUNSTEP = java -jar ../$(2) $(3)
lua_RUNSTEP = ../$(2) $(3)
make_RUNSTEP = make --no-print-directory -f ../$(2) $(3)
mal_RUNSTEP = $(call $(MAL_IMPL)_RUNSTEP,stepA,$(call $(MAL_IMPL)_STEP_TO_PROG,stepA),../$(2),") #"
ocaml_RUNSTEP = ../$(2) $(3)
matlab_RUNSTEP = env USE_MATLAB=$(USE_MATLAB) STEP=$($(1)) ./run $(3)
miniMAL_RUNSTEP = miniMAL ../$(2) $(3)
nim_RUNSTEP = ../$(2) $(3)
objc_RUNSTEP = ../$(2) $(3)
objpascal_RUNSTEP = ../$(2) $(3)
perl_RUNSTEP = perl ../$(2) $(3)
php_RUNSTEP = php ../$(2) $(3)
plpgsql_RUNSTEP = ./wrap.sh ../$(2) $(3)
ps_RUNSTEP = gs -q -I./ -dNODISPLAY -- ../$(2) $(3)
python_RUNSTEP = $(PYTHON) ../$(2) $(3)
r_RUNSTEP = Rscript ../$(2) $(3)
racket_RUNSTEP = ../$(2) $(3)
rpython_RUNSTEP = ../$(2) $(3)
ruby_RUNSTEP = ruby ../$(2) $(3)
rust_RUNSTEP = ../$(2) $(3)
scala_RUNSTEP = env STEP=$($(1)) ./run $(3)
swift_RUNSTEP = ../$(2) $(3)
swift3_RUNSTEP = ../$(2) $(3)
tcl_RUNSTEP = tclsh ../$(2) --raw $(3)
vb_RUNSTEP = mono ../$(2) --raw $(3)
vhdl_RUNSTEP = ./run_vhdl.sh ../$(2) $(3)
vimscript_RUNSTEP = ./run_vimscript.sh ../$(2) $(3)


# DOCKERIZE utility functions
lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$1))))))))))))))))))))))))))
impl_to_image = kanaka/mal-test-$(call lc,$(1))

actual_impl = $(if $(filter mal,$(1)),$(MAL_IMPL),$(1))

# Takes impl
# Returns nothing if DOCKERIZE is not set, otherwise returns the
# docker prefix necessary to run make within the docker environment
# for this impl
get_build_prefix = $(if $(strip $(DOCKERIZE)),docker run -it --rm -u $(shell id -u) -v $(dir $(abspath $(lastword $(MAKEFILE_LIST)))):/mal -w /mal/$(1) $(if $(filter factor,$(1)),-e FACTOR_ROOTS=$(FACTOR_ROOTS),) $(call impl_to_image,$(1)) ,)
get_run_prefix = $(if $(strip $(DOCKERIZE)),docker run -it --rm -u $(shell id -u) -v $(dir $(abspath $(lastword $(MAKEFILE_LIST)))):/mal -w /mal/$(call actual_impl,$(1)) $(if $(filter factor,$(1)),-e FACTOR_ROOTS=$(FACTOR_ROOTS),) $(call impl_to_image,$(call actual_impl,$(1))) ,)

# Takes impl and step arguments
# Returns a command prefix (docker command and environment variables)
# necessary to launch the given impl and step
get_run_prefix = $(strip $(if $(strip $(DOCKERIZE)),\
docker run -e STEP=$($2) \
-it --rm -u $(shell id -u) \
-v $(dir $(abspath $(lastword $(MAKEFILE_LIST)))):/mal \
-w /mal/$(call actual_impl,$(1)) \
$(if $(filter haxe,$(1)),-e HAXE_MODE=$(HAXE_MODE),) \
$(if $(filter factor,$(1)),-e FACTOR_ROOTS=$(FACTOR_ROOTS),) \
$(foreach env,$(3),-e $(env)) \
$(call impl_to_image,$(call actual_impl,$(1))) \
,\
env STEP=$($2) \
$(if $(filter haxe,$(1)),HAXE_MODE=$(HAXE_MODE),) \
$(if $(filter factor,$(1)),FACTOR_ROOTS=$(FACTOR_ROOTS),) \
$(3)))

# Takes impl and step
# Returns the runtest command prefix (with runtest options) for testing the given step
get_runtest_cmd = $(call get_run_prefix,$(1),$(2),$(if $(filter cs fsharp tcl vb,$(1)),RAW=1,)) \
../runtest.py $(TEST_OPTS) $(opt_DEFERRABLE) $(opt_OPTIONAL) $(call $(1)_TEST_OPTS)

# Takes impl and step
# Returns the runtest command prefix (with runtest options) for testing the given step
get_argvtest_cmd = $(call get_run_prefix,$(1),$(2)) ../run_argv_test.sh

vimscript_TEST_OPTS = --test-timeout 30
ifeq ($(MAL_IMPL),vimscript)
Expand Down Expand Up @@ -330,14 +293,14 @@ $(ALL_TESTS): $$(call $$(word 2,$$(subst ^, ,$$(@)))_STEP_TO_PROG,$$(word 3,$$(s
cd $(if $(filter mal,$(impl)),$(MAL_IMPL),$(impl)) && \
$(foreach test,$(call STEP_TEST_FILES,$(impl),$(step)),\
echo '----------------------------------------------' && \
echo 'Testing $@, step file: $+, test file: $(test)' && \
echo 'Running: $(call get_run_prefix,$(impl))../runtest.py $(TEST_OPTS) $(opt_DEFERRABLE) $(opt_OPTIONAL) $(call $(impl)_TEST_OPTS) ../$(test) -- $(call $(impl)_RUNSTEP,$(step),$(+))' && \
$(call get_run_prefix,$(impl))../runtest.py $(TEST_OPTS) $(opt_DEFERRABLE) $(opt_OPTIONAL) $(call $(impl)_TEST_OPTS) ../$(test) -- $(call $(impl)_RUNSTEP,$(step),$(+)) && \
echo 'Testing $@; step file: $+, test file: $(test)' && \
echo 'Running: $(call get_runtest_cmd,$(impl),$(step)) $(call $(impl)_TEST_OPTS) ../$(test) -- ../$(impl)/run' && \
$(call get_runtest_cmd,$(impl),$(step)) $(call $(impl)_TEST_OPTS) ../$(test) -- ../$(impl)/run && \
$(if $(filter tests/step6_file.mal,$(test)),\
echo '----------------------------------------------' && \
echo 'Testing ARGV of $@; step file: $+' && \
echo 'Running: $(call get_run_prefix,$(impl))../run_argv_test.sh $(call $(impl)_RUNSTEP,$(step),$(+))' && \
$(call get_run_prefix,$(impl))../run_argv_test.sh $(call $(impl)_RUNSTEP,$(step),$(+)) && ,\
echo 'Running: $(call get_argvtest_cmd,$(impl),$(step)) ../$(impl)/run ' && \
$(call get_argvtest_cmd,$(impl),$(step)) ../$(impl)/run && ,\
true && ))\
true))

Expand Down Expand Up @@ -392,12 +355,12 @@ $(IMPL_PERF):
$(foreach impl,$(word 2,$(subst ^, ,$(@))),\
cd $(if $(filter mal,$(impl)),$(MAL_IMPL),$(impl)); \
echo "Performance test for $(impl):"; \
echo 'Running: $(call get_run_prefix,$(impl))$(call $(impl)_RUNSTEP,stepA,$(call $(impl)_STEP_TO_PROG,stepA),../tests/perf1.mal)'; \
$(call get_run_prefix,$(impl))$(call $(impl)_RUNSTEP,stepA,$(call $(impl)_STEP_TO_PROG,stepA),../tests/perf1.mal); \
echo 'Running: $(call $(impl)_RUNSTEP,stepA,$(call $(impl)_STEP_TO_PROG,stepA),../tests/perf2.mal)'; \
$(call get_run_prefix,$(impl))$(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 get_run_prefix,$(impl))$(call $(impl)_RUNSTEP,stepA,$(call $(impl)_STEP_TO_PROG,stepA),../tests/perf3.mal))
echo 'Running: $(call get_run_prefix,$(impl),stepA) ../$(impl)/run ../tests/perf1.mal'; \
$(call get_run_prefix,$(impl),stepA) ../$(impl)/run ../tests/perf1.mal; \
echo 'Running: $(call get_run_prefix,$(impl),stepA) ../$(impl)/run ../tests/perf2.mal'; \
$(call get_run_prefix,$(impl),stepA) ../$(impl)/run ../tests/perf2.mal; \
echo 'Running: $(call get_run_prefix,$(impl),stepA) ../$(impl)/run ../tests/perf3.mal'; \
$(call get_run_prefix,$(impl),stepA) ../$(impl)/run ../tests/perf3.mal)


#
Expand All @@ -410,8 +373,8 @@ $(ALL_REPL): $$(call $$(word 2,$$(subst ^, ,$$(@)))_STEP_TO_PROG,$$(word 3,$$(su
$(foreach step,$(word 3,$(subst ^, ,$(@))),\
cd $(if $(filter mal,$(impl)),$(MAL_IMPL),$(impl)); \
echo 'REPL implementation $(impl), step file: $+'; \
echo 'Running: $(call get_run_prefix,$(impl))$(call $(impl)_RUNSTEP,$(step),$(+))'; \
$(call get_run_prefix,$(impl))$(call $(impl)_RUNSTEP,$(step),$(+));))
echo 'Running: $(call get_run_prefix,$(impl),$(step)) ../$(impl)/run'; \
$(call get_run_prefix,$(impl),$(step)) ../$(impl)/run;))

# Allow repl^IMPL^STEP and repl^IMPL (which starts REPL of stepA)
.SECONDEXPANSION:
Expand Down
2 changes: 2 additions & 0 deletions ada/run
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/bin/bash
exec $(dirname $0)/${STEP:-stepA_mal} "${@}"
2 changes: 2 additions & 0 deletions awk/run
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/bin/bash
exec awk -O -f $(dirname $0)/${STEP:-stepA_mal}.awk "${@}"
2 changes: 2 additions & 0 deletions bash/run
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/bin/bash
exec bash $(dirname $0)/${STEP:-stepA_mal}.sh "${@}"
2 changes: 2 additions & 0 deletions c/run
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/bin/bash
exec $(dirname $0)/${STEP:-stepA_mal} "${@}"
6 changes: 5 additions & 1 deletion clojure/Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
SOURCES_BASE = src/readline.clj src/reader.clj src/printer.clj
SOURCES_LISP = src/env.clj src/core.clj src/stepA_mal.clj
SRCS = $(SOURCES_BASE) src/env.clj src/core.clj
SOURCES = $(SOURCES_BASE) $(SOURCES_LISP)

all: deps
Expand All @@ -10,14 +11,17 @@ deps:
lein deps

mal.jar: $(SOURCES)
lein with-profile +jar uberjar
lein with-profile stepA uberjar
cp target/mal-0.0.1-SNAPSHOT-standalone.jar $@

SHELL := bash
mal: mal.jar
cat <(echo -e '#!/bin/sh\nexec java -jar "$$0" "$$@"') mal.jar > $@
chmod +x mal

target/%.jar: src/%.clj $(SRCS)
lein with-profile $(word 1,$(subst _, ,$*)) uberjar

clean:
rm -rf target/ mal.jar mal

Expand Down
52 changes: 35 additions & 17 deletions clojure/project.clj
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,39 @@

;; To run a step with correct readline behavior:
;; lein trampoline with-profile stepX run
;; To load step in repl:
;; lein with-profile +stepX repl
:profiles {:step0 {:main step0-repl}
:step1 {:main step1-read-print}
:step2 {:main step2-eval}
:step3 {:main step3-env}
:step4 {:main step4-if-fn-do}
:step5 {:main step5-tco}
:step6 {:main step6-file}
:step7 {:main step7-quote}
:step8 {:main step8-macros}
:step9 {:main step9-try}
:stepA {:main stepA-mal}
:jar {:main stepA-mal
:aot [stepA-mal]}}

:main stepA-mal)
;; To generate a executable uberjar (in target/) for a step:
;; lein with-profile stepX repl
:profiles {:step0 {:main step0-repl
:uberjar-name "step0_repl.jar"
:aot [step0-repl]}
:step1 {:main step1-read-print
:uberjar-name "step1_read_print.jar"
:aot [step1-read-print]}
:step2 {:main step2-eval
:uberjar-name "step2_eval.jar"
:aot [step2-eval]}
:step3 {:main step3-env
:uberjar-name "step3_env.jar"
:aot [step3-env]}
:step4 {:main step4-if-fn-do
:uberjar-name "step4_if_fn_do.jar"
:aot [step4-if-fn-do]}
:step5 {:main step5-tco
:uberjar-name "step5_tco.jar"
:aot [step5-tco]}
:step6 {:main step6-file
:uberjar-name "step6_file.jar"
:aot [step6-file]}
:step7 {:main step7-quote
:uberjar-name "step7_quote.jar"
:aot [step7-quote]}
:step8 {:main step8-macros
:uberjar-name "step8_macros.jar"
:aot [step8-macros]}
:step9 {:main step9-try
:uberjar-name "step9_try.jar"
:aot [step9-try]}
:stepA {:main stepA-mal
:uberjar-name "stepA_mal.jar"
:aot [stepA-mal]}})

2 changes: 2 additions & 0 deletions clojure/run
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/bin/bash
exec java -jar $(dirname $0)/target/${STEP:-stepA_mal}.jar "${@}"
3 changes: 2 additions & 1 deletion clojure/src/step0_repl.clj
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
(ns step0-repl
(:require [readline]))
(:require [readline])
(:gen-class))


;; read
Expand Down
3 changes: 2 additions & 1 deletion clojure/src/step1_read_print.clj
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
(:require [clojure.repl]
[readline]
[reader]
[printer]))
[printer])
(:gen-class))

;; read
(defn READ [& [strng]]
Expand Down
3 changes: 2 additions & 1 deletion clojure/src/step2_eval.clj
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
(:require [clojure.repl]
[readline]
[reader]
[printer]))
[printer])
(:gen-class))

;; read
(defn READ [& [strng]]
Expand Down
3 changes: 2 additions & 1 deletion clojure/src/step3_env.clj
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
[readline]
[reader]
[printer]
[env]))
[env])
(:gen-class))

;; read
(defn READ [& [strng]]
Expand Down
3 changes: 2 additions & 1 deletion clojure/src/step4_if_fn_do.clj
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
[reader]
[printer]
[env]
[core]))
[core])
(:gen-class))

;; read
(defn READ [& [strng]]
Expand Down
3 changes: 2 additions & 1 deletion clojure/src/step5_tco.clj
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
[reader]
[printer]
[env]
[core]))
[core])
(:gen-class))

;; read
(defn READ [& [strng]]
Expand Down
3 changes: 2 additions & 1 deletion clojure/src/step6_file.clj
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
[reader]
[printer]
[env]
[core]))
[core])
(:gen-class))

;; read
(defn READ [& [strng]]
Expand Down
3 changes: 2 additions & 1 deletion clojure/src/step7_quote.clj
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
[reader]
[printer]
[env]
[core]))
[core])
(:gen-class))

;; read
(defn READ [& [strng]]
Expand Down
3 changes: 2 additions & 1 deletion clojure/src/step8_macros.clj
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
[reader]
[printer]
[env]
[core]))
[core])
(:gen-class))

;; read
(defn READ [& [strng]]
Expand Down
3 changes: 2 additions & 1 deletion clojure/src/step9_try.clj
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
[reader]
[printer]
[env]
[core]))
[core])
(:gen-class))

;; read
(defn READ [& [strng]]
Expand Down
2 changes: 2 additions & 0 deletions coffee/run
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/bin/bash
exec coffee $(dirname $0)/${STEP:-stepA_mal}.coffee "${@}"
2 changes: 2 additions & 0 deletions cpp/run
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/bin/bash
exec $(dirname $0)/${STEP:-stepA_mal} "${@}"
2 changes: 2 additions & 0 deletions crystal/run
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/bin/bash
exec $(dirname $0)/${STEP:-stepA_mal} "${@}"
2 changes: 2 additions & 0 deletions cs/run
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/bin/bash
exec mono $(dirname $0)/${STEP:-stepA_mal}.exe ${RAW:+--raw} "${@}"
2 changes: 2 additions & 0 deletions d/run
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/bin/bash
exec $(dirname $0)/${STEP:-stepA_mal} "${@}"
2 changes: 2 additions & 0 deletions elisp/run
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/bin/bash
exec emacs -Q --batch --load $(dirname $0)/${STEP:-stepA_mal}.el "${@}"
3 changes: 3 additions & 0 deletions elixir/run
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/bin/bash
cd $(dirname $0)
exec mix ${STEP:-stepA_mal} "${@}"
Loading

0 comments on commit 20e8dea

Please sign in to comment.