Commit | Line | Data |
---|---|---|
5b207de7 JM |
1 | # Usage/help |
2 | all help: | |
3 | @echo | |
4 | @echo 'USAGE:' | |
5 | @echo | |
6 | @echo 'Rules/Targets:' | |
7 | @echo | |
8 | @echo 'make "IMPL" # build all steps of IMPL' | |
9 | @echo 'make "IMPL^STEP" # build STEP of IMPL' | |
10 | @echo | |
11 | @echo 'make "test" # test all implementations' | |
12 | @echo 'make "test^IMPL" # test all steps of IMPL' | |
13 | @echo 'make "test^STEP" # test STEP for all implementations' | |
14 | @echo 'make "test^IMPL^STEP" # test STEP of IMPL' | |
15 | @echo | |
16 | @echo 'make "perf" # run microbenchmarks for all implementations' | |
17 | @echo 'make "perf^IMPL" # run microbenchmarks for IMPL' | |
18 | @echo | |
19 | @echo 'make "repl^IMPL" # run stepA of IMPL' | |
20 | @echo 'make "repl^IMPL^STEP" # test STEP of IMPL' | |
21 | @echo | |
22 | @echo 'make "clean" # run 'make clean' for all implementations' | |
23 | @echo 'make "clean^IMPL" # run 'make clean' for IMPL' | |
24 | @echo | |
25 | @echo 'make "stats" # run 'make stats' for all implementations' | |
26 | @echo 'make "stats-lisp" # run 'make stats-lisp' for all implementations' | |
27 | @echo 'make "stats^IMPL" # run 'make stats' for IMPL' | |
28 | @echo 'make "stats-lisp^IMPL" # run 'make stats-lisp' for IMPL' | |
29 | @echo | |
30 | @echo 'Options/Settings:' | |
31 | @echo | |
32 | @echo 'make MAL_IMPL=IMPL "test^mal..." # use IMPL for self-host tests' | |
33 | @echo 'make REGRESS=1 "test..." # test with previous step tests too' | |
34 | @echo 'make DOCKERIZE=1 ... # to dockerize above rules/targets' | |
35 | @echo | |
36 | @echo 'Other:' | |
37 | @echo | |
38 | @echo 'make "docker-build^IMPL" # build docker image for IMPL' | |
39 | @echo | |
40 | ||
31690700 JM |
41 | # |
42 | # Command line settings | |
43 | # | |
44 | ||
45 | MAL_IMPL = js | |
46 | ||
2d76e877 JM |
47 | # clj or cljs (Clojure vs ClojureScript/lumo) |
48 | clojure_MODE = clj | |
49 | # python, js, cpp, or neko | |
50 | haxe_MODE = neko | |
51 | # octave or matlab | |
52 | matlab_MODE = octave | |
53 | # python, python2 or python3 | |
54 | python_MODE = python | |
a05f7822 | 55 | |
337c8031 JM |
56 | # Extra options to pass to runtest.py |
57 | TEST_OPTS = | |
58 | ||
17180e85 JM |
59 | # Test with previous test files not just the test files for the |
60 | # current step. Step 0 and 1 tests are special and not included in | |
61 | # later steps. | |
5b207de7 | 62 | REGRESS = |
17180e85 | 63 | |
a1eb30fc | 64 | DEFERRABLE=1 |
46e25689 JM |
65 | OPTIONAL=1 |
66 | ||
337c8031 | 67 | # Extra implementation specific options to pass to runtest.py |
4eb88ef2 | 68 | logo_TEST_OPTS = --start-timeout 60 --test-timeout 120 |
337c8031 | 69 | mal_TEST_OPTS = --start-timeout 60 --test-timeout 120 |
f2b067cb | 70 | miniMAL_TEST_OPTS = --start-timeout 60 --test-timeout 120 |
08e44c41 | 71 | plpgsql_TEST_OPTS = --start-timeout 60 --test-timeout 180 |
ba1649e4 | 72 | plsql_TEST_OPTS = --start-timeout 120 --test-timeout 120 |
a7081401 | 73 | perl6_TEST_OPTS = --test-timeout=60 |
f2b067cb | 74 | |
5b207de7 JM |
75 | # Run target/rule within docker image for the implementation |
76 | DOCKERIZE = | |
a05f7822 | 77 | |
31690700 JM |
78 | # |
79 | # Settings | |
80 | # | |
81 | ||
f48e7d5a | 82 | IMPLS = ada awk bash basic c d chuck clojure coffee common-lisp cpp crystal cs dart \ |
908bb61f | 83 | erlang elisp elixir es6 factor forth fsharp go groovy gst guile haskell \ |
4ceefe3b | 84 | haxe io java julia js kotlin logo lua make mal ocaml matlab miniMAL \ |
46e89434 | 85 | nim objc objpascal perl perl6 php pil plpgsql plsql powershell ps \ |
a7b8df67 | 86 | python r racket rexx rpython ruby rust scala scheme skew swift swift3 tcl \ |
244ac2d6 | 87 | ts vb vhdl vimscript livescript elm |
31690700 | 88 | |
a0e89ae4 JM |
89 | EXTENSION = .mal |
90 | ||
31690700 JM |
91 | step0 = step0_repl |
92 | step1 = step1_read_print | |
93 | step2 = step2_eval | |
94 | step3 = step3_env | |
95 | step4 = step4_if_fn_do | |
96 | step5 = step5_tco | |
97 | step6 = step6_file | |
98 | step7 = step7_quote | |
99 | step8 = step8_macros | |
01c97316 | 100 | step9 = step9_try |
90f618cb | 101 | stepA = stepA_mal |
31690700 | 102 | |
a0e89ae4 JM |
103 | argv_STEP = step6_file |
104 | ||
105 | ||
17180e85 JM |
106 | regress_step0 = step0 |
107 | regress_step1 = step1 | |
108 | regress_step2 = step2 | |
109 | regress_step3 = $(regress_step2) step3 | |
110 | regress_step4 = $(regress_step3) step4 | |
111 | regress_step5 = $(regress_step4) step5 | |
112 | regress_step6 = $(regress_step5) step6 | |
113 | regress_step7 = $(regress_step6) step7 | |
114 | regress_step8 = $(regress_step7) step8 | |
115 | regress_step9 = $(regress_step8) step9 | |
116 | regress_stepA = $(regress_step9) stepA | |
117 | ||
dca6b585 | 118 | test_EXCLUDES += test^bash^step5 # never completes at 10,000 |
8be49ba8 | 119 | test_EXCLUDES += test^basic^step5 # too slow, and limited to ints of 2^16 |
4eb88ef2 | 120 | test_EXCLUDES += test^logo^step5 # too slow for 10,000 |
dca6b585 JM |
121 | test_EXCLUDES += test^make^step5 # no TCO capability (iteration or recursion) |
122 | test_EXCLUDES += test^mal^step5 # host impl dependent | |
123 | test_EXCLUDES += test^matlab^step5 # never completes at 10,000 | |
8119e744 JM |
124 | test_EXCLUDES += test^plpgsql^step5 # too slow for 10,000 |
125 | test_EXCLUDES += test^plsql^step5 # too slow for 10,000 | |
f6146aef | 126 | test_EXCLUDES += test^powershell^step5 # too slow for 10,000 |
dca6b585 JM |
127 | |
128 | perf_EXCLUDES = mal # TODO: fix this | |
31690700 | 129 | |
bcfd8b70 | 130 | dist_EXCLUDES += mal |
5245b079 | 131 | # TODO: still need to implement dist |
bcfd8b70 | 132 | dist_EXCLUDES += guile io julia matlab swift |
31690700 JM |
133 | |
134 | # | |
135 | # Utility functions | |
136 | # | |
137 | ||
32d0a1cf JM |
138 | haxe_STEP_TO_PROG_neko = haxe/$($(1)).n |
139 | haxe_STEP_TO_PROG_python = haxe/$($(1)).py | |
140 | haxe_STEP_TO_PROG_cpp = haxe/cpp/$($(1)) | |
141 | haxe_STEP_TO_PROG_js = haxe/$($(1)).js | |
142 | ||
2b933f42 JM |
143 | clojure_STEP_TO_PROG_clj = clojure/target/$($(1)).jar |
144 | clojure_STEP_TO_PROG_cljs = clojure/src/mal/$($(1)).cljc | |
145 | ||
20e8dea0 | 146 | opt_DEFERRABLE = $(if $(strip $(DEFERRABLE)),$(if $(filter t true T True TRUE 1 y yes Yes YES,$(DEFERRABLE)),--deferrable,--no-deferrable),--no-deferrable) |
46e25689 | 147 | opt_OPTIONAL = $(if $(strip $(OPTIONAL)),$(if $(filter t true T True TRUE 1 y yes Yes YES,$(OPTIONAL)),--optional,--no-optional),--no-optional) |
32d0a1cf | 148 | |
17180e85 JM |
149 | # Return list of test files for a given step. If REGRESS is set then |
150 | # test files will include step 2 tests through tests for the step | |
151 | # being tested. | |
152 | STEP_TEST_FILES = $(strip $(wildcard \ | |
153 | $(foreach s,$(if $(strip $(REGRESS)),$(regress_$(2)),$(2)),\ | |
a0e89ae4 | 154 | $(1)/tests/$($(s))$(EXTENSION) tests/$($(s))$(EXTENSION)))) |
31690700 | 155 | |
17180e85 | 156 | # Map of step (e.g. "step8") to executable file for that step |
99be41df | 157 | ada_STEP_TO_PROG = ada/$($(1)) |
3b7ef8c7 | 158 | awk_STEP_TO_PROG = awk/$($(1)).awk |
db4c329a | 159 | bash_STEP_TO_PROG = bash/$($(1)).sh |
47def37e | 160 | basic_STEP_TO_PROG = basic/$($(1)).bas |
db4c329a | 161 | c_STEP_TO_PROG = c/$($(1)) |
f82cb965 | 162 | d_STEP_TO_PROG = d/$($(1)) |
4abd73a6 | 163 | chuck_STEP_TO_PROG = chuck/$($(1)).ck |
2d76e877 | 164 | clojure_STEP_TO_PROG = $(clojure_STEP_TO_PROG_$(clojure_MODE)) |
891c3f3b | 165 | coffee_STEP_TO_PROG = coffee/$($(1)).coffee |
983d9f3b | 166 | common-lisp_STEP_TO_PROG = common-lisp/$($(1)) |
9ddaa0b9 | 167 | cpp_STEP_TO_PROG = cpp/$($(1)) |
86fe6314 | 168 | crystal_STEP_TO_PROG = crystal/$($(1)) |
db4c329a | 169 | cs_STEP_TO_PROG = cs/$($(1)).exe |
3934e3f8 | 170 | dart_STEP_TO_PROG = dart/$($(1)).dart |
ae28e856 | 171 | elisp_STEP_TO_PROG = elisp/$($(1)).el |
51c2c1fe | 172 | elixir_STEP_TO_PROG = elixir/lib/mix/tasks/$($(1)).ex |
2cc3804b | 173 | erlang_STEP_TO_PROG = erlang/$($(1)) |
4eb71990 | 174 | es6_STEP_TO_PROG = es6/build/$($(1)).js |
199b1ce7 | 175 | factor_STEP_TO_PROG = factor/$($(1))/$($(1)).factor |
59038a10 | 176 | forth_STEP_TO_PROG = forth/$($(1)).fs |
1c358979 | 177 | fsharp_STEP_TO_PROG = fsharp/$($(1)).exe |
69b4abd6 | 178 | go_STEP_TO_PROG = go/$($(1)) |
a9cd6543 | 179 | groovy_STEP_TO_PROG = groovy/$($(1)).groovy |
908bb61f | 180 | gst_STEP_TO_PROG = gst/$($(1)).st |
36e287b5 | 181 | java_STEP_TO_PROG = java/target/classes/mal/$($(1)).class |
b76aa73b | 182 | haskell_STEP_TO_PROG = haskell/$($(1)) |
2d76e877 | 183 | haxe_STEP_TO_PROG = $(haxe_STEP_TO_PROG_$(haxe_MODE)) |
7511317b | 184 | io_STEP_TO_PROG = io/$($(1)).io |
a23e0cdb | 185 | julia_STEP_TO_PROG = julia/$($(1)).jl |
db4c329a | 186 | js_STEP_TO_PROG = js/$($(1)).js |
53c2ea70 | 187 | kotlin_STEP_TO_PROG = kotlin/$($(1)).jar |
9d42904e | 188 | lua_STEP_TO_PROG = lua/$($(1)).lua |
db4c329a JM |
189 | make_STEP_TO_PROG = make/$($(1)).mk |
190 | mal_STEP_TO_PROG = mal/$($(1)).mal | |
59d10e1b | 191 | ocaml_STEP_TO_PROG = ocaml/$($(1)) |
9a54ea18 | 192 | matlab_STEP_TO_PROG = matlab/$($(1)).m |
c1fe72ae | 193 | miniMAL_STEP_TO_PROG = miniMAL/$($(1)).json |
dbac60df | 194 | nim_STEP_TO_PROG = nim/$($(1)) |
2faae94c | 195 | objc_STEP_TO_PROG = objc/$($(1)) |
0067158f | 196 | objpascal_STEP_TO_PROG = objpascal/$($(1)) |
b5dedee0 | 197 | perl_STEP_TO_PROG = perl/$($(1)).pl |
a7081401 | 198 | perl6_STEP_TO_PROG = perl6/$($(1)).pl |
db4c329a | 199 | php_STEP_TO_PROG = php/$($(1)).php |
42f304e8 | 200 | pil_STEP_TO_PROG = pil/$($(1)).l |
adc5b4fb | 201 | plpgsql_STEP_TO_PROG = plpgsql/$($(1)).sql |
97df14cd | 202 | plsql_STEP_TO_PROG = plsql/$($(1)).sql |
d7d197f9 | 203 | powershell_STEP_TO_PROG = powershell/$($(1)).ps1 |
db4c329a JM |
204 | ps_STEP_TO_PROG = ps/$($(1)).ps |
205 | python_STEP_TO_PROG = python/$($(1)).py | |
4d1456b9 | 206 | r_STEP_TO_PROG = r/$($(1)).r |
f5223195 | 207 | racket_STEP_TO_PROG = racket/$($(1)).rkt |
33a37291 | 208 | rexx_STEP_TO_PROG = rexx/$($(1)).rexx |
80320efc | 209 | rpython_STEP_TO_PROG = rpython/$($(1)) |
db4c329a | 210 | ruby_STEP_TO_PROG = ruby/$($(1)).rb |
434516e0 | 211 | rust_STEP_TO_PROG = rust/target/release/$($(1)) |
37a33ac7 | 212 | scala_STEP_TO_PROG = scala/target/scala-2.11/classes/$($(1)).class |
a7b8df67 | 213 | scheme_STEP_TO_PROG = scheme/$($(1)).scm |
034e82ad | 214 | skew_STEP_TO_PROG = skew/$($(1)).js |
2539e6af | 215 | swift_STEP_TO_PROG = swift/$($(1)) |
0eace3df | 216 | swift3_STEP_TO_PROG = swift3/$($(1)) |
54d9903c | 217 | tcl_STEP_TO_PROG = tcl/$($(1)).tcl |
571eb786 | 218 | ts_STEP_TO_PROG = ts/$($(1)).js |
ee7cd585 | 219 | vb_STEP_TO_PROG = vb/$($(1)).exe |
36e91db4 | 220 | vhdl_STEP_TO_PROG = vhdl/$($(1)) |
50a964ce | 221 | vimscript_STEP_TO_PROG = vimscript/$($(1)).vim |
5eb1f5cb | 222 | guile_STEP_TO_PROG = guile/$($(1)).scm |
dcccf1b2 | 223 | livescript_STEP_TO_PROG = livescript/$($(1)).js |
f38c7ffa | 224 | elm_STEP_TO_PROG = elm/$($(1)).js |
db4c329a | 225 | |
db4c329a | 226 | |
c4033aab JM |
227 | # Needed some argument munging |
228 | COMMA = , | |
229 | noop = | |
230 | SPACE = $(noop) $(noop) | |
d1596ac2 | 231 | export FACTOR_ROOTS := . |
db4c329a | 232 | |
4959b19d JM |
233 | # DOCKERIZE utility functions |
234 | 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)))))))))))))))))))))))))) | |
235 | impl_to_image = kanaka/mal-test-$(call lc,$(1)) | |
236 | ||
237 | actual_impl = $(if $(filter mal,$(1)),$(MAL_IMPL),$(1)) | |
238 | ||
20e8dea0 JM |
239 | # Takes impl |
240 | # Returns nothing if DOCKERIZE is not set, otherwise returns the | |
241 | # docker prefix necessary to run make within the docker environment | |
242 | # for this impl | |
85bb01d0 | 243 | get_build_command = $(strip $(if $(strip $(DOCKERIZE)),\ |
62fc786e JM |
244 | docker run \ |
245 | -it --rm -u $(shell id -u) \ | |
246 | -v $(dir $(abspath $(lastword $(MAKEFILE_LIST)))):/mal \ | |
247 | -w /mal/$(1) \ | |
2d76e877 | 248 | $(if $(strip $($(1)_MODE)),-e $(1)_MODE=$($(1)_MODE),) \ |
62fc786e JM |
249 | $(if $(filter factor,$(1)),-e FACTOR_ROOTS=$(FACTOR_ROOTS),) \ |
250 | $(call impl_to_image,$(1)) \ | |
85bb01d0 JM |
251 | $(MAKE) $(if $(strip $($(1)_MODE)),$(1)_MODE=$($(1)_MODE),) \ |
252 | ,\ | |
253 | $(MAKE) $(if $(strip $($(1)_MODE)),$(1)_MODE=$($(1)_MODE),))) | |
db4c329a | 254 | |
20e8dea0 JM |
255 | # Takes impl and step arguments |
256 | # Returns a command prefix (docker command and environment variables) | |
257 | # necessary to launch the given impl and step | |
258 | get_run_prefix = $(strip $(if $(strip $(DOCKERIZE)),\ | |
2b52a2a5 | 259 | docker run -e STEP=$($2) -e MAL_IMPL=$(MAL_IMPL) \ |
20e8dea0 JM |
260 | -it --rm -u $(shell id -u) \ |
261 | -v $(dir $(abspath $(lastword $(MAKEFILE_LIST)))):/mal \ | |
262 | -w /mal/$(call actual_impl,$(1)) \ | |
2d76e877 | 263 | $(if $(strip $($(1)_MODE)),-e $(1)_MODE=$($(1)_MODE),) \ |
20e8dea0 JM |
264 | $(if $(filter factor,$(1)),-e FACTOR_ROOTS=$(FACTOR_ROOTS),) \ |
265 | $(foreach env,$(3),-e $(env)) \ | |
266 | $(call impl_to_image,$(call actual_impl,$(1))) \ | |
267 | ,\ | |
2b52a2a5 | 268 | env STEP=$($2) MAL_IMPL=$(MAL_IMPL) \ |
2d76e877 | 269 | $(if $(strip $($(1)_MODE)),$(1)_MODE=$($(1)_MODE),) \ |
20e8dea0 JM |
270 | $(if $(filter factor,$(1)),FACTOR_ROOTS=$(FACTOR_ROOTS),) \ |
271 | $(3))) | |
272 | ||
273 | # Takes impl and step | |
274 | # Returns the runtest command prefix (with runtest options) for testing the given step | |
275 | get_runtest_cmd = $(call get_run_prefix,$(1),$(2),$(if $(filter cs fsharp tcl vb,$(1)),RAW=1,)) \ | |
553a0950 | 276 | ../runtest.py $(opt_DEFERRABLE) $(opt_OPTIONAL) $(call $(1)_TEST_OPTS) $(TEST_OPTS) |
20e8dea0 JM |
277 | |
278 | # Takes impl and step | |
279 | # Returns the runtest command prefix (with runtest options) for testing the given step | |
280 | get_argvtest_cmd = $(call get_run_prefix,$(1),$(2)) ../run_argv_test.sh | |
31690700 | 281 | |
50a964ce DM |
282 | vimscript_TEST_OPTS = --test-timeout 30 |
283 | ifeq ($(MAL_IMPL),vimscript) | |
284 | mal_TEST_OPTS = --start-timeout 60 --test-timeout 180 | |
f6146aef JM |
285 | else ifeq ($(MAL_IMPL),powershell) |
286 | mal_TEST_OPTS = --start-timeout 60 --test-timeout 180 | |
50a964ce | 287 | endif |
31690700 JM |
288 | |
289 | # Derived lists | |
290 | STEPS = $(sort $(filter step%,$(.VARIABLES))) | |
8569b2af JM |
291 | DO_IMPLS = $(filter-out $(SKIP_IMPLS),$(IMPLS)) |
292 | IMPL_TESTS = $(foreach impl,$(DO_IMPLS),test^$(impl)) | |
31690700 | 293 | STEP_TESTS = $(foreach step,$(STEPS),test^$(step)) |
dca6b585 | 294 | ALL_TESTS = $(filter-out $(test_EXCLUDES),\ |
31690700 | 295 | $(strip $(sort \ |
8569b2af | 296 | $(foreach impl,$(DO_IMPLS),\ |
31690700 JM |
297 | $(foreach step,$(STEPS),test^$(impl)^$(step)))))) |
298 | ||
cf1d3eae JM |
299 | DOCKER_BUILD = $(foreach impl,$(DO_IMPLS),docker-build^$(impl)) |
300 | ||
dca6b585 | 301 | IMPL_PERF = $(foreach impl,$(filter-out $(perf_EXCLUDES),$(DO_IMPLS)),perf^$(impl)) |
db4c329a | 302 | |
854cf2a6 DM |
303 | IMPL_REPL = $(foreach impl,$(DO_IMPLS),repl^$(impl)) |
304 | ALL_REPL = $(strip $(sort \ | |
305 | $(foreach impl,$(DO_IMPLS),\ | |
306 | $(foreach step,$(STEPS),repl^$(impl)^$(step))))) | |
db4c329a | 307 | |
31690700 JM |
308 | # |
309 | # Build rules | |
310 | # | |
311 | ||
4fc7a281 | 312 | # Build a program in an implementation directory |
f045aba1 JM |
313 | # Make sure we always try and build first because the dependencies are |
314 | # encoded in the implementation Makefile not here | |
315 | .PHONY: $(foreach i,$(DO_IMPLS),$(foreach s,$(STEPS),$(call $(i)_STEP_TO_PROG,$(s)))) | |
4fc7a281 | 316 | $(foreach i,$(DO_IMPLS),$(foreach s,$(STEPS),$(call $(i)_STEP_TO_PROG,$(s)))): |
f045aba1 | 317 | $(foreach impl,$(word 1,$(subst /, ,$(@))),\ |
4959b19d | 318 | $(if $(DOCKERIZE), \ |
85bb01d0 JM |
319 | $(call get_build_command,$(impl)) $(patsubst $(impl)/%,%,$(@)), \ |
320 | $(call get_build_command,$(impl)) -C $(impl) $(subst $(impl)/,,$(@)))) | |
31690700 | 321 | |
5b207de7 | 322 | # Allow IMPL, and IMPL^STEP |
31690700 | 323 | .SECONDEXPANSION: |
5b207de7 | 324 | $(DO_IMPLS): $$(foreach s,$$(STEPS),$$(call $$(@)_STEP_TO_PROG,$$(s))) |
31690700 JM |
325 | |
326 | .SECONDEXPANSION: | |
5b207de7 JM |
327 | $(foreach i,$(DO_IMPLS),$(foreach s,$(STEPS),$(i)^$(s))): $$(call $$(word 1,$$(subst ^, ,$$(@)))_STEP_TO_PROG,$$(word 2,$$(subst ^, ,$$(@)))) |
328 | ||
329 | ||
330 | # | |
331 | # Test rules | |
332 | # | |
31690700 JM |
333 | |
334 | .SECONDEXPANSION: | |
335 | $(ALL_TESTS): $$(call $$(word 2,$$(subst ^, ,$$(@)))_STEP_TO_PROG,$$(word 3,$$(subst ^, ,$$(@)))) | |
336 | @$(foreach impl,$(word 2,$(subst ^, ,$(@))),\ | |
337 | $(foreach step,$(word 3,$(subst ^, ,$(@))),\ | |
d5221bcf | 338 | cd $(if $(filter mal,$(impl)),$(MAL_IMPL),$(impl)) && \ |
31690700 | 339 | $(foreach test,$(call STEP_TEST_FILES,$(impl),$(step)),\ |
d5221bcf | 340 | echo '----------------------------------------------' && \ |
20e8dea0 | 341 | echo 'Testing $@; step file: $+, test file: $(test)' && \ |
ba1649e4 JM |
342 | echo 'Running: $(call get_runtest_cmd,$(impl),$(step)) ../$(test) -- ../$(impl)/run' && \ |
343 | $(call get_runtest_cmd,$(impl),$(step)) ../$(test) -- ../$(impl)/run && \ | |
a0e89ae4 | 344 | $(if $(filter tests/$(argv_STEP)$(EXTENSION),$(test)),\ |
d3c401c1 DM |
345 | echo '----------------------------------------------' && \ |
346 | echo 'Testing ARGV of $@; step file: $+' && \ | |
20e8dea0 JM |
347 | echo 'Running: $(call get_argvtest_cmd,$(impl),$(step)) ../$(impl)/run ' && \ |
348 | $(call get_argvtest_cmd,$(impl),$(step)) ../$(impl)/run && ,\ | |
d3c401c1 | 349 | true && ))\ |
d5221bcf | 350 | true)) |
31690700 | 351 | |
5b207de7 | 352 | # Allow test, tests, test^STEP, test^IMPL, and test^IMPL^STEP |
31690700 JM |
353 | test: $(ALL_TESTS) |
354 | tests: $(ALL_TESTS) | |
355 | ||
5b207de7 JM |
356 | .SECONDEXPANSION: |
357 | $(IMPL_TESTS): $$(filter $$@^%,$$(ALL_TESTS)) | |
31690700 | 358 | |
5b207de7 JM |
359 | .SECONDEXPANSION: |
360 | $(STEP_TESTS): $$(foreach step,$$(subst test^,,$$@),$$(filter %^$$(step),$$(ALL_TESTS))) | |
31690700 | 361 | |
db4c329a | 362 | |
5b207de7 JM |
363 | # |
364 | # Dist rules | |
365 | # | |
b6dc3e37 JM |
366 | |
367 | dist: $(IMPL_DIST) | |
31690700 | 368 | |
712af9ef | 369 | .SECONDEXPANSION: |
b6dc3e37 | 370 | $(IMPL_DIST): |
712af9ef JM |
371 | @echo "----------------------------------------------"; \ |
372 | $(foreach impl,$(word 2,$(subst ^, ,$(@))),\ | |
b6dc3e37 JM |
373 | echo "Running: make -C $(impl) dist"; \ |
374 | $(MAKE) --no-print-directory -C $(impl) dist) | |
375 | ||
712af9ef | 376 | |
5b207de7 | 377 | # |
cf1d3eae | 378 | # Docker build rules |
5b207de7 | 379 | # |
cf1d3eae JM |
380 | |
381 | docker-build: $(DOCKER_BUILD) | |
382 | ||
383 | .SECONDEXPANSION: | |
384 | $(DOCKER_BUILD): | |
385 | echo "----------------------------------------------"; \ | |
386 | $(foreach impl,$(word 2,$(subst ^, ,$(@))),\ | |
4959b19d JM |
387 | echo "Running: docker build -t $(call impl_to_image,$(impl)) .:"; \ |
388 | cd $(impl) && docker build -t $(call impl_to_image,$(impl)) .) | |
db4c329a | 389 | |
5b207de7 JM |
390 | |
391 | # | |
db4c329a | 392 | # Performance test rules |
5b207de7 | 393 | # |
db4c329a JM |
394 | |
395 | perf: $(IMPL_PERF) | |
396 | ||
397 | .SECONDEXPANSION: | |
398 | $(IMPL_PERF): | |
399 | @echo "----------------------------------------------"; \ | |
400 | $(foreach impl,$(word 2,$(subst ^, ,$(@))),\ | |
401 | cd $(if $(filter mal,$(impl)),$(MAL_IMPL),$(impl)); \ | |
402 | echo "Performance test for $(impl):"; \ | |
20e8dea0 JM |
403 | echo 'Running: $(call get_run_prefix,$(impl),stepA) ../$(impl)/run ../tests/perf1.mal'; \ |
404 | $(call get_run_prefix,$(impl),stepA) ../$(impl)/run ../tests/perf1.mal; \ | |
405 | echo 'Running: $(call get_run_prefix,$(impl),stepA) ../$(impl)/run ../tests/perf2.mal'; \ | |
406 | $(call get_run_prefix,$(impl),stepA) ../$(impl)/run ../tests/perf2.mal; \ | |
407 | echo 'Running: $(call get_run_prefix,$(impl),stepA) ../$(impl)/run ../tests/perf3.mal'; \ | |
408 | $(call get_run_prefix,$(impl),stepA) ../$(impl)/run ../tests/perf3.mal) | |
db4c329a | 409 | |
854cf2a6 | 410 | |
5b207de7 | 411 | # |
854cf2a6 | 412 | # REPL invocation rules |
5b207de7 | 413 | # |
854cf2a6 DM |
414 | |
415 | .SECONDEXPANSION: | |
416 | $(ALL_REPL): $$(call $$(word 2,$$(subst ^, ,$$(@)))_STEP_TO_PROG,$$(word 3,$$(subst ^, ,$$(@)))) | |
417 | @$(foreach impl,$(word 2,$(subst ^, ,$(@))),\ | |
418 | $(foreach step,$(word 3,$(subst ^, ,$(@))),\ | |
419 | cd $(if $(filter mal,$(impl)),$(MAL_IMPL),$(impl)); \ | |
420 | echo 'REPL implementation $(impl), step file: $+'; \ | |
20e8dea0 JM |
421 | echo 'Running: $(call get_run_prefix,$(impl),$(step)) ../$(impl)/run'; \ |
422 | $(call get_run_prefix,$(impl),$(step)) ../$(impl)/run;)) | |
bcfd8b70 | 423 | |
5b207de7 JM |
424 | # Allow repl^IMPL^STEP and repl^IMPL (which starts REPL of stepA) |
425 | .SECONDEXPANSION: | |
426 | $(IMPL_REPL): $$@^stepA | |
427 | ||
dca6b585 JM |
428 | # |
429 | # Utility functions | |
430 | # | |
431 | .SECONDEXPANSION: | |
432 | print-%: | |
433 | @echo "$($(*))" | |
bcfd8b70 | 434 | |
5b207de7 | 435 | # |
bcfd8b70 | 436 | # Recursive rules (call make FOO in each subdirectory) |
5b207de7 | 437 | # |
bcfd8b70 JM |
438 | |
439 | define recur_template | |
440 | .PHONY: $(1) | |
441 | $(1): $(2) | |
442 | .SECONDEXPANSION: | |
443 | $(2): | |
444 | @echo "----------------------------------------------"; \ | |
445 | $$(foreach impl,$$(word 2,$$(subst ^, ,$$(@))),\ | |
4959b19d | 446 | $$(if $$(DOCKERIZE), \ |
85bb01d0 JM |
447 | echo "Running: $$(call get_build_command,$$(impl)) --no-print-directory $(1)"; \ |
448 | $$(call get_build_command,$$(impl)) --no-print-directory $(1), \ | |
449 | echo "Running: $$(call get_build_command,$$(impl)) --no-print-directory -C $$(impl) $(1)"; \ | |
450 | $$(call get_build_command,$$(impl)) --no-print-directory -C $$(impl) $(1))) | |
bcfd8b70 JM |
451 | endef |
452 | ||
453 | recur_impls_ = $(filter-out $(foreach impl,$($(1)_EXCLUDES),$(1)^$(impl)),$(foreach impl,$(IMPLS),$(1)^$(impl))) | |
454 | ||
455 | # recursive clean | |
456 | $(eval $(call recur_template,clean,$(call recur_impls_,clean))) | |
457 | ||
458 | # recursive stats | |
459 | $(eval $(call recur_template,stats,$(call recur_impls_,stats))) | |
460 | $(eval $(call recur_template,stats-lisp,$(call recur_impls_,stats-lisp))) | |
461 | ||
462 | # recursive dist | |
463 | $(eval $(call recur_template,dist,$(call recur_impls_,dist))) |