2016-03-08 08:33:45 +03:00
# Usage/help
all help :
@echo
@echo 'USAGE:'
@echo
@echo 'Rules/Targets:'
@echo
@echo 'make "IMPL" # build all steps of IMPL'
2019-05-30 06:41:35 +03:00
@echo 'make "build^IMPL" # build all steps of IMPL'
2016-03-08 08:33:45 +03:00
@echo 'make "IMPL^STEP" # build STEP of IMPL'
2019-05-30 06:41:35 +03:00
@echo 'make "build^IMPL^STEP" # build STEP of IMPL'
2016-03-08 08:33:45 +03:00
@echo
@echo 'make "test" # test all implementations'
@echo 'make "test^IMPL" # test all steps of IMPL'
@echo 'make "test^STEP" # test STEP for all implementations'
@echo 'make "test^IMPL^STEP" # test STEP of IMPL'
@echo
@echo 'make "perf" # run microbenchmarks for all implementations'
@echo 'make "perf^IMPL" # run microbenchmarks for IMPL'
@echo
@echo 'make "repl^IMPL" # run stepA of IMPL'
@echo 'make "repl^IMPL^STEP" # test STEP of IMPL'
@echo
@echo 'make "clean" # run ' make clean' for all implementations'
@echo 'make "clean^IMPL" # run ' make clean' for IMPL'
@echo
@echo 'make "stats" # run ' make stats' for all implementations'
@echo 'make "stats-lisp" # run ' make stats-lisp' for all implementations'
@echo 'make "stats^IMPL" # run ' make stats' for IMPL'
@echo 'make "stats-lisp^IMPL" # run ' make stats-lisp' for IMPL'
@echo
@echo 'Options/Settings:'
@echo
@echo 'make MAL_IMPL=IMPL "test^mal..." # use IMPL for self-host tests'
@echo 'make REGRESS=1 "test..." # test with previous step tests too'
@echo 'make DOCKERIZE=1 ... # to dockerize above rules/targets'
2019-01-30 20:56:01 +03:00
@echo 'make TEST_OPTS="--opt ..." # options to pass to runtest.py'
2016-03-08 08:33:45 +03:00
@echo
@echo 'Other:'
@echo
@echo 'make "docker-build^IMPL" # build docker image for IMPL'
@echo
2017-09-15 07:37:26 +03:00
@echo 'make "docker-shell^IMPL" # start bash shell in docker image for IMPL'
@echo
2016-03-08 08:33:45 +03:00
2021-04-20 02:39:03 +03:00
# Implementation specific settings are here:
i n c l u d e M a k e f i l e . i m p l s
2014-03-25 01:32:24 +04:00
#
2021-04-20 02:39:03 +03:00
# General command line settings
2014-03-25 01:32:24 +04:00
#
MAL_IMPL = js
2019-03-21 07:32:35 +03:00
# Path to loccount for counting LOC stats
LOCCOUNT = loccount
2015-10-09 19:14:51 +03:00
# Extra options to pass to runtest.py
TEST_OPTS =
2015-12-19 02:24:02 +03:00
# Test with previous test files not just the test files for the
# current step. Step 0 and 1 tests are special and not included in
# later steps.
2016-03-08 08:33:45 +03:00
REGRESS =
2015-12-19 02:24:02 +03:00
2019-07-24 09:29:40 +03:00
HARD =
2016-05-10 18:26:39 +03:00
DEFERRABLE = 1
2016-05-10 02:00:49 +03:00
OPTIONAL = 1
2016-03-08 08:33:45 +03:00
# Run target/rule within docker image for the implementation
DOCKERIZE =
2014-04-17 07:42:17 +04:00
2017-09-15 07:36:25 +03:00
2014-03-25 01:32:24 +04:00
#
2021-04-20 02:39:03 +03:00
# General settings and utility functions
2014-03-25 01:32:24 +04:00
#
2017-02-11 09:15:34 +03:00
EXTENSION = .mal
2014-03-25 01:32:24 +04:00
step0 = step0_repl
step1 = step1_read_print
step2 = step2_eval
step3 = step3_env
step4 = step4_if_fn_do
step5 = step5_tco
step6 = step6_file
step7 = step7_quote
step8 = step8_macros
2014-10-10 08:48:47 +04:00
step9 = step9_try
2015-02-28 20:09:54 +03:00
stepA = stepA_mal
2014-03-25 01:32:24 +04:00
2017-02-11 09:15:34 +03:00
argv_STEP = step6_file
2015-12-19 02:24:02 +03:00
regress_step0 = step0
regress_step1 = step1
regress_step2 = step2
regress_step3 = $( regress_step2) step3
regress_step4 = $( regress_step3) step4
regress_step5 = $( regress_step4) step5
regress_step6 = $( regress_step5) step6
regress_step7 = $( regress_step6) step7
regress_step8 = $( regress_step7) step8
regress_step9 = $( regress_step8) step9
regress_stepA = $( regress_step9) stepA
2015-02-09 05:35:44 +03:00
# Needed some argument munging
COMMA = ,
noop =
SPACE = $( noop) $( noop)
2015-10-29 18:27:24 +03:00
export FACTOR_ROOTS := .
2014-04-18 06:49:07 +04:00
2019-07-24 09:29:40 +03:00
opt_HARD = $( if $( strip $( HARD) ) ,$( if $( filter t true T True TRUE 1 y yes Yes YES,$( HARD) ) ,--hard,) ,)
2017-09-15 07:36:25 +03:00
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
# test files will include step 2 tests through tests for the step
# being tested.
STEP_TEST_FILES = $( strip $( wildcard \
2019-02-27 02:38:05 +03:00
$( foreach s,$( if $( strip $( REGRESS) ) ,\
$( filter-out $( if $( filter $( 1) ,$( step5_EXCLUDES) ) ,step5,) ,\
$( regress_$( 2) ) ) \
,$( 2) ) ,\
2020-02-11 08:50:16 +03:00
impls/$( 1) /tests/$( $( s) ) $( EXTENSION) impls/tests/$( $( s) ) $( EXTENSION) ) ) )
2017-09-15 07:36:25 +03:00
2016-03-08 06:59:16 +03:00
# 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) )
2019-07-30 01:55:25 +03:00
actual_impl = $( if $( filter mal,$( 1) ) ,$( patsubst %-mal,%,$( MAL_IMPL) ) ,$( 1) )
2016-03-08 06:59:16 +03:00
2016-05-18 07:37:26 +03:00
# 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
2019-05-28 07:21:57 +03:00
get_build_command = $( strip $( foreach mode,$( 1) _MODE, \
$( if $( strip $( DOCKERIZE) ) ,\
docker run \
-it --rm -u $( shell id -u) \
-v $( dir $( abspath $( lastword $( MAKEFILE_LIST) ) ) ) :/mal \
2020-02-11 08:50:16 +03:00
-w /mal/impls/$( 1) \
2019-05-28 07:21:57 +03:00
$( if $( strip $( $( mode) ) ) ,-e $( mode) = $( $( mode) ) ,) \
$( if $( filter factor,$( 1) ) ,-e FACTOR_ROOTS = $( FACTOR_ROOTS) ,) \
$( call impl_to_image,$( 1) ) \
$( MAKE) $( if $( strip $( $( mode) ) ) ,$( mode) = $( $( mode) ) ,) \
,\
2020-02-11 08:50:16 +03:00
$( MAKE) $( if $( strip $( $( mode) ) ) ,$( mode) = $( $( mode) ) ,) -C impls/$( impl) ) ) )
2014-04-18 06:49:07 +04:00
2017-09-15 07:37:26 +03:00
# Takes impl and step args. Optional env vars and dockerize args
2016-05-18 07:37:26 +03:00
# Returns a command prefix (docker command and environment variables)
# necessary to launch the given impl and step
2019-05-28 07:21:57 +03:00
get_run_prefix = $( strip $( foreach mode,$( call actual_impl,$( 1) ) _MODE, \
$( if $( strip $( DOCKERIZE) $( 4) ) ,\
docker run -e STEP = $( $2 ) -e MAL_IMPL = $( MAL_IMPL) \
-it --rm -u $( shell id -u) \
-v $( dir $( abspath $( lastword $( MAKEFILE_LIST) ) ) ) :/mal \
2020-02-11 08:50:16 +03:00
-w /mal/impls/$( call actual_impl,$( 1) ) \
2019-05-28 07:21:57 +03:00
$( if $( strip $( $( mode) ) ) ,-e $( mode) = $( $( 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 ) MAL_IMPL = $( MAL_IMPL) \
$( if $( strip $( $( mode) ) ) ,$( mode) = $( $( mode) ) ,) \
$( if $( filter factor,$( 1) ) ,FACTOR_ROOTS= $( FACTOR_ROOTS) ,) \
$( 3) ) ) )
2016-05-18 07:37:26 +03:00
# Takes impl and step
# Returns the runtest command prefix (with runtest options) for testing the given step
2019-05-29 06:34:15 +03:00
get_runtest_cmd = $( call get_run_prefix,$( 1) ,$( 2) ,$( if $( filter cs fsharp mal tcl vb,$( 1) ) ,RAW= 1,) ) \
2020-02-11 08:50:16 +03:00
../../runtest.py $( opt_HARD) $( opt_DEFERRABLE) $( opt_OPTIONAL) $( call $( 1) _TEST_OPTS) $( TEST_OPTS)
2016-05-18 07:37:26 +03:00
# Takes impl and step
# Returns the runtest command prefix (with runtest options) for testing the given step
2020-02-11 08:50:16 +03:00
get_argvtest_cmd = $( call get_run_prefix,$( 1) ,$( 2) ) ../tests/run_argv_test.sh
2014-03-25 01:32:24 +04:00
# Derived lists
2019-02-27 02:38:05 +03:00
STEPS = $( sort $( filter-out %_EXCLUDES,$( filter step%,$( .VARIABLES) ) ) )
2015-03-12 06:08:21 +03:00
DO_IMPLS = $( filter-out $( SKIP_IMPLS) ,$( IMPLS) )
IMPL_TESTS = $( foreach impl,$( DO_IMPLS) ,test^$( impl) )
2014-03-25 01:32:24 +04:00
STEP_TESTS = $( foreach step,$( STEPS) ,test^$( step) )
2019-02-27 02:38:05 +03:00
ALL_TESTS = $( filter-out $( foreach e,$( step5_EXCLUDES) ,test^$( e) ^step5) ,\
2014-03-25 01:32:24 +04:00
$( strip $( sort \
2015-03-12 06:08:21 +03:00
$( foreach impl,$( DO_IMPLS) ,\
2014-03-25 01:32:24 +04:00
$( foreach step,$( STEPS) ,test^$( impl) ^$( step) ) ) ) ) )
2019-05-30 06:41:35 +03:00
ALL_BUILDS = $( strip $( sort \
$( foreach impl,$( DO_IMPLS) ,\
$( foreach step,$( STEPS) ,build^$( impl) ^$( step) ) ) ) )
2014-03-25 01:32:24 +04:00
2015-10-06 00:46:21 +03:00
DOCKER_BUILD = $( foreach impl,$( DO_IMPLS) ,docker-build^$( impl) )
2017-09-15 07:37:26 +03:00
DOCKER_SHELL = $( foreach impl,$( DO_IMPLS) ,docker-shell^$( impl) )
2016-03-15 07:39:21 +03:00
IMPL_PERF = $( foreach impl,$( filter-out $( perf_EXCLUDES) ,$( DO_IMPLS) ) ,perf^$( impl) )
2014-04-18 06:49:07 +04:00
2019-03-21 07:32:35 +03:00
IMPL_STATS = $( foreach impl,$( DO_IMPLS) ,stats^$( impl) )
2015-12-14 16:50:27 +03:00
IMPL_REPL = $( foreach impl,$( DO_IMPLS) ,repl^$( impl) )
ALL_REPL = $( strip $( sort \
$( foreach impl,$( DO_IMPLS) ,\
$( foreach step,$( STEPS) ,repl^$( impl) ^$( step) ) ) ) )
2014-04-18 06:49:07 +04:00
2017-09-15 07:36:25 +03:00
2014-03-25 01:32:24 +04:00
#
# Build rules
#
2017-09-15 07:36:25 +03:00
# Enable secondary expansion for all rules
.SECONDEXPANSION :
2015-06-16 18:23:12 +03:00
# Build a program in an implementation directory
2015-11-19 01:32:53 +03:00
# 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 ) ) ) )
2015-06-16 18:23:12 +03:00
$(foreach i,$(DO_IMPLS),$(foreach s,$(STEPS),$(call $(i)_STEP_TO_PROG,$(s)))) :
2020-02-11 08:50:16 +03:00
$( foreach impl,$( word 2,$( subst /, ,$( @) ) ) ,\
2016-03-08 06:59:16 +03:00
$( if $( DOCKERIZE) , \
2020-02-11 08:50:16 +03:00
$( call get_build_command,$( impl) ) $( patsubst impls/$( impl) /%,%,$( @) ) , \
$( call get_build_command,$( impl) ) $( subst impls/$( impl) /,,$( @) ) ) )
2014-03-25 01:32:24 +04:00
2019-05-30 06:41:35 +03:00
# Allow IMPL, build^IMPL, IMPL^STEP, and build^IMPL^STEP
2016-03-08 08:33:45 +03:00
$(DO_IMPLS) : $$( foreach s ,$ $ ( STEPS ) ,$ $ ( call $ $ ( @) _STEP_TO_PROG ,$ $ ( s ) ) )
2014-03-25 01:32:24 +04:00
2019-05-30 06:41:35 +03:00
$(foreach i,$(DO_IMPLS),$(foreach s,$(STEPS),build^$(i))) : $$( foreach s ,$ $ ( STEPS ) ,$ $ ( call $ $ ( word 2,$ $ ( subst ^, ,$ $ ( @) ) ) _STEP_TO_PROG ,$ $ ( s ) ) )
2016-03-08 08:33:45 +03:00
$(foreach i,$(DO_IMPLS),$(foreach s,$(STEPS),$(i)^$(s))) : $$( call $ $ ( word 1,$ $ ( subst ^, ,$ $ ( @) ) ) _STEP_TO_PROG ,$ $ ( word 2,$ $ ( subst ^, ,$ $ ( @) ) ) )
2019-05-30 06:41:35 +03:00
$(foreach i,$(DO_IMPLS),$(foreach s,$(STEPS),build^$(i)^$(s))) : $$( call $ $ ( word 2,$ $ ( subst ^, ,$ $ ( @) ) ) _STEP_TO_PROG ,$ $ ( word 3,$ $ ( subst ^, ,$ $ ( @) ) ) )
2016-03-08 08:33:45 +03:00
#
# Test rules
#
2014-03-25 01:32:24 +04:00
$(ALL_TESTS) : $$( call $ $ ( word 2,$ $ ( subst ^, ,$ $ ( @) ) ) _STEP_TO_PROG ,$ $ ( word 3,$ $ ( subst ^, ,$ $ ( @) ) ) )
@$( foreach impl,$( word 2,$( subst ^, ,$( @) ) ) ,\
$( foreach step,$( word 3,$( subst ^, ,$( @) ) ) ,\
2020-02-11 08:50:16 +03:00
echo " (call STEP_TEST_FILES, $( impl) , $( step) ): $( call STEP_TEST_FILES,$( impl) ,$( step) ) " && \
cd impls/$( call actual_impl,$( impl) ) && \
$( foreach test,$( patsubst impls/%,%,$( call STEP_TEST_FILES,$( impl) ,$( step) ) ) ,\
2016-03-30 17:14:48 +03:00
echo '----------------------------------------------' && \
2016-05-18 07:37:26 +03:00
echo 'Testing $@; step file: $+, test file: $(test)' && \
2016-06-03 18:20:28 +03:00
echo 'Running: $(call get_runtest_cmd,$(impl),$(step)) ../$(test) -- ../$(impl)/run' && \
$( call get_runtest_cmd,$( impl) ,$( step) ) ../$( test ) -- ../$( impl) /run && \
2017-02-11 09:15:34 +03:00
$( if $( filter tests/$( argv_STEP) $( EXTENSION) ,$( test ) ) ,\
2016-05-10 22:28:29 +03:00
echo '----------------------------------------------' && \
echo 'Testing ARGV of $@; step file: $+' && \
2016-05-18 07:37:26 +03:00
echo 'Running: $(call get_argvtest_cmd,$(impl),$(step)) ../$(impl)/run ' && \
$( call get_argvtest_cmd,$( impl) ,$( step) ) ../$( impl) /run && ,\
2016-05-10 22:28:29 +03:00
true && ) ) \
2016-03-30 17:14:48 +03:00
true ) )
2014-03-25 01:32:24 +04:00
2016-03-08 08:33:45 +03:00
# Allow test, tests, test^STEP, test^IMPL, and test^IMPL^STEP
2014-03-25 01:32:24 +04:00
test : $( ALL_TESTS )
tests : $( ALL_TESTS )
2016-03-08 08:33:45 +03:00
$(IMPL_TESTS) : $$( filter $ $ @^%,$ $ ( ALL_TESTS ) )
2014-03-25 01:32:24 +04:00
2016-03-08 08:33:45 +03:00
$(STEP_TESTS) : $$( foreach step ,$ $ ( subst test ^,,$ $ @) ,$ $ ( filter %^$ $ ( step ) ,$ $ ( ALL_TESTS ) ) )
2014-03-25 01:32:24 +04:00
2014-04-18 06:49:07 +04:00
2016-03-08 08:33:45 +03:00
#
2017-09-15 07:37:26 +03:00
# Docker build rules
2016-03-08 08:33:45 +03:00
#
2016-02-15 05:57:31 +03:00
2017-09-15 07:37:26 +03:00
docker-build : $( DOCKER_BUILD )
2014-03-25 01:32:24 +04:00
2017-09-15 07:37:26 +03:00
$(DOCKER_BUILD) :
2014-04-11 04:27:42 +04:00
@echo "----------------------------------------------" ; \
$( foreach impl,$( word 2,$( subst ^, ,$( @) ) ) ,\
2017-09-15 07:37:26 +03:00
echo " Running: docker build -t $( call impl_to_image,$( impl) ) .: " ; \
2020-02-11 08:50:16 +03:00
cd impls/$( impl) && docker build -t $( call impl_to_image,$( impl) ) .)
2014-04-11 04:27:42 +04:00
2016-03-08 08:33:45 +03:00
#
2017-09-15 07:37:26 +03:00
# Docker shell rules
2016-03-08 08:33:45 +03:00
#
2015-10-06 00:46:21 +03:00
2017-09-15 07:37:26 +03:00
$(DOCKER_SHELL) :
@echo "----------------------------------------------" ; \
2015-10-06 00:46:21 +03:00
$( foreach impl,$( word 2,$( subst ^, ,$( @) ) ) ,\
2017-09-15 07:37:26 +03:00
echo " Running: $( call get_run_prefix,$( impl) ,stepA,,dockerize) bash " ; \
$( call get_run_prefix,$( impl) ,stepA,,dockerize) bash)
2014-04-18 06:49:07 +04:00
2016-03-08 08:33:45 +03:00
#
2014-04-18 06:49:07 +04:00
# Performance test rules
2016-03-08 08:33:45 +03:00
#
2014-04-18 06:49:07 +04:00
perf : $( IMPL_PERF )
$(IMPL_PERF) :
@echo "----------------------------------------------" ; \
$( foreach impl,$( word 2,$( subst ^, ,$( @) ) ) ,\
2020-02-11 08:50:16 +03:00
cd impls/$( call actual_impl,$( impl) ) ; \
2014-04-18 06:49:07 +04:00
echo " Performance test for $( impl) : " ; \
2016-05-18 07:37:26 +03:00
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)
2014-04-18 06:49:07 +04:00
2015-12-14 16:50:27 +03:00
2016-03-08 08:33:45 +03:00
#
2015-12-14 16:50:27 +03:00
# REPL invocation rules
2016-03-08 08:33:45 +03:00
#
2015-12-14 16:50:27 +03:00
$(ALL_REPL) : $$( call $ $ ( word 2,$ $ ( subst ^, ,$ $ ( @) ) ) _STEP_TO_PROG ,$ $ ( word 3,$ $ ( subst ^, ,$ $ ( @) ) ) )
@$( foreach impl,$( word 2,$( subst ^, ,$( @) ) ) ,\
$( foreach step,$( word 3,$( subst ^, ,$( @) ) ) ,\
2020-02-11 08:50:16 +03:00
cd impls/$( call actual_impl,$( impl) ) ; \
2015-12-14 16:50:27 +03:00
echo 'REPL implementation $(impl), step file: $+' ; \
2017-09-15 07:36:25 +03:00
echo 'Running: $(call get_run_prefix,$(impl),$(step)) ../$(impl)/run $(RUN_ARGS)' ; \
$( call get_run_prefix,$( impl) ,$( step) ) ../$( impl) /run $( RUN_ARGS) ; ) )
2016-02-24 10:05:44 +03:00
2016-03-08 08:33:45 +03:00
# Allow repl^IMPL^STEP and repl^IMPL (which starts REPL of stepA)
$(IMPL_REPL) : $$@^stepA
2019-03-21 07:32:35 +03:00
#
# Stats test rules
#
# For a concise summary:
# make stats | egrep -A1 "^Stats for|^all" | egrep -v "^all|^--"
stats : $( IMPL_STATS )
$(IMPL_STATS) :
@$( foreach impl,$( word 2,$( subst ^, ,$( @) ) ) ,\
echo " Stats for $( impl) : " ; \
2020-02-11 08:50:16 +03:00
$( 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 " impls/$( impl) )
2019-03-21 07:32:35 +03:00
2016-03-15 07:39:21 +03:00
#
# Utility functions
#
print-% :
@echo " $( $( *) ) "
2016-02-24 10:05:44 +03:00
2016-03-08 08:33:45 +03:00
#
2016-02-24 10:05:44 +03:00
# Recursive rules (call make FOO in each subdirectory)
2016-03-08 08:33:45 +03:00
#
2016-02-24 10:05:44 +03:00
d e f i n e r e c u r _ t e m p l a t e
.PHONY : $( 1)
$(1) : $( 2)
$(2) :
@echo "----------------------------------------------" ; \
$$ ( foreach impl,$$ ( word 2,$$ ( subst ^, ,$$ ( @) ) ) ,\
2019-05-28 07:21:57 +03:00
echo " Running: $$ (call get_build_command, $$ (impl)) --no-print-directory $( 1) " ; \
$$ ( call get_build_command,$$ ( impl) ) --no-print-directory $( 1) )
2016-02-24 10:05:44 +03:00
e n d e f
recur_impls_ = $( filter-out $( foreach impl,$( $( 1) _EXCLUDES) ,$( 1) ^$( impl) ) ,$( foreach impl,$( IMPLS) ,$( 1) ^$( impl) ) )
# recursive clean
$( eval $ ( call recur_template ,clean ,$ ( call recur_impls_ ,clean ) ) )
# recursive dist
$( eval $ ( call recur_template ,dist ,$ ( call recur_impls_ ,dist ) ) )