From 42d205e4a1d77ac6c99684fa6261b256b567324e Mon Sep 17 00:00:00 2001 From: Stefano Lattarini Date: Wed, 8 Aug 2012 17:15:31 +0200 Subject: [PATCH] [ng] am.xargs-map: can pass further arguments to the mapped function This is just a preparatory refactoring that will be needed by future changes. * lib/am/header-vars.mk (am.xargs-map): Improve. * t/am-xargs-map.sh: Enhance to check the enhanced behaviour. Signed-off-by: Stefano Lattarini --- lib/am/header-vars.mk | 15 ++++++----- t/am-xargs-map.sh | 60 ++++++++++++++++++++++++++++++++++++------- 2 files changed, 60 insertions(+), 15 deletions(-) diff --git a/lib/am/header-vars.mk b/lib/am/header-vars.mk index 2714c6090..92b74f688 100644 --- a/lib/am/header-vars.mk +++ b/lib/am/header-vars.mk @@ -285,10 +285,12 @@ am.max-cmdline-args := xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # the system would allow it), or our implementation will likely suffer in # performance and in memory consumption. -# $(call am.xargs-map,FUNCTION,LIST) -# ---------------------------------- -# Map the function $1 on the arguments $2, ensuring that each -# call of $1 has at most 40 arguments. +# $(call am.xargs-map,FUNCTION,LIST,[EXTRA-ARGS..]) +# ------------------------------------------------- +# Map the function $1 on the whitespace-separated list $2, ensuring that +# each call of $1 has at most 40 entries from that list at once. If +# further arguments are given (up to $9), they are passed to each $1 +# invocation. # This implementation is hacky, but the more elegant or "naive" ones # (based on recursion) proved to be ludicrously memory-hungry with # huge lists. @@ -303,10 +305,11 @@ $(if $2,$(strip \ )$(eval $0.counter := $$($0.counter)x)$(strip \ )$(eval $0.partial-args += $$i)$(strip \ )$(if $(filter $(am.max-cmdline-args),$($0.counter)),$(strip \ - )$(call $1,$(strip $($0.partial-args)))$(strip \ + )$(call $1,$(strip $($0.partial-args)),$3,$4,$5,$6,$7,$8,$9)$(strip \ )$(eval $0.partial-args :=)$(strip \ )$(eval $0.counter :=)))$(strip \ - )$(if $($0.counter),$(call $1,$(strip $($0.partial-args))))) + )$(if $($0.counter),$(call $1,$(strip \ + $($0.partial-args)),$3,$4,$5,$6,$7,$8,$9))) endef # Used only by the 'am.clean-cmd.*' functions below. Do not use in diff --git a/t/am-xargs-map.sh b/t/am-xargs-map.sh index e2bbdd0b1..93c4ef4a7 100755 --- a/t/am-xargs-map.sh +++ b/t/am-xargs-map.sh @@ -23,6 +23,8 @@ am_create_testdir=empty # Filter out Automake comments. grep -v '^##' "$am_amdir"/header-vars.mk > defn.mk \ || fatal_ "fetching makefile fragment headers-vars.am" +echo 'x-warning = $(warning $1)' >> defn.mk +echo 'y-warning = $(warning $1 -- $2)' >> defn.mk sed 's/^[0-9][0-9]*:://' > Makefile << 'END' 01::include ./defn.mk @@ -35,10 +37,11 @@ sed 's/^[0-9][0-9]*:://' > Makefile << 'END' 08:: 09::WARN := no 10::ifeq ($(WARN),yes) -11:: $(call am.xargs-map,warning,$(args16)) -12:: $(call am.xargs-map,warning,$(args16) 0 1 2 3) -13:: $(call am.xargs-map,warning,x y z) -14::endif +11:: $(call am.xargs-map,x-warning,$(args16)) +12:: $(call am.xargs-map,x-warning,$(args16) 0 1 2 3) +13:: $(call am.xargs-map,x-warning,x y z) +14:: $(call am.xargs-map,y-warning,$(args16) 0 1 2 3,X) +15::endif args32 := $(args16) $(args16) args64 := $(args32) $(args32) @@ -48,9 +51,15 @@ test-xargs-map: $(call am.xargs-map,bar,$(args16)) args = $(error 'args' should be overridden from the command line) +more-args = $(error 'more-args' should be overridden from the command line) + foo = @echo $1$(am.chars.newline) echo-xargs-map: $(call am.xargs-map,foo,$(args)) + +foo2 = @echo $1$(if $2, -- $2)$(am.chars.newline) +echo2-xargs-map: + $(call am.xargs-map,foo2,$(args),$(more-args)) END args1="0 1 2 3 4 5 6 7 8 9" @@ -64,21 +73,31 @@ test $(grep -c "^Makefile:11: $args4$" stderr) -eq 4 test $(grep -c "^Makefile:12: $args4$" stderr) -eq 4 test $(grep -c "^Makefile:12: 0 1 2 3$" stderr) -eq 1 test $(grep -c "^Makefile:13: x y z$" stderr) -eq 1 -test $(grep -c "^Makefile:" stderr) -eq 10 +test $(grep -c "^Makefile:14: $args4 -- X$" stderr) -eq 4 +test $(grep -c "^Makefile:14: 0 1 2 3 -- X" stderr) -eq 1 +test $(grep -c "^Makefile:" stderr) -eq 15 $MAKE 'test-xargs-map' check_echo () { cat > exp - $MAKE --no-print-directory "echo-xargs-map" args="$1" >got \ + mk="$MAKE --no-print-directory" + case $# in + 1) $mk "echo-xargs-map" args="$1";; + 2) $mk "echo2-xargs-map" args="$1" more-args="$2";; + *) fatal_ "check_echo: incorrect usage";; + esac >got \ || { cat got >&2; exit 1; } cat exp && cat got && diff exp got || exit 1 } -echo "$args1" | check_echo '$(args1)' -echo "$args2" | check_echo '$(args2)' -echo "$args4" | check_echo '$(args4)' +echo "$args1" | check_echo '$(args1)' +echo "$args1 -- x" | check_echo '$(args1)' x +echo "$args2" | check_echo '$(args2)' +echo "$args2 -- no" | check_echo '$(args2)' '$(WARN)' +echo "$args4" | check_echo '$(args4)' +echo "$args4 -- a b c" | check_echo '$(args4)' '$(notdir x/a ./b c)' check_echo '$(args8)'<