8 @echo
'make "IMPL" # build all steps of IMPL'
9 @echo
'make "build^IMPL" # build all steps of IMPL'
10 @echo
'make "IMPL^STEP" # build STEP of IMPL'
11 @echo
'make "build^IMPL^STEP" # build STEP of IMPL'
13 @echo
'make "test" # test all implementations'
14 @echo
'make "test^IMPL" # test all steps of IMPL'
15 @echo
'make "test^STEP" # test STEP for all implementations'
16 @echo
'make "test^IMPL^STEP" # test STEP of IMPL'
18 @echo
'make "perf" # run microbenchmarks for all implementations'
19 @echo
'make "perf^IMPL" # run microbenchmarks for IMPL'
21 @echo
'make "repl^IMPL" # run stepA of IMPL'
22 @echo
'make "repl^IMPL^STEP" # test STEP of IMPL'
24 @echo
'make "clean" # run 'make
clean' for all implementations'
25 @echo
'make "clean^IMPL" # run 'make
clean' for IMPL'
27 @echo
'make "stats" # run 'make stats
' for all implementations'
28 @echo
'make "stats-lisp" # run 'make stats-lisp
' for all implementations'
29 @echo
'make "stats^IMPL" # run 'make stats
' for IMPL'
30 @echo
'make "stats-lisp^IMPL" # run 'make stats-lisp
' for IMPL'
32 @echo
'Options/Settings:'
34 @echo
'make MAL_IMPL=IMPL "test^mal..." # use IMPL for self-host tests'
35 @echo
'make REGRESS=1 "test..." # test with previous step tests too'
36 @echo
'make DOCKERIZE=1 ... # to dockerize above rules/targets'
37 @echo
'make TEST_OPTS="--opt ..." # options to pass to runtest.py'
41 @echo
'make "docker-build^IMPL" # build docker image for IMPL'
43 @echo
'make "docker-shell^IMPL" # start bash shell in docker image for IMPL'
47 # Command line settings
54 # clj or cljs (Clojure vs ClojureScript/lumo)
58 # python, js, cpp, or neko
62 # python, python2 or python3
64 # scheme (chibi, kawa, gauche, chicken, sagittarius, cyclone, foment)
66 # wasmtime wasmer lucet wax node warpy wace_libc
69 # Path to loccount for counting LOC stats
72 # Extra options to pass to runtest.py
75 # Test with previous test files not just the test files for the
76 # current step. Step 0 and 1 tests are special and not included in
84 # Run target/rule within docker image for the implementation
89 # Implementation specific settings
92 IMPLS
= ada ada
.2 awk bash basic bbc-basic c chuck clojure coffee common-lisp
cpp crystal cs d dart \
93 elisp elixir elm erlang es6 factor fantom forth fsharp go groovy gnu-smalltalk \
94 guile haskell haxe hy io java js julia kotlin livescript logo lua make mal \
95 matlab miniMAL nasm nim objc objpascal ocaml perl perl6 php picolisp pike plpgsql \
96 plsql powershell ps python python
.2 r racket rexx rpython ruby rust scala scheme skew \
98 swift swift3 swift4 swift5 tcl ts vala vb vhdl vimscript wasm wren yorick zig
100 swift swift3 swift4 swift5 tcl ts vala vb vhdl vimscript wasm wren yorick zig jq
101 >>>>>>> basic...? impl
106 step1
= step1_read_print
109 step4
= step4_if_fn_do
117 argv_STEP
= step6_file
120 regress_step0
= step0
121 regress_step1
= step1
122 regress_step2
= step2
123 regress_step3
= $(regress_step2
) step3
124 regress_step4
= $(regress_step3
) step4
125 regress_step5
= $(regress_step4
) step5
126 regress_step6
= $(regress_step5
) step6
127 regress_step7
= $(regress_step6
) step7
128 regress_step8
= $(regress_step7
) step8
129 regress_step9
= $(regress_step8
) step9
130 regress_stepA
= $(regress_step9
) stepA
132 step5_EXCLUDES
+= bash
# never completes at 10,000
133 step5_EXCLUDES
+= basic
# too slow, and limited to ints of 2^16
134 step5_EXCLUDES
+= logo
# too slow for 10,000
135 step5_EXCLUDES
+= make
# no TCO capability (iteration or recursion)
136 step5_EXCLUDES
+= mal
# host impl dependent
137 step5_EXCLUDES
+= matlab
# never completes at 10,000
138 step5_EXCLUDES
+= plpgsql
# too slow for 10,000
139 step5_EXCLUDES
+= plsql
# too slow for 10,000
140 step5_EXCLUDES
+= powershell
# too slow for 10,000
141 step5_EXCLUDES
+= $(if
$(filter cpp,$(haxe_MODE
)),haxe
,) # cpp finishes 10,000, segfaults at 100,000
144 # TODO: still need to implement dist
145 dist_EXCLUDES
+= guile io julia matlab swift
148 # Extra options to pass to runtest.py
149 bbc-basic_TEST_OPTS
= --test-timeout
60
150 guile_TEST_OPTS
= --test-timeout
120
151 io_TEST_OPTS
= --test-timeout
120
152 logo_TEST_OPTS
= --start-timeout
60 --test-timeout
120
153 mal_TEST_OPTS
= --start-timeout
60 --test-timeout
120
154 miniMAL_TEST_OPTS
= --start-timeout
60 --test-timeout
120
155 perl6_TEST_OPTS
= --test-timeout
=60
156 plpgsql_TEST_OPTS
= --start-timeout
60 --test-timeout
180
157 plsql_TEST_OPTS
= --start-timeout
120 --test-timeout
120
158 vimscript_TEST_OPTS
= --test-timeout
30
159 ifeq ($(MAL_IMPL
),vimscript
)
160 mal_TEST_OPTS
= --start-timeout
60 --test-timeout
180
161 else ifeq ($(MAL_IMPL
),powershell
)
162 mal_TEST_OPTS
= --start-timeout
60 --test-timeout
180
167 # Implementation specific utility functions
170 basic_STEP_TO_PROG_cbm
= basic
/$($(1)).bas
171 basic_STEP_TO_PROG_qbasic
= basic
/$($(1))
173 clojure_STEP_TO_PROG_clj
= clojure
/target
/$($(1)).jar
174 clojure_STEP_TO_PROG_cljs
= clojure
/src
/mal
/$($(1)).cljc
176 haxe_STEP_TO_PROG_neko
= haxe
/$($(1)).n
177 haxe_STEP_TO_PROG_python
= haxe
/$($(1)).py
178 haxe_STEP_TO_PROG_cpp
= haxe
/cpp/$($(1))
179 haxe_STEP_TO_PROG_js
= haxe
/$($(1)).js
181 scheme_STEP_TO_PROG_chibi
= scheme
/$($(1)).scm
182 scheme_STEP_TO_PROG_kawa
= scheme
/out
/$($(1)).class
183 scheme_STEP_TO_PROG_gauche
= scheme
/$($(1)).scm
184 scheme_STEP_TO_PROG_chicken
= scheme
/$($(1))
185 scheme_STEP_TO_PROG_sagittarius
= scheme
/$($(1)).scm
186 scheme_STEP_TO_PROG_cyclone
= scheme
/$($(1))
187 scheme_STEP_TO_PROG_foment
= scheme
/$($(1)).scm
189 # Map of step (e.g. "step8") to executable file for that step
190 ada_STEP_TO_PROG
= ada
/$($(1))
191 ada
.2_STEP_TO_PROG
= ada
.2/$($(1))
192 awk_STEP_TO_PROG
= awk
/$($(1)).awk
193 bash_STEP_TO_PROG
= bash
/$($(1)).sh
194 basic_STEP_TO_PROG
= $(basic_STEP_TO_PROG_
$(basic_MODE
))
195 bbc-basic_STEP_TO_PROG
= bbc-basic
/$($(1)).bas
196 c_STEP_TO_PROG
= c
/$($(1))
197 chuck_STEP_TO_PROG
= chuck
/$($(1)).ck
198 clojure_STEP_TO_PROG
= $(clojure_STEP_TO_PROG_
$(clojure_MODE
))
199 coffee_STEP_TO_PROG
= coffee
/$($(1)).coffee
200 common-lisp_STEP_TO_PROG
= common-lisp
/$($(1))
201 cpp_STEP_TO_PROG
= cpp/$($(1))
202 crystal_STEP_TO_PROG
= crystal
/$($(1))
203 cs_STEP_TO_PROG
= cs
/$($(1)).exe
204 d_STEP_TO_PROG
= d
/$($(1))
205 dart_STEP_TO_PROG
= dart
/$($(1)).dart
206 elisp_STEP_TO_PROG
= elisp
/$($(1)).el
207 elixir_STEP_TO_PROG
= elixir
/lib
/mix
/tasks
/$($(1)).ex
208 elm_STEP_TO_PROG
= elm
/$($(1)).js
209 erlang_STEP_TO_PROG
= erlang
/$($(1))
210 es6_STEP_TO_PROG
= es6
/$($(1)).mjs
211 factor_STEP_TO_PROG
= factor
/$($(1))/$($(1)).factor
212 fantom_STEP_TO_PROG
= fantom
/lib
/fan
/$($(1)).pod
213 forth_STEP_TO_PROG
= forth
/$($(1)).fs
214 fsharp_STEP_TO_PROG
= fsharp
/$($(1)).exe
215 go_STEP_TO_PROG
= go
/$($(1))
216 groovy_STEP_TO_PROG
= groovy
/$($(1)).groovy
217 gnu-smalltalk_STEP_TO_PROG
= gnu-smalltalk
/$($(1)).st
218 guile_STEP_TO_PROG
= guile
/$($(1)).scm
219 haskell_STEP_TO_PROG
= haskell
/$($(1))
220 haxe_STEP_TO_PROG
= $(haxe_STEP_TO_PROG_
$(haxe_MODE
))
221 hy_STEP_TO_PROG
= hy
/$($(1)).hy
222 io_STEP_TO_PROG
= io
/$($(1)).io
223 java_STEP_TO_PROG
= java
/target
/classes
/mal
/$($(1)).class
224 js_STEP_TO_PROG
= js
/$($(1)).js
225 jq_STEP_PROG
= jq
/$($(1)).jq
226 julia_STEP_TO_PROG
= julia
/$($(1)).jl
227 kotlin_STEP_TO_PROG
= kotlin
/$($(1)).jar
228 livescript_STEP_TO_PROG
= livescript
/$($(1)).js
229 logo_STEP_TO_PROG
= logo
/$($(1)).lg
230 lua_STEP_TO_PROG
= lua
/$($(1)).lua
231 make_STEP_TO_PROG
= make
/$($(1)).mk
232 mal_STEP_TO_PROG
= mal
/$($(1)).mal
233 matlab_STEP_TO_PROG
= matlab
/$($(1)).m
234 miniMAL_STEP_TO_PROG
= miniMAL
/$($(1)).json
235 nasm_STEP_TO_PROG
= nasm
/$($(1))
236 nim_STEP_TO_PROG
= nim
/$($(1))
237 objc_STEP_TO_PROG
= objc
/$($(1))
238 objpascal_STEP_TO_PROG
= objpascal
/$($(1))
239 ocaml_STEP_TO_PROG
= ocaml
/$($(1))
240 perl_STEP_TO_PROG
= perl
/$($(1)).pl
241 perl6_STEP_TO_PROG
= perl6
/$($(1)).pl
242 php_STEP_TO_PROG
= php
/$($(1)).php
243 picolisp_STEP_TO_PROG
= picolisp
/$($(1)).l
244 pike_STEP_TO_PROG
= pike
/$($(1)).pike
245 plpgsql_STEP_TO_PROG
= plpgsql
/$($(1)).sql
246 plsql_STEP_TO_PROG
= plsql
/$($(1)).sql
247 powershell_STEP_TO_PROG
= powershell
/$($(1)).ps1
248 ps_STEP_TO_PROG
= ps
/$($(1)).ps
249 python_STEP_TO_PROG
= python
/$($(1)).py
250 python
.2_STEP_TO_PROG
= python
.2/$($(1)).py
251 r_STEP_TO_PROG
= r
/$($(1)).r
252 racket_STEP_TO_PROG
= racket
/$($(1)).rkt
253 rexx_STEP_TO_PROG
= rexx
/$($(1)).rexxpp
254 rpython_STEP_TO_PROG
= rpython
/$($(1))
255 ruby_STEP_TO_PROG
= ruby
/$($(1)).rb
256 rust_STEP_TO_PROG
= rust
/$($(1))
257 scala_STEP_TO_PROG
= scala
/target
/scala-2.11
/classes
/$($(1)).class
258 scheme_STEP_TO_PROG
= $(scheme_STEP_TO_PROG_
$(scheme_MODE
))
259 skew_STEP_TO_PROG
= skew
/$($(1)).js
260 swift_STEP_TO_PROG
= swift
/$($(1))
261 swift3_STEP_TO_PROG
= swift3
/$($(1))
262 swift4_STEP_TO_PROG
= swift4
/$($(1))
263 swift5_STEP_TO_PROG
= swift5
/$($(1))
264 tcl_STEP_TO_PROG
= tcl
/$($(1)).tcl
265 ts_STEP_TO_PROG
= ts
/$($(1)).js
266 vala_STEP_TO_PROG
= vala
/$($(1))
267 vb_STEP_TO_PROG
= vb
/$($(1)).exe
268 vhdl_STEP_TO_PROG
= vhdl
/$($(1))
269 vimscript_STEP_TO_PROG
= vimscript
/$($(1)).vim
270 wasm_STEP_TO_PROG
= wasm
/$($(1)).
$(if
$(filter lucet
,$(wasm_MODE
)),so
,wasm
)
271 wren_STEP_TO_PROG
= wren
/$($(1)).wren
272 yorick_STEP_TO_PROG
= yorick
/$($(1)).i
273 zig_STEP_TO_PROG
= zig
/$($(1))
276 # General settings and utility functions
279 # Needed some argument munging
282 SPACE
= $(noop
) $(noop
)
283 export FACTOR_ROOTS
:= .
285 opt_HARD
= $(if
$(strip $(HARD
)),$(if
$(filter t true T True TRUE
1 y yes Yes YES
,$(HARD
)),--hard
,),)
286 opt_DEFERRABLE
= $(if
$(strip $(DEFERRABLE
)),$(if
$(filter t true T True TRUE
1 y yes Yes YES
,$(DEFERRABLE
)),--deferrable
,--no-deferrable
),--no-deferrable
)
287 opt_OPTIONAL
= $(if
$(strip $(OPTIONAL
)),$(if
$(filter t true T True TRUE
1 y yes Yes YES
,$(OPTIONAL
)),--optional
,--no-optional
),--no-optional
)
289 # Return list of test files for a given step. If REGRESS is set then
290 # test files will include step 2 tests through tests for the step
292 STEP_TEST_FILES
= $(strip $(wildcard \
293 $(foreach s
,$(if
$(strip $(REGRESS
)),\
294 $(filter-out $(if
$(filter $(1),$(step5_EXCLUDES
)),step5
,),\
297 $(1)/tests
/$($(s
))$(EXTENSION
) tests
/$($(s
))$(EXTENSION
))))
299 # DOCKERIZE utility functions
300 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))))))))))))))))))))))))))
301 impl_to_image
= kanaka
/mal-test-
$(call lc
,$(1))
303 actual_impl
= $(if
$(filter mal
,$(1)),$(patsubst %-mal
,%,$(MAL_IMPL
)),$(1))
306 # Returns nothing if DOCKERIZE is not set, otherwise returns the
307 # docker prefix necessary to run make within the docker environment
309 get_build_command
= $(strip $(foreach mode
,$(1)_MODE
, \
310 $(if
$(strip $(DOCKERIZE
)),\
312 -it
--rm -u
$(shell id
-u
) \
313 -v
$(dir $(abspath
$(lastword
$(MAKEFILE_LIST
)))):/mal \
315 $(if
$(strip $($(mode
))),-e
$(mode
)=$($(mode
)),) \
316 $(if
$(filter factor
,$(1)),-e FACTOR_ROOTS
=$(FACTOR_ROOTS
),) \
317 $(call impl_to_image
,$(1)) \
318 $(MAKE
) $(if
$(strip $($(mode
))),$(mode
)=$($(mode
)),) \
320 $(MAKE
) $(if
$(strip $($(mode
))),$(mode
)=$($(mode
)),) -C
$(impl
))))
322 # Takes impl and step args. Optional env vars and dockerize args
323 # Returns a command prefix (docker command and environment variables)
324 # necessary to launch the given impl and step
325 get_run_prefix
= $(strip $(foreach mode
,$(call actual_impl
,$(1))_MODE
, \
326 $(if
$(strip $(DOCKERIZE
) $(4)),\
327 docker run
-e STEP
=$($2) -e MAL_IMPL
=$(MAL_IMPL
) \
328 -it
--rm -u
$(shell id
-u
) \
329 -v
$(dir $(abspath
$(lastword
$(MAKEFILE_LIST
)))):/mal \
330 -w
/mal
/$(call actual_impl
,$(1)) \
331 $(if
$(strip $($(mode
))),-e
$(mode
)=$($(mode
)),) \
332 $(if
$(filter factor
,$(1)),-e FACTOR_ROOTS
=$(FACTOR_ROOTS
),) \
333 $(foreach env
,$(3),-e
$(env
)) \
334 $(call impl_to_image
,$(call actual_impl
,$(1))) \
336 env STEP
=$($2) MAL_IMPL
=$(MAL_IMPL
) \
337 $(if
$(strip $($(mode
))),$(mode
)=$($(mode
)),) \
338 $(if
$(filter factor
,$(1)),FACTOR_ROOTS
=$(FACTOR_ROOTS
),) \
341 # Takes impl and step
342 # Returns the runtest command prefix (with runtest options) for testing the given step
343 get_runtest_cmd
= $(call get_run_prefix
,$(1),$(2),$(if
$(filter cs fsharp mal tcl vb
,$(1)),RAW
=1,)) \
344 ..
/runtest.py
$(opt_HARD
) $(opt_DEFERRABLE
) $(opt_OPTIONAL
) $(call
$(1)_TEST_OPTS
) $(TEST_OPTS
)
346 # Takes impl and step
347 # Returns the runtest command prefix (with runtest options) for testing the given step
348 get_argvtest_cmd
= $(call get_run_prefix
,$(1),$(2)) ..
/run_argv_test.sh
351 STEPS
= $(sort $(filter-out %_EXCLUDES
,$(filter step
%,$(.VARIABLES
))))
352 DO_IMPLS
= $(filter-out $(SKIP_IMPLS
),$(IMPLS
))
353 IMPL_TESTS
= $(foreach impl
,$(DO_IMPLS
),test^
$(impl
))
354 STEP_TESTS
= $(foreach step
,$(STEPS
),test^
$(step
))
355 ALL_TESTS
= $(filter-out $(foreach e
,$(step5_EXCLUDES
),test^
$(e
)^step5
),\
357 $(foreach impl
,$(DO_IMPLS
),\
358 $(foreach step
,$(STEPS
),test^
$(impl
)^
$(step
))))))
359 ALL_BUILDS
= $(strip $(sort \
360 $(foreach impl
,$(DO_IMPLS
),\
361 $(foreach step
,$(STEPS
),build^
$(impl
)^
$(step
)))))
363 DOCKER_BUILD
= $(foreach impl
,$(DO_IMPLS
),docker-build^
$(impl
))
365 DOCKER_SHELL
= $(foreach impl
,$(DO_IMPLS
),docker-shell^
$(impl
))
367 IMPL_PERF
= $(foreach impl
,$(filter-out $(perf_EXCLUDES
),$(DO_IMPLS
)),perf^
$(impl
))
369 IMPL_STATS
= $(foreach impl
,$(DO_IMPLS
),stats^
$(impl
))
371 IMPL_REPL
= $(foreach impl
,$(DO_IMPLS
),repl^
$(impl
))
372 ALL_REPL
= $(strip $(sort \
373 $(foreach impl
,$(DO_IMPLS
),\
374 $(foreach step
,$(STEPS
),repl^
$(impl
)^
$(step
)))))
381 # Enable secondary expansion for all rules
384 # Build a program in an implementation directory
385 # Make sure we always try and build first because the dependencies are
386 # encoded in the implementation Makefile not here
387 .PHONY
: $(foreach i
,$(DO_IMPLS
),$(foreach s
,$(STEPS
),$(call
$(i
)_STEP_TO_PROG
,$(s
))))
388 $(foreach i
,$(DO_IMPLS
),$(foreach s
,$(STEPS
),$(call
$(i
)_STEP_TO_PROG
,$(s
)))):
389 $(foreach impl
,$(word 1,$(subst /, ,$(@
))),\
391 $(call get_build_command
,$(impl
)) $(patsubst $(impl
)/%,%,$(@
)), \
392 $(call get_build_command
,$(impl
)) $(subst $(impl
)/,,$(@
))))
394 # Allow IMPL, build^IMPL, IMPL^STEP, and build^IMPL^STEP
395 $(DO_IMPLS
): $$(foreach s
,$$(STEPS
),$$(call
$$(@
)_STEP_TO_PROG
,$$(s
)))
397 $(foreach i
,$(DO_IMPLS
),$(foreach s
,$(STEPS
),build^
$(i
))): $$(foreach s
,$$(STEPS
),$$(call
$$(word 2,$$(subst ^
, ,$$(@
)))_STEP_TO_PROG
,$$(s
)))
399 $(foreach i
,$(DO_IMPLS
),$(foreach s
,$(STEPS
),$(i
)^
$(s
))): $$(call
$$(word 1,$$(subst ^
, ,$$(@
)))_STEP_TO_PROG
,$$(word 2,$$(subst ^
, ,$$(@
))))
401 $(foreach i
,$(DO_IMPLS
),$(foreach s
,$(STEPS
),build^
$(i
)^
$(s
))): $$(call
$$(word 2,$$(subst ^
, ,$$(@
)))_STEP_TO_PROG
,$$(word 3,$$(subst ^
, ,$$(@
))))
409 $(ALL_TESTS
): $$(call
$$(word 2,$$(subst ^
, ,$$(@
)))_STEP_TO_PROG
,$$(word 3,$$(subst ^
, ,$$(@
))))
410 @
$(foreach impl
,$(word 2,$(subst ^
, ,$(@
))),\
411 $(foreach step
,$(word 3,$(subst ^
, ,$(@
))),\
412 cd
$(call actual_impl
,$(impl
)) && \
413 $(foreach test,$(call STEP_TEST_FILES
,$(impl
),$(step
)),\
414 echo
'----------------------------------------------' && \
415 echo
'Testing $@; step file: $+, test file: $(test)' && \
416 echo
'Running: $(call get_runtest_cmd,$(impl),$(step)) ../$(test) -- ../$(impl)/run' && \
417 $(call get_runtest_cmd
,$(impl
),$(step
)) ..
/$(test) -- ..
/$(impl
)/run
&& \
418 $(if
$(filter tests
/$(argv_STEP
)$(EXTENSION
),$(test)),\
419 echo
'----------------------------------------------' && \
420 echo
'Testing ARGV of $@; step file: $+' && \
421 echo
'Running: $(call get_argvtest_cmd,$(impl),$(step)) ../$(impl)/run ' && \
422 $(call get_argvtest_cmd
,$(impl
),$(step
)) ..
/$(impl
)/run
&& ,\
426 # Allow test, tests, test^STEP, test^IMPL, and test^IMPL^STEP
430 $(IMPL_TESTS
): $$(filter $$@^
%,$$(ALL_TESTS
))
432 $(STEP_TESTS
): $$(foreach step
,$$(subst test^
,,$$@
),$$(filter %^
$$(step
),$$(ALL_TESTS
)))
439 docker-build
: $(DOCKER_BUILD
)
442 @echo
"----------------------------------------------"; \
443 $(foreach impl
,$(word 2,$(subst ^
, ,$(@
))),\
444 echo
"Running: docker build -t $(call impl_to_image,$(impl)) .:"; \
445 cd
$(impl
) && docker build
-t
$(call impl_to_image
,$(impl
)) .
)
452 @echo
"----------------------------------------------"; \
453 $(foreach impl
,$(word 2,$(subst ^
, ,$(@
))),\
454 echo
"Running: $(call get_run_prefix,$(impl),stepA,,dockerize) bash"; \
455 $(call get_run_prefix
,$(impl
),stepA
,,dockerize
) bash
)
459 # Performance test rules
465 @echo
"----------------------------------------------"; \
466 $(foreach impl
,$(word 2,$(subst ^
, ,$(@
))),\
467 cd
$(call actual_impl
,$(impl
)); \
468 echo
"Performance test for $(impl):"; \
469 echo
'Running: $(call get_run_prefix,$(impl),stepA) ../$(impl)/run ../tests/perf1.mal'; \
470 $(call get_run_prefix
,$(impl
),stepA
) ..
/$(impl
)/run ..
/tests
/perf1.mal
; \
471 echo
'Running: $(call get_run_prefix,$(impl),stepA) ../$(impl)/run ../tests/perf2.mal'; \
472 $(call get_run_prefix
,$(impl
),stepA
) ..
/$(impl
)/run ..
/tests
/perf2.mal
; \
473 echo
'Running: $(call get_run_prefix,$(impl),stepA) ../$(impl)/run ../tests/perf3.mal'; \
474 $(call get_run_prefix
,$(impl
),stepA
) ..
/$(impl
)/run ..
/tests
/perf3.mal
)
478 # REPL invocation rules
481 $(ALL_REPL
): $$(call
$$(word 2,$$(subst ^
, ,$$(@
)))_STEP_TO_PROG
,$$(word 3,$$(subst ^
, ,$$(@
))))
482 @
$(foreach impl
,$(word 2,$(subst ^
, ,$(@
))),\
483 $(foreach step
,$(word 3,$(subst ^
, ,$(@
))),\
484 cd
$(call actual_impl
,$(impl
)); \
485 echo
'REPL implementation $(impl), step file: $+'; \
486 echo
'Running: $(call get_run_prefix,$(impl),$(step)) ../$(impl)/run $(RUN_ARGS)'; \
487 $(call get_run_prefix
,$(impl
),$(step
)) ..
/$(impl
)/run
$(RUN_ARGS
);))
489 # Allow repl^IMPL^STEP and repl^IMPL (which starts REPL of stepA)
490 $(IMPL_REPL
): $$@^stepA
496 # For a concise summary:
497 # make stats | egrep -A1 "^Stats for|^all" | egrep -v "^all|^--"
501 @
$(foreach impl
,$(word 2,$(subst ^
, ,$(@
))),\
502 echo
"Stats for $(impl):"; \
503 $(LOCCOUNT
) -x
"[sS]tep[0-9]_.*|[.]md$$|tests|examples|Makefile|package.json|tsconfig.json|Cargo.toml|project.clj|node_modules|getline.cs|terminal.cs|elm-stuff|objpascal/regexpr|rdyncall|swift/templates" $(impl
))
512 # Recursive rules (call make FOO in each subdirectory)
515 define recur_template
519 @echo
"----------------------------------------------"; \
520 $$(foreach impl
,$$(word 2,$$(subst ^
, ,$$(@
))),\
521 echo
"Running: $$(call get_build_command,$$(impl)) --no-print-directory $(1)"; \
522 $$(call get_build_command
,$$(impl
)) --no-print-directory
$(1))
525 recur_impls_
= $(filter-out $(foreach impl
,$($(1)_EXCLUDES
),$(1)^
$(impl
)),$(foreach impl
,$(IMPLS
),$(1)^
$(impl
)))
528 $(eval
$(call recur_template
,clean,$(call recur_impls_
,clean)))
531 $(eval
$(call recur_template
,dist,$(call recur_impls_
,dist)))